From preprensa@tecnografica.cl Tue Apr 1 00:25:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C14BF7F54 for ; Tue, 1 Apr 2014 00:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7AC1AAC004 for ; Mon, 31 Mar 2014 22:25:45 -0700 (PDT) X-ASG-Debug-ID: 1396329937-04bdf076f08e0040001-NocioJ Received: from srv57.publiweb.cl (srv57.publiweb.cl [190.215.113.57]) by cuda.sgi.com with ESMTP id ISJ8WmAYb3vxA2VV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Mar 2014 22:25:39 -0700 (PDT) X-Barracuda-Envelope-From: preprensa@tecnografica.cl X-Barracuda-Apparent-Source-IP: 190.215.113.57 Received: from [117.194.89.129] (port=4430 helo=zbspszts) by srv57.publiweb.cl with esmtpa (Exim 4.82) (envelope-from ) id 1WUrCW-0001co-3D for xfs@oss.sgi.com; Tue, 01 Apr 2014 02:25:33 -0300 Message-ID: <1D523330AC034E059C2EBA4C766C8ABB@zrqdf> From: "Leon Borneman" To: "xfs" Subject: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDP8OXv4PDg8iDk?= =?windows-1251?B?6/8g7+7i+/jl7ej/IO/u8uXt9ujoLCB6cnlX?= =?windows-1251?B?d0o=?= Date: Tue, 1 Apr 2014 07:25:30 +0200 X-ASG-Orig-Subj: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDP8OXv4PDg8iDk?= =?windows-1251?B?6/8g7+7i+/jl7ej/IO/u8uXt9ujoLCB6cnlX?= =?windows-1251?B?d0o=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_080A_01CF4D7B.8FF55590" X-Priority: 3 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - srv57.publiweb.cl X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tecnografica.cl X-Get-Message-Sender-Via: srv57.publiweb.cl: authenticated_id: preprensa@tecnografica.cl X-Barracuda-Connect: srv57.publiweb.cl[190.215.113.57] X-Barracuda-Start-Time: 1396329938 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.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_TG035a, HTML_MESSAGE, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4477 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_080A_01CF4D7B.8FF55590 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=EE=E4=EE=EB=E6=E8=F2=E5=EB=FC=ED=FB=E9 =FD=F4=F4=E5=EA=F2 =DD=F4=F4=E5=EA=F2 =EE=F2 Menergizer =EE=F9=F3=F9=E0=E5=F2=F1=FF, =EA=E0=EA= =EF=F0=E0=E2=E8=EB=EE, =EE=F2 2-3 =E4=ED=E5=E9 =E4=EE 5 =F1=F3=F2=EE=EA!= =DD=F2=EE =E7=ED=E0=F7=E8=F2=E5=EB=FC=ED=EE =EF=F0=E5=E2=EE=F1=F5=EE=E4=E8= =F2 =EC=ED=EE=E3=E8=E5 =E0=ED=E0=EB=EE=E3=E8=F7=ED=FB=E5 =EF=F0=E5=EF=E0=F0= =E0=F2=FB. =CC=FB =EE=F2=EF=F0=E0=E2=E8=EB=E8 =E1=EE=EB=E5=E5 8 000 =F3=EF= =E0=EA=EE=E2=EE=EA =E8 =E8=EC=E5=E5=EC =E1=EE=EB=E5=E5 6 500 =EE=F2=E7=FB= =E2=EE=E2. =CC=FB =EC=EE=E6=E5=EC =E3=E0=F0=E0=ED=F2=E8=F0=EE=E2=E0=F2=FC =F0=E5=E7=F3= =EB=FC=F2=E0=F2 =E8=EB=E8 =E2=E5=F0=ED=E5=EC =C2=E0=EC =E4=E5=ED=FC=E3=E8= ! =CD=E0=F3=F7=ED=FB=E5 =E4=E0=ED=ED=FB=E5 =E3=EE=E2=EE=F0=FF=F2 =EE =F2=EE= =EC, =F7=F2=EE =E2 =EC=F3=E6=F1=EA=EE=EC =EE=F0=E3=E0=ED=E8=E7=EC=E5 98-9= 9% =F2=E5=F1=F2=EE=F1=F2=E5=F0=EE=ED=E0 =ED=E0=F5=EE=E4=E8=F2=F1=FF =E2 =ED= =E5=E0=EA=F2=E8=E2=ED=EE=E9 =F4=EE=F0=EC=E5 - =E5=E3=EE =EC=EE=EB=E5=EA=F3= =EB=FB =F1=E2=FF=E7=E0=ED=FB =F1 =E1=E5=EB=EA=E0=EC=E8 =EA=F0=EE=E2=E8 =E8= =E2 =EF=F0=EE=F6=E5=F1=F1=E0=F5 =ED=E5 =F3=F7=E0=F1=F2=E2=F3=E5=F2, =E8 = =EB=E8=F8=FC 1-2% =ED=E0=F5=EE=E4=E8=F2=F1=FF =E2 =F1=E2=EE=E1=EE=E4=ED=EE= =E9 (=E0=EA=F2=E8=E2=ED=EE=E9) =F4=EE=F0=EC=E5, =E8 =E8=EC=E5=ED=ED=EE =FD= =F2=EE=F2 =F2=E5=F1=F2=EE=F1=F2=E5=F0=EE=ED =EE=EF=F0=E5=E4=E5=EB=FF=E5=F2= =EC=F3=E6=F1=EA=EE=E9 =F1=F2=E0=F2=F3=F1 - =EA=E0=F7=E5=F1=F2=E2=EE, =F1= =E8=EB=F3, =EF=F0=EE=E4=EE=EB=E6=E8=F2=E5=EB=FC=ED=EE=F1=F2=FC =FD=F0=E5=EA= =F6=E8=E8, =EA=EE=EB=E8=F7=E5=F1=F2=E2=EE =E0=EA=F2=EE=E2, =E0 =F2=E0=EA=E6= =E5 =EE=F1=F2=F0=EE=F2=F3 =F1=E5=EA=F1=F3=E0=EB=FC=ED=FB=F5 =EE=F9=F3=F9=E5= =ED=E8=E9. =D3=E4=E8=E2=E8=F2=E5=EB=FC=ED=FB=E9 =FD=F4=F4=E5=EA=F2 =EA=E0= =EF=F1=F3=EB MENERGIZER =EE=E1=F3=F1=EB=EE=E2=EB=E5=ED =F2=E5=EC, =F7=F2=EE= =EA=E0=E6=E4=E0=FF =EA=E0=EF=F1=F3=EB=E0 (330 =EC=E3) =F1=EE=E4=E5=F0=E6= =E8=F2 =E2 =F1=E5=E1=E5 =EE=EA=EE=EB=EE 3 =EA=E8=EB=EE=E3=F0=E0=EC=EC=EE=E2= =E8=F1=F5=EE=E4=ED=EE=E3=EE =F1=FB=F0=FC=FF, =E2 =E2=E8=E4=E5 =F1=F3=F5=E8= =F5 =FD=EA=F1=F2=F0=E0=EA=F2=EE=E2 =FF=E3=EE=E4 =E8 =F1=E5=EC=FF=ED! =CF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8 =E4=E0=EB=E5=E5... ------=_NextPart_000_080A_01CF4D7B.8FF55590 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=F0=EE=E4=EE=EB=E6=E8=F2= =E5=EB=FC=ED=FB=E9 =FD=F4=F4=E5=EA=F2
 
=DD=F4=F4=E5=EA=F2 =EE=F2 M= energizer =EE=F9=F3=F9=E0=E5=F2=F1=FF, =EA=E0=EA=20 =EF=F0=E0=E2=E8=EB=EE, =EE=F2 2-3 =E4=ED=E5=E9 =E4=EE 5 =F1=F3=F2=EE=EA! = =DD=F2=EE =E7=ED=E0=F7=E8=F2=E5=EB=FC=ED=EE =EF=F0=E5=E2=EE=F1=F5=EE=E4=E8= =F2 =EC=ED=EE=E3=E8=E5 =E0=ED=E0=EB=EE=E3=E8=F7=ED=FB=E5=20 =EF=F0=E5=EF=E0=F0=E0=F2=FB. =CC=FB =EE=F2=EF=F0=E0=E2=E8=EB=E8 =E1=EE=EB= =E5=E5 8 000 =F3=EF=E0=EA=EE=E2=EE=EA =E8 =E8=EC=E5=E5=EC =E1=EE=EB=E5=E5= 6 500 =EE=F2=E7=FB=E2=EE=E2.
=CC=FB=20 =EC=EE=E6=E5=EC =E3=E0=F0=E0=ED=F2=E8=F0=EE=E2=E0=F2=FC =F0=E5=E7=F3=EB=FC= =F2=E0=F2 =E8=EB=E8 =E2=E5=F0=ED=E5=EC =C2=E0=EC =E4=E5=ED=FC=E3=E8!
 
=CD=E0=F3=F7=ED=FB=E5 =E4=E0= =ED=ED=FB=E5 =E3=EE=E2=EE=F0=FF=F2 =EE =F2=EE=EC, =F7=F2=EE =E2=20 =EC=F3=E6=F1=EA=EE=EC =EE=F0=E3=E0=ED=E8=E7=EC=E5 98-99% =F2=E5=F1=F2=EE=F1= =F2=E5=F0=EE=ED=E0 =ED=E0=F5=EE=E4=E8=F2=F1=FF =E2 =ED=E5=E0=EA=F2=E8=E2=ED= =EE=E9 =F4=EE=F0=EC=E5 - =E5=E3=EE=20 =EC=EE=EB=E5=EA=F3=EB=FB =F1=E2=FF=E7=E0=ED=FB =F1 =E1=E5=EB=EA=E0=EC=E8 = =EA=F0=EE=E2=E8 =E8 =E2 =EF=F0=EE=F6=E5=F1=F1=E0=F5 =ED=E5 =F3=F7=E0=F1=F2= =E2=F3=E5=F2, =E8 =EB=E8=F8=FC 1-2%=20 =ED=E0=F5=EE=E4=E8=F2=F1=FF =E2 =F1=E2=EE=E1=EE=E4=ED=EE=E9 (=E0=EA=F2=E8= =E2=ED=EE=E9) =F4=EE=F0=EC=E5, =E8 =E8=EC=E5=ED=ED=EE =FD=F2=EE=F2 =F2=E5= =F1=F2=EE=F1=F2=E5=F0=EE=ED =EE=EF=F0=E5=E4=E5=EB=FF=E5=F2=20 =EC=F3=E6=F1=EA=EE=E9 =F1=F2=E0=F2=F3=F1 - =EA=E0=F7=E5=F1=F2=E2=EE, =F1=E8= =EB=F3, =EF=F0=EE=E4=EE=EB=E6=E8=F2=E5=EB=FC=ED=EE=F1=F2=FC =FD=F0=E5=EA=F6= =E8=E8, =EA=EE=EB=E8=F7=E5=F1=F2=E2=EE =E0=EA=F2=EE=E2, =E0=20 =F2=E0=EA=E6=E5 =EE=F1=F2=F0=EE=F2=F3 =F1=E5=EA=F1=F3=E0=EB=FC=ED=FB=F5 =EE= =F9=F3=F9=E5=ED=E8=E9. =D3=E4=E8=E2=E8=F2=E5=EB=FC=ED=FB=E9 =FD=F4=F4=E5=EA= =F2 =EA=E0=EF=F1=F3=EB MENERGIZER=20 =EE=E1=F3=F1=EB=EE=E2=EB=E5=ED =F2=E5=EC, =F7=F2=EE =EA=E0=E6=E4=E0=FF =EA= =E0=EF=F1=F3=EB=E0 (330 =EC=E3) =F1=EE=E4=E5=F0=E6=E8=F2 =E2 =F1=E5=E1=E5= =EE=EA=EE=EB=EE 3 =EA=E8=EB=EE=E3=F0=E0=EC=EC=EE=E2=20 =E8=F1=F5=EE=E4=ED=EE=E3=EE =F1=FB=F0=FC=FF, =E2 =E2=E8=E4=E5 =F1=F3=F5=E8= =F5 =FD=EA=F1=F2=F0=E0=EA=F2=EE=E2 =FF=E3=EE=E4 =E8 =F1=E5=EC=FF=ED!
 
------=_NextPart_000_080A_01CF4D7B.8FF55590-- From promotion1000promo@gmail.com Tue Apr 1 03:22:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C487A7F50 for ; Tue, 1 Apr 2014 03:22:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B026130405F for ; Tue, 1 Apr 2014 01:22:21 -0700 (PDT) X-ASG-Debug-ID: 1396340537-04cbb054b89aaf90001-NocioJ Received: from [139.170.10.103] ([139.170.10.103]) by cuda.sgi.com with SMTP id 2BACsmPRHPsPuP4L for ; Tue, 01 Apr 2014 01:22:18 -0700 (PDT) X-Barracuda-Envelope-From: promotion1000promo@gmail.com X-Barracuda-Apparent-Source-IP: 139.170.10.103 Reply-To: promotion1000promo@gmail.com From: promotion1000promo@gmail.com To: xfs@oss.sgi.com Subject: Chalets et studios dans les Laurentided Sender: promotion1000promo@gmail.com X-ASG-Orig-Subj: Chalets et studios dans les Laurentided Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Date: Tue, 1 Apr 2014 16:18:04 +0800 X-Barracuda-Connect: UNKNOWN[139.170.10.103] X-Barracuda-Start-Time: 1396340537 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, MISSING_MID, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4480 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140401082221.9ABBB106C6A5@cuda.sgi.com> Chalets et Studios Le Vent Du Nord Offre pour un temps limité: Le printemps est enfin arrivé dans les Laurentides. Venez profiter de nos studios, suites et chalets jusqu'à 5 chambres a coucher en famille et entre amis. Mentionnez la promo PRINTEMPSENSOLEILLÉ obtenez jusqu'à $100 de rabais sur votre séjour Spa, BBQ, embarcation, feu de camp. 2 nuits minimum. For a limited time: Spring is in the air in the Laurentiens. Come with friends & family enjoy one of our studios, suites & chalets (up to 5 bedrooms). By mentionning SPRINGAIR get up to $100 off your stay Spa, BBQ, camp fire, boats 2 nights minimum. Jean et Géraldine Tel.: 819.688-6140 Site web: leventdunord From bfoster@redhat.com Tue Apr 1 06:54:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A30C97F4E for ; Tue, 1 Apr 2014 06:54:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E7B2304051 for ; Tue, 1 Apr 2014 04:54:12 -0700 (PDT) X-ASG-Debug-ID: 1396353251-04cb6c5678b9fee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KsciK53ZErrA9imn for ; Tue, 01 Apr 2014 04:54: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-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 s31Bs9tl009893 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 1 Apr 2014 07:54:09 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s31Bs9qn030503; Tue, 1 Apr 2014 07:54:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A147B123C1C; Tue, 1 Apr 2014 07:54:08 -0400 (EDT) Date: Tue, 1 Apr 2014 07:54:08 -0400 From: Brian Foster To: Dave Chinner Cc: Al@disappointment.disaster, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... Message-ID: <20140401115408.GA21540@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <20140331172243.GB63718@bfoster.bfoster> <20140331201757.GC17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331201757.GC17603@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396353251 X-Barracuda-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, Apr 01, 2014 at 07:17:57AM +1100, Dave Chinner wrote: > On Mon, Mar 31, 2014 at 01:22:43PM -0400, Brian Foster wrote: > > On Fri, Mar 21, 2014 at 09:11:44PM +1100, Dave Chinner wrote: > > > Hi folks, > > > > > > This patch series mostly shuts a can of worms that Al opened when he > > > found the cause of the generic/263 fsx failures. The fix for that is > > > patch 6 of this series, but, well, there are a bunch of other > > > problems that need to be fixed before making that change. > > > > > > Basically, the direct Io block mapping behaviour was covering up a > > > bunch of other bugs in the delayed allocation extent/page cache > > > state coherency mappings. Essentially, we punch out the page cache > > > in quite a few places without first cleaning up delayed allocation > > > extents over that range and that exposes all sorts of nasty issues > > > once the direct IO mapping changes are made. All of these are > > > existing problems, most of them are very unlikely to be seen in the > > > wild. > > > > > > This patch set passes xfstests on a 4k block size/4k page size > > > config with out problems. However, there is still a fsx failure in > > > generic/127 on 1k block size/4k page size configurations that I > > > haven't yet tracked down. That test was failing occasionally before > > > this patch set as well, so it may be a completely unrelated problem. > > > > > > The sad fact of this patchset is it is mostly playing whack-a-mole > > > with visible symptoms of bugs. It drives home the fact that > > > bufferheads and the keeping of internal filesystem state attached to > > > the page cache simply isn't a verifiable architecture. After > > > spending several days of doing nothing else but tracking down these > > > inconsistencies i can only conclude that the code is complex, > > > fragile and extremely difficult to verify that behaviour is correct. > > > As such, I doubt that the fixes are entirely correct, so I'm left > > > with using fsx and fsstress to tell me if I've broken anything. > > > > > > Eyeballs appreciated, as is test results. > > > > > > > I had an xfstests running against this (on for-next) over the weekend > > and it hit the following bug on xfs/297: > > > > [ 6408.168767] kernel BUG at fs/xfs/xfs_aops.c:1336! > > [ 6408.169542] invalid opcode: 0000 [#1] SMP > > Ok, so that's found another stale delalloc range where there > shouldn't be. I know there were still problems when I left because > generic/127 was failing on 1k block size filesystems, but I haven't > yet had a chance to get back to determine if the bug was the broken > code in xfs_check_page_types() that Dan Carpenter noticed. Were you > running with that fix? > Ah, good point. I was running with the check_page_type() rework, but not the most recent fix. I'll plan to test again with that included. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 1 08:48:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7DD2B7F56 for ; Tue, 1 Apr 2014 08:48:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 614AF30405F for ; Tue, 1 Apr 2014 06:48:19 -0700 (PDT) X-ASG-Debug-ID: 1396360095-04cb6c5675ba70c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iEvLtgWBshbsZ8E6 for ; Tue, 01 Apr 2014 06:48:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s31DmDXl016554 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 1 Apr 2014 09:48:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s31DmD4S003612; Tue, 1 Apr 2014 09:48:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 51470123C1C; Tue, 1 Apr 2014 09:48:12 -0400 (EDT) Date: Tue, 1 Apr 2014 09:48:12 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: add flush flag to xfs_eofblocks Message-ID: <20140401134810.GB21540@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: add flush flag to xfs_eofblocks References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-3-git-send-email-bfoster@redhat.com> <20140331214754.GE17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331214754.GE17603@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396360095 X-Barracuda-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, Apr 01, 2014 at 08:47:54AM +1100, Dave Chinner wrote: > On Fri, Mar 28, 2014 at 09:16:00AM -0400, Brian Foster wrote: > > The flush flag allows the caller to issue a flush for scanned inodes. In > > ENOSPC conditions caused by project quotas, a flush is required to free > > up reserved metadata allocations. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_fs.h | 4 +++- > > fs/xfs/xfs_icache.c | 3 +++ > > 2 files changed, 6 insertions(+), 1 deletion(-) > > > > diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h > > index c5fc116..fa3a58e 100644 > > --- a/fs/xfs/xfs_fs.h > > +++ b/fs/xfs/xfs_fs.h > > @@ -374,12 +374,14 @@ struct xfs_fs_eofblocks { > > #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_FLUSH (1 << 5) /* issue a flush */ > > #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) > > + XFS_EOF_FLAGS_MINFILESIZE | \ > > + XFS_EOF_FLAGS_FLUSH) > > > > > > /* > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > > index 7ff59c9..d4e15db 100644 > > --- a/fs/xfs/xfs_icache.c > > +++ b/fs/xfs/xfs_icache.c > > @@ -1231,6 +1231,9 @@ xfs_inode_free_eofblocks( > > if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && > > XFS_ISIZE(ip) < eofb->eof_min_file_size) > > return 0; > > + > > + if (eofb->eof_flags & XFS_EOF_FLAGS_FLUSH) > > + filemap_flush(VFS_I(ip)->i_mapping); > > So this does WB_SYNC_NONE writeback, which means the filesystem is > free to ignore it when we get to .writepage. Given that we are are > ENOSPC here, wouldn't it be better to guarantee that writeback will > occur (i.e. use filemap_fdatawrite())? > Yeah, I didn't catch that. That makes sense, thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Tue Apr 1 08:55:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 571967F59 for ; Tue, 1 Apr 2014 08:55:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27547304043 for ; Tue, 1 Apr 2014 06:55:22 -0700 (PDT) X-ASG-Debug-ID: 1396360521-04bdf076f08f8d00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wQH91d0smKo7BoDr for ; Tue, 01 Apr 2014 06:55: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-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 s31DtKmp020954 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 1 Apr 2014 09:55:20 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s31DtJBD003040; Tue, 1 Apr 2014 09:55:19 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B5E33123C1C; Tue, 1 Apr 2014 09:55:18 -0400 (EDT) Date: Tue, 1 Apr 2014 09:55:18 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140401135518.GC21540@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> <20140331222246.GF17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331222246.GF17603@dastard> 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: 1396360521 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 01, 2014 at 09:22:47AM +1100, Dave Chinner wrote: > On Fri, Mar 28, 2014 at 09:16:02AM -0400, Brian Foster wrote: ... > > /* > > - * If we just got an ENOSPC, try to write back all dirty inodes to > > - * convert delalloc space to free up some of the excess reserved > > - * metadata space. > > + * If we hit ENOSPC or a quota limit, use the selective nature of the > > + * eofblocks scan to try and free up some lingering speculative > > + * preallocation delalloc blocks. > > + * > > + * If we hit a quota limit, only scan for files covered by the quota. We > > + * also consider ENOSPC here because project quota failure can return > > + * ENOSPC instead of EDQUOT. The quota scanning only sets 'scanned' if > > + * the inode is covered by a quota with low free space. This should > > + * minimize interference with global ENOSPC handling. > > + * > > + * If a scan does not free enough space, resort to the inode flush big > > + * hammer to convert delalloc space to free up some of the excess > > + * reserved metadata space. > > */ > > + if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { > > + scanned = xfs_inode_free_quota_eofblocks(ip); > > + if (scanned) > > + goto write_retry; > > + } > > + if (ret == -ENOSPC && !scanned) { > > + struct xfs_eofblocks eofb = {0,}; > > IIRC, you can just use "{ 0 }" for initialisation, no "," needed. > > > + > > + eofb.eof_scan_owner = ip->i_ino; /* for locking */ > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC | XFS_EOF_FLAGS_FLUSH; > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > + scanned = 1; > > + goto write_retry; > > + } > > if (ret == -ENOSPC && !enospc) { > > enospc = 1; > > xfs_flush_inodes(ip->i_mount); > > This seems overly complex and fragile. I'd much prefer that we don't > bury data writeback deep in the EOF block freeing code - we've done > a lot of work in the past to remove exactly that sort of behaviour > from XFS inode scanners. > I think the fragility comes from the fact that we can't detect a particular quota failure or a project quota failure from a global failure. IIRC from looking at this way back when, there wasn't a clear solution to that problem. It didn't seem worth getting too far into for the purpose of this little bit of functionality. In that sense, the fragility will be there regardless. It would be nice to simplify this, however. It took a little bit of staring at this to try and make it effective and somewhat succinct. > I'd prefer to see something like this: > > if (ret == -EDQUOT && !enospc) { > enospc = 1; > xfs_inode_free_quota_eofblocks(ip); > goto retry; > else if (ret == -ENOSPC && !enospc) { > enospc = 1; > xfs_flush_inodes(ip->i_mount); > .... > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > goto retry; > } > What I don't like about this, in particular, is xfs_flush_inodes() could be unnecessary. We have a max preallocation size of 8GB, so the eofblocks scan alone can free up gigabytes of space. Now that I think of it, this is kind of a flaw in the proposed logic as well. > This way has specific behaviours for EDQUOT vs ENOSPC, and we treat > them appropriately with a minimum of differences. And ENOSPC is > global, because we can't tell the difference here between a project > quota ENOSPC and a global ENOSPC at this point. > The main difference I see is that the original logic is centered around figuring out how to do an eofblocks scan vs. xfs_flush_inodes() only when necessary. In other words, we always attempt to do an eofblocks scan first then fall back to the inode flush. Where it gets a bit ugly is where we try to determine what kind of scan to run due to lack of information. The flush aspect of things is a little confused as well I suppose. Alternatively, the logic above is designed around categorization of the possible error conditions. I agree that it is more simple, but not quite as effective as noted above. We would continue to run a global inode flush when eofblocks can clean up effectively for the time being or due to a project quota failure that should ideally not impact the wider fs. I wonder if something like the following would simplify this enough, yet still provide nicer behavior: /* * If this is an allocation failure, attempt an eofblocks scan * before we resort to an inode flush... */ if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { scanned = xfs_inode_enospc_eofblocks(ip); if (scanned) goto retry; scanned = 1; /* try this once */ } if (ret == -ENOSPC && !enospc) { enospc = 1; xfs_flush_inodes(); goto retry; } This consolidates the eofblocks scan logic to a separate helper to simplify things. The helper can run the quota scan and/or the global scan based on the data regarding the situation (i.e., the inode and associated quota characteristics). This allows us to preserve the notion of attempting a lightweight recovery first and a heavyweight recovery second, reserving the inode flush for when space is truly tight. Thoughts? > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > > index bd0ab7d..471ccfa 100644 > > --- a/fs/xfs/xfs_icache.c > > +++ b/fs/xfs/xfs_icache.c > > @@ -33,6 +33,9 @@ ... > > + > > + if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount)) { > > + dq = xfs_inode_dquot(ip, XFS_DQ_PROJ); > > + if (dq && xfs_dquot_lowsp(dq)) { > > + eofb.eof_prid = xfs_get_projid(ip); > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > + XFS_EOF_FLAGS_PRID| > > + XFS_EOF_FLAGS_FLUSH; > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > + scanned = 1; > > + } > > + } > > I really don't like the fact that project quota is hiding a data > flush in the "free_quota_eofblocks" logic. It just strikes me a the > wrong thing to do because if it's a real ENOSPC we're just going to > have to do this anyway... > I was under the impression that a flush was important for project quotas based on freeing up reserved metadata space (from our past discussions on the original eofblocks work). I could have just misunderstood the point at the time. If so, I can just remove the flush flag on the eofblocks scan in the logic proposed above and let the inode flush handle this for both cases. If we go that route, any preference as to whether to keep the support for doing a flush in eofblocks at all? I included it primarily for the project quota case. With that dropped, I could just drop the first couple of patches here. Thanks for the review. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From hannes@stressinduktion.org Tue Apr 1 13:49:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 413767F58 for ; Tue, 1 Apr 2014 13:49:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C687AAC005 for ; Tue, 1 Apr 2014 11:49:10 -0700 (PDT) X-ASG-Debug-ID: 1396378144-04cbb054b79d02c0001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id 2ZyfBKAIdyCIr9ym (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 01 Apr 2014 11:49:05 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id E726D1A0C2A6; Tue, 1 Apr 2014 20:49:03 +0200 (CEST) Date: Tue, 1 Apr 2014 20:49:03 +0200 From: Hannes Frederic Sowa To: xfs@oss.sgi.com Subject: [PATCH xfstests] tests for file hash collisions on xfs filesystems Message-ID: <20140401184903.GA13434@order.stressinduktion.org> X-ASG-Orig-Subj: [PATCH xfstests] tests for file hash collisions on xfs filesystems References: <20140327074156.GJ29498@order.stressinduktion.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20140327074156.GJ29498@order.stressinduktion.org> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1396378145 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4495 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patch adds a new check for xfstests, which generates directories with 64 distinct hash values and afterwards tries to delete the directory. This caused a hash ordering issue. The file-hash-tool can also generate files (this should result in the same original problem as with directories) and generate only filenames with one hash (this can be very well optimized in future). This is just a preview. Dave Chiner seems to want this as soon as possible, thus please review and suggest changes so I can adapt this patch ASAP. Thanks! Signed-off-by: Hannes Frederic Sowa --- .gitignore | 1 + ltp/Makefile | 2 +- ltp/file-hash-test.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/307 | 61 +++++++++++++++++ tests/xfs/307.out | 2 + tests/xfs/group | 1 + 6 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 ltp/file-hash-test.c create mode 100755 tests/xfs/307 create mode 100644 tests/xfs/307.out diff --git a/.gitignore b/.gitignore index b6f2463..c023afc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ /ltp/fsstress /ltp/fsx /ltp/growfiles +/ltp/file-hash-test /ltp/iogen # src/ binaries diff --git a/ltp/Makefile b/ltp/Makefile index 5bea492..c1ec489 100644 --- a/ltp/Makefile +++ b/ltp/Makefile @@ -5,7 +5,7 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs -TARGETS = doio fsstress fsx growfiles iogen +TARGETS = doio fsstress fsx growfiles iogen file-hash-test SCRIPTS = rwtest.sh CFILES = $(TARGETS:=.c) HFILES = doio.h diff --git a/ltp/file-hash-test.c b/ltp/file-hash-test.c new file mode 100644 index 0000000..c297034 --- /dev/null +++ b/ltp/file-hash-test.c @@ -0,0 +1,189 @@ +/* + * creates files or directories with similar hashes + * + * If used without option 64 different hash values are possible If + * '-s' is specified as command line option, it does reduce the number + * of hashes to just one. + * + * '-f' creates files - this is the default + * '-d' creates directories + * '-n 200000' specified the number of file names to generate + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static enum { + DIRECTORY, + FILENAME, +} touch_mode = FILENAME; + +static bool one_hash = false; + +static uint32_t rol32(uint32_t word, unsigned int shift) +{ + return (word << shift) | (word >> (32 - shift)); +} + +static uint32_t xfs_hash(const uint8_t *name, int namelen) +{ + uint32_t hash; + + for (hash = 0; namelen >= 4; namelen -= 4, name += 4) + hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^ + (name[3] << 0) ^ rol32(hash, 7 * 4); + + if (namelen) { + fprintf(stderr, + "internal error: " + "misbalanced input buffer to xfs_hash - " + "overlapping %d bytes\n", namelen); + exit(1); + } + + return hash; +} + +static uint8_t gen_rand(void) +{ + uint8_t r; + while (!(r = rand())); + return r; +} + +static uint8_t buffer[252+1] = {0}; + +static void gen_name(void) +{ + int idx; + uint32_t hash, last; + +again: + for (idx = 0; idx < 252-4; idx+=4) { + buffer[idx + 0] = gen_rand(); + buffer[idx + 1] = gen_rand(); + buffer[idx + 2] = gen_rand(); + buffer[idx + 3] = gen_rand(); + } + + hash = rol32(xfs_hash(buffer, 248), 7 * 4); + last = hash ^ ~0U; + + if (last == 0) + goto again; + + buffer[idx + 0] = (last >> 21) & 0xff; + buffer[idx + 1] = (last >> 14) & 0xff; + buffer[idx + 2] = (last >> 7) & 0xff; + buffer[idx + 3] = last & 0xff; + + if (memchr(buffer, '.', sizeof(buffer)) || + memchr(buffer, '/', sizeof(buffer))) + goto again; + + if (one_hash) { + /* very poor - can be improved later */ + static bool done = false; + static uint32_t filter; + + if (!done) { + filter = xfs_hash(buffer, 252); + done = true; + return; + } + + if (filter != xfs_hash(buffer, 252)) + goto again; + } +} + +static int touch(const char *buffer) +{ + if (touch_mode == DIRECTORY) { + if (mkdir(buffer, S_IRWXU)) { + /* ignore if directory is already present */ + if (errno == EEXIST) + return 0; + perror("mkdir with random directory name"); + return 1; + } + } else if (touch_mode == FILENAME) { + int fd = creat(buffer, S_IRWXU); + if (fd == -1) { + /* ignore duplicate files */ + if (errno == EEXIST) + return 0; + perror("creat with random directory name"); + return 1; + } + if (close(fd)) { + perror("close is leaking a file descriptor"); + return 1; + } + return 0; + } + return 0; +} + +static void do_seed(void) +{ + struct timeval tv; + if (gettimeofday(&tv, NULL)) { + perror("gettimeofday"); + exit(1); + } + srand(tv.tv_sec ^ tv.tv_usec ^ getpid()); +} + +int main(int argc, char **argv) +{ + const char allopts[] = "vsdfn:"; + int c, orig_cycles, errors = 0, cycles = 200000; + + while ((c = getopt(argc, argv, allopts)) != -1) { + switch (c) { + case 'd': + touch_mode = DIRECTORY; + break; + case 'f': + touch_mode = FILENAME; + break; + case 'n': + errno = 0; + if (sscanf(optarg, "%d", &cycles) != 1 || + errno == ERANGE) { + fputs("could not parse number of iterations", stderr); + exit(1); + } + break; + case 's': + one_hash = true; + break; + } + } + + orig_cycles = cycles; + + do_seed(); + + while (cycles--) { + gen_name(); + errors += touch((char *)buffer); + } + + if (errors) + fprintf(stderr, "creating %d %s caused %d errors\n", + orig_cycles, touch_mode == FILENAME ? "files" : "directories", + errors); + + return 0; +} diff --git a/tests/xfs/307 b/tests/xfs/307 new file mode 100755 index 0000000..12a322a --- /dev/null +++ b/tests/xfs/307 @@ -0,0 +1,61 @@ +#! /bin/bash +# FS QA Test No. 001 +# +# what am I here for? +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 YOUR NAME HERE. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os IRIX Linux + +mkdir $TEST_DIR/x +cd $TEST_DIR/x + +$here/ltp/file-hash-test -d -n 200000 +cd $here +# kernel should oops here +rm -rf $TEST_DIR/x + +echo "If we got here, everything seems fine at first." + +# success, all done +status=0 +exit diff --git a/tests/xfs/307.out b/tests/xfs/307.out new file mode 100644 index 0000000..6cd3cd6 --- /dev/null +++ b/tests/xfs/307.out @@ -0,0 +1,2 @@ +QA output created by 307 +If we got here, everything seems fine at first. diff --git a/tests/xfs/group b/tests/xfs/group index ba34650..b5695d3 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -189,3 +189,4 @@ 304 auto quick quota 305 auto quota 306 auto stress log metadata repair +307 auto stress -- 1.9.0 From tinguely@sgi.com Tue Apr 1 13:56:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 039D17F5D for ; Tue, 1 Apr 2014 13:56:57 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB9AA8F8065; Tue, 1 Apr 2014 11:56:53 -0700 (PDT) Message-ID: <533B0BF5.5000404@sgi.com> Date: Tue, 01 Apr 2014 13:56: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: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: [PATCH xfstests] tests for file hash collisions on xfs filesystems References: <20140327074156.GJ29498@order.stressinduktion.org> <20140401184903.GA13434@order.stressinduktion.org> In-Reply-To: <20140401184903.GA13434@order.stressinduktion.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/01/14 13:49, Hannes Frederic Sowa wrote: > This patch adds a new check for xfstests, which generates directories with 64 > distinct hash values and afterwards tries to delete the directory. This caused > a hash ordering issue. > > The file-hash-tool can also generate files (this should result in the same > original problem as with directories) and generate only filenames with one > hash (this can be very well optimized in future). > > This is just a preview. Dave Chiner seems to want this as soon as possible, > thus please review and suggest changes so I can adapt this patch ASAP. > > Thanks! > > Signed-off-by: Hannes Frederic Sowa > --- I had some suggestions for the C and xfstests that cross paths with this post. --Mark. From pocas.jamie@gmail.com Tue Apr 1 15:16:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, LOCALPART_IN_SUBJECT,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7CDBB7F56 for ; Tue, 1 Apr 2014 15:16:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6467D304053 for ; Tue, 1 Apr 2014 13:16:42 -0700 (PDT) X-ASG-Debug-ID: 1396383399-04cbb054b69d4f40001-NocioJ Received: from mail-lb0-f172.google.com (mail-lb0-f172.google.com [209.85.217.172]) by cuda.sgi.com with ESMTP id 8LW06qSHACH7sw6S (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 01 Apr 2014 13:16:40 -0700 (PDT) X-Barracuda-Envelope-From: pocas.jamie@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.172] Received: by mail-lb0-f172.google.com with SMTP id c11so7509736lbj.3 for ; Tue, 01 Apr 2014 13:16:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=iyeBIkT9qgmBEOQeFkI+JhH0MKLeT75b21q7WUUY6Mg=; b=mEnpn9Jn4sNhAgeH+6DKWrf8Wy3+sBt8wvjeHq3l7HUh9i7Gj19TYhxuMubVxv12jQ gIwZHb7oVdNDS0RPrf2PsjJZclHOHikawWx/zamjriWd9LN7B98BPasPaMmiyG1leOn8 nCrQB6t7MVmgJg9PeOVoXtVE0HkyhSZ+zuNxijkyShIbNrqv2FOOzkiFwEXY2P4YiPGb rbChdfv9G9XHzz8Sl076OQpNFsBJ5EFSZ9cL7rAqtYAXWnSWl7pAEmswWj3fZJTmqW1/ rNn6nkRA/foCWEEH7B0h0m3igm7GD48yuypWgqSUO+vcu4nBYMvNcwnplmz9hOW5IvtT cMMw== MIME-Version: 1.0 X-Received: by 10.153.7.200 with SMTP id de8mr24019615lad.19.1396383399132; Tue, 01 Apr 2014 13:16:39 -0700 (PDT) Received: by 10.114.188.129 with HTTP; Tue, 1 Apr 2014 13:16:39 -0700 (PDT) Date: Tue, 1 Apr 2014 16:16:39 -0400 Message-ID: Subject: xfs: invalid requests to request_fn from xfs_repair From: Jamie Pocas X-ASG-Orig-Subj: xfs: invalid requests to request_fn from xfs_repair To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a1137e98679c1ed04f600d880 X-Barracuda-Connect: mail-lb0-f172.google.com[209.85.217.172] X-Barracuda-Start-Time: 1396383400 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.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, LOCALPART_IN_SUBJECT, LOCALPART_IN_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4495 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 LOCALPART_IN_SUBJECT_2 Local part of To: address appears in Subject --001a1137e98679c1ed04f600d880 Content-Type: text/plain; charset=ISO-8859-1 Hi folks, I have a very simple block device driver that uses the request_fn style of processing instead of the older bio handling or newer multiqueue approach. I have been using this with ext3 and ext4 for years with no issues, but scalability requirements have dictated that I move to xfs to better support larger devices. I'm observing something weird in my request_fn. It seems like the block layer is issuing invalid requests to my request function, and it really manifests when I use xfs_repair. Here's some info: blk_queue_physical_block_size(q, 512) // should be no surprise blk_queue_logical_block_size(q, 512) // should be no surprise blk_queue_max_segments(q, 128); /* 128 memory segments (page + offset/length pairs) per request! */ blk_queue_max_hw_sectors(q, CA_MAX_REQUEST_SECTORS); /* Up to 1024 sectors (512k) per request hard limit in the kernel */ blk_queue_max_segment_size(q, CA_MAX_REQUEST_BYTES); /* 512k (1024 sectors) is the hard limit in the kernel */ While iterating through segments in rq_for_each_segment(), for some requests I am seeing some odd behavior. segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 903 // Ok, this looks normal segment 1: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 7 // Whoah... this doesn't look right to me ... You can see with segment 1, that the start sector is *NOT* adjacent to the the previous segment's sectors (there's a gap from sector 903 through 1022) and that the "sparse" request, for lack of a better term, extends beyond the max I/O boundary of 512k. Furthermore, this doesn't seem to jibe with what userspace is doing, which is a simple 512k read all in one chunk with a single userspace address. But when you look at the strace of what xfs_repair is doing, it's just an innocuous read of 512k from sector 0. write(2, "Phase 1 - find and verify superb"..., 40Phase 1 - find and verify superblock... ) = 40 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f00e2f42000 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f00e2ec1000 lseek(4, 0, SEEK_SET) = 0 read(4, 0x7f00e2ec1200, 524288) = -1 EIO (Input/output error) write(2, "superblock read failed, offset 0"..., 61superblock read failed, offset 0, size 524288, ag 0, rval -1 ) = 61 The reason you see the EIO is because I am failing a request in the driver since it violates the restrictions I set earlier, is non-adjacent, and so I am unable to satisfy it. *Point 1:* Shouldn't requests contain all segments that are adjacent on disk e.g. if initially before the rq_for_each_segment() loop blk_rq_pos(rq) is 10, and blk_rq_cur_sectors is 10, then on the next iteration (if any) iter.bio->bi_sector should be 10+10-1=20? Is my understanding correct? Are these some kind of special requests that should be handled differently (e.g. I know that DISCARD requests have to be handled differently and shouldn't be run through rq_for_each_segment, and that FLUSH requests are often empty). The cmd_flags say that they are normal REQ_TYPE_FS requests. *Point 2:* If I ignore the incorrect iter.bio->bi_sector, and just read/write the request out as if it were adjacent, I xfs_repair reports corruption, and sure enough there are inodes which are zeroed out instead of having the inode magic 0x494e ( "IN") as expected. So mkfs.xfs, while not sending what appear to be illegal requests, is still resulting in corruption. *Point 3:* Interestingly this goes away when I set blk_queue_max_segments(q, 1), but this obviously cuts down on clustering, and this of course kills performance. Is this indicative of anything in particular that I could be doing wrong? Please cut me some slack when I say something like xfs_repair is "sending" invalid requests. I know that there is the C library, system call interface, block layer, etc.. in between, but I just mean to say simply that using this tool results in this unexpected behavior. I don't mean to point blame at xfs or xfsprogs. If this turns out to be a block layer issue, and this posting needs to be sent elsewhere, I apologize and would appreciate being pointed in the right direction. It almost feels like the block layer is splitting the bios up wrongly, is corrupting the bvecs, or is introducing a race. What's strange again, is that I have only seen this behavior with xfs tools, but not ext3, or ext4 and e2fsprogs which has been working for years. It really shouldn't matter though, because mkfs.xfs and xfs_repair are user space tools, so this shouldn't cause the block layer in the kernel to send down invalid requests. I have been grappling with this for a few weeks, and I am tempted to go to the old bio handling function instead just to see if that would work out for me better, but that would be a big rewrite of the LLD. I am using an older Ubuntu 12.04 kernel 3.2.x so I am not able to go to the newer multiqueue implementation. Any ideas/suggestions? Need more information? Thanks and Regards, Jamie Pocas --001a1137e98679c1ed04f600d880 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi folks,

I have a very= simple block device driver that uses the request_fn style of processing in= stead of the older bio handling or newer multiqueue approach. I have been u= sing this with ext3 and ext4 for years with no issues, but scalability requ= irements have dictated that I move to xfs to better support larger devices.=

I'm observing something weird in my request_f= n. It seems like the block layer is issuing invalid requests to my request = function, and it really manifests when I use xfs_repair. Here's some in= fo:

blk_queue_physical_block_size(q, 512) // should be no s= urprise
blk_queue_logical_block_size(q, 512) // should b= e no surprise
blk_queue_max_segments(q, 128); /* 128 m= emory segments (page + offset/length pairs) per request! */
blk_queue_max_hw_sectors(q, CA_MAX_REQUEST_SECTORS); /* Up to 1024 sec= tors (512k) per request hard limit in the kernel */
blk_queue= _max_segment_size(q, CA_MAX_REQUEST_BYTES); /* 512k (1024 sectors) is the h= ard limit in the kernel */

While iterating through segments in rq_for_each_s= egment(), for some requests I am seeing some odd behavior.

segmen= t 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D 903 =A0 // Ok= , this looks normal
segm= ent 1: iter.bio->bi_sector =3D 1023, blk_rq_cur_sectors(rq) =3D 7 // Who= ah... this doesn't look right to me
...=A0

You can see with segment 1, that the start sect= or is *NOT* adjacent to the the previous segment's sectors (there's= a gap from sector 903 through 1022) and that the "sparse" reques= t, for lack of a better term, extends beyond the max I/O boundary of 512k. = Furthermore, this doesn't seem to jibe with what userspace is doing, wh= ich is a simple 512k read all in one chunk with a single userspace address.=

But when you look at the strace of what xfs_repair is d= oing, it's just an innocuous read of 512k from sector 0.

=
write(2, "Phase 1 - find and verify superb"..., 40Phas= e 1 - find and verify superblock...
) =3D 40
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVAT= E|MAP_ANONYMOUS, -1, 0) =3D 0x7f00e2f42000
mmap(NULL, 528384, PRO= T_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =3D 0x7f00e2ec1000
lseek(4, 0, SEEK_SET) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =3D 0
<= div>read(4, 0x7f00e2ec1200, 524288) =A0 =A0 =A0 =A0 =3D -1 EIO (Input/outpu= t error)
write(2, "superblock read failed, offset 0"...= , 61superblock read failed, offset 0, size 524288, ag 0, rval -1
) =3D 61

The reason you see the EIO is becaus= e I am failing a request in the driver since it violates the restrictions I= set earlier, is non-adjacent, and so I am unable to satisfy it.

Point 1: Shouldn't requests contain all segments = that are adjacent on disk e.g. if initially before the rq_for_each_segment(= ) loop blk_rq_pos(rq) is 10, and blk_rq_cur_sectors is 10, then on the next= iteration (if any) iter.bio->bi_sector should be 10+10-1=3D20? Is my un= derstanding correct? Are these some kind of special requests that should be= handled differently (e.g. I know that DISCARD requests have to be handled = differently and shouldn't be run through rq_for_each_segment, and that = FLUSH requests are often empty). The cmd_flags say that they are normal REQ= _TYPE_FS requests.

Point 2:=A0If I ignore the incorrect=A0iter.bio->bi_sector, = and just read/write the request out as if it were adjacent, I xfs_repair re= ports corruption, and sure enough there are inodes which are zeroed out ins= tead of having the inode magic=A00x= 494e (= =A0"IN") as expected. So mkfs.xfs, while not sending what appear = to be illegal requests, is still resulting in corruption.

Point 3:=A0Interestingly this goes away whe= n I set blk_queue_max_segments(q, 1), but this obviously cuts down on clust= ering, and this of course kills performance. Is this indicative of anything= in particular that I could be doing wrong?

Please cut me some slack when I say something lik= e xfs_repair is "sending" invalid requests. I know that there is = the C library, system call interface, block layer, etc.. in between, but I = just mean to say simply that using this tool results in this unexpected beh= avior. I don't mean to point blame at xfs or xfsprogs. If this turns ou= t to be a block layer issue, and this posting needs to be sent elsewhere, I= apologize and would appreciate being pointed in the right direction.

It almost feels like the block layer is splitting the b= ios up wrongly, is corrupting the bvecs, or is introducing a race. What'= ;s strange again, is that I have only seen this behavior with xfs tools, bu= t not ext3, or ext4 and e2fsprogs which has been working for years. It real= ly shouldn't matter though, because mkfs.xfs and xfs_repair are user sp= ace tools, so this shouldn't cause the block layer in the kernel to sen= d down invalid requests. I have been grappling with this for a few weeks, a= nd I am tempted to go to the old bio handling function instead just to see = if that would work out for me better, but that would be a big rewrite of th= e LLD. I am using an older Ubuntu 12.04 kernel 3.2.x so I am not able to go= to the newer multiqueue implementation.


Any ideas/suggestions?
Need mo= re information?


Thanks and Regards,=
Jamie Pocas

--001a1137e98679c1ed04f600d880-- From david@fromorbit.com Tue Apr 1 15:42:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D81F7F56 for ; Tue, 1 Apr 2014 15:42:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1C1EAC005 for ; Tue, 1 Apr 2014 13:42:34 -0700 (PDT) X-ASG-Debug-ID: 1396384950-04cb6c5677bc2e80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9BPGOszaejF3VDwK for ; Tue, 01 Apr 2014 13:42:31 -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: AloGAPEjO1N5LEcv/2dsb2JhbABZgwa/A4VdgRwXdIIlAQEBAwEnExwjBQsIAxgJJQ8FJQMhE4dxB9EJFxaOA1cHhDgEmFWKX4dbg0QpgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 02 Apr 2014 07:12:28 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WV5Vf-0004sc-J9; Wed, 02 Apr 2014 07:42:15 +1100 Date: Wed, 2 Apr 2014 07:42:15 +1100 From: Dave Chinner To: Jamie Pocas Cc: xfs@oss.sgi.com Subject: Re: xfs: invalid requests to request_fn from xfs_repair Message-ID: <20140401204215.GG17603@dastard> X-ASG-Orig-Subj: Re: xfs: invalid requests to request_fn from xfs_repair 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: 1396384951 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 01, 2014 at 04:16:39PM -0400, Jamie Pocas wrote: > Hi folks, > > I have a very simple block device driver that uses the request_fn style of > processing instead of the older bio handling or newer multiqueue approach. > I have been using this with ext3 and ext4 for years with no issues, but > scalability requirements have dictated that I move to xfs to better support > larger devices. > > I'm observing something weird in my request_fn. It seems like the block > layer is issuing invalid requests to my request function, and it really > manifests when I use xfs_repair. Here's some info: > > blk_queue_physical_block_size(q, 512) // should be no surprise > blk_queue_logical_block_size(q, 512) // should be no surprise 512 byte sectors. > blk_queue_max_segments(q, 128); /* 128 memory segments (page + > offset/length pairs) per request! */ > blk_queue_max_hw_sectors(q, CA_MAX_REQUEST_SECTORS); /* Up to 1024 sectors > (512k) per request hard limit in the kernel */ > blk_queue_max_segment_size(q, CA_MAX_REQUEST_BYTES); /* 512k (1024 sectors) > is the hard limit in the kernel */ And up to 512KB per IO. > While iterating through segments in rq_for_each_segment(), for some > requests I am seeing some odd behavior. > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 903 // Ok, > this looks normal > segment 1: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 7 // > Whoah... this doesn't look right to me Seems fine to me. There's absolutely no reason two separate IOs can't be sub-page sector aligned or discontiguous given the above configuration. If that's what the getblocks callback returned to the DIO layer, then that's what you're going to see in the bios... > You can see with segment 1, that the start sector is *NOT* > adjacent to the the previous segment's sectors (there's a gap from > sector 903 through 1022) and that the "sparse" request, for lack > of a better term, extends beyond the max I/O boundary of 512k. > Furthermore, this doesn't seem to jibe with what userspace is > doing, which is a simple 512k read all in one chunk with a single > userspace address. The read syscall is for a byte offset (from the fd, set by lseek) and a length, not a range of contiguous sectors on the device. That off/len tuple gets mapped by the underlying filesystem or device into an sector/len via a getblocks callback in the dio code and the bios are then built according to the mappings that are returned. So in many cases the IO that hits the block device looks nothing at all like the IO that came from userspace. > But when you look at the strace of what xfs_repair is doing, it's just an > innocuous read of 512k from sector 0. > > write(2, "Phase 1 - find and verify superb"..., 40Phase 1 - find and verify > superblock... > ) = 40 > mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) > = 0x7f00e2f42000 > mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) > = 0x7f00e2ec1000 > lseek(4, 0, SEEK_SET) = 0 > read(4, 0x7f00e2ec1200, 524288) = -1 EIO (Input/output error) > write(2, "superblock read failed, offset 0"..., 61superblock read failed, > offset 0, size 524288, ag 0, rval -1 > ) = 61 This is mostly meaningless without the command line you used for xfs_repair and the trace from the open() syscall parameters that returned fd 4 because we have no idea what the IO context actually is. > The reason you see the EIO is because I am failing a request in the driver > since it violates the restrictions I set earlier, is non-adjacent, and so I > am unable to satisfy it. > > *Point 1:* Shouldn't requests contain all segments that are adjacent on > disk Not necessarily, see above. > *Point 2:* If I ignore the incorrect iter.bio->bi_sector, and just > read/write the request out as if it were adjacent, I xfs_repair reports > corruption, Of course, because you read data from different sectors than was asked for by the higher layers. > and sure enough there are inodes which are zeroed out instead > of having the inode magic 0x494e ( "IN") as expected. So mkfs.xfs, while > not sending what appear to be illegal requests, is still resulting in > corruption. > > *Point 3:* Interestingly this goes away when I set > blk_queue_max_segments(q, 1), but this obviously cuts down on clustering, > and this of course kills performance. Is this indicative of anything in > particular that I could be doing wrong? Probably does, but I can't tell you what it may be... > Please cut me some slack when I say something like xfs_repair is "sending" > invalid requests. I know that there is the C library, system call > interface, block layer, etc.. in between, but I just mean to say simply > that using this tool results in this unexpected behavior. I don't mean to > point blame at xfs or xfsprogs. If this turns out to be a block layer > issue, and this posting needs to be sent elsewhere, I apologize and would > appreciate being pointed in the right direction. > > It almost feels like the block layer is splitting the bios up wrongly, is > corrupting the bvecs, or is introducing a race. What's strange again, is > that I have only seen this behavior with xfs tools, but not ext3, or ext4 > and e2fsprogs which has been working for years. It really shouldn't matter Because the XFS tools use direct IO, and the ext tools don't. Therefore the IO that the different tools pass through are completely different code paths in the kernel that have different constraints. e.g. buffered IO will always be page aligned, direct IO can be sector aligned.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 1 16:19:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 757007F58 for ; Tue, 1 Apr 2014 16:19:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6A6BAC005 for ; Tue, 1 Apr 2014 14:19:46 -0700 (PDT) X-ASG-Debug-ID: 1396387180-04bdf05dabbf0340001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id gvuutkTXVtbGz10S for ; Tue, 01 Apr 2014 14:19: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: AlsGABUsO1N5LEcv/2dsb2JhbABZgwa/BIVdgRwXdIIlAQEBAwEnExwjBQsIAw4KCSUPBSUDIRMbh1YH0GAXFokwhFMKBEkHhDgElCaEL5I6g0QpgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 02 Apr 2014 07:49:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WV65e-0004yS-HK; Wed, 02 Apr 2014 08:19:26 +1100 Date: Wed, 2 Apr 2014 08:19:26 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140401211926.GH17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> <20140331222246.GF17603@dastard> <20140401135518.GC21540@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140401135518.GC21540@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396387180 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4497 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 01, 2014 at 09:55:18AM -0400, Brian Foster wrote: > On Tue, Apr 01, 2014 at 09:22:47AM +1100, Dave Chinner wrote: > > On Fri, Mar 28, 2014 at 09:16:02AM -0400, Brian Foster wrote: > ... > > > /* > > > - * If we just got an ENOSPC, try to write back all dirty inodes to > > > - * convert delalloc space to free up some of the excess reserved > > > - * metadata space. > > > + * If we hit ENOSPC or a quota limit, use the selective nature of the > > > + * eofblocks scan to try and free up some lingering speculative > > > + * preallocation delalloc blocks. > > > + * > > > + * If we hit a quota limit, only scan for files covered by the quota. We > > > + * also consider ENOSPC here because project quota failure can return > > > + * ENOSPC instead of EDQUOT. The quota scanning only sets 'scanned' if > > > + * the inode is covered by a quota with low free space. This should > > > + * minimize interference with global ENOSPC handling. > > > + * > > > + * If a scan does not free enough space, resort to the inode flush big > > > + * hammer to convert delalloc space to free up some of the excess > > > + * reserved metadata space. > > > */ > > > + if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { > > > + scanned = xfs_inode_free_quota_eofblocks(ip); > > > + if (scanned) > > > + goto write_retry; > > > + } > > > + if (ret == -ENOSPC && !scanned) { > > > + struct xfs_eofblocks eofb = {0,}; > > > > IIRC, you can just use "{ 0 }" for initialisation, no "," needed. > > > > > + > > > + eofb.eof_scan_owner = ip->i_ino; /* for locking */ > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC | XFS_EOF_FLAGS_FLUSH; > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > + scanned = 1; > > > + goto write_retry; > > > + } > > > if (ret == -ENOSPC && !enospc) { > > > enospc = 1; > > > xfs_flush_inodes(ip->i_mount); > > > > This seems overly complex and fragile. I'd much prefer that we don't > > bury data writeback deep in the EOF block freeing code - we've done > > a lot of work in the past to remove exactly that sort of behaviour > > from XFS inode scanners. > > I think the fragility comes from the fact that we can't detect a > particular quota failure or a project quota failure from a global > failure. IIRC from looking at this way back when, there wasn't a clear > solution to that problem. It didn't seem worth getting too far into for > the purpose of this little bit of functionality. In that sense, the > fragility will be there regardless. > > It would be nice to simplify this, however. It took a little bit of > staring at this to try and make it effective and somewhat succinct. > > > I'd prefer to see something like this: > > > > if (ret == -EDQUOT && !enospc) { > > enospc = 1; > > xfs_inode_free_quota_eofblocks(ip); > > goto retry; > > else if (ret == -ENOSPC && !enospc) { > > enospc = 1; > > xfs_flush_inodes(ip->i_mount); > > .... > > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > goto retry; > > } > > > > What I don't like about this, in particular, is xfs_flush_inodes() could > be unnecessary. We have a max preallocation size of 8GB, so the > eofblocks scan alone can free up gigabytes of space. Now that I think of > it, this is kind of a flaw in the proposed logic as well. The issue is that an eofblock scan is expensive, and there's no limiting on how many inodes can have the EOF tag set and there's no limiting on the number of concurrent scans that can be run. i.e. when an active project that has many processes writing to it runs out of space, every process will enter xfs_icache_free_eofblocks() function and start issuing data flush requests on dirty inodes. It causes unbound writeback concurrency, and we know that this is a bad thing to do to your storage... xfs_flush_inodes() only runs one scan of the currently dirty inodes at a time because it serialises on the flusher thread. We get optimised writeback patterns rather than random data writeback from as many threads hitting the eofblocks scanner at once. History has shown that this is the most efficient way to clean dirty data - optimise once and in the correct place, then use it everywhere. Yes, it means that there is a global flush when a project quota runs out of space, but it means that we only do it once and we don't burn excessive CPU walking radix trees scanning inodes needlessly every time we get a storm of processes hammering project quota ENOSPC. FWIW, if we want to filter the list of dirty inodes to writeback, we should look at providing a filter callback to the generic inode code that gets called on each dirty inode. That way we can use the optimised writeback code to quickly find and dispatch only the dirty inodes that match the quota id we are having problems with.... > > This way has specific behaviours for EDQUOT vs ENOSPC, and we treat > > them appropriately with a minimum of differences. And ENOSPC is > > global, because we can't tell the difference here between a project > > quota ENOSPC and a global ENOSPC at this point. > > > > The main difference I see is that the original logic is centered around > figuring out how to do an eofblocks scan vs. xfs_flush_inodes() only > when necessary. In other words, we always attempt to do an eofblocks > scan first then fall back to the inode flush. Where it gets a bit ugly > is where we try to determine what kind of scan to run due to lack of > information. The flush aspect of things is a little confused as well I > suppose. > > Alternatively, the logic above is designed around categorization of the > possible error conditions. I agree that it is more simple, but not quite > as effective as noted above. We would continue to run a global inode > flush when eofblocks can clean up effectively for the time being or due > to a project quota failure that should ideally not impact the wider fs. Sure, but we've found in the past that just issuing a global flush is far better from both the CPU and IO efficiency POV than concurrent inode cache scans to find matching dirty inodes and flushing them. > I wonder if something like the following would simplify this enough, yet > still provide nicer behavior: > > /* > * If this is an allocation failure, attempt an eofblocks scan > * before we resort to an inode flush... > */ > if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { > scanned = xfs_inode_enospc_eofblocks(ip); > if (scanned) > goto retry; > scanned = 1; /* try this once */ > } > if (ret == -ENOSPC && !enospc) { > enospc = 1; > xfs_flush_inodes(); > goto retry; > } > > This consolidates the eofblocks scan logic to a separate helper to > simplify things. The helper can run the quota scan and/or the global > scan based on the data regarding the situation (i.e., the inode and > associated quota characteristics). This allows us to preserve the notion > of attempting a lightweight recovery first and a heavyweight recovery > second, reserving the inode flush for when space is truly tight. > Thoughts? It's still damn clunky, IMO. It's still trying to work around the fact that project quotas use ENOSPC rather than EDQUOT, and that makes the logic rather twisted. And it still has that hidden data flush in it so it can't really be called lightweight... > > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > > > index bd0ab7d..471ccfa 100644 > > > --- a/fs/xfs/xfs_icache.c > > > +++ b/fs/xfs/xfs_icache.c > > > @@ -33,6 +33,9 @@ > ... > > > + > > > + if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount)) { > > > + dq = xfs_inode_dquot(ip, XFS_DQ_PROJ); > > > + if (dq && xfs_dquot_lowsp(dq)) { > > > + eofb.eof_prid = xfs_get_projid(ip); > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > > + XFS_EOF_FLAGS_PRID| > > > + XFS_EOF_FLAGS_FLUSH; > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > + scanned = 1; > > > + } > > > + } > > > > I really don't like the fact that project quota is hiding a data > > flush in the "free_quota_eofblocks" logic. It just strikes me a the > > wrong thing to do because if it's a real ENOSPC we're just going to > > have to do this anyway... > > > > I was under the impression that a flush was important for project quotas > based on freeing up reserved metadata space (from our past discussions > on the original eofblocks work). I could have just misunderstood the > point at the time. It is important - I'm not saying that we should not flush dirty data. What I am disagreeing with is the implementation of data flushing in the patch.... > If so, I can just remove the flush flag on the > eofblocks scan in the logic proposed above and let the inode flush > handle this for both cases. > > If we go that route, any preference as to whether to keep the support > for doing a flush in eofblocks at all? I included it primarily for the > project quota case. With that dropped, I could just drop the first > couple of patches here. Yes, you could do that. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 1 17:04:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8AAB37F54 for ; Tue, 1 Apr 2014 17:04:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 316D930405F for ; Tue, 1 Apr 2014 15:04:02 -0700 (PDT) X-ASG-Debug-ID: 1396389837-04bdf05daabf23c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id xGFikzPXs7kJPQbS for ; Tue, 01 Apr 2014 15:03:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAKU2O1N5LEcv/2dsb2JhbABYgwa/C4VdgR0XdIIlAQEBAwE6HBUOBQsIAxgJEAITDwUlAyETFIddB9BaFxaOWgcnAoQPBJhVkjqDRCmBEB4 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 02 Apr 2014 08:33:57 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WV6mV-00055Q-Lp; Wed, 02 Apr 2014 09:03:43 +1100 Date: Wed, 2 Apr 2014 09:03:43 +1100 From: Dave Chinner To: Mark Tinguely Cc: XFS Mailing List Subject: Re: [PATCH] xfs: fix bad hash ordering Message-ID: <20140401220343.GI17603@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix bad hash ordering References: <20140328173430.622616177@sgi.com> <20140331001055.GD16336@dastard> <53399B06.5010400@sgi.com> <20140331214016.GD17603@dastard> <533A22DB.2030608@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <533A22DB.2030608@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: 1396389837 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4498 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 09:22:19PM -0500, Mark Tinguely wrote: > >Well, it's been over a week now and you're asking me to trust that > >someone I don't know and who has never submitted an xfstests before > >to do something in a timely manner so we can test a critical bug fix > >during a merge window. I'm willing to be pleasently surprised, but > >history tells me that people that report bugs rarely follow up with > >xfstest cases and it's usually the developer that fixes the bug that > >generates the xfstests patch. > > > >So if the xfstests patch doesn't arrive in the next few hours, can > >you please do that for us so I can get this sorted out for the merge > >window? > > > >Cheers, > > > >Dave. > > Dave, > > I think we need to take a step back and clear a little confusion here. > There are 2 different directory bugs. > > 1) Freeing of a already free extent. It presents with the error: > XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 16XX of file > fs/xfs/xfs_alloc.c. > Could be a right or a left edge (or both) that is free. > > Morgan Meyers sent the latest occurrence on > March 12, but others have been seeing it in the community code in the > last few mounts. SGI has been seeing it lately with big customers and > it has occurred off and on for 7-8 years according to our bug > database. I fail to see what this has to do with someone providing an xfstests case for the directory hash regression that was under discussion. Regardless, I'll take issue with your sweeping generalisation: not every XFS_WANT_CORRUPTED_GOTO error has the same cause. Indeed, most of the ones we've seen in the past 7-8 years we've found some kind of problem with hardware or fixed other bugs that have made it go away. The above issue that was reported is - so far - a one of a kind. I haven't seen any other reports that are even vaguely similar. If SGI has more customers hitting this problem, then it would be really nice if SGI could provide that information to the community rather than complain that they've been seeing it for 8 years. All that tells us in the community is that you aren't fixing bugs your customers are hitting and youren't passing them on to people who might be able to help... IOWs, if a vendor doesn't have the expertise to find the underlying problem and they need help tracking down such problems, then they should report the bugs to the list like end users do. > 2) Hannes Frederic Sowa found a different directory bug on Thursday, > March 27. He included a replicator. I bisected the source of the this > bug on Thursday. Walked the bisected patch on Friday and posted the > patch. The idea to make a xfstest from the replicator was also made > on March 28. > > This bug has been only known for 3 business days. I already promised > that a xfstest will be made. If you need to verify the problem and > the patch, there already is a replicator. The xfstest is *not for me* - it's for every distro and vendor out there that ships XFS in their product to realise that there's a serious bug they need fixing, and for them to be able to confirm that they've fixed it. I don't ask people to do stuff for my benefit - I'm perfectly capable of doing random special stuff for myself - but I will ask for things that are needed for the greater community. That's why I asked you to rewrite the commit message to explain what the cause and impact of problem being fixed was, and why I'm asking for the regression test to be provided quickly. Both of these things greatly benefit downstream users of XFS and xfstests, so upstream processes need to reflect this. Fixing the bug in the upstream tree is only half the job we need to do... It's a moot discussion now that the xfstest case has been posted.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From pocas.jamie@gmail.com Tue Apr 1 17:28:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 B94F37F58 for ; Tue, 1 Apr 2014 17:28:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E745AC009 for ; Tue, 1 Apr 2014 15:28:23 -0700 (PDT) X-ASG-Debug-ID: 1396391300-04cb6c5677bc8490001-NocioJ Received: from mail-lb0-f179.google.com (mail-lb0-f179.google.com [209.85.217.179]) by cuda.sgi.com with ESMTP id 0hM3vBrWDGRmKfH8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 01 Apr 2014 15:28:21 -0700 (PDT) X-Barracuda-Envelope-From: pocas.jamie@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.179] Received: by mail-lb0-f179.google.com with SMTP id p9so7617647lbv.10 for ; Tue, 01 Apr 2014 15:28:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=g0rUuf3puMDLkN7m+tTWglebMn4mZ23jPMURhYvZbgM=; b=aLVzu/l1IpZdgRtQc+Kzlq3YRLwJN1tSio6WaSVk2uJr8ZqF88MMPQH78XsFRqCvEh egyFrXu3P5hD0EsqAPScmyp+CjgsdkuQwIsPP783WziIiX+akCHhFSgPGsXhKm21iYt1 FpNbzmYGveFATU8yQf0LMvg8lhwZRlgB6yyHMwqX2cznZW+fORoVeGKkiTjtbdb7L/RG wsGgULD4WsmldPN4Oj+d7tKd4iar/fFL3WhP+UAYnQCxMaVlhZgUCdBJ4nvIELHPPyy1 7/tfDLigBDmAdC8SaRkdHikUqceV8WHiCE44REwprV8KtKegvzMOxrGMDUAZf5XYVJe2 XKpg== MIME-Version: 1.0 X-Received: by 10.152.209.70 with SMTP id mk6mr24644663lac.13.1396391299428; Tue, 01 Apr 2014 15:28:19 -0700 (PDT) Received: by 10.114.188.129 with HTTP; Tue, 1 Apr 2014 15:28:19 -0700 (PDT) In-Reply-To: <20140401204215.GG17603@dastard> References: <20140401204215.GG17603@dastard> Date: Tue, 1 Apr 2014 18:28:19 -0400 Message-ID: Subject: Re: xfs: invalid requests to request_fn from xfs_repair From: Jamie Pocas X-ASG-Orig-Subj: Re: xfs: invalid requests to request_fn from xfs_repair To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113802465eb67c04f602affb X-Barracuda-Connect: mail-lb0-f179.google.com[209.85.217.179] X-Barracuda-Start-Time: 1396391300 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4499 Rule breakdown below pts rule name 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 --001a113802465eb67c04f602affb Content-Type: text/plain; charset=ISO-8859-1 I have to say, thanks very much for the lightning fast response. Comments are inline. I think the punchline is going to end up being that I probably need to learn some more about the effects of O_DIRECT on the I/O path and how it ends up in the request_queue. It's tempting now to regress back to a bio-handling function, do my own merging, and see if I can avoid the problem, but I am stubborn so I will probably stick it out for as long as I can. On Tue, Apr 1, 2014 at 4:42 PM, Dave Chinner wrote: > On Tue, Apr 01, 2014 at 04:16:39PM -0400, Jamie Pocas wrote: > > blk_queue_physical_block_size(q, 512) // should be no surprise > > blk_queue_logical_block_size(q, 512) // should be no surprise > > 512 byte sectors. > > > blk_queue_max_segments(q, 128); /* 128 memory segments (page + > > offset/length pairs) per request! */ > > blk_queue_max_hw_sectors(q, CA_MAX_REQUEST_SECTORS); /* Up to 1024 > sectors > > (512k) per request hard limit in the kernel */ > > blk_queue_max_segment_size(q, CA_MAX_REQUEST_BYTES); /* 512k (1024 > sectors) > > is the hard limit in the kernel */ > > And up to 512KB per IO. > > > While iterating through segments in rq_for_each_segment(), for some > > requests I am seeing some odd behavior. > > > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 903 // Ok, > > this looks normal > > segment 1: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 7 // > > Whoah... this doesn't look right to me > > Seems fine to me. There's absolutely no reason two separate IOs > can't be sub-page sector aligned or discontiguous given the above > configuration. If that's what the getblocks callback returned to the > DIO layer, then that's what you're going to see in the bios... > > I guess my assumption that sectors would be adjacent was invalid, but this is what I have read in ldd3 and other books and seen in some driver examples. So I apologize for my folly and it's another lesson in not believing everything you see on the net. The back half of my driver is really optimized for transferring a single contiguous lba & transfer length pair (ala SCSI WRITE 16 for example). However in desperation, I had changed the driver to support requests like this (with disjoint sector ranges) but it still seemed odd to me that occasionally some requests would even have multiple segments that would *write* the same sectors/lengths. For example I also see requests like the following. Given: rq_data_dir(rq) == 1 (i.e. a write) segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Ok segment 1: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Again? segment 2: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Yet again? segment 3: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Really? ... segment 126: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // What's going on? // Reminder: segment limit is 128 segment 127: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 1 // Haha, bet you though I was going to say sector = 0! This makes sense for reads, since maybe multiple user buffers wanted to read the same sectors at [around] the same time so it batched them in one request (temporal + spatial locality), but it doesn't make a lot of sense to me for writes. That seems inefficient at best. Wouldn't the last write win? Even still, I occasionally see requests with more segments than the max (perhaps I am counting segments wrong too). This was commented on by Jens Axboe years ago here, but still seems to happen on my Ubuntu 12.04 w/ 3.2 kernel occasionally: https://lkml.org/lkml/2009/2/4/465 > You can see with segment 1, that the start sector is *NOT* > > adjacent to the the previous segment's sectors (there's a gap from > > sector 903 through 1022) and that the "sparse" request, for lack > > of a better term, extends beyond the max I/O boundary of 512k. > > Furthermore, this doesn't seem to jibe with what userspace is > > doing, which is a simple 512k read all in one chunk with a single > > userspace address. > > The read syscall is for a byte offset (from the fd, set by lseek) > and a length, not a range of contiguous sectors on the device. That > off/len tuple gets mapped by the underlying filesystem or device > into an sector/len via a getblocks callback in the dio code and the > bios are then built according to the mappings that are returned. So > in many cases the IO that hits the block device looks nothing at all > like the IO that came from userspace. > > In general if I were reading a file I agree 100%, but this was the read call issued by xfs_repair to read the superblock directly from a block device. So I, perhaps wrongly, anticipated straightforward requests or maybe even a single 512k request coming down to the request_fn. I should have mentioned that this was observed while using xfs_repair earlier in the email though, so no offense intended. There's more of the xfs_repair strace in my response to your next comment below. It fails very early as you can imagine when xfs_repair can't read the superblock. > > But when you look at the strace of what xfs_repair is doing, it's just an > > innocuous read of 512k from sector 0. > > > > write(2, "Phase 1 - find and verify superb"..., 40Phase 1 - find and > verify > > superblock... > > ) = 40 > > mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, > 0) > > = 0x7f00e2f42000 > > mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, > 0) > > = 0x7f00e2ec1000 > > lseek(4, 0, SEEK_SET) = 0 > > read(4, 0x7f00e2ec1200, 524288) = -1 EIO (Input/output error) > > write(2, "superblock read failed, offset 0"..., 61superblock read failed, > > offset 0, size 524288, ag 0, rval -1 > > ) = 61 > > This is mostly meaningless without the command line you used for > xfs_repair and the trace from the open() syscall parameters that > returned fd 4 because we have no idea what the IO context actually > is. > > Yes, sorry about that I was trying to not bloat the thread with all the localizations loading noise. I'm going to try to strip some of those out and post more of the strace below. I *do* see the O_DIRECT flag as expected. Here's the block device being opened. All I did was "xfs_repair -n /dev/tsca0", hence the O_RDONLY flag. open("/dev/tsca0", O_RDONLY|O_DIRECT) = 4 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(251, 0), ...}) = 0 fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(251, 0), ...}) = 0 ioctl(4, BLKGETSIZE64, 0x7fff8f759270) = 0 ioctl(4, BLKSSZGET, 0x6732e0) = 0 chdir("/home/jpocas/source/xfs/drivers") = 0 brk(0x23f9000) = 0x23f9000 close(3) = 0 getrlimit(RLIMIT_FSIZE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=2570, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f00e2fc2000 read(3, "# Locale name alias data base.\n#"..., 4096) = 2570 read(3, "", 4096) = 0 close(3) = 0 munmap(0x7f00e2fc2000, 4096) = 0 write(2, "Phase 1 - find and verify superb"..., 40Phase 1 - find and verify superblock... ) = 40 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f00e2f42000 mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f00e2ec1000 lseek(4, 0, SEEK_SET) = 0 read(4, 0x7f00e2ec1200, 524288) = -1 EIO (Input/output error) write(2, "superblock read failed, offset 0"..., 61superblock read failed, offset 0, size 524288, ag 0, rval -1 ) = 61 write(2, "\nfatal error -- ", 16 fatal error -- ) = 16 write(2, "Input/output error\n", 19Input/output error ) = 19 exit_group(1) = ? > > The reason you see the EIO is because I am failing a request in the > driver > > since it violates the restrictions I set earlier, is non-adjacent, and > so I > > am unable to satisfy it. > > > > *Point 1:* Shouldn't requests contain all segments that are adjacent on > > disk > > Not necessarily, see above. > > Got it. I need to look at the DIO code path in the kernel. > > *Point 2:* If I ignore the incorrect iter.bio->bi_sector, and just > > read/write the request out as if it were adjacent, I xfs_repair reports > > corruption, > > Of course, because you read data from different sectors than was > asked for by the higher layers. > > Sorry, this was just out of desperation and another data point, ridiculous as it may sound. I have been looking at this for a couple weeks now so I am taking wild shots in the dark. > > and sure enough there are inodes which are zeroed out instead > > of having the inode magic 0x494e ( "IN") as expected. So mkfs.xfs, while > > not sending what appear to be illegal requests, is still resulting in > > corruption. > > > > *Point 3:* Interestingly this goes away when I set > > blk_queue_max_segments(q, 1), but this obviously cuts down on clustering, > > and this of course kills performance. Is this indicative of anything in > > particular that I could be doing wrong? > > Probably does, but I can't tell you what it may be... > > > Please cut me some slack when I say something like xfs_repair is > "sending" > > invalid requests. I know that there is the C library, system call > > interface, block layer, etc.. in between, but I just mean to say simply > > that using this tool results in this unexpected behavior. I don't mean to > > point blame at xfs or xfsprogs. If this turns out to be a block layer > > issue, and this posting needs to be sent elsewhere, I apologize and would > > appreciate being pointed in the right direction. > > > > It almost feels like the block layer is splitting the bios up wrongly, is > > corrupting the bvecs, or is introducing a race. What's strange again, is > > that I have only seen this behavior with xfs tools, but not ext3, or ext4 > > and e2fsprogs which has been working for years. It really shouldn't > matter > > Because the XFS tools use direct IO, and the ext tools don't. > Therefore the IO that the different tools pass through are completely > different code paths in the kernel that have different constraints. > e.g. buffered IO will always be page aligned, direct IO can be > sector aligned.... > > That makes sense and I do see that O_DIRECT is being used by both mkfs.xfs and xfs_repair. I guess I am off to investigate the O_DIRECT code path. --001a113802465eb67c04f602affb Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
I have to say, thanks very much for the lightning fast res= ponse. Comments are inline. I think the punchline is going to end up being = that I probably need to learn some more about the effects of O_DIRECT on th= e I/O path and how it ends up in the request_queue. It's tempting now t= o regress back to a bio-handling function, do my own merging, and see if I = can avoid the problem, but I am stubborn so I will probably stick it out fo= r as long as I can.

On Tue, Apr 1, 2014 at 4:42 PM, Dave Chinner= <david@fromorbit.com> wrote:
On Tue, Apr 01, 2014 at 04:16:39PM -0400, Jamie Pocas wrote= :
> blk_queue_physical_block_size(q, 512) // should be no surprise > blk_queue_logical_block_size(q, 512) // should be no surprise

512 byte sectors.

> blk_queue_max_segments(q, 128); /* 128 memory segments (page +
> offset/length pairs) per request! */
> blk_queue_max_hw_sectors(q, CA_MAX_REQUEST_SECTORS); /* Up to 1024 sec= tors
> (512k) per request hard limit in the kernel */
> blk_queue_max_segment_size(q, CA_MAX_REQUEST_BYTES); /* 512k (1024 sec= tors)
> is the hard limit in the kernel */

And up to 512KB per IO.

> While iterating through segments in rq_for_each_segment(), for some > requests I am seeing some odd behavior.
>
> segment 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D 90= 3 =A0 // Ok,
> this looks normal
> segment 1: iter.bio->bi_sector =3D 1023, blk_rq_cur_sectors(rq) =3D= 7 //
> Whoah... this doesn't look right to me

Seems fine to me. There's absolutely no reason two separate IOs can't be sub-page sector aligned or discontiguous given the above
configuration. If that's what the getblocks callback returned to the DIO layer, then that's what you're going to see in the bios...


I guess my assum= ption that sectors would be adjacent was invalid, but this is what I have r= ead in ldd3 and other books and seen in some driver examples. So I apologiz= e for my folly and it's another lesson in not believing everything you = see on the net. The back half of my driver is really optimized for transfer= ring a single contiguous lba & transfer length pair (ala SCSI WRITE 16 = for example). However in desperation, I had changed the driver to support r= equests like this (with disjoint sector ranges) but it still seemed odd to = me that occasionally some requests would even have multiple segments that w= ould *write* the same sectors/lengths. For example I also see requests like= the following.

Given: rq_data_dir(rq) =3D=3D 1 (i.e. a write)
segment =A0 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0// Ok
segment =A0 1: iter.bio->bi_sector =3D 0, b= lk_rq_cur_sectors(rq) =3D 7 =A0 =A0// Again?
segment =A0 2: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0// Yet again?
segment =A0 3: iter.bio->bi_sector = =3D 0, blk_rq_cur_sectors(rq) =3D 7 =A0 =A0// Really?
...
segment 126: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D 7 = =A0 =A0// What's going on?
// Reminder: segment limit is 128
segment 127: iter.bio->= bi_sector =3D 1023, blk_rq_cur_sectors(rq) =3D 1 // Haha, bet you though I = was going to say sector =3D 0!

This makes se= nse for reads, since maybe multiple user buffers wanted to read the same se= ctors at [around] the same time so it batched them in one request (temporal= + spatial locality), but it doesn't make a lot of sense to me for writ= es. That seems inefficient at best. Wouldn't the last write win?

Even still, I occasionally see requests with more segme= nts than the max (perhaps I am counting segments wrong too). This was comme= nted on by Jens Axboe years ago here, but still seems to happen on my Ubunt= u 12.04 w/ 3.2 kernel occasionally:=A0https://lkml.org/lkml/2009/2/4/465

> You can see with segment 1, that the start sector is *NOT*
> adjacent to the the previous segment's sectors (there's a gap = from
> sector 903 through 1022) and that the "sparse" request, for = lack
> of a better term, extends beyond the max I/O boundary of 512k.
> Furthermore, this doesn't seem to jibe with what userspace is
> doing, which is a simple 512k read all in one chunk with a single
> userspace address.

The read syscall is for a byte offset (from the fd, set by lseek)
and a length, not a range of contiguous sectors on the device. That
off/len tuple gets mapped by the underlying filesystem or device
into an sector/len via a getblocks callback in the dio code and the
bios are then built according to the mappings that are returned. So
in many cases the IO that hits the block device looks nothing at all
like the IO that came from userspace.


In general if I = were reading a file I agree 100%, but this was the read call issued by xfs_= repair to read the superblock directly from a block device. So I, perhaps w= rongly, anticipated straightforward requests or maybe even a single 512k re= quest coming down to the request_fn. I should have mentioned that this was = observed while using xfs_repair earlier in the email though, so no offense = intended. There's more of the xfs_repair strace in my response to your = next comment below. It fails very early as you can imagine when xfs_repair = can't read the superblock.


> But when you look at the strace of what xfs_repair is doing, it's = just an
> innocuous read of 512k from sector 0.
>
> write(2, "Phase 1 - find and verify superb"..., 40Phase 1 - = find and verify
> superblock...
> ) =3D 40
> mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1= , 0)
> =3D 0x7f00e2f42000
> mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1= , 0)
> =3D 0x7f00e2ec1000
> lseek(4, 0, SEEK_SET) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =3D 0
> read(4, 0x7f00e2ec1200, 524288) =A0 =A0 =A0 =A0 =3D -1 EIO (Input/outp= ut error)
> write(2, "superblock read failed, offset 0"..., 61superblock= read failed,
> offset 0, size 524288, ag 0, rval -1
> ) =3D 61

This is mostly meaningless without the command line you used for
xfs_repair and the trace from the open() syscall parameters that
returned fd 4 because we have no idea what the IO context actually
is.


Yes, sorry about= that I was trying to not bloat the thread with all the localizations loadi= ng noise. I'm going to try to strip some of those out and post more of = the strace below. I *do* see the O_DIRECT flag as expected. Here's the = block device being opened. All I did was "xfs_repair -n /dev/tsca0&quo= t;, hence the O_RDONLY flag.

open("/dev/tsca0", O_RDONLY|O_DIRECT) = =A0 =3D 4
fstat(4, {st_mode=3DS_IFBLK|0660, st_rdev=3Dmakedev(251= , 0), ...}) =3D 0
fstat(4, {st_mode=3DS_IFBLK|0660, st_rdev=3Dmak= edev(251, 0), ...}) =3D 0
ioctl(4, BLKGETSIZE64, 0x7fff8f759270) =A0=3D 0
ioctl(4, BLK= SSZGET, 0x6732e0) =A0 =A0 =A0 =A0 =A0 =3D 0
chdir("/home/jpo= cas/source/xfs/drivers") =3D 0
brk(0x23f9000) =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=3D 0x23f9000
close(3) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0=3D 0
getrlimit(RLIMIT_FSIZE, {rlim_cur=3DRLIM_INFINITY, rlim_= max=3DRLIM_INFINITY}) =3D 0
open("/usr/share/locale/locale.a= lias", O_RDONLY|O_CLOEXEC) =3D 3
fstat(3, {st_mode=3DS_IFREG|0644, st_size=3D2570, ...}) =3D 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = =3D 0x7f00e2fc2000
read(3, "# Locale name alias data base.\n= #"..., 4096) =3D 2570
read(3, "", 4096) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =3D 0
close(3) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0=3D 0
munmap(0x7f00e2fc2000, 4096) =A0 =A0 =A0= =A0 =A0 =A0=3D 0
write(2, "Phase 1 - find and verify superb= "..., 40Phase 1 - find and verify superblock...
) =3D 40
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_= PRIVATE|MAP_ANONYMOUS, -1, 0) =3D 0x7f00e2f42000
mmap(NULL, 52838= 4, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =3D 0x7f00e2ec10= 00
lseek(4, 0, SEEK_SET) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =3D 0
<= div>read(4, 0x7f00e2ec1200, 524288) =A0 =A0 =A0 =A0 =3D -1 EIO (Input/outpu= t error)
write(2, "superblock read failed, offset 0"...= , 61superblock read failed, offset 0, size 524288, ag 0, rval -1
) =3D 61
write(2, "\nfatal error -- ", 16
fatal error -- ) =A0 =A0 =A0 =3D 16
write(2, "Input/ou= tput error\n", 19Input/output error
) =A0 =A0=3D 19
exit_group(1) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =3D ?

=A0
> The reason you see the EIO is because I am failing a request in the dr= iver
> since it violates the restrictions I set earlier, is non-adjacent, and= so I
> am unable to satisfy it.
>
> *Point 1:* Shouldn't requests contain all segments that are = adjacent on
> disk

Not necessarily, see above.


Got it. I need to look at the DIO code= path in the kernel.
=A0
> *Point 2:* If I ignore the incorrect iter.bio->bi_sector, and just<= br>
> read/write the request out as if it were adjacent, I x= fs_repair reports
> corruption,

Of course, because you read data from different sectors than was
asked for by the higher layers.


Sorry, this was = just out of desperation and another data point, ridiculous as it may sound.= I have been looking at this for a couple weeks now so I am taking wild sho= ts in the dark.
=A0
> and sure enough there are inodes which are zeroed out instead
> of having the inode magic 0x494e ( "IN") as expected. So mkf= s.xfs, while
> not sending what appear to be illegal requests, is still resulting in<= br> > corruption.
>
> *Point 3:* Interestingly this goes away when I set
> blk_queue_max_segments(q, 1), but this obviously cuts = down on clustering,
> and this of course kills performance. Is this indicative of anything i= n
> particular that I could be doing wrong?

Probably does, but I can't tell you what it may be...

> Please cut me some slack when I say something like xfs_repair is "= ;sending"
> invalid requests. I know that there is the C library, system call
> interface, block layer, etc.. in between, but I just mean to say simpl= y
> that using this tool results in this unexpected behavior. I don't = mean to
> point blame at xfs or xfsprogs. If this turns out to be a block layer<= br> > issue, and this posting needs to be sent elsewhere, I apologize and wo= uld
> appreciate being pointed in the right direction.
>
> It almost feels like the block layer is splitting the bios up wrongly,= is
> corrupting the bvecs, or is introducing a race. What's strange aga= in, is
> that I have only seen this behavior with xfs tools, but not ext3, or e= xt4
> and e2fsprogs which has been working for years. It really shouldn'= t matter

Because the XFS tools use direct IO, and the ext tools don't.
Therefore the IO that the different tools pass through are completely
different code paths in the kernel that have different constraints.
e.g. buffered IO will always be page aligned, direct IO can be
sector aligned....


That makes sense and I do see that O_D= IRECT is being used by both mkfs.xfs and xfs_repair. I guess I am off to in= vestigate the O_DIRECT code path.
--001a113802465eb67c04f602affb-- From david@fromorbit.com Tue Apr 1 17:28:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F9B37F58 for ; Tue, 1 Apr 2014 17:28:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88EEE30405F for ; Tue, 1 Apr 2014 15:28:40 -0700 (PDT) X-ASG-Debug-ID: 1396391318-04cb6c5677bc84f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4F8a5bRN5krUwvte for ; Tue, 01 Apr 2014 15:28:38 -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: AlsGAJM8O1N5LEcv/2dsb2JhbABZDoJ4vxCFXYEdF3SCJQEBAQMBOhweBQULCAMYCSUPBSUDIRMbh1YH0F0XFo14EQFQB4Q4BJRqg2uSOoFxf1QpgTU Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 02 Apr 2014 08:58:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WV7AN-000598-RI; Wed, 02 Apr 2014 09:28:23 +1100 Date: Wed, 2 Apr 2014 09:28:23 +1100 From: Dave Chinner To: Theodore Ts'o Cc: Sedat Dilek , lsf@lists.linux-foundation.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140401222823.GJ17603@dastard> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140401023711.GE4911@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396391318 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 10:37:11PM -0400, Theodore Ts'o wrote: > On Mon, Mar 31, 2014 at 01:51:48PM +1100, Dave Chinner wrote: > > > especially given that based on a challenge which > > > Greg K-H gave us at the kernel pannel at Collab Summit, > > ^^^^ > > > > Hmmmm. Not the way I remember it. Perhaps I should go look at the > > video and check that Greg was addressing me directly as the xfstests > > maintainer with those comments. After all, those lights on stage can > > be blinding..... > > Sorry, I thought in the discussions we had afterwards you agreed with > me that *some* way of running xfststs easily was going to be a > requirement, as it is somewhat doubtful that most non-file system > developers will have the patience to deal with the "some assembly > required" in order to actually run xfstests, and actually putting > xfstests into the kernel sources wasn't going to be particularly > useful unless we have some way of making it possible to run the tests > in a semi-automated fashion. Right, there was follup discussion about how we could potentially acheive what Greg wanted, but it was more of a "we've got pieces that we might be able to leverage" discussion than anything else. > Whether that method is based on what I have in xfstests-bld, or some > other way is I agree certainly up for discussion. At the moment the > system I have is only set up for ext4, although I will happily accept > patches and work with other file system developers to enhance it so it > can work with other file systems. Right, that's pretty much where we finished the discussion at the collab summit ;) But that this is why I responded to your previous email - while you likely had the best of intentions, you gave the impression that xfstests-bld type of solution was fait accompli, when in fact we haven't even really started defining the problem space and gathering requirements yet... > And of course, whether changes in the mainline kernel tree are > manually propagated changes from the xfstests.git tree, or whether > primary development happens in the kernel tree, is ultimately going to > be up to you and the XFS developers who have stewardship of xfstests. > I'm not sure I would be that excited about manual propagation of > changes from one git tree to another, but that is of course, up to > you. And this is exactly my point, Ted. Again, you are presuming that the implementation is going to require syncing commits across disparate git trees and other such games will be needed to maintain separate packages. Nothing could be further from the truth: we already have this problem with the shared XFS kernel/userspace code and it's a royal PITA keeping them in sync. Hence introducing the same maintenance problem with new code and infrastructure is highly undesirable and something we'll try to avoid at all costs. Basically, we need to start with a proposal that outlines what we need in the kernel tree for testing filesystems in place and go from there. Once we've agreed on the big picture stuff and solved the maintenance, packaging and "how do we run in place" architectural issues, then we can start working on the implementation. I'm hoping to write something up in the next week or two to being the process and discussions, because I'm sure the -stable folk will have some input on what they would like to be able to do.... :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From hannes@stressinduktion.org Tue Apr 1 18:03:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B35B97F61 for ; Tue, 1 Apr 2014 18:03:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 876A830405F for ; Tue, 1 Apr 2014 16:03:12 -0700 (PDT) X-ASG-Debug-ID: 1396393390-04cbb054b99dfd60001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id uGIiV0rlZwSOWCeu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 01 Apr 2014 16:03:10 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id 92E131A0C25C; Wed, 2 Apr 2014 01:03:09 +0200 (CEST) Date: Wed, 2 Apr 2014 01:03:09 +0200 From: Hannes Frederic Sowa To: xfs@oss.sgi.com Cc: david@fromorbit.com, tinguely@sgi.com Subject: [PATCH v2 xfstests] add tests for unlinking directories with hash collisions Message-ID: <20140401230309.GC16157@order.stressinduktion.org> X-ASG-Orig-Subj: [PATCH v2 xfstests] add tests for unlinking directories with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <20140401184903.GA13434@order.stressinduktion.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20140401184903.GA13434@order.stressinduktion.org> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1396393390 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Mark Tinguely says: This tests use the XFS hash routine to create several directories that all have the same small (64) group of hashes. Commit f5ea110 ("xfs: add CRCs to dir2/da node) added a hash ordering regression and this test make sure the directory name hash order is preserved. Sample backtrace this test tries to prevent in future: [ 3856.245843] XFS (vda1): Internal error xfs_trans_cancel at line 966 of file fs/xfs/xfs_trans.c. Caller 0xffffffffa01186bc [ 3856.249049] CPU: 1 PID: 866 Comm: rm Not tainted 3.13.6-200.fc20.x86_64 #1 [ 3856.250966] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 3856.252615] 000000000000000c ffff8800d23a7d68 ffffffff8168730c ffff8800cf5462b8 [ 3856.254823] ffff8800d23a7d80 ffffffffa00d00cb ffffffffa01186bc ffff8800d23a7da8 [ 3856.257241] ffffffffa00e5459 ffff8800d9ac3400 ffff8800d23a7e30 ffff8800371b6800 [ 3856.259420] Call Trace: [ 3856.260172] [] dump_stack+0x45/0x56 [ 3856.261717] [] xfs_error_report+0x3b/0x40 [xfs] [ 3856.263472] [] ? xfs_remove+0x1ac/0x370 [xfs] [ 3856.270838] [] xfs_trans_cancel+0xd9/0x100 [xfs] [ 3856.272783] [] xfs_remove+0x1ac/0x370 [xfs] [ 3856.274531] [] xfs_vn_unlink+0x4b/0x90 [xfs] [ 3856.276286] [] vfs_rmdir+0xa8/0x100 [ 3856.277821] [] do_rmdir+0x17d/0x1d0 [ 3856.281021] [] ? ____fput+0xe/0x10 [ 3856.285261] [] ? task_work_run+0xac/0xe0 [ 3856.286952] [] ? do_notify_resume+0x61/0xa0 [ 3856.288693] [] SyS_unlinkat+0x25/0x40 [ 3856.290407] [] system_call_fastpath+0x16/0x1b [ 3856.292685] XFS (vda1): xfs_do_force_shutdown(0x8) called from line 967 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa00e5472 [ 3856.627330] XFS (vda1): Corruption of in-memory data detected. Shutting down filesystem [ 3856.627332] XFS (vda1): Please umount the filesystem and rectify the problem(s) With help from Mark Tinguely, thanks very much! Cc: Dave Chinner Cc: Mark Tinguely Signed-off-by: Hannes Frederic Sowa --- .gitignore | 1 + src/Makefile | 2 +- src/generate-hash-collision.c | 223 ++++++++++++++++++++++++++++++++++++++++++ tests/xfs/307 | 63 ++++++++++++ tests/xfs/307.out | 28 ++++++ tests/xfs/group | 1 + 6 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 src/generate-hash-collision.c create mode 100755 tests/xfs/307 create mode 100644 tests/xfs/307.out diff --git a/.gitignore b/.gitignore index b6f2463..049f2e0 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ /src/fsync-tester /src/ftrunc /src/genhashnames +/src/generate-hash-collision /src/getdevicesize /src/getpagesize /src/godown diff --git a/src/Makefile b/src/Makefile index 6509f2d..1e9ec61 100644 --- a/src/Makefile +++ b/src/Makefile @@ -11,7 +11,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ devzero feature alloc fault fstest t_access_root \ godown resvtest writemod makeextents itrash rename \ multi_open_unlink dmiperf unwritten_sync genhashnames t_holes \ - t_mmap_writev t_truncate_cmtime + t_mmap_writev t_truncate_cmtime generate-hash-collision LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ diff --git a/src/generate-hash-collision.c b/src/generate-hash-collision.c new file mode 100644 index 0000000..76c7b3e --- /dev/null +++ b/src/generate-hash-collision.c @@ -0,0 +1,223 @@ +/* + * Generates files or directories with hash collisions on a XFS filesystem + * Copyright (C) 2014 Hannes Frederic Sowa + * + * 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 will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static enum { + ILLEGAL, + DIRECTORY, + FILENAME, +} touch_mode = ILLEGAL; + +static bool one_hash = false; + +static uint32_t rol32(uint32_t word, unsigned int shift) +{ + return (word << shift) | (word >> (32 - shift)); +} + +static uint32_t xfs_da_hashname(const uint8_t *name, int namelen) +{ + uint32_t hash; + + for (hash = 0; namelen >= 4; namelen -= 4, name += 4) + hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^ + (name[3] << 0) ^ rol32(hash, 7 * 4); + + if (namelen) { + fprintf(stderr, + "internal error: " + "misbalanced input buffer to xfs_da_hashname - " + "overlapping %d bytes\n", namelen); + exit(1); + } + + return hash; +} + +static uint8_t gen_rand(void) +{ + uint8_t r; + while (!(r = rand())); + return r; +} + +static uint8_t buffer[252+1] = {0}; + +static void gen_name(void) +{ + int idx; + uint32_t hash, last; + +again: + for (idx = 0; idx < 252-4; idx+=4) { + buffer[idx + 0] = gen_rand(); + buffer[idx + 1] = gen_rand(); + buffer[idx + 2] = gen_rand(); + buffer[idx + 3] = gen_rand(); + } + + hash = rol32(xfs_da_hashname(buffer, 248), 7 * 4); + last = hash ^ ~0U; + + if (last == 0) + goto again; + + buffer[idx + 0] = (last >> 21) & 0xff; + buffer[idx + 1] = (last >> 14) & 0xff; + buffer[idx + 2] = (last >> 7) & 0xff; + buffer[idx + 3] = last & 0xff; + + if (memchr(buffer, '.', sizeof(buffer)) || + memchr(buffer, '/', sizeof(buffer))) + goto again; + + if (one_hash) { + /* very poor - can be improved later */ + static bool done = false; + static uint32_t filter; + + if (!done) { + filter = xfs_da_hashname(buffer, 252); + done = true; + return; + } + + if (filter != xfs_da_hashname(buffer, 252)) + goto again; + } +} + +static int touch(const char *buffer) +{ + if (touch_mode == DIRECTORY) { + if (mkdir(buffer, S_IRWXU)) { + /* ignore if directory is already present */ + if (errno == EEXIST) + return 0; + perror("mkdir with random directory name"); + return 1; + } + } else if (touch_mode == FILENAME) { + int fd = creat(buffer, S_IRWXU); + if (fd == -1) { + /* ignore duplicate files */ + if (errno == EEXIST) + return 0; + perror("creat with random directory name"); + return 1; + } + if (close(fd)) { + perror("close is leaking a file descriptor"); + return 1; + } + return 0; + } + return 0; +} + +static void do_seed(void) +{ + struct timeval tv; + if (gettimeofday(&tv, NULL)) { + perror("gettimeofday"); + exit(1); + } + srand(tv.tv_sec ^ tv.tv_usec ^ getpid()); +} + +static void usage_and_exit(const char *pname) +{ + fprintf(stderr, "usage: %s [-d] [-f] [-n num] [-s] directory\n" + "\t-f\tcreate files (the default)\n" + "\t-d\tcreate directories\n" + "\t-n num\tcreate num directories or files (default 200000)\n" + "\t-s\tonly generate one hash\n" + "\tdirectory\tthe directory to chdir() to\n", + pname); + exit(1); +} + +int main(int argc, char **argv) +{ + const char allopts[] = "hsdfn:"; + int c, orig_cycles, errors = 0, cycles = 200000; + + while ((c = getopt(argc, argv, allopts)) != -1) { + switch (c) { + case 'd': + if (touch_mode != ILLEGAL) + usage_and_exit(argv[0]); + touch_mode = DIRECTORY; + break; + case 'f': + if (touch_mode != ILLEGAL) + usage_and_exit(argv[0]); + touch_mode = FILENAME; + break; + case 'n': + errno = 0; + if (sscanf(optarg, "%d", &cycles) != 1 || + errno == ERANGE) { + fputs("could not parse number of iterations", stderr); + exit(1); + } + break; + case 's': + one_hash = true; + break; + default: + usage_and_exit(argv[0]); + break; + } + } + + if (argc <= optind || touch_mode == ILLEGAL) + usage_and_exit(argv[0]); + + if (chdir(argv[optind])) { + perror("chdir"); + exit(1); + } + + orig_cycles = cycles; + + do_seed(); + + while (cycles--) { + gen_name(); + errors += touch((char *)buffer); + } + + if (errors) + fprintf(stderr, "creating %d %s caused %d errors\n", + orig_cycles, touch_mode == FILENAME ? "files" : "directories", + errors); + + return 0; +} diff --git a/tests/xfs/307 b/tests/xfs/307 new file mode 100755 index 0000000..b31cc13 --- /dev/null +++ b/tests/xfs/307 @@ -0,0 +1,63 @@ +#! /bin/bash +# FS QA Test No. 307 +# +# Test that directory hash entries are place in the correct order. +# commit f5ea110 ("xfs: add CRCs to dir2/da node blocks") left the +# directory with incorrect hash ordering. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Hannes Frederic Sowa. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/repair + +# real QA test starts here + +_supported_fs xfs +_supported_os Linux +_require_scratch + +_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs +_scratch_mount | _filter_scratch + +mkdir $SCRATCH_MNT/x +$here/src/generate-hash-collision -d -n 200000 $SCRATCH_MNT/x +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +_scratch_xfs_repair 2>&1 | _filter_repair + +# success, all done +status=0 +exit diff --git a/tests/xfs/307.out b/tests/xfs/307.out new file mode 100644 index 0000000..eaf5716 --- /dev/null +++ b/tests/xfs/307.out @@ -0,0 +1,28 @@ +QA output created by 307 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done diff --git a/tests/xfs/group b/tests/xfs/group index ba34650..a1ef7f9 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -189,3 +189,4 @@ 304 auto quick quota 305 auto quota 306 auto stress log metadata repair +307 auto dir -- 1.9.0 From bfoster@redhat.com Tue Apr 1 19:02:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E2B8F7F63 for ; Tue, 1 Apr 2014 19:02:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9010B8F8065 for ; Tue, 1 Apr 2014 17:02:54 -0700 (PDT) X-ASG-Debug-ID: 1396396972-04bdf05dabbf7d10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Dh2y2E3O7YzZrWs4 for ; Tue, 01 Apr 2014 17:02:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s31NKP6x026051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 1 Apr 2014 19:20:26 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s31NKPEL016900; Tue, 1 Apr 2014 19:20:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8E2ED123C1C; Tue, 1 Apr 2014 19:20:23 -0400 (EDT) Date: Tue, 1 Apr 2014 19:20:23 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140401232022.GA15934@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> <20140331222246.GF17603@dastard> <20140401135518.GC21540@bfoster.bfoster> <20140401211926.GH17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140401211926.GH17603@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396396972 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 02, 2014 at 08:19:26AM +1100, Dave Chinner wrote: > On Tue, Apr 01, 2014 at 09:55:18AM -0400, Brian Foster wrote: > > On Tue, Apr 01, 2014 at 09:22:47AM +1100, Dave Chinner wrote: > > > On Fri, Mar 28, 2014 at 09:16:02AM -0400, Brian Foster wrote: > > ... > > > > /* > > > > - * If we just got an ENOSPC, try to write back all dirty inodes to > > > > - * convert delalloc space to free up some of the excess reserved > > > > - * metadata space. > > > > + * If we hit ENOSPC or a quota limit, use the selective nature of the > > > > + * eofblocks scan to try and free up some lingering speculative > > > > + * preallocation delalloc blocks. > > > > + * > > > > + * If we hit a quota limit, only scan for files covered by the quota. We > > > > + * also consider ENOSPC here because project quota failure can return > > > > + * ENOSPC instead of EDQUOT. The quota scanning only sets 'scanned' if > > > > + * the inode is covered by a quota with low free space. This should > > > > + * minimize interference with global ENOSPC handling. > > > > + * > > > > + * If a scan does not free enough space, resort to the inode flush big > > > > + * hammer to convert delalloc space to free up some of the excess > > > > + * reserved metadata space. > > > > */ > > > > + if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { > > > > + scanned = xfs_inode_free_quota_eofblocks(ip); > > > > + if (scanned) > > > > + goto write_retry; > > > > + } > > > > + if (ret == -ENOSPC && !scanned) { > > > > + struct xfs_eofblocks eofb = {0,}; > > > > > > IIRC, you can just use "{ 0 }" for initialisation, no "," needed. > > > > > > > + > > > > + eofb.eof_scan_owner = ip->i_ino; /* for locking */ > > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC | XFS_EOF_FLAGS_FLUSH; > > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > > + scanned = 1; > > > > + goto write_retry; > > > > + } > > > > if (ret == -ENOSPC && !enospc) { > > > > enospc = 1; > > > > xfs_flush_inodes(ip->i_mount); > > > > > > This seems overly complex and fragile. I'd much prefer that we don't > > > bury data writeback deep in the EOF block freeing code - we've done > > > a lot of work in the past to remove exactly that sort of behaviour > > > from XFS inode scanners. > > > > I think the fragility comes from the fact that we can't detect a > > particular quota failure or a project quota failure from a global > > failure. IIRC from looking at this way back when, there wasn't a clear > > solution to that problem. It didn't seem worth getting too far into for > > the purpose of this little bit of functionality. In that sense, the > > fragility will be there regardless. > > > > It would be nice to simplify this, however. It took a little bit of > > staring at this to try and make it effective and somewhat succinct. > > > > > I'd prefer to see something like this: > > > > > > if (ret == -EDQUOT && !enospc) { > > > enospc = 1; > > > xfs_inode_free_quota_eofblocks(ip); > > > goto retry; > > > else if (ret == -ENOSPC && !enospc) { > > > enospc = 1; > > > xfs_flush_inodes(ip->i_mount); > > > .... > > > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > goto retry; > > > } > > > > > > > What I don't like about this, in particular, is xfs_flush_inodes() could > > be unnecessary. We have a max preallocation size of 8GB, so the > > eofblocks scan alone can free up gigabytes of space. Now that I think of > > it, this is kind of a flaw in the proposed logic as well. > > The issue is that an eofblock scan is expensive, and there's no > limiting on how many inodes can have the EOF tag set and there's no > limiting on the number of concurrent scans that can be run. i.e. > when an active project that has many processes writing to it runs > out of space, every process will enter xfs_icache_free_eofblocks() > function and start issuing data flush requests on dirty inodes. It > causes unbound writeback concurrency, and we know that this is a bad > thing to do to your storage... > > xfs_flush_inodes() only runs one scan of the currently dirty > inodes at a time because it serialises on the flusher thread. We get > optimised writeback patterns rather than random data writeback from > as many threads hitting the eofblocks scanner at once. History has > shown that this is the most efficient way to clean dirty data - > optimise once and in the correct place, then use it everywhere. > Ok. I've been waffling on whether the eofblocks scan does/needs to do the flush, including whether there is any value of it being "selective." This suggests otherwise. In particular, that one big flush is better than many smaller/selective flushes. So we can just toss the project quota eofblocks flush. I'll drop the first couple patches for the flush mechanism. > Yes, it means that there is a global flush when a project quota runs > out of space, but it means that we only do it once and we don't burn > excessive CPU walking radix trees scanning inodes needlessly every > time we get a storm of processes hammering project quota ENOSPC. > It's not clear to me that excess scanning is an issue, but it seems orthogonal to how we organize the enospc logic (at least once the flush is out of the equation). IOW, we'll invoke the scanner with the same frequency either way. Or maybe you are just referring to scanning specifically for the purpose of doing flushes as a waste..? That said, I'll do some testing in this area to try and detect any potential issues. > FWIW, if we want to filter the list of dirty inodes to writeback, we > should look at providing a filter callback to the generic inode code > that gets called on each dirty inode. That way we can use the > optimised writeback code to quickly find and dispatch only the dirty > inodes that match the quota id we are having problems with.... > > > > This way has specific behaviours for EDQUOT vs ENOSPC, and we treat > > > them appropriately with a minimum of differences. And ENOSPC is > > > global, because we can't tell the difference here between a project > > > quota ENOSPC and a global ENOSPC at this point. > > > > > > > The main difference I see is that the original logic is centered around > > figuring out how to do an eofblocks scan vs. xfs_flush_inodes() only > > when necessary. In other words, we always attempt to do an eofblocks > > scan first then fall back to the inode flush. Where it gets a bit ugly > > is where we try to determine what kind of scan to run due to lack of > > information. The flush aspect of things is a little confused as well I > > suppose. > > > > Alternatively, the logic above is designed around categorization of the > > possible error conditions. I agree that it is more simple, but not quite > > as effective as noted above. We would continue to run a global inode > > flush when eofblocks can clean up effectively for the time being or due > > to a project quota failure that should ideally not impact the wider fs. > > Sure, but we've found in the past that just issuing a global flush > is far better from both the CPU and IO efficiency POV than > concurrent inode cache scans to find matching dirty inodes and > flushing them. > Makes sense... > > I wonder if something like the following would simplify this enough, yet > > still provide nicer behavior: > > > > /* > > * If this is an allocation failure, attempt an eofblocks scan > > * before we resort to an inode flush... > > */ > > if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { > > scanned = xfs_inode_enospc_eofblocks(ip); > > if (scanned) > > goto retry; > > scanned = 1; /* try this once */ > > } > > if (ret == -ENOSPC && !enospc) { > > enospc = 1; > > xfs_flush_inodes(); > > goto retry; > > } > > > > This consolidates the eofblocks scan logic to a separate helper to > > simplify things. The helper can run the quota scan and/or the global > > scan based on the data regarding the situation (i.e., the inode and > > associated quota characteristics). This allows us to preserve the notion > > of attempting a lightweight recovery first and a heavyweight recovery > > second, reserving the inode flush for when space is truly tight. > > Thoughts? > > It's still damn clunky, IMO. It's still trying to work around the > fact that project quotas use ENOSPC rather than EDQUOT, and that > makes the logic rather twisted. And it still has that hidden data > flush in it so it can't really be called lightweight... > Ok. Well if the high level logic is the issue, we could still turn that inside out a bit to use your EDQUOT/ENOSPC logic, yet still preserve the standalone eofblocks scan. It might be a few more lines, but perhaps more clear. E.g.: if (ret == -EDQUOT && !enospc) { enospc = 1; xfs_inode_free_quota_eofblocks(ip); goto retry; else if (ret == -ENOSPC && !enospc) { if (!scanned) { struct xfs_eofblocks eofb = {0}; ... scanned = 1; xfs_icache_free_eofblocks(ip->i_mount, &eofb); goto retry; } enospc = 1; xfs_flush_inodes(ip->i_mount); goto retry; } Thoughts on that? We'll handle project quota ENOSPC just as we handle global ENOSPC with respect to the scan and the flush, but we'll still have the opportunity to free up a decent amount of space without initiating I/O. The project quota scan down in free_quota_eofblocks() might be rendered pointless as well. Brian > > > > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > > > > index bd0ab7d..471ccfa 100644 > > > > --- a/fs/xfs/xfs_icache.c > > > > +++ b/fs/xfs/xfs_icache.c > > > > @@ -33,6 +33,9 @@ > > ... > > > > + > > > > + if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount)) { > > > > + dq = xfs_inode_dquot(ip, XFS_DQ_PROJ); > > > > + if (dq && xfs_dquot_lowsp(dq)) { > > > > + eofb.eof_prid = xfs_get_projid(ip); > > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > > > + XFS_EOF_FLAGS_PRID| > > > > + XFS_EOF_FLAGS_FLUSH; > > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > > + scanned = 1; > > > > + } > > > > + } > > > > > > I really don't like the fact that project quota is hiding a data > > > flush in the "free_quota_eofblocks" logic. It just strikes me a the > > > wrong thing to do because if it's a real ENOSPC we're just going to > > > have to do this anyway... > > > > > > > I was under the impression that a flush was important for project quotas > > based on freeing up reserved metadata space (from our past discussions > > on the original eofblocks work). I could have just misunderstood the > > point at the time. > > It is important - I'm not saying that we should not flush dirty > data. What I am disagreeing with is the implementation of data > flushing in the patch.... > > > If so, I can just remove the flush flag on the > > eofblocks scan in the logic proposed above and let the inode flush > > handle this for both cases. > > > > If we go that route, any preference as to whether to keep the support > > for doing a flush in eofblocks at all? I included it primarily for the > > project quota case. With that dropped, I could just drop the first > > couple of patches here. > > Yes, you could do that. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Tue Apr 1 23:47:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E0C947F54 for ; Tue, 1 Apr 2014 23:47:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA1DE304053 for ; Tue, 1 Apr 2014 21:47:55 -0700 (PDT) X-ASG-Debug-ID: 1396414072-04cb6c5675bdd8c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id yDHoowRxwBcDz03l for ; Tue, 01 Apr 2014 21:47: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: AidUAF2VO1N5LEcvPGdsb2JhbABZgwaDSoULtkWFXYEZFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoKCYdxB9AkFxaNeAsGAVAHhDgEmFWKX4sfKYEtCBc Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Apr 2014 15:17:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVD5Z-0005t4-L5; Wed, 02 Apr 2014 15:47:49 +1100 Date: Wed, 2 Apr 2014 15:47:49 +1100 From: Dave Chinner To: Jamie Pocas Cc: xfs@oss.sgi.com Subject: Re: xfs: invalid requests to request_fn from xfs_repair Message-ID: <20140402044749.GK17603@dastard> X-ASG-Orig-Subj: Re: xfs: invalid requests to request_fn from xfs_repair References: <20140401204215.GG17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396414072 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 01, 2014 at 06:28:19PM -0400, Jamie Pocas wrote: > I have to say, thanks very much for the lightning fast response. Comments > are inline. I think the punchline is going to end up being that I probably > need to learn some more about the effects of O_DIRECT on the I/O path and > how it ends up in the request_queue. It's tempting now to regress back to a > bio-handling function, do my own merging, and see if I can avoid the > problem, but I am stubborn so I will probably stick it out for as long as I > can. > > On Tue, Apr 1, 2014 at 4:42 PM, Dave Chinner wrote: > > > On Tue, Apr 01, 2014 at 04:16:39PM -0400, Jamie Pocas wrote: > > > blk_queue_physical_block_size(q, 512) // should be no surprise > > > blk_queue_logical_block_size(q, 512) // should be no surprise > > > > 512 byte sectors. > > > > > blk_queue_max_segments(q, 128); /* 128 memory segments (page + > > > offset/length pairs) per request! */ > > > blk_queue_max_hw_sectors(q, CA_MAX_REQUEST_SECTORS); /* Up to 1024 > > sectors > > > (512k) per request hard limit in the kernel */ > > > blk_queue_max_segment_size(q, CA_MAX_REQUEST_BYTES); /* 512k (1024 > > sectors) > > > is the hard limit in the kernel */ > > > > And up to 512KB per IO. > > > > > While iterating through segments in rq_for_each_segment(), for some > > > requests I am seeing some odd behavior. > > > > > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 903 // Ok, > > > this looks normal > > > segment 1: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 7 // > > > Whoah... this doesn't look right to me > > > > Seems fine to me. There's absolutely no reason two separate IOs > > can't be sub-page sector aligned or discontiguous given the above > > configuration. If that's what the getblocks callback returned to the > > DIO layer, then that's what you're going to see in the bios... > > > > > I guess my assumption that sectors would be adjacent was invalid, but this > is what I have read in ldd3 and other books and seen in some driver > examples. So I apologize for my folly and it's another lesson in not > believing everything you see on the net. The back half of my driver is > really optimized for transferring a single contiguous lba & transfer length > pair (ala SCSI WRITE 16 for example). However in desperation, I had changed > the driver to support requests like this (with disjoint sector ranges) but > it still seemed odd to me that occasionally some requests would even have > multiple segments that would *write* the same sectors/lengths. For example > I also see requests like the following. > > Given: rq_data_dir(rq) == 1 (i.e. a write) > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Ok > segment 1: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > Again? > segment 2: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Yet > again? > segment 3: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > Really? > ... > segment 126: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > What's going on? > // Reminder: segment limit is 128 > segment 127: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 1 // > Haha, bet you though I was going to say sector = 0! That really looks to me like a bug in whatever is building that iter structure. It looks like there's an off-by-one on each page (should be 8 sectors not 7) and the bi_sector is not being set correctly to the sector offset of the bio within the IO. i.e. for a contiguous IO it should look something like: segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 8 segment 1: iter.bio->bi_sector = 8, blk_rq_cur_sectors(rq) = 8 segment 2: iter.bio->bi_sector = 16, blk_rq_cur_sectors(rq) = 8 .... segment 127: iter.bio->bi_sector = 1016, blk_rq_cur_sectors(rq) = 8 I highly doubt the direct IO code is doing something wrong, because a mapping bug like that would show up everywhere and not just in your special driver.... > > The read syscall is for a byte offset (from the fd, set by lseek) > > and a length, not a range of contiguous sectors on the device. That > > off/len tuple gets mapped by the underlying filesystem or device > > into an sector/len via a getblocks callback in the dio code and the > > bios are then built according to the mappings that are returned. So > > in many cases the IO that hits the block device looks nothing at all > > like the IO that came from userspace. > > > > > In general if I were reading a file I agree 100%, but this was the read > call issued by xfs_repair to read the superblock directly from a block > device. So I, perhaps wrongly, anticipated straightforward requests or > maybe even a single 512k request coming down to the request_fn. I should > have mentioned that this was observed while using xfs_repair earlier in the > email though, so no offense intended. There's more of the xfs_repair strace > in my response to your next comment below. It fails very early as you can > imagine when xfs_repair can't read the superblock. I figured that this is what you were talking about, but remember that the block device also does it's own offset->sector mapping in the direct IO layer. So it's entirely possible that the mapping function (i.e the getblocks callback) is broken and that is why you are seeing weird mappings in the bios being built by the direct Io code. > and post more of the strace below. I *do* see the O_DIRECT flag as > expected. Here's the block device being opened. All I did was "xfs_repair > -n /dev/tsca0", hence the O_RDONLY flag. That all seems ok from what I'd expect from xfsrepair.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 2 00:11:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4A0D77F58 for ; Wed, 2 Apr 2014 00:11:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C49C5AC005 for ; Tue, 1 Apr 2014 22:11:08 -0700 (PDT) X-ASG-Debug-ID: 1396415465-04cb6c5675bdf060001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BsHYzYIdmLJjTEf7 for ; Tue, 01 Apr 2014 22:11: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: AihUAP+aO1N5LEcvPGdsb2JhbABZgwaDSoULtkWFXYEZFwMBAQEBODWCJQEBAQMBJxMcIwULCAMOCgklDwUlAwcaExuHVgfQKBcWjgILTQeEOASYVZV+KYEsAR8 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Apr 2014 15:41:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVDS3-0005wE-Hz; Wed, 02 Apr 2014 16:11:03 +1100 Date: Wed, 2 Apr 2014 16:11:03 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140402051103.GL17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> <20140331222246.GF17603@dastard> <20140401135518.GC21540@bfoster.bfoster> <20140401211926.GH17603@dastard> <20140401232022.GA15934@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140401232022.GA15934@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396415465 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 01, 2014 at 07:20:23PM -0400, Brian Foster wrote: > On Wed, Apr 02, 2014 at 08:19:26AM +1100, Dave Chinner wrote: > > On Tue, Apr 01, 2014 at 09:55:18AM -0400, Brian Foster wrote: > > Yes, it means that there is a global flush when a project quota runs > > out of space, but it means that we only do it once and we don't burn > > excessive CPU walking radix trees scanning inodes needlessly every > > time we get a storm of processes hammering project quota ENOSPC. > > > > It's not clear to me that excess scanning is an issue, but it seems Have 100 threads hit ENOSPC on the same project quota at the same time on a filesystem with a couple of thousand AGs with a few million cached inode, and then you'll see the problem.... > orthogonal to how we organize the enospc logic (at least once the flush > is out of the equation). IOW, we'll invoke the scanner with the same > frequency either way. Or maybe you are just referring to scanning > specifically for the purpose of doing flushes as a waste..? Well, lots of concurrent scanning for the same purpose is highly inefficient - look at the amount of additional serialisation in the inode recalim walker that is aimed at reducing concurrency to one reclaim thread per AG at a time... I expect that if the serialisation on xfs_flush_inodes() isn't sufficient to throttle eofblock scanning concurrency in case like the above then we'll know about it pretty quickly. > > > simplify things. The helper can run the quota scan and/or the global > > > scan based on the data regarding the situation (i.e., the inode and > > > associated quota characteristics). This allows us to preserve the notion > > > of attempting a lightweight recovery first and a heavyweight recovery > > > second, reserving the inode flush for when space is truly tight. > > > Thoughts? > > > > It's still damn clunky, IMO. It's still trying to work around the > > fact that project quotas use ENOSPC rather than EDQUOT, and that > > makes the logic rather twisted. And it still has that hidden data > > flush in it so it can't really be called lightweight... > > > > Ok. Well if the high level logic is the issue, we could still turn that > inside out a bit to use your EDQUOT/ENOSPC logic, yet still preserve the > standalone eofblocks scan. It might be a few more lines, but perhaps > more clear. E.g.: > > if (ret == -EDQUOT && !enospc) { > enospc = 1; > xfs_inode_free_quota_eofblocks(ip); > goto retry; > else if (ret == -ENOSPC && !enospc) { > if (!scanned) { > struct xfs_eofblocks eofb = {0}; > ... > scanned = 1; > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > goto retry; > } > > enospc = 1; > xfs_flush_inodes(ip->i_mount); > goto retry; > } > > Thoughts on that? Even more convoluted. :/ Look at it this way - I've never been a fan of this "retry write on enospc once" code. It's a necessary evil due to the reality of locking orders and having to back out of the write far enough to safely trigger dirty inode writeback so we *might* be able to write this data. Making this code more finicky and tricky is the last thing I think we should be doing. I don't have any better ideas at this point - I'm still tired and jetlagged and need to sort out everything for a merge window pull of the current tree, so time for me to think up a creative solution is limited. I'm hoping that you might be able to think of a different way entirely of doing this "write retry on ENOSPC" that dolves all these problems simply and easily ;) > We'll handle project quota ENOSPC just as we handle > global ENOSPC with respect to the scan and the flush, but we'll still > have the opportunity to free up a decent amount of space without > initiating I/O. The project quota scan down in free_quota_eofblocks() > might be rendered pointless as well. Well, therein lies an avenue of investigation: for EOF block trimming, why would we need to do a flush first, even for project quotas? And if we aren't going to flush data, why does it need to be done at this level? Can it be done deep in the quota code where we know exactly what quota ran out of space? Cheers, Dave. -- Dave Chinner david@fromorbit.com From hupin467@163.com Wed Apr 2 00:31:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1AF507F59 for ; Wed, 2 Apr 2014 00:31:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2E8C8F804C for ; Tue, 1 Apr 2014 22:31:24 -0700 (PDT) X-ASG-Debug-ID: 1396416682-04bdf0743a1b040001-NocioJ Received: from mail1.dsv-gruppe.de (mail1.dsv-gruppe.de [194.55.112.66]) by cuda.sgi.com with ESMTP id pr9NTQABPd1qvBts for ; Tue, 01 Apr 2014 22:31:22 -0700 (PDT) X-Barracuda-Envelope-From: hupin467@163.com X-Barracuda-Apparent-Source-IP: 194.55.112.66 Received: from m13-77.163.com ([220.181.13.77]) by mail1.dsv-gruppe.de (Lotus Domino Release 8.5.3FP5) with ESMTP id 2014040207311246-303869 ; Wed, 2 Apr 2014 07:31:12 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=Date:From:Subject:MIME-Version:Message-ID; bh=nIDGO yfiYXLnzRjRAhqjzRAeFEuIZCyNQwp8tq76bgY=; b=N2fPijPAhT6NANgpV9KlH woo7OwGxIzffjJcHcMVw4JSRwzR4I3oBSrDOfw2LTUYonoU9KtXy7LiXp1QLBhcC 6nPm+d7CIJJD2IQRNfy29pZYKftsjyxo2aH0Nao9hS57QIwt/EWRguWYcg0Bw+Lp 7BoE/fZY+N+eoeyxQv13XE= Received: from hupin467$163.com ( [183.12.76.242] ) by ajax-webmail-wmsvr77 (Coremail) ; Wed, 2 Apr 2014 13:30:15 +0800 (CST) X-Originating-IP: [183.12.76.242] From: SUPPLIER-LCD-BERYL To: sanjiatech@gmail.com, sanjiatech2@gmail.com, lavandaland@yandex.ru, sales@globalspec.com, Tim.Carroll@ihs.com, service@actron.de, Info@electrodragon.com, apple@suvsystem.com, frauplaints@ic.nc, wees.group@yahoo.com, chuangyi188@yahoo.com, evanwhan@yahoo.com, service@taobaoshoppingagent.com, kgsnow@sgi.com, xfs@oss.sgi.com, richa@sgi.com, office@elecom.kiev.ua, shabliyenko@elecom.kiev.ua, at@atilos.com.ua, ovdiy@elecom.kiev.ua, de.sales@ce-infosys.com, sg.sales@ce-infosys.com, service.sg@ce-infosys.com, support.sg@ce-infosys.com, service.de@ce-infosys.com, support@ce-infosys.com, support.de@ce-infosys.com, info@dsd.de, info@dv-loesungen.de, contact@junese.de, log@logmbh.de, info@phr-business.de, mail@roda-computer.com, info@secaron.de, info@toptechnologies.de, info@helpag.de, info@omnikom.hu, compusec-info@canon-its.co.jp, sales@gss-ksa.com, info@focus-europe.com Subject: Original LCD from InnoLux#RecipientName##DateTime# X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 20131204(24406.5820.5783) Copyright (c) 2002-2014 www.mailtech.cn 163com X-ASG-Orig-Subj: Original LCD from InnoLux#RecipientName##DateTime# X-CM-CTRLDATA: 5OEOPGZvb3Rlcl9odG09MTYxMDo4MQ== MIME-Version: 1.0 X-CM-TRANSID:TcGowEApTUJnoDtTe_sHAA--.4710W X-CM-SenderInfo: pkxsx0quwxqiywtou0bp/1tbiNwpgV1D+NVyMnwACsc X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== X-TNEFEvaluated: 1 Message-ID: <1dbfe2f9.1a51d.14520ea9575.Coremail.hupin467@163.com> X-Priority: 3 (Normal) Date: Wed, 2 Apr 2014 13:30:15 +0800 X-MIMETrack: Itemize by SMTP Server on LNSDMZ02/DSVextern/DE(Release 8.5.3FP5|July 31, 2013) at 02.04.2014 07:31:13, Serialize by Router on LNSDMZ02/DSVextern/DE(Release 8.5.3FP5|July 31, 2013) at 02.04.2014 07:31:21, Serialize complete at 02.04.2014 07:31:21 Content-Type: multipart/alternative; boundary="----=_Part_393808_1675855139.1396416615797" X-Barracuda-Connect: mail1.dsv-gruppe.de[194.55.112.66] X-Barracuda-Start-Time: 1396416682 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4508 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 ------=_Part_393808_1675855139.1396416615797 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset=GBK SGV5LEd1eQoKTENEIE1vZHVsZSxUb3VjaCBQYW5lbCxEcml2ZXIgQm9hcmQgYW5kIFdpbjggVGFi bGV0IGhlcmUuCgpMQ0Q6ICBBIGdyYWRlLG5ldyxvcmlnaW5hbCBmcm9tIElubm9MdXggYW5kIEFV TyxTVE4vRlNUTiBMQ0QgaXMgYWxzbyBhdmFpbGFibGUKClRvdWNoIFBhbmVsOiBSZXNpc3RpdmUg VG91Y2ggU2NyZWVuLENhcGFjaXRpdmUgVG91Y2guQ2FuIGJlIGN1c3RvbWl6ZWQuCgpEcml2ZXIg Qm9hcmQ6IEFWLFZHQSxIRE1JLERWSSBwb3J0cyBvciBhbnkgb3RoZXIKCldpbjggVGFibGV0OiBT U0QgMTZHIC8gMzJHIC8gNjRHIC8gMTI4RywgIDkuNyIgMjA0OCoxNTM2IElQUyBMQ0Qgc2NyZWVu CgpDb250YWN0IG1lIGZvciBtb3JlIGRldGFpbHMuCgpUaGFua3MgYW5kIHJlZ2FyZHMhCgotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpCZXJ5bCAvIENvbnRyb2wgRWxlY3Ryb25p YyBDby4sTHRkLgoKMDA4Ni03NTUtMjkwMzEzMTcgICAgICAgICAgICAgICAgICAgICAgICAgU2t5 cGU6IGJlcnlsLnplbmc5OSA= ------=_Part_393808_1675855139.1396416615797 Content-Transfer-Encoding: base64 Content-Type: text/html; charset=GBK PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7 Zm9udC1mYW1pbHk6YXJpYWwiPjxwPjxmb250IGZhY2U9IkFyaWFsIj5IZXksR3V5PC9mb250Pjwv cD48Zm9udCBmYWNlPSJBcmlhbCI+PC9mb250PiA8cD48Zm9udCBmYWNlPSJBcmlhbCI+TENEIE1v ZHVsZSxUb3VjaCBQYW5lbCxEcml2ZXIgQm9hcmQgYW5kIFdpbjggVGFibGV0ICBoZXJlLjwvZm9u dD48L3A+PGZvbnQgZmFjZT0iQXJpYWwiPjwvZm9udD4gPHA+PGZvbnQgZmFjZT0iQXJpYWwiPjxm b250IGNvbG9yPSIjMDAwMDgwIj48c3Ryb25nPkxDRDwvc3Ryb25nPjo8L2ZvbnQ+Jm5ic3A7IEEg IGdyYWRlLG5ldyxvcmlnaW5hbCAgZnJvbSBJbm5vTHV4IGFuZCBBVU8sU1ROL0ZTVE4gTENEIGlz IGFsc28gIGF2YWlsYWJsZTwvZm9udD48L3A+PGZvbnQgZmFjZT0iQXJpYWwiPjwvZm9udD4gPHA+ PGZvbnQgZmFjZT0iQXJpYWwiPjxzdHJvbmc+PGZvbnQgY29sb3I9IiMwMDAwODAiPlRvdWNoIFBh bmVsOjwvZm9udD48L3N0cm9uZz4gUmVzaXN0aXZlIFRvdWNoICBTY3JlZW4sQ2FwYWNpdGl2ZSBU b3VjaC5DYW4gYmUgY3VzdG9taXplZC48L2ZvbnQ+PC9wPjxmb250IGZhY2U9IkFyaWFsIj48L2Zv bnQ+IDxwPjxmb250IGZhY2U9IkFyaWFsIj48c3Ryb25nPjxmb250IGNvbG9yPSIjMDAwMDgwIj5E cml2ZXIgIEJvYXJkOjwvZm9udD48L3N0cm9uZz4gQVYsVkdBLEhETUksRFZJICBwb3J0cyBvciBh bnkgb3RoZXI8L2ZvbnQ+PC9wPjxmb250IGZhY2U9IkFyaWFsIj48L2ZvbnQ+IDxwPjxmb250IGZh Y2U9IkFyaWFsIj48c3Ryb25nPjxmb250IGNvbG9yPSIjMDAwMDgwIj5XaW44IFRhYmxldDo8L2Zv bnQ+PC9zdHJvbmc+IFNTRCAxNkcgLyAzMkcgLyA2NEcgIC8gMTI4RywmbmJzcDsgOS43IiAyMDQ4 KjE1MzYgSVBTIExDRCBzY3JlZW48L2ZvbnQ+PC9wPjxmb250IGZhY2U9IkFyaWFsIj48L2ZvbnQ+ IDxwPjxmb250IGZhY2U9IkFyaWFsIj5Db250YWN0IG1lIGZvciBtb3JlIGRldGFpbHMuPC9mb250 PjwvcD48Zm9udCBmYWNlPSJBcmlhbCI+PC9mb250PiA8cD48Zm9udCBmYWNlPSJBcmlhbCI+VGhh bmtzIGFuZCByZWdhcmRzITwvZm9udD48L3A+PGZvbnQgZmFjZT0iQXJpYWwiPjwvZm9udD4gPHA+ PGZvbnQgZmFjZT0iQXJpYWwiPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L2Zv bnQ+PC9wPjxmb250IGZhY2U9IkFyaWFsIj48L2ZvbnQ+IDxwPjxmb250IGZhY2U9IkFyaWFsIj5C ZXJ5bCAvIENvbnRyb2wgRWxlY3Ryb25pYyBDby4sTHRkLjwvZm9udD48L3A+PGZvbnQgZmFjZT0i QXJpYWwiPjwvZm9udD4gPHA+PGZvbnQgZmFjZT0iQXJpYWwiPjAwODYtNzU1LTI5MDMxMzE3Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICBTa3lwZTogYmVyeWwuemVuZzk5PC9mb250PiZu YnNwOzwvcD48L2Rpdj48YnI+PGJyPjxzcGFuIHRpdGxlPSJuZXRlYXNlZm9vdGVyIj48c3BhbiBp ZD0ibmV0ZWFzZV9tYWlsX2Zvb3RlciI+PC9zcGFuPjwvc3Bhbj4= ------=_Part_393808_1675855139.1396416615797-- From gizem@dalokay.com.tr Wed Apr 2 06:13:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BAC147F54 for ; Wed, 2 Apr 2014 06:13:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4F5530405F for ; Wed, 2 Apr 2014 04:13:25 -0700 (PDT) X-ASG-Debug-ID: 1396437201-04cb6c5675bf6f30001-NocioJ Received: from smtp-02-9775.kriter.com.tr (smtp-02-9775.kriter.com.tr [81.22.97.75]) by cuda.sgi.com with ESMTP id cv7bfTyVtxQcFend for ; Wed, 02 Apr 2014 04:13:22 -0700 (PDT) X-Barracuda-Envelope-From: gizem@dalokay.com.tr X-Barracuda-Apparent-Source-IP: 81.22.97.75 Received: from mail-323.kriter.com.tr (unknown [81.22.97.167]) by smtp-102.kriter.com.tr (Postfix) with ESMTP id 32C9D141D63; Wed, 2 Apr 2014 14:13:14 +0300 (EEST) Received: from mail.dalokay.com.tr (mail-81-97-kadikoy.kriter.com.tr [81.22.97.81]) by mail-323.kriter.com.tr (Postfix) with ESMTPA id 02E351404C1; Wed, 2 Apr 2014 14:13:16 +0300 (EEST) Received: from [41.138.102.60] by mail.dalokay.com.tr with HTTP (HTTP/1.1 POST); Wed, 02 Apr 2014 14:13:16 +0300 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 02 Apr 2014 12:13:16 +0100 From: Info To: undisclosed-recipients:; Subject: CEO/ Jim W. Henderson Reply-To: X-ASG-Orig-Subj: CEO/ Jim W. Henderson Mail-Reply-To: Message-ID: <6e9c709449b11dc8f0c10b133948edb7@dalokay.com.tr> X-Sender: gizem@dalokay.com.tr User-Agent: Webmail/0.6 X-Virus-Scanned: Clean X-Barracuda-Connect: smtp-02-9775.kriter.com.tr[81.22.97.75] X-Barracuda-Start-Time: 1396437201 X-Barracuda-URL: http://192.48.176.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.3.4513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA620a Custom Rule SA620a -- Hello// I am CEO/ Jim W. Henderson certify private loan lender at 2%. Are you looking for urgent loan to finance your project and pay off your bills? Here is your opportunity to apply at Henderson loan Firm, We offer all types of loan, any interested person must be honest and sincere to follow the procedure / Terms and Condition, also abide by the laws to pay the Re-payment Period accordingly and should contact us ASAP via our private Email at ''' ceo.jim.henderson@gmail.com''. Best Regards CEO/ Jim W. Henderson From hannes@stressinduktion.org Wed Apr 2 07:34:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BFE6E7F6C for ; Wed, 2 Apr 2014 07:34:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 505BAAC008 for ; Wed, 2 Apr 2014 05:34:46 -0700 (PDT) X-ASG-Debug-ID: 1396442083-04bdf0743a33dc0001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id NwKIz96LyHGXEyEL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 02 Apr 2014 05:34:44 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id 080781A0C28F; Wed, 2 Apr 2014 14:34:42 +0200 (CEST) Date: Wed, 2 Apr 2014 14:34:42 +0200 From: Hannes Frederic Sowa To: xfs@oss.sgi.com Cc: tinguely@sgi.com, david@fromorbit.com Subject: [PATCH v3 xfstests] add tests for unlinking directories with hash collisions Message-ID: <20140402123442.GF16157@order.stressinduktion.org> X-ASG-Orig-Subj: [PATCH v3 xfstests] add tests for unlinking directories with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <20140401184903.GA13434@order.stressinduktion.org> <20140401230309.GC16157@order.stressinduktion.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20140401230309.GC16157@order.stressinduktion.org> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1396442084 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This tests creates several directories that have the same small (8) group of hashes to ensure the hash ordering of file and directories are preserved. Sample backtrace this test tries to prevent in future: [ 3856.245843] XFS (vda1): Internal error xfs_trans_cancel at line 966 of file fs/xfs/xfs_trans.c. Caller 0xffffffffa01186bc [ 3856.249049] CPU: 1 PID: 866 Comm: rm Not tainted 3.13.6-200.fc20.x86_64 #1 [ 3856.250966] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 3856.252615] 000000000000000c ffff8800d23a7d68 ffffffff8168730c ffff8800cf5462b8 [ 3856.254823] ffff8800d23a7d80 ffffffffa00d00cb ffffffffa01186bc ffff8800d23a7da8 [ 3856.257241] ffffffffa00e5459 ffff8800d9ac3400 ffff8800d23a7e30 ffff8800371b6800 [ 3856.259420] Call Trace: [ 3856.260172] [] dump_stack+0x45/0x56 [ 3856.261717] [] xfs_error_report+0x3b/0x40 [xfs] [ 3856.263472] [] ? xfs_remove+0x1ac/0x370 [xfs] [ 3856.270838] [] xfs_trans_cancel+0xd9/0x100 [xfs] [ 3856.272783] [] xfs_remove+0x1ac/0x370 [xfs] [ 3856.274531] [] xfs_vn_unlink+0x4b/0x90 [xfs] [ 3856.276286] [] vfs_rmdir+0xa8/0x100 [ 3856.277821] [] do_rmdir+0x17d/0x1d0 [ 3856.281021] [] ? ____fput+0xe/0x10 [ 3856.285261] [] ? task_work_run+0xac/0xe0 [ 3856.286952] [] ? do_notify_resume+0x61/0xa0 [ 3856.288693] [] SyS_unlinkat+0x25/0x40 [ 3856.290407] [] system_call_fastpath+0x16/0x1b [ 3856.292685] XFS (vda1): xfs_do_force_shutdown(0x8) called from line 967 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa00e5472 [ 3856.627330] XFS (vda1): Corruption of in-memory data detected. Shutting down filesystem [ 3856.627332] XFS (vda1): Please umount the filesystem and rectify the problem(s) With help from Mark Tinguely, thanks very much! Cc: Dave Chinner Cc: Mark Tinguely Signed-off-by: Hannes Frederic Sowa --- Changelog: v2) * first serious proposal v3) * reduced number of possible generated hashes to 8 and thus lowered the number of generated files to 10_000 which still generate the corruption in all of my 10 tests. This speeds up the test considerable. Maybe we can add quick to the group description now? * updated changelog Also: When testing this program with reduced number of generated hashes and huge amount of test files, xfs_repair needs a considerable amount of time to check the directory (I aborted it). I guess this is because the hash tables get flattened to linked lists. I don't know if there are other runtime explosions in other parts of the code (maybe in the kernel). I suggest to add a random perturbation to the hash function, which unluckily seems to be included into the superblock then, too. Please have a look! Thanks, Hannes .gitignore | 1 + src/Makefile | 2 +- src/generate-hash-collision.c | 223 ++++++++++++++++++++++++++++++++++++++++++ tests/xfs/307 | 63 ++++++++++++ tests/xfs/307.out | 28 ++++++ tests/xfs/group | 1 + 6 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 src/generate-hash-collision.c create mode 100755 tests/xfs/307 create mode 100644 tests/xfs/307.out diff --git a/.gitignore b/.gitignore index b6f2463..049f2e0 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ /src/fsync-tester /src/ftrunc /src/genhashnames +/src/generate-hash-collision /src/getdevicesize /src/getpagesize /src/godown diff --git a/src/Makefile b/src/Makefile index 6509f2d..1e9ec61 100644 --- a/src/Makefile +++ b/src/Makefile @@ -11,7 +11,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ devzero feature alloc fault fstest t_access_root \ godown resvtest writemod makeextents itrash rename \ multi_open_unlink dmiperf unwritten_sync genhashnames t_holes \ - t_mmap_writev t_truncate_cmtime + t_mmap_writev t_truncate_cmtime generate-hash-collision LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ diff --git a/src/generate-hash-collision.c b/src/generate-hash-collision.c new file mode 100644 index 0000000..55cec87 --- /dev/null +++ b/src/generate-hash-collision.c @@ -0,0 +1,223 @@ +/* + * Generates files or directories with hash collisions on a XFS filesystem + * Copyright (C) 2014 Hannes Frederic Sowa + * + * 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 will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static enum { + ILLEGAL, + DIRECTORY, + FILENAME, +} touch_mode = ILLEGAL; + +static bool one_hash = false; + +static uint32_t rol32(uint32_t word, unsigned int shift) +{ + return (word << shift) | (word >> (32 - shift)); +} + +static uint32_t xfs_da_hashname(const uint8_t *name, int namelen) +{ + uint32_t hash; + + for (hash = 0; namelen >= 4; namelen -= 4, name += 4) + hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^ + (name[3] << 0) ^ rol32(hash, 7 * 4); + + if (namelen) { + fprintf(stderr, + "internal error: " + "misbalanced input buffer to xfs_da_hashname - " + "overlapping %d bytes\n", namelen); + exit(1); + } + + return hash; +} + +static uint8_t gen_rand(void) +{ + uint8_t r; + while (!(r = rand())); + return r; +} + +static uint8_t buffer[252+1] = {0}; + +static void gen_name(void) +{ + int idx; + uint32_t hash, last; + +again: + for (idx = 0; idx < 252-4; idx+=4) { + buffer[idx + 0] = gen_rand(); + buffer[idx + 1] = gen_rand(); + buffer[idx + 2] = gen_rand(); + buffer[idx + 3] = gen_rand(); + } + + hash = rol32(xfs_da_hashname(buffer, 248), 7 * 4); + last = hash ^ ~0U; + + if (last == 0) + goto again; + + buffer[idx + 3] = last & 0x7fU; + buffer[idx + 2] = (last >> 7) & 0x7fU; + buffer[idx + 1] = (last >> 14) & 0x7fU; + buffer[idx + 0] = ((last >> 21) & 0xffU); + + if (memchr(buffer, '.', sizeof(buffer)) || + memchr(buffer, '/', sizeof(buffer))) + goto again; + + if (one_hash) { + /* very poor - can be improved later */ + static bool done = false; + static uint32_t filter; + + if (!done) { + filter = xfs_da_hashname(buffer, 252); + done = true; + return; + } + + if (filter != xfs_da_hashname(buffer, 252)) + goto again; + } +} + +static int touch(const char *buffer) +{ + if (touch_mode == DIRECTORY) { + if (mkdir(buffer, S_IRWXU)) { + /* ignore if directory is already present */ + if (errno == EEXIST) + return 0; + perror("mkdir with random directory name"); + return 1; + } + } else if (touch_mode == FILENAME) { + int fd = creat(buffer, S_IRWXU); + if (fd == -1) { + /* ignore duplicate files */ + if (errno == EEXIST) + return 0; + perror("creat with random directory name"); + return 1; + } + if (close(fd)) { + perror("close is leaking a file descriptor"); + return 1; + } + return 0; + } + return 0; +} + +static void do_seed(void) +{ + struct timeval tv; + if (gettimeofday(&tv, NULL)) { + perror("gettimeofday"); + exit(1); + } + srand(tv.tv_sec ^ tv.tv_usec ^ getpid()); +} + +static void usage_and_exit(const char *pname) +{ + fprintf(stderr, "usage: %s [-d] [-f] [-n num] [-s] directory\n" + "\t-f\tcreate files (the default)\n" + "\t-d\tcreate directories\n" + "\t-n num\tcreate num directories or files (default 200000)\n" + "\t-s\tonly generate one hash\n" + "\tdirectory\tthe directory to chdir() to\n", + pname); + exit(1); +} + +int main(int argc, char **argv) +{ + const char allopts[] = "hsdfn:"; + int c, orig_cycles, errors = 0, cycles = 200000; + + while ((c = getopt(argc, argv, allopts)) != -1) { + switch (c) { + case 'd': + if (touch_mode != ILLEGAL) + usage_and_exit(argv[0]); + touch_mode = DIRECTORY; + break; + case 'f': + if (touch_mode != ILLEGAL) + usage_and_exit(argv[0]); + touch_mode = FILENAME; + break; + case 'n': + errno = 0; + if (sscanf(optarg, "%d", &cycles) != 1 || + errno == ERANGE) { + fputs("could not parse number of iterations", stderr); + exit(1); + } + break; + case 's': + one_hash = true; + break; + default: + usage_and_exit(argv[0]); + break; + } + } + + if (argc <= optind || touch_mode == ILLEGAL) + usage_and_exit(argv[0]); + + if (chdir(argv[optind])) { + perror("chdir"); + exit(1); + } + + orig_cycles = cycles; + + do_seed(); + + while (cycles--) { + gen_name(); + errors += touch((char *)buffer); + } + + if (errors) + fprintf(stderr, "creating %d %s caused %d errors\n", + orig_cycles, touch_mode == FILENAME ? "files" : "directories", + errors); + + return 0; +} diff --git a/tests/xfs/307 b/tests/xfs/307 new file mode 100755 index 0000000..9ff1bf7 --- /dev/null +++ b/tests/xfs/307 @@ -0,0 +1,63 @@ +#! /bin/bash +# FS QA Test No. 307 +# +# Test that directory hash entries are place in the correct order. +# commit f5ea110 ("xfs: add CRCs to dir2/da node blocks") left the +# directory with incorrect hash ordering. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Hannes Frederic Sowa. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/repair + +# real QA test starts here + +_supported_fs xfs +_supported_os Linux +_require_scratch + +_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs +_scratch_mount | _filter_scratch + +mkdir $SCRATCH_MNT/x +$here/src/generate-hash-collision -d -n 10000 $SCRATCH_MNT/x +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +_scratch_xfs_repair 2>&1 | _filter_repair + +# success, all done +status=0 +exit diff --git a/tests/xfs/307.out b/tests/xfs/307.out new file mode 100644 index 0000000..eaf5716 --- /dev/null +++ b/tests/xfs/307.out @@ -0,0 +1,28 @@ +QA output created by 307 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - reset superblock... +Phase 6 - check inode connectivity... + - resetting contents of realtime bitmap and summary inodes + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +Phase 7 - verify and correct link counts... +done diff --git a/tests/xfs/group b/tests/xfs/group index ba34650..a1ef7f9 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -189,3 +189,4 @@ 304 auto quick quota 305 auto quota 306 auto stress log metadata repair +307 auto dir -- 1.9.0 From tinguely@sgi.com Wed Apr 2 08:07:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9F1CA29DF7 for ; Wed, 2 Apr 2014 08:07:43 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C3038F8066; Wed, 2 Apr 2014 06:07:40 -0700 (PDT) Message-ID: <533C0B9D.4070307@sgi.com> Date: Wed, 02 Apr 2014 08:07:41 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 xfstests] add tests for unlinking directories with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <20140401184903.GA13434@order.stressinduktion.org> <20140401230309.GC16157@order.stressinduktion.org> <20140402123442.GF16157@order.stressinduktion.org> In-Reply-To: <20140402123442.GF16157@order.stressinduktion.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 04/02/14 07:34, Hannes Frederic Sowa wrote: > This tests creates several directories that have the same small (8) > group of hashes to ensure the hash ordering of file and directories > are preserved. > > Sample backtrace this test tries to prevent in future: > > [ 3856.245843] XFS (vda1): Internal error xfs_trans_cancel at line 966 of file fs/xfs/xfs_trans.c. Caller 0xffffffffa01186bc > [ 3856.249049] CPU: 1 PID: 866 Comm: rm Not tainted 3.13.6-200.fc20.x86_64 #1 > [ 3856.250966] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 > [ 3856.252615] 000000000000000c ffff8800d23a7d68 ffffffff8168730c ffff8800cf5462b8 > [ 3856.254823] ffff8800d23a7d80 ffffffffa00d00cb ffffffffa01186bc ffff8800d23a7da8 > [ 3856.257241] ffffffffa00e5459 ffff8800d9ac3400 ffff8800d23a7e30 ffff8800371b6800 > [ 3856.259420] Call Trace: > [ 3856.260172] [] dump_stack+0x45/0x56 > [ 3856.261717] [] xfs_error_report+0x3b/0x40 [xfs] > [ 3856.263472] [] ? xfs_remove+0x1ac/0x370 [xfs] > [ 3856.270838] [] xfs_trans_cancel+0xd9/0x100 [xfs] > [ 3856.272783] [] xfs_remove+0x1ac/0x370 [xfs] > [ 3856.274531] [] xfs_vn_unlink+0x4b/0x90 [xfs] > [ 3856.276286] [] vfs_rmdir+0xa8/0x100 > [ 3856.277821] [] do_rmdir+0x17d/0x1d0 > [ 3856.281021] [] ? ____fput+0xe/0x10 > [ 3856.285261] [] ? task_work_run+0xac/0xe0 > [ 3856.286952] [] ? do_notify_resume+0x61/0xa0 > [ 3856.288693] [] SyS_unlinkat+0x25/0x40 > [ 3856.290407] [] system_call_fastpath+0x16/0x1b > [ 3856.292685] XFS (vda1): xfs_do_force_shutdown(0x8) called from line 967 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa00e5472 > [ 3856.627330] XFS (vda1): Corruption of in-memory data detected. Shutting down filesystem > [ 3856.627332] XFS (vda1): Please umount the filesystem and rectify the problem(s) > > With help from Mark Tinguely, thanks very much! > > Cc: Dave Chinner > Cc: Mark Tinguely > Signed-off-by: Hannes Frederic Sowa > --- > Changelog: > > v2) > * first serious proposal > > v3) > * reduced number of possible generated hashes to 8 and thus lowered the number of > generated files to 10_000 which still generate the corruption in all of my > 10 tests. This speeds up the test considerable. Maybe we can add > quick to the group description now? > * updated changelog > > Also: > When testing this program with reduced number of generated hashes and > huge amount of test files, xfs_repair needs a considerable amount of > time to check the directory (I aborted it). I guess this is because the > hash tables get flattened to linked lists. > > I don't know if there are other runtime explosions in other parts of > the code (maybe in the kernel). I suggest to add a random perturbation > to the hash function, which unluckily seems to be included into the > superblock then, too. > > Please have a look! > > Thanks, > > Hannes Tested-by: Mark Tinguely From apache@vps.com Wed Apr 2 08:37:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, SUBJECT_NEEDS_ENCODING,SUBJ_ILLEGAL_CHARS,T_FRT_CLICK,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ECA8D7F69 for ; Wed, 2 Apr 2014 08:37:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75CCBAC006 for ; Wed, 2 Apr 2014 06:37:30 -0700 (PDT) X-ASG-Debug-ID: 1396445848-04cbb054b9a0fb40001-NocioJ Received: from mail.vps.com ([168.61.8.253]) by cuda.sgi.com with ESMTP id gLk1bHuoqgRwbPB6 for ; Wed, 02 Apr 2014 06:37:28 -0700 (PDT) X-Barracuda-Envelope-From: apache@vps.com X-Barracuda-Apparent-Source-IP: 168.61.8.253 Received: by mail.vps.com (Postfix, from userid 48) id E4CD52C932; Wed, 2 Apr 2014 13:35:38 +0000 (UTC) To: xfs@oss.sgi.com Subject: Benachrichtigung von Sparkasse†X-PHP-Originating-Script: 0:mailer.php X-ASG-Orig-Subj: Benachrichtigung von Sparkasse†From: © SPARKASSE 2014 Reply-To: noreply@sparkasse.de MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: <20140402133538.E4CD52C932@mail.vps.com> Date: Wed, 2 Apr 2014 13:35:38 +0000 (UTC) X-Barracuda-Connect: UNKNOWN[168.61.8.253] X-Barracuda-Start-Time: 1396445848 X-Barracuda-URL: http://192.48.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.88 X-Barracuda-Spam-Status: No, SCORE=1.88 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_NONE, SUBJECT_NEEDS_ENCODING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4516 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.28 SUBJECT_NEEDS_ENCODING SUBJECT_NEEDS_ENCODING 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is HTML source of message you composed. Do not modify here. To modify this message press HTML Messages Editor button.
Sehr geehrter Kunde,
 
wir möchten Sie darauf hinweisen, dass der Zugang zu Ihrem Online-Konto in Kurze abläuft.
Um dieses weiterhin nützen zu können, bitten wir Sie Ihre Daten bei folgendem Link zu bestätigen:
 
 
Anschließend wir Ihr Online-Konto automatisch wiederhergestellt und Sie werden von einem unserer Mitarbeiter kontaktiert.
 
Beim Online-Banking haben Sie per Klick alles im Griff.
 
Mit dem komfortablen Online-Banking haben Sie schnellen und problemlosen Zugang zu Ihrem Girokonto.
Bequem können Sie Überweisungen und Daueraufträge per Mausklick erledigen.
 
Das Online-Banking bietet aber noch viel mehr:
 
DIE VORTEILE AUF EINEM BLICK:
 
- Kontozugang rund um die Uhr
- Schneller Zugriff aufs Girokonto
- Online-Banking bequem vom Handy oder PC aus
- Flexibel in jedem Winkel der Welt
- Übersichtliche Kontoführung
- Hohe Sicherheitsstandards
- Kombinierbar mit Telefon-Banking
 
Wir freuen uns sehr Sie weiterhin als unseren Online Konto Kunden begrüßen zu dürfen!
 
Mit freundlichen Grüßen,
 
Sparkasse Kundenservice
From tytso@thunk.org Wed Apr 2 09:27:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 465D77F74 for ; Wed, 2 Apr 2014 09:27:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41082304053 for ; Wed, 2 Apr 2014 07:27:10 -0700 (PDT) X-ASG-Debug-ID: 1396448825-04cb6c5678c03210001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id TEqrA97YU8eSpROJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 02 Apr 2014 07:27:06 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WVM7T-00017S-Fd; Wed, 02 Apr 2014 14:26:23 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C865B580386; Wed, 2 Apr 2014 10:26:20 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1396448780; bh=kTxTcZhEkaMkb//WbxXWziaIoOVazHBP+ZIVNmpUgik=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=qd78RwztqFakaZJQPtNzeLoD1RiRHjKy7FtcQhAAcBpgDcRUIb/kq0Q7BBdmi2Z5A cUWmAx9/10MEWNu2XwWOsrAQ/laGLxexVnV3YnQQddtQiPNKq9hKb43VYe3le+njog zVKAAkezd9n+J5sIhjemw1NsJmbJ4lhqw+uIwRxY= Date: Wed, 2 Apr 2014 10:26:20 -0400 From: Theodore Ts'o To: Dave Chinner Cc: Sedat Dilek , lsf@lists.linux-foundation.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140402142620.GA6901@thunk.org> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140401222823.GJ17603@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1396448826 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4517 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Apr 02, 2014 at 09:28:23AM +1100, Dave Chinner wrote: > > And of course, whether changes in the mainline kernel tree are > > manually propagated changes from the xfstests.git tree, or whether > > primary development happens in the kernel tree, is ultimately going to > > be up to you and the XFS developers who have stewardship of xfstests. > > I'm not sure I would be that excited about manual propagation of > > changes from one git tree to another, but that is of course, up to > > you. > > And this is exactly my point, Ted. Again, you are presuming that the > implementation is going to require syncing commits across disparate > git trees and other such games will be needed to maintain separate > packages. Nothing could be further from the truth: we already have > this problem with the shared XFS kernel/userspace code and it's a > royal PITA keeping them in sync. Hence introducing the same > maintenance problem with new code and infrastructure is highly > undesirable and something we'll try to avoid at all costs. Actually, I was presuming that the thing that makes the most sense was to move all or most of the tests in xfstests into the kernel tests tree. And then you complained that I was making a presumption that this was the only sane thing to do. That's why I said, "if you want to do something insane, be my guest". I have nothing against doing a formal requirements process, that's fine, but I think there are certain things about what the final solution of "test in the kernel git tree" will look like that are pretty obvious. Cheers, - Ted From lczerner@redhat.com Wed Apr 2 10:33:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4EB0329DF9 for ; Wed, 2 Apr 2014 10:33:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2380F304032 for ; Wed, 2 Apr 2014 08:33:28 -0700 (PDT) X-ASG-Debug-ID: 1396452808-04cbb054b9a187c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YNAGcqA0bKRyC2Nm for ; Wed, 02 Apr 2014 08:33:28 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s32FXR1o031314 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Apr 2014 11:33:27 -0400 Received: from localhost.localdomain.com (dhcp-1-214.brq.redhat.com [10.34.1.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s32FXO0v006903; Wed, 2 Apr 2014 11:33:26 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, Lukas Czerner Subject: [PATCH 2/2] fsstress: Add fallocate collapse range operation Date: Wed, 2 Apr 2014 17:33:20 +0200 X-ASG-Orig-Subj: [PATCH 2/2] fsstress: Add fallocate collapse range operation Message-Id: <1396452800-25775-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1396452800-25775-1-git-send-email-lczerner@redhat.com> References: <1396452800-25775-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396452808 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds collapse operation support for fsstress, which is meant to exercise fallocate FALLOC_FL_COLLAPSE_RANGE support. Signed-off-by: Lukas Czerner --- ltp/fsstress.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index fd258bf..1eec11a 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -71,6 +71,7 @@ typedef enum { OP_MKNOD, OP_PUNCH, OP_ZERO, + OP_COLLAPSE, OP_READ, OP_READLINK, OP_RENAME, @@ -168,6 +169,7 @@ void mkdir_f(int, long); void mknod_f(int, long); void punch_f(int, long); void zero_f(int, long); +void collapse_f(int, long); void read_f(int, long); void readlink_f(int, long); void rename_f(int, long); @@ -206,6 +208,7 @@ opdesc_t ops[] = { { OP_MKNOD, "mknod", mknod_f, 2, 1 }, { OP_PUNCH, "punch", punch_f, 1, 1 }, { OP_ZERO, "zero", zero_f, 1, 1 }, + { OP_COLLAPSE, "collapse", collapse_f, 1, 1 }, { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_RENAME, "rename", rename_f, 2, 1 }, @@ -2173,6 +2176,7 @@ struct print_flags falloc_flags [] = { { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, + { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { -1, NULL} }; @@ -2223,6 +2227,14 @@ do_fallocate(int opno, long r, int mode) off = (off64_t)(lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE)); off %= maxfsize; len = (off64_t)(random() % (1024 * 1024)); + /* + * Collapse range requires off and len to be block aligned, make it + * more likely to be the case. + */ + if (FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { + off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); + len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); + } mode |= FALLOC_FL_KEEP_SIZE & random(); e = fallocate(fd, mode, (loff_t)off, (loff_t)len) < 0 ? errno : 0; if (v) @@ -2637,6 +2649,14 @@ zero_f(int opno, long r) } void +collapse_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, FALLOC_FL_COLLAPSE_RANGE); +#endif +} + +void read_f(int opno, long r) { char *buf; -- 1.8.3.1 From lczerner@redhat.com Wed Apr 2 10:33:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 187D729DF7 for ; Wed, 2 Apr 2014 10:33:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 85FEFAC006 for ; Wed, 2 Apr 2014 08:33:28 -0700 (PDT) X-ASG-Debug-ID: 1396452806-04cb6c5675c08270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fzgSP6h8uIPKos0l for ; Wed, 02 Apr 2014 08:33:27 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s32FXPRP000700 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Apr 2014 11:33:26 -0400 Received: from localhost.localdomain.com (dhcp-1-214.brq.redhat.com [10.34.1.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s32FXO0u006903; Wed, 2 Apr 2014 11:33:24 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, Lukas Czerner Subject: [PATCH 1/2] fsx: Add fallocate collapse range operation Date: Wed, 2 Apr 2014 17:33:19 +0200 X-ASG-Orig-Subj: [PATCH 1/2] fsx: Add fallocate collapse range operation Message-Id: <1396452800-25775-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396452807 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds fallocate FALLOC_FL_COLLAPSE_RANGE support for fsx. Signed-off-by: Lukas Czerner --- ltp/fsx.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 7 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index bd1ed76..47d3ee8 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -90,11 +90,12 @@ int logcount = 0; /* total ops */ #define OP_MAX_LITE 4 /* !lite operations */ -#define OP_TRUNCATE 4 -#define OP_FALLOCATE 5 -#define OP_PUNCH_HOLE 6 -#define OP_ZERO_RANGE 7 -#define OP_MAX_FULL 8 +#define OP_TRUNCATE 4 +#define OP_FALLOCATE 5 +#define OP_PUNCH_HOLE 6 +#define OP_ZERO_RANGE 7 +#define OP_COLLAPSE_RANGE 8 +#define OP_MAX_FULL 9 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -111,6 +112,7 @@ char *temp_buf; /* a pointer to the current data */ char *fname; /* name of our test file */ int fd; /* fd for our test file */ +blksize_t block_size = 0; off_t file_size = 0; off_t biggest = 0; char state[256]; @@ -142,6 +144,7 @@ int mapped_writes = 1; /* -W flag disables */ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int zero_range_calls = 1; /* -z flag disables */ +int collapse_range_calls = 1; /* -C flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -321,13 +324,21 @@ logdump(void) prt("\t******PPPP"); break; case OP_ZERO_RANGE: - prt("ZERO 0x%x thru 0x%x\t(0x%x bytes)", + prt("ZERO 0x%x thru 0x%x\t(0x%x bytes)", lp->args[0], lp->args[0] + lp->args[1] - 1, lp->args[1]); if (badoff >= lp->args[0] && badoff < lp->args[0] + lp->args[1]) prt("\t******ZZZZ"); break; + case OP_COLLAPSE_RANGE: + prt("COLLAPSE 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******CCCC"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -949,6 +960,58 @@ do_zero_range(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_COLLAPSE_RANGE +void +do_collapse_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_COLLAPSE_RANGE; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length collapse range\n"); + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, length); + return; + } + + end_offset = offset + length; + if ((loff_t)end_offset >= file_size) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping collapse range behind EOF\n"); + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, length); + return; + } + + log4(OP_COLLAPSE_RANGE, offset, length, 0); + + if (testcalls <= simulatedopcount) + return; + + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu collapse\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("collapse range: %x to %x\n", offset, length); + prterr("do_collapse_range: fallocate"); + report_failure(161); + } + + memmove(good_buf + offset, good_buf + end_offset, + file_size - end_offset); + file_size -= length; +} + +#else +void +do_collapse_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1123,6 +1186,12 @@ test(void) goto out; } break; + case OP_COLLAPSE_RANGE: + if (!collapse_range_calls) { + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1165,6 +1234,16 @@ test(void) TRIM_OFF_LEN(offset, size, file_size); do_zero_range(offset, size); break; + case OP_COLLAPSE_RANGE: + TRIM_OFF_LEN(offset, size, file_size - 1); + offset = offset & ~(block_size - 1); + size = size & ~(block_size - 1); + if (size == 0) { + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, size); + goto out; + } + do_collapse_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1225,6 +1304,9 @@ usage(void) #ifdef FALLOC_FL_ZERO_RANGE " -z: Do not use zero range calls\n" #endif +#ifdef FALLOC_FL_COLLAPSE_RANGE +" -C: Do not use collapse range calls\n" +#endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ -O: use oplen (see -o flag) for every op (default random)\n\ @@ -1399,6 +1481,7 @@ main(int argc, char **argv) char *endp; char goodfile[1024]; char logfile[1024]; + struct stat statbuf; goodfile[0] = 0; logfile[0] = 0; @@ -1410,7 +1493,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCLN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1513,6 +1596,9 @@ main(int argc, char **argv) case 'z': zero_range_calls = 0; break; + case 'C': + collapse_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1579,6 +1665,11 @@ main(int argc, char **argv) prterr(fname); exit(91); } + if (fstat(fd, &statbuf)) { + prterr("check_size: fstat"); + exit(91); + } + block_size = statbuf.st_blksize; #ifdef XFS if (prealloc) { xfs_flock64_t resv = { 0 }; @@ -1665,6 +1756,8 @@ main(int argc, char **argv) FALLOC_FL_KEEP_SIZE); if (zero_range_calls) zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); + if (collapse_range_calls) + collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); while (numops == -1 || numops--) test(); -- 1.8.3.1 From lczerner@redhat.com Wed Apr 2 10:55:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 54B5229DF7 for ; Wed, 2 Apr 2014 10:55:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 486FA8F8066 for ; Wed, 2 Apr 2014 08:55:12 -0700 (PDT) X-ASG-Debug-ID: 1396454111-04cb6c5678c09b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cJ0QTG1CdHJTpxl2 for ; Wed, 02 Apr 2014 08:55:12 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s32FtA4q009985 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Apr 2014 11:55:10 -0400 Received: from dhcp-1-214.brq.redhat.com (dhcp-1-214.brq.redhat.com [10.34.1.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s32Ft7Xk016692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 2 Apr 2014 11:55:09 -0400 Date: Wed, 2 Apr 2014 17:55:07 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: xfs@oss.sgi.com cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 1/2] fsx: Add fallocate collapse range operation In-Reply-To: <1396452800-25775-1-git-send-email-lczerner@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] fsx: Add fallocate collapse range operation Message-ID: References: <1396452800-25775-1-git-send-email-lczerner@redhat.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396454111 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 2 Apr 2014, Lukas Czerner wrote: > Date: Wed, 2 Apr 2014 17:33:19 +0200 > From: Lukas Czerner > To: xfs@oss.sgi.com > Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, > Lukas Czerner > Subject: [PATCH 1/2] fsx: Add fallocate collapse range operation > > This commit adds fallocate FALLOC_FL_COLLAPSE_RANGE support for fsx. Btw, this actually makes the fsx fail on ext4 and xfs after a while. I was trying to find a problem in fsx itself but I think it is actually ok. That means that we could possibly have bugs in ext4 and xfs collapse range implementation. More eyes are needed on this! Thanks! -Lukas > > Signed-off-by: Lukas Czerner > --- > ltp/fsx.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 100 insertions(+), 7 deletions(-) > > diff --git a/ltp/fsx.c b/ltp/fsx.c > index bd1ed76..47d3ee8 100644 > --- a/ltp/fsx.c > +++ b/ltp/fsx.c > @@ -90,11 +90,12 @@ int logcount = 0; /* total ops */ > #define OP_MAX_LITE 4 > > /* !lite operations */ > -#define OP_TRUNCATE 4 > -#define OP_FALLOCATE 5 > -#define OP_PUNCH_HOLE 6 > -#define OP_ZERO_RANGE 7 > -#define OP_MAX_FULL 8 > +#define OP_TRUNCATE 4 > +#define OP_FALLOCATE 5 > +#define OP_PUNCH_HOLE 6 > +#define OP_ZERO_RANGE 7 > +#define OP_COLLAPSE_RANGE 8 > +#define OP_MAX_FULL 9 > > /* operation modifiers */ > #define OP_CLOSEOPEN 100 > @@ -111,6 +112,7 @@ char *temp_buf; /* a pointer to the current data */ > char *fname; /* name of our test file */ > int fd; /* fd for our test file */ > > +blksize_t block_size = 0; > off_t file_size = 0; > off_t biggest = 0; > char state[256]; > @@ -142,6 +144,7 @@ int mapped_writes = 1; /* -W flag disables */ > int fallocate_calls = 1; /* -F flag disables */ > int punch_hole_calls = 1; /* -H flag disables */ > int zero_range_calls = 1; /* -z flag disables */ > +int collapse_range_calls = 1; /* -C flag disables */ > int mapped_reads = 1; /* -R flag disables it */ > int fsxgoodfd = 0; > int o_direct; /* -Z */ > @@ -321,13 +324,21 @@ logdump(void) > prt("\t******PPPP"); > break; > case OP_ZERO_RANGE: > - prt("ZERO 0x%x thru 0x%x\t(0x%x bytes)", > + prt("ZERO 0x%x thru 0x%x\t(0x%x bytes)", > lp->args[0], lp->args[0] + lp->args[1] - 1, > lp->args[1]); > if (badoff >= lp->args[0] && badoff < > lp->args[0] + lp->args[1]) > prt("\t******ZZZZ"); > break; > + case OP_COLLAPSE_RANGE: > + prt("COLLAPSE 0x%x thru 0x%x\t(0x%x bytes)", > + lp->args[0], lp->args[0] + lp->args[1] - 1, > + lp->args[1]); > + if (badoff >= lp->args[0] && badoff < > + lp->args[0] + lp->args[1]) > + prt("\t******CCCC"); > + break; > case OP_SKIPPED: > prt("SKIPPED (no operation)"); > break; > @@ -949,6 +960,58 @@ do_zero_range(unsigned offset, unsigned length) > } > #endif > > +#ifdef FALLOC_FL_COLLAPSE_RANGE > +void > +do_collapse_range(unsigned offset, unsigned length) > +{ > + unsigned end_offset; > + int mode = FALLOC_FL_COLLAPSE_RANGE; > + > + if (length == 0) { > + if (!quiet && testcalls > simulatedopcount) > + prt("skipping zero length collapse range\n"); > + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, length); > + return; > + } > + > + end_offset = offset + length; > + if ((loff_t)end_offset >= file_size) { > + if (!quiet && testcalls > simulatedopcount) > + prt("skipping collapse range behind EOF\n"); > + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, length); > + return; > + } > + > + log4(OP_COLLAPSE_RANGE, offset, length, 0); > + > + if (testcalls <= simulatedopcount) > + return; > + > + if ((progressinterval && testcalls % progressinterval == 0) || > + (debug && (monitorstart == -1 || monitorend == -1 || > + end_offset <= monitorend))) { > + prt("%lu collapse\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, > + offset, offset+length, length); > + } > + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { > + prt("collapse range: %x to %x\n", offset, length); > + prterr("do_collapse_range: fallocate"); > + report_failure(161); > + } > + > + memmove(good_buf + offset, good_buf + end_offset, > + file_size - end_offset); > + file_size -= length; > +} > + > +#else > +void > +do_collapse_range(unsigned offset, unsigned length) > +{ > + return; > +} > +#endif > + > #ifdef HAVE_LINUX_FALLOC_H > /* fallocate is basically a no-op unless extending, then a lot like a truncate */ > void > @@ -1123,6 +1186,12 @@ test(void) > goto out; > } > break; > + case OP_COLLAPSE_RANGE: > + if (!collapse_range_calls) { > + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, size); > + goto out; > + } > + break; > } > > switch (op) { > @@ -1165,6 +1234,16 @@ test(void) > TRIM_OFF_LEN(offset, size, file_size); > do_zero_range(offset, size); > break; > + case OP_COLLAPSE_RANGE: > + TRIM_OFF_LEN(offset, size, file_size - 1); > + offset = offset & ~(block_size - 1); > + size = size & ~(block_size - 1); > + if (size == 0) { > + log4(OP_SKIPPED, OP_COLLAPSE_RANGE, offset, size); > + goto out; > + } > + do_collapse_range(offset, size); > + break; > default: > prterr("test: unknown operation"); > report_failure(42); > @@ -1225,6 +1304,9 @@ usage(void) > #ifdef FALLOC_FL_ZERO_RANGE > " -z: Do not use zero range calls\n" > #endif > +#ifdef FALLOC_FL_COLLAPSE_RANGE > +" -C: Do not use collapse range calls\n" > +#endif > " -L: fsxLite - no file creations & no file size changes\n\ > -N numops: total # operations to do (default infinity)\n\ > -O: use oplen (see -o flag) for every op (default random)\n\ > @@ -1399,6 +1481,7 @@ main(int argc, char **argv) > char *endp; > char goodfile[1024]; > char logfile[1024]; > + struct stat statbuf; > > goodfile[0] = 0; > logfile[0] = 0; > @@ -1410,7 +1493,7 @@ main(int argc, char **argv) > > setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ > > - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzLN:OP:RS:WZ")) > + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCLN:OP:RS:WZ")) > != EOF) > switch (ch) { > case 'b': > @@ -1513,6 +1596,9 @@ main(int argc, char **argv) > case 'z': > zero_range_calls = 0; > break; > + case 'C': > + collapse_range_calls = 0; > + break; > case 'L': > lite = 1; > break; > @@ -1579,6 +1665,11 @@ main(int argc, char **argv) > prterr(fname); > exit(91); > } > + if (fstat(fd, &statbuf)) { > + prterr("check_size: fstat"); > + exit(91); > + } > + block_size = statbuf.st_blksize; > #ifdef XFS > if (prealloc) { > xfs_flock64_t resv = { 0 }; > @@ -1665,6 +1756,8 @@ main(int argc, char **argv) > FALLOC_FL_KEEP_SIZE); > if (zero_range_calls) > zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); > + if (collapse_range_calls) > + collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); > > while (numops == -1 || numops--) > test(); > From bfoster@redhat.com Wed Apr 2 15:11:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0657B7F78 for ; Wed, 2 Apr 2014 15:11:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DC0F7304053 for ; Wed, 2 Apr 2014 13:11:18 -0700 (PDT) X-ASG-Debug-ID: 1396469476-04bdf05dabc43680001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CFrj8aCIjpaa2rJ4 for ; Wed, 02 Apr 2014 13:11:17 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s32KBDHx027733 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 2 Apr 2014 16:11:14 -0400 Received: from laptop.bfoster (vpn-59-88.rdu2.redhat.com [10.10.59.88]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s32KBCGL031492; Wed, 2 Apr 2014 16:11:12 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 03E61120ADC; Wed, 2 Apr 2014 16:11:12 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s32KBAOX006755; Wed, 2 Apr 2014 16:11:10 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 2 Apr 2014 16:11:10 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140402201110.GC3043@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> <20140331222246.GF17603@dastard> <20140401135518.GC21540@bfoster.bfoster> <20140401211926.GH17603@dastard> <20140401232022.GA15934@bfoster.bfoster> <20140402051103.GL17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140402051103.GL17603@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396469477 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 02, 2014 at 04:11:03PM +1100, Dave Chinner wrote: > On Tue, Apr 01, 2014 at 07:20:23PM -0400, Brian Foster wrote: > > On Wed, Apr 02, 2014 at 08:19:26AM +1100, Dave Chinner wrote: > > > On Tue, Apr 01, 2014 at 09:55:18AM -0400, Brian Foster wrote: > > > Yes, it means that there is a global flush when a project quota runs > > > out of space, but it means that we only do it once and we don't burn > > > excessive CPU walking radix trees scanning inodes needlessly every > > > time we get a storm of processes hammering project quota ENOSPC. > > > > > > > It's not clear to me that excess scanning is an issue, but it seems > > Have 100 threads hit ENOSPC on the same project quota at the same > time on a filesystem with a couple of thousand AGs with a few > million cached inode, and then you'll see the problem.... > Right, that certainly sounds like a mess if we kicked off a bunch of the mini-flush scans. I'm curious how much overhead there would be with the flush out of the picture and a scan can actually go ahead and free up some space (hopefully) quickly. That's something I'll have to test. > > orthogonal to how we organize the enospc logic (at least once the flush > > is out of the equation). IOW, we'll invoke the scanner with the same > > frequency either way. Or maybe you are just referring to scanning > > specifically for the purpose of doing flushes as a waste..? > > Well, lots of concurrent scanning for the same purpose is highly > inefficient - look at the amount of additional serialisation in the > inode recalim walker that is aimed at reducing concurrency to one > reclaim thread per AG at a time... > Interesting, and I think this touches a bit on what I mean by the scanning being somewhat orthogonal to the purpose of this patch. If the scanning does turn out to be a real problem in this particular context, why not try to improve the efficiency of the scan? We could include this kind of per-ag locking for internal scans, or perhaps create a new scan mode that exits after freeing a specified amount of space, etc. > I expect that if the serialisation on xfs_flush_inodes() isn't > sufficient to throttle eofblock scanning concurrency in case like > the above then we'll know about it pretty quickly. > How much space should we expect xfs_flush_inodes() to free up? Using your example of the unconditional flush followed by the global scan - it seems like it could throttle things temporarily by allowing some set of writers to serialize on a flush and hopefully soon after that other writers can allocate space again. Once we're past that, those flushing threads head into the scan just the same. So I guess the question is, will the flush satisfy concurrent writers long enough for one of the flush inducing threads to get into the scan and prevent others from queuing further? If so, it seems like a potential positive if the overhead of the flush is less than the overhead of the "unbounded" scan in the same scenario. If not, it seems like it could also be a potential net negative because we'll effectively queue more threads on the flush that could have avoided allocation failure were a scan already running and freeing space. I guess that all depends on how long the flush takes, how much data is in cache, storage hardware, etc. Something else I'll have to experiment with a little more I suppose... :) > > > > simplify things. The helper can run the quota scan and/or the global > > > > scan based on the data regarding the situation (i.e., the inode and > > > > associated quota characteristics). This allows us to preserve the notion > > > > of attempting a lightweight recovery first and a heavyweight recovery > > > > second, reserving the inode flush for when space is truly tight. > > > > Thoughts? > > > > > > It's still damn clunky, IMO. It's still trying to work around the > > > fact that project quotas use ENOSPC rather than EDQUOT, and that > > > makes the logic rather twisted. And it still has that hidden data > > > flush in it so it can't really be called lightweight... > > > > > > > Ok. Well if the high level logic is the issue, we could still turn that > > inside out a bit to use your EDQUOT/ENOSPC logic, yet still preserve the > > standalone eofblocks scan. It might be a few more lines, but perhaps > > more clear. E.g.: > > > > if (ret == -EDQUOT && !enospc) { > > enospc = 1; > > xfs_inode_free_quota_eofblocks(ip); > > goto retry; > > else if (ret == -ENOSPC && !enospc) { > > if (!scanned) { > > struct xfs_eofblocks eofb = {0}; > > ... > > scanned = 1; > > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > goto retry; > > } > > > > enospc = 1; > > xfs_flush_inodes(ip->i_mount); > > goto retry; > > } > > > > Thoughts on that? > > Even more convoluted. :/ > That's pretty close to your example with the exception of adding the retry after the scan and the scan/flush order. It loses the EDQUT/ENOSPC confusion. > Look at it this way - I've never been a fan of this "retry write on > enospc once" code. It's a necessary evil due to the reality of > locking orders and having to back out of the write far enough to > safely trigger dirty inode writeback so we *might* be able to write > this data. Making this code more finicky and tricky is the last > thing I think we should be doing. > > I don't have any better ideas at this point - I'm still tired and > jetlagged and need to sort out everything for a merge window pull of > the current tree, so time for me to think up a creative solution is > limited. I'm hoping that you might be able to think of a different > way entirely of doing this "write retry on ENOSPC" that dolves all > these problems simply and easily ;) > Fair enough, that's certainly more helpful. ;) We're probably closer on this than I thought. I'm not arguing because I think this code is great, but rather because the behavior we have seems kind of obtuse in particular situations and can be improved with some reasonably small changes. > > We'll handle project quota ENOSPC just as we handle > > global ENOSPC with respect to the scan and the flush, but we'll still > > have the opportunity to free up a decent amount of space without > > initiating I/O. The project quota scan down in free_quota_eofblocks() > > might be rendered pointless as well. > > Well, therein lies an avenue of investigation: for EOF block > trimming, why would we need to do a flush first, even for project > quotas? And if we aren't going to flush data, why does it need to be > done at this level? Can it be done deep in the quota code where we > know exactly what quota ran out of space? > This is something I considered way back when first looking at this (http://oss.sgi.com/archives/xfs/2012-12/msg00112.html). I don't recall specifically what made that difficult, perhaps lack of enough information to run a scan in a single context. I'll reset and have another look at it. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Wed Apr 2 20:14:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB8CD29E05 for ; Wed, 2 Apr 2014 20:14:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B842B8F8092 for ; Wed, 2 Apr 2014 18:14:28 -0700 (PDT) X-ASG-Debug-ID: 1396487665-04cb6c5675c2a010001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GRuCH1H5uNp5BSCq for ; Wed, 02 Apr 2014 18:14: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: Ap1PAHW1PFN5LEcvPGdsb2JhbABZDoJ4iFW8JYEbFwMBAQEBODWCJQEBAQMBOhwREgULCAMYCSUPBSUDBxoTG4dWB89bFxaOWgeEOASYV5Qrf1Qp Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Apr 2014 11:44:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVWEN-0000Gh-V4; Thu, 03 Apr 2014 12:14:11 +1100 Date: Thu, 3 Apr 2014 12:14:11 +1100 From: Dave Chinner To: Theodore Ts'o Cc: Sedat Dilek , lsf@lists.linux-foundation.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140403011411.GL16336@dastard> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140402142620.GA6901@thunk.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: 1396487665 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Apr 02, 2014 at 10:26:20AM -0400, Theodore Ts'o wrote: > On Wed, Apr 02, 2014 at 09:28:23AM +1100, Dave Chinner wrote: > > > And of course, whether changes in the mainline kernel tree are > > > manually propagated changes from the xfstests.git tree, or whether > > > primary development happens in the kernel tree, is ultimately going to > > > be up to you and the XFS developers who have stewardship of xfstests. > > > I'm not sure I would be that excited about manual propagation of > > > changes from one git tree to another, but that is of course, up to > > > you. > > > > And this is exactly my point, Ted. Again, you are presuming that the > > implementation is going to require syncing commits across disparate > > git trees and other such games will be needed to maintain separate > > packages. Nothing could be further from the truth: we already have > > this problem with the shared XFS kernel/userspace code and it's a > > royal PITA keeping them in sync. Hence introducing the same > > maintenance problem with new code and infrastructure is highly > > undesirable and something we'll try to avoid at all costs. > > Actually, I was presuming that the thing that makes the most sense was > to move all or most of the tests in xfstests into the kernel tests > tree. And then you complained that I was making a presumption that > this was the only sane thing to do. That's why I said, "if you want > to do something insane, be my guest". So, you think there's only one "sane" solution. That's a massive assumption, and that's what I'm pointing out. It's perfectly sane to treat the kernel tree as just another downstream consumer of xfstests, and simple add infrastructure to the kernel tree to source and build xfstests from the upstream repo. Indeed, this is the existing model that seems to work for just about everyone, so I see no reason why we should treat Greg's request any differently. IOWs, you're assumming that the only thing that makes sense is that "kernel tree == upstream". We don't push code into the kernel tree just because it's the Kernel Tree. We push code there if it makes sense to do so - either from a commercial or technical PO. We have no commercial motive to move xfstests into the kernel tree, and I see a lot technical downsides to moving xfstests in it's entirity to the kernel tree. So, really, putting some infrastructure into the kernel tree to use xfstests (i.e. a downstream consumer) makes a lot more sense from a technical point of view than making the kernel tree the xfstests upstream. It's a sane way to solve the problem that Greg wanted solved - the kernel tree carries the infrastructure needed to solve the "test in place" use case that -stable maintainers want, but it doesn't turn test development nor filesystem developer work flows on their head nor make xfstests less useful to existing users. > I have nothing against doing a formal requirements process, that's I'm not doing anything formal, just doing the right thing to make sure we don't do all the work and then be told "not acceptable".... > fine, but I think there are certain things about what the final > solution of "test in the kernel git tree" will look like that are > pretty obvious. Certain things, yes. Like using kvm to run the tests in a container. Just what form that takes is not clear right now... Cheers, Dave. -- Dave Chinner david@fromorbit.com From rickie@olivedrabgs.com Wed Apr 2 22:34:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,RCVD_NUMERIC_HELO autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B3417F59 for ; Wed, 2 Apr 2014 22:34:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 164C5304053 for ; Wed, 2 Apr 2014 20:34:11 -0700 (PDT) X-ASG-Debug-ID: 1396496047-04bdf05dacc58960001-NocioJ Received: from smtp311.phy.lolipop.jp (smtp311.phy.lolipop.jp [210.157.22.79]) by cuda.sgi.com with ESMTP id E2FTQhwik1OjKX1D for ; Wed, 02 Apr 2014 20:34:08 -0700 (PDT) X-Barracuda-Envelope-From: rickie@olivedrabgs.com X-Barracuda-Apparent-Source-IP: 210.157.22.79 Received: from smtp311.phy.lolipop.lan (HELO smtp311.phy.lolipop.jp) (172.17.1.11) (smtp-auth username rickie@olivedrabgs.com, mechanism plain) by smtp311.phy.lolipop.jp (qpsmtpd/0.82) with ESMTPA; Thu, 03 Apr 2014 12:34:07 +0900 Received: from 49.144.77.32 (49.144.77.32) by smtp311.phy.lolipop.jp (LOLIPOP-Fsecure); Thu, 03 Apr 2014 12:33:43 +0900 (JST) X-Virus-Status: clean(LOLIPOP-Fsecure) Message-ID: <533CD6B7.1060809@olivedrabgs.com> Date: Thu, 03 Apr 2014 11:34:15 +0800 From: "Rickie Amado (PersuasiveSVC)" User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: undisclosed-recipients:; Subject: ODGS, Inc. | Software Development Service Content-Type: multipart/alternative; boundary="------------000700020403030505020106" X-ASG-Orig-Subj: ODGS, Inc. | Software Development Service X-Barracuda-Connect: smtp311.phy.lolipop.jp[210.157.22.79] X-Barracuda-Start-Time: 1396496048 X-Barracuda-URL: http://192.48.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.75 X-Barracuda-Spam-Status: No, SCORE=1.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO This is a multi-part message in MIME format. --------------000700020403030505020106 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Dear Customer, good day ! For more than 2 years now, ODGS, Inc. provided *Quality IT-related Services* to various industries like Restaurants, Manufacturing, BPO, Real Estate, as well as fellow IT companies, and more, with *Reasonable Cost*. We provide *Inventory* System, *HR* System, *Billing* System, and other *Custom**ized**Software* solutions you may require. Our company is composed of *Skilled Software Developers* who will help you build your required IT solutions. We have teams of developers using *.NET* (C#, VB, ASP), *PHP* (CodeIgniter, Wordpress), as well as *Java* (Struts, Spring/Hibernate). I would like to request a *5-minute call* to discuss how we can support you with your IT concerns. Thank you and looking forward to hearing from you soon ! -- Regards, ----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- Roderick Amado Olive Drab Global Services, Inc. (http://www.olivedrabgs.com) Suite 22, Zeta Building, 191 Salcedo Street, Legaspi Village, Makati City 1229, Philippines Cellphone : +63-918-933-7301 Landline : +63-2-553-7405 (Reception) +63-2-553-7406 (President's Office) "Storms make trees take deeper roots." --------------000700020403030505020106 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
Dear Customer, good day !

For more than 2 years now, ODGS, Inc. provided Quality IT-related Services to various industries like Restaurants, Manufacturing, BPO, Real Estate, as well as fellow IT companies, and more, with Reasonable Cost.  We provide Inventory System, HR System, Billing System, and other Customized Software solutions you may require.

Our company is composed of Skilled Software Developers who will help you build your required IT solutions.
We have teams of developers using .NET (C#, VB, ASP), PHP (CodeIgniter, Wordpress), as well as Java (Struts, Spring/Hibernate).

I would like to request a 5-minute call to discuss how we can support you with your IT concerns.

Thank you and looking forward to hearing from you soon !


-- 
Regards,
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
Roderick Amado
Olive Drab Global Services, Inc. (http://www.olivedrabgs.com)
Suite 22, Zeta Building, 191 Salcedo Street, Legaspi Village,
Makati City 1229, Philippines
Cellphone : +63-918-933-7301
Landline  : +63-2-553-7405 (Reception)
            +63-2-553-7406 (President's Office)

"Storms make trees take deeper roots."
 
--------------000700020403030505020106-- From lczerner@redhat.com Thu Apr 3 05:27:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 61F137F60 for ; Thu, 3 Apr 2014 05:27:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 369988F80B8 for ; Thu, 3 Apr 2014 03:27:01 -0700 (PDT) X-ASG-Debug-ID: 1396520820-04cb6c5677c42ff0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 49ADkVwOQtfiBHz6 for ; Thu, 03 Apr 2014 03:27:01 -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-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 s33AQmBJ010462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 3 Apr 2014 06:26:48 -0400 Received: from dhcp-1-214.brq.redhat.com (dhcp-1-214.brq.redhat.com [10.34.1.214]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s33AQj7w018407 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 3 Apr 2014 06:26:46 -0400 Date: Thu, 3 Apr 2014 12:26:44 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner cc: "Theodore Ts'o" , Sedat Dilek , lsf@lists.linux-foundation.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all In-Reply-To: <20140403011411.GL16336@dastard> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396520820 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 3 Apr 2014, Dave Chinner wrote: > Date: Thu, 3 Apr 2014 12:14:11 +1100 > From: Dave Chinner > To: Theodore Ts'o > Cc: Sedat Dilek , lsf@lists.linux-foundation.org, > linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of > CPUs in build-all > > On Wed, Apr 02, 2014 at 10:26:20AM -0400, Theodore Ts'o wrote: > > On Wed, Apr 02, 2014 at 09:28:23AM +1100, Dave Chinner wrote: > > > > And of course, whether changes in the mainline kernel tree are > > > > manually propagated changes from the xfstests.git tree, or whether > > > > primary development happens in the kernel tree, is ultimately going to > > > > be up to you and the XFS developers who have stewardship of xfstests. > > > > I'm not sure I would be that excited about manual propagation of > > > > changes from one git tree to another, but that is of course, up to > > > > you. > > > > > > And this is exactly my point, Ted. Again, you are presuming that the > > > implementation is going to require syncing commits across disparate > > > git trees and other such games will be needed to maintain separate > > > packages. Nothing could be further from the truth: we already have > > > this problem with the shared XFS kernel/userspace code and it's a > > > royal PITA keeping them in sync. Hence introducing the same > > > maintenance problem with new code and infrastructure is highly > > > undesirable and something we'll try to avoid at all costs. > > > > Actually, I was presuming that the thing that makes the most sense was > > to move all or most of the tests in xfstests into the kernel tests > > tree. And then you complained that I was making a presumption that > > this was the only sane thing to do. That's why I said, "if you want > > to do something insane, be my guest". > > So, you think there's only one "sane" solution. That's a massive > assumption, and that's what I'm pointing out. > > It's perfectly sane to treat the kernel tree as just another > downstream consumer of xfstests, and simple add infrastructure to > the kernel tree to source and build xfstests from the upstream repo. That's what I think is the best approach as well. We'll still have separate tree for the xfstests which works for everyone and infrastructure in kernel tree which will simply use it. Looking at rcutorture tests in kernel tree, they are indeed using qemu and it looks like that they are running those tests directly from init script - we really need an image to boot from. We could use virtme https://git.kernel.org/cgit/utils/kernel/virtme/virtme.git/ which seems like a best option. Alternatively we could allow users passing their own image as well. Then we would need init script which would download and build xfstests, xfsprogs and possible other dependencies (such as fio) and finally run xfstests itself. Colnsole output from the qemu can be redirected to the file in the host, so that's ok, but we still need a way to retrieve 'retults' directory from the test. We'd also need a devices to test on (at least TEST_DEV and SCRATCH_DEV). Those could be files a of set size exported to qemu as block devices. I think that looking at rcutorture test infrastructure is a good start and we can possibly reuse parts of it for actually running the qemu and then reuse parts of Ted's solution to run xfstests in the virtual guest. Thanks! -Lukas > Indeed, this is the existing model that seems to work for just about > everyone, so I see no reason why we should treat Greg's request any > differently. > > IOWs, you're assumming that the only thing that makes sense is that > "kernel tree == upstream". We don't push code into the kernel tree > just because it's the Kernel Tree. We push code there if it makes > sense to do so - either from a commercial or technical PO. We have > no commercial motive to move xfstests into the kernel tree, and I > see a lot technical downsides to moving xfstests in it's entirity to the > kernel tree. > > So, really, putting some infrastructure into the kernel tree to use > xfstests (i.e. a downstream consumer) makes a lot more sense from a > technical point of view than making the kernel tree the xfstests > upstream. > > It's a sane way to solve the problem that Greg wanted solved - the > kernel tree carries the infrastructure needed to solve the "test in > place" use case that -stable maintainers want, but it doesn't turn > test development nor filesystem developer work flows on their head > nor make xfstests less useful to existing users. > > > I have nothing against doing a formal requirements process, that's > > I'm not doing anything formal, just doing the right thing to make > sure we don't do all the work and then be told "not acceptable".... > > > fine, but I think there are certain things about what the final > > solution of "test in the kernel git tree" will look like that are > > pretty obvious. > > Certain things, yes. Like using kvm to run the tests in a container. > Just what form that takes is not clear right now... > > Cheers, > > Dave. > From BATV+541636404dd8f7fa9db7+3875+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 3 06:07:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2EE57F51 for ; Thu, 3 Apr 2014 06:07:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85BA9304048 for ; Thu, 3 Apr 2014 04:07:31 -0700 (PDT) X-ASG-Debug-ID: 1396523250-04bdf05dabc6d890001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id i9coGY6LgHhPnqw6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 04:07:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+541636404dd8f7fa9db7+3875+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WVfUY-00082W-4Q; Thu, 03 Apr 2014 11:07:30 +0000 Date: Thu, 3 Apr 2014 04:07:30 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE Message-ID: <20140403110730.GB26244@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140313101302.996355155@bombadil.infradead.org> <20140313101433.608283621@bombadil.infradead.org> <20140313112907.GJ4263@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313112907.GJ4263@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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1396523250 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4542 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Skipping this for now, filtering the repair output properly is going to be a lot of work, and I'd rather do a generic unlinked inode list recovery test instead of tying it to O_TMPFILE. With the first patch already reviewed and the second updated those should be ready to apply now. From contact@theyiffgallery.com Thu Apr 3 08:06:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1CE9C7F63 for ; Thu, 3 Apr 2014 08:06:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0AEB8F8033 for ; Thu, 3 Apr 2014 06:05:59 -0700 (PDT) X-ASG-Debug-ID: 1396530356-04bdf05dacc74cf0001-NocioJ Received: from triton123.server4you.net (triton123.server4you.de [85.25.111.155]) by cuda.sgi.com with ESMTP id JyDj4iRqR7DsLaYE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 06:05:57 -0700 (PDT) X-Barracuda-Envelope-From: contact@theyiffgallery.com X-Barracuda-Apparent-Source-IP: 85.25.111.155 Received: by triton123.server4you.net (Postfix, from userid 10000) id 2EF5A25EF07B; Thu, 3 Apr 2014 15:05:23 +0200 (CEST) To: xfs@oss.sgi.com Subject: Order questions. X-PHP-Originating-Script: 10000:zbbss.php X-ASG-Orig-Subj: Order questions. From: Coast Supply Ltd. Reply-To: coastsupply@blumail.org MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20140403130556.2EF5A25EF07B@triton123.server4you.net> Date: Thu, 3 Apr 2014 15:05:23 +0200 (CEST) X-Barracuda-Connect: triton123.server4you.de[85.25.111.155] X-Barracuda-Start-Time: 1396530357 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4544 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi! Sales, How are you doing today! I'm very much interested in purchasing some of your products but firstly i want to make an inquiry if you can ship directly to us here in Tortola, British Virgin Islands, 1. Do you accept credit card Yes / No ( Answer ) 2. What type of card do you accept 3. Do you ship to British Virgin Islands Yes / No ( Answer ) 3) Can you work hand in hand with my freight forwarder personal shipping agent? so they can Pickup the products directly from your location down to us here in the British Virgin Islands Yes / No ( Answer ) I'll be looking forward to hearing from you. Thank you, President, Owner. Andrea Roberto. From contact@theyiffgallery.com Thu Apr 3 08:09:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FDB57F69 for ; Thu, 3 Apr 2014 08:09:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CA7D8F8033 for ; Thu, 3 Apr 2014 06:09:59 -0700 (PDT) X-ASG-Debug-ID: 1396530597-04cb6c5675c4c640001-NocioJ Received: from triton123.server4you.net (triton123.server4you.de [85.25.111.155]) by cuda.sgi.com with ESMTP id gHjhGl81Nu5W6dRr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 06:09:57 -0700 (PDT) X-Barracuda-Envelope-From: contact@theyiffgallery.com X-Barracuda-Apparent-Source-IP: 85.25.111.155 Received: by triton123.server4you.net (Postfix, from userid 10000) id 8AD5F25EED6F; Thu, 3 Apr 2014 15:05:38 +0200 (CEST) To: xfs@oss.sgi.com Subject: Order questions. X-PHP-Originating-Script: 10000:zbbss.php X-ASG-Orig-Subj: Order questions. From: Coast Supply Ltd. Reply-To: coastsupply@blumail.org MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: <20140403130956.8AD5F25EED6F@triton123.server4you.net> Date: Thu, 3 Apr 2014 15:05:38 +0200 (CEST) X-Barracuda-Connect: triton123.server4you.de[85.25.111.155] X-Barracuda-Start-Time: 1396530597 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: cf7185704a5789b21b5b8c6e0861b78e-672-htm X-Barracuda-Spam-Score: 1.05 X-Barracuda-Spam-Status: No, SCORE=1.05 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4543 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag Hi! Sales, How are you doing today! I'm very much interested in purchasing some of your products but firstly i want to make an inquiry if you can ship directly to us here in Tortola, British Virgin Islands, 1. Do you accept credit card Yes / No ( Answer ) 2. What type of card do you accept 3. Do you ship to British Virgin Islands Yes / No ( Answer ) 3) Can you work hand in hand with my freight forwarder personal shipping agent? so they can Pickup the products directly from your location down to us here in the British Virgin Islands Yes / No ( Answer ) I'll be looking forward to hearing from you. Thank you, President, Owner. Andrea Roberto. From contact@theyiffgallery.com Thu Apr 3 08:10:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,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 551BA7F75 for ; Thu, 3 Apr 2014 08:10:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4AE8AC001 for ; Thu, 3 Apr 2014 06:09:59 -0700 (PDT) X-ASG-Debug-ID: 1396530594-04bdf05daac751c0001-NocioJ Received: from triton123.server4you.net (triton123.server4you.de [85.25.111.155]) by cuda.sgi.com with ESMTP id pCZtN4zroVuAyFAZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 06:09:55 -0700 (PDT) X-Barracuda-Envelope-From: contact@theyiffgallery.com X-Barracuda-Apparent-Source-IP: 85.25.111.155 Received: by triton123.server4you.net (Postfix, from userid 10000) id C498125EED2D; Thu, 3 Apr 2014 15:05:23 +0200 (CEST) To: xfs@oss.sgi.com Subject: Order questions. X-PHP-Originating-Script: 10000:zbbss.php X-ASG-Orig-Subj: Order questions. From: Coast Supply Ltd. Reply-To: coastsupply@blumail.org MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: <20140403130952.C498125EED2D@triton123.server4you.net> Date: Thu, 3 Apr 2014 15:05:23 +0200 (CEST) X-Barracuda-Connect: triton123.server4you.de[85.25.111.155] X-Barracuda-Start-Time: 1396530594 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-BRTS-Evidence: cf7185704a5789b21b5b8c6e0861b78e-672-htm X-Barracuda-Spam-Score: 1.05 X-Barracuda-Spam-Status: No, SCORE=1.05 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4544 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag Hi! Sales, How are you doing today! I'm very much interested in purchasing some of your products but firstly i want to make an inquiry if you can ship directly to us here in Tortola, British Virgin Islands, 1. Do you accept credit card Yes / No ( Answer ) 2. What type of card do you accept 3. Do you ship to British Virgin Islands Yes / No ( Answer ) 3) Can you work hand in hand with my freight forwarder personal shipping agent? so they can Pickup the products directly from your location down to us here in the British Virgin Islands Yes / No ( Answer ) I'll be looking forward to hearing from you. Thank you, President, Owner. Andrea Roberto. From contact@theyiffgallery.com Thu Apr 3 08:11:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E965F7F73 for ; Thu, 3 Apr 2014 08:11:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D38E88F80B7 for ; Thu, 3 Apr 2014 06:11:58 -0700 (PDT) X-ASG-Debug-ID: 1396530716-04cb6c5676c4c8a0001-NocioJ Received: from triton123.server4you.net (triton123.server4you.de [85.25.111.155]) by cuda.sgi.com with ESMTP id CTGP2pNoitzrUrhb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 06:11:57 -0700 (PDT) X-Barracuda-Envelope-From: contact@theyiffgallery.com X-Barracuda-Apparent-Source-IP: 85.25.111.155 Received: by triton123.server4you.net (Postfix, from userid 10000) id 2749F25EED5D; Thu, 3 Apr 2014 15:05:22 +0200 (CEST) To: xfs@oss.sgi.com Subject: Order questions. X-PHP-Originating-Script: 10000:zbbss.php X-ASG-Orig-Subj: Order questions. From: Coast Supply Ltd. Reply-To: coastsupply@blumail.org MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20140403131156.2749F25EED5D@triton123.server4you.net> Date: Thu, 3 Apr 2014 15:05:22 +0200 (CEST) X-Barracuda-Connect: triton123.server4you.de[85.25.111.155] X-Barracuda-Start-Time: 1396530716 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4543 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi! Sales, How are you doing today! I'm very much interested in purchasing some of your products but firstly i want to make an inquiry if you can ship directly to us here in Tortola, British Virgin Islands, 1. Do you accept credit card Yes / No ( Answer ) 2. What type of card do you accept 3. Do you ship to British Virgin Islands Yes / No ( Answer ) 3) Can you work hand in hand with my freight forwarder personal shipping agent? so they can Pickup the products directly from your location down to us here in the British Virgin Islands Yes / No ( Answer ) I'll be looking forward to hearing from you. Thank you, President, Owner. Andrea Roberto. From contact@theyiffgallery.com Thu Apr 3 08:12:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 728907F85 for ; Thu, 3 Apr 2014 08:12:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C9658F80B8 for ; Thu, 3 Apr 2014 06:12:54 -0700 (PDT) X-ASG-Debug-ID: 1396530772-04cbb054b7a5cf70001-NocioJ Received: from triton123.server4you.net (triton123.server4you.de [85.25.111.155]) by cuda.sgi.com with ESMTP id O7LXK5JJj63Uvf9l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 06:12:53 -0700 (PDT) X-Barracuda-Envelope-From: contact@theyiffgallery.com X-Barracuda-Apparent-Source-IP: 85.25.111.155 Received: by triton123.server4you.net (Postfix, from userid 10000) id 81ED625EEE51; Thu, 3 Apr 2014 15:05:23 +0200 (CEST) To: xfs@oss.sgi.com Subject: Order questions. X-PHP-Originating-Script: 10000:zbbss.php X-ASG-Orig-Subj: Order questions. From: Coast Supply Ltd. Reply-To: coastsupply@blumail.org MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: <20140403131252.81ED625EEE51@triton123.server4you.net> Date: Thu, 3 Apr 2014 15:05:23 +0200 (CEST) X-Barracuda-Connect: triton123.server4you.de[85.25.111.155] X-Barracuda-Start-Time: 1396530773 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.05 X-Barracuda-Spam-Status: No, SCORE=1.05 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4544 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag Hi! Sales, How are you doing today! I'm very much interested in purchasing some of your products but firstly i want to make an inquiry if you can ship directly to us here in Tortola, British Virgin Islands, 1. Do you accept credit card Yes / No ( Answer ) 2. What type of card do you accept 3. Do you ship to British Virgin Islands Yes / No ( Answer ) 3) Can you work hand in hand with my freight forwarder personal shipping agent? so they can Pickup the products directly from your location down to us here in the British Virgin Islands Yes / No ( Answer ) I'll be looking forward to hearing from you. Thank you, President, Owner. Andrea Roberto. From mgorman@suse.de Thu Apr 3 08:16:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 621637F76 for ; Thu, 3 Apr 2014 08:16:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA146AC002 for ; Thu, 3 Apr 2014 06:16:17 -0700 (PDT) X-ASG-Debug-ID: 1396530975-04cbb054b8a5d2f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id MJ3AZa3eTmbcPynj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 03 Apr 2014 06:16:16 -0700 (PDT) X-Barracuda-Envelope-From: mgorman@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 7B3F0AB0E; Thu, 3 Apr 2014 13:16:14 +0000 (UTC) Date: Thu, 3 Apr 2014 14:16:10 +0100 From: Mel Gorman To: Theodore Ts'o Cc: Dave Chinner , Sedat Dilek , lsf@lists.linux-foundation.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140403131610.GB7292@suse.de> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <20140402142620.GA6901@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1396530975 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4544 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Apr 02, 2014 at 10:26:20AM -0400, Theodore Ts'o wrote: > On Wed, Apr 02, 2014 at 09:28:23AM +1100, Dave Chinner wrote: > > > And of course, whether changes in the mainline kernel tree are > > > manually propagated changes from the xfstests.git tree, or whether > > > primary development happens in the kernel tree, is ultimately going to > > > be up to you and the XFS developers who have stewardship of xfstests. > > > I'm not sure I would be that excited about manual propagation of > > > changes from one git tree to another, but that is of course, up to > > > you. > > > > And this is exactly my point, Ted. Again, you are presuming that the > > implementation is going to require syncing commits across disparate > > git trees and other such games will be needed to maintain separate > > packages. Nothing could be further from the truth: we already have > > this problem with the shared XFS kernel/userspace code and it's a > > royal PITA keeping them in sync. Hence introducing the same > > maintenance problem with new code and infrastructure is highly > > undesirable and something we'll try to avoid at all costs. > > Actually, I was presuming that the thing that makes the most sense was > to move all or most of the tests in xfstests into the kernel tests > tree. And then you complained that I was making a presumption that > this was the only sane thing to do. That's why I said, "if you want > to do something insane, be my guest". > FWIW, I also don't think that xfstests or a framework should go into the kernel tree for the following reasons 1. Tests can be created during the release cycle and it does not make sense to tie the availabilty of tests to the availability of a kernel. If someone is running tests against historical tests, they must first checkout the most recent kernel tree, build xfstests and then checkout the old tree. Yes, users can be given a patch against the kernel tree to add a new test but they still have this awkward switching back and forth between the branch that has the test and the kernel they are running the test against. Recent example -- trinity 1.3 does not trigger MM bugs. Until recently, the latest git version of trinity caused massive damage. If trinity had been in the tree someone might have accidentally concluded that 3.13 was "fine" 2. It would be relatively easy for someone to mistakenly bisect xfstests instead of bisecting the kernel although my understanding is that tests do not change per-se, only new ones are added. There may be exceptions to this rule 3. With testing automation, it's not that hard to download the requirements for it. mmtests prefers to use a local mirror but falls back to downloading tarballs, checking out git trees or mercurcial trees as appropriate. It's just a few lines of code (most of which is auto-generated from a template). 4. Testing monoculture. Sometimes the value of a benchmark is because different people run it differently for whatever reason. My IO tests for example all tune the benchmark to at least 2*RAM but that misses the cases where there are regressions in IO to a file that fits in memory. xfstests might have similar problems but minimally it would be a shame if the framework always used the same mount options for example. FWIW I've had bugs reported that were real bugs and only revealed because the benchmark parameters made no sense but still found a bug by accident. Overall I have little motivation to having all the tests in the kernel tree. That said, I already have an automated framework I can use so I would not feel as strongly about the problem. The point is that putting tests in tree or out of tree is neither sane nor insane. It's simply different approaches so people on the thread should be wary of trying to label the other person as being mental just because of where they want to stick a test. -- Mel Gorman SUSE Labs From luto@amacapital.net Thu Apr 3 12:05:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 37CB37F81 for ; Thu, 3 Apr 2014 12:05:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0436F304067 for ; Thu, 3 Apr 2014 10:05:52 -0700 (PDT) X-ASG-Debug-ID: 1396544747-04bdf05daac81020001-NocioJ Received: from mail-qc0-f182.google.com (mail-qc0-f182.google.com [209.85.216.182]) by cuda.sgi.com with ESMTP id SX62ZZGDbvxmJHfH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Apr 2014 10:05:47 -0700 (PDT) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.216.182 Received: by mail-qc0-f182.google.com with SMTP id e16so2217941qcx.27 for ; Thu, 03 Apr 2014 10:05:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type:content-transfer-encoding; bh=5JBC9458MIVmlo9byECFbs42Hg8+PrTQ4bw7M9feCHk=; b=mIbQ7jIcfu7Y43lA8sNIatE8Fz2GRw2M0kwdW53KHsaRnhdmVVeq+EGTGl7SkFfaXY cXczwELMs1MpqhEwLnQ0o7fGmqKWJnmxo+wkpWJfPI+zNItjDBd0FNxQij8cTOLt0pK+ CUsMcxbvrQh+DLw3G3ukqDM2CTtKZqpOK/GP5UrqJyiP9wbvXxE1Dxg6BiaSIRt20gI+ EgL69ZyShY5/cdoD/Lm+zXVbziemn03a5BXCZS8HRpGm5ZlETpCfDU76Xqs1p2HAo2Ar oviG3qRyEOPlOH8nYWLGY58ayx5SN7hc9tHgoHczJXzRVVRR80Ovre1KohHBpRuZ2amH QUIg== X-Gm-Message-State: ALoCoQmGBM1qf3qkMy90UggLtSIkIsiKK4tvx/BfHGdM/+Si6iumbATyfIeWZbdhp4kB7E74CMiy X-Received: by 10.224.160.142 with SMTP id n14mr8797252qax.17.1396544746863; Thu, 03 Apr 2014 10:05:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.126.66 with HTTP; Thu, 3 Apr 2014 10:05:26 -0700 (PDT) In-Reply-To: References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> From: Andy Lutomirski Date: Thu, 3 Apr 2014 10:05:26 -0700 Message-ID: Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all To: =?ISO-8859-2?Q?Luk=E1=B9_Czerner?= X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Cc: Dave Chinner , "Theodore Ts'o" , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qc0-f182.google.com[209.85.216.182] X-Barracuda-Start-Time: 1396544747 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.3.4548 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Thu, Apr 3, 2014 at 3:26 AM, Luk=C3=A1=C5=A1 Czerner wrote: > On Thu, 3 Apr 2014, Dave Chinner wrote: > >> Date: Thu, 3 Apr 2014 12:14:11 +1100 >> From: Dave Chinner >> To: Theodore Ts'o >> Cc: Sedat Dilek , lsf@lists.linux-foundation.org, >> linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.s= gi.com >> Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of numbe= r of >> CPUs in build-all >> >> On Wed, Apr 02, 2014 at 10:26:20AM -0400, Theodore Ts'o wrote: >> > On Wed, Apr 02, 2014 at 09:28:23AM +1100, Dave Chinner wrote: >> > > > And of course, whether changes in the mainline kernel tree are >> > > > manually propagated changes from the xfstests.git tree, or whether >> > > > primary development happens in the kernel tree, is ultimately goin= g to >> > > > be up to you and the XFS developers who have stewardship of xfstes= ts. >> > > > I'm not sure I would be that excited about manual propagation of >> > > > changes from one git tree to another, but that is of course, up to >> > > > you. >> > > >> > > And this is exactly my point, Ted. Again, you are presuming that the >> > > implementation is going to require syncing commits across disparate >> > > git trees and other such games will be needed to maintain separate >> > > packages. Nothing could be further from the truth: we already have >> > > this problem with the shared XFS kernel/userspace code and it's a >> > > royal PITA keeping them in sync. Hence introducing the same >> > > maintenance problem with new code and infrastructure is highly >> > > undesirable and something we'll try to avoid at all costs. >> > >> > Actually, I was presuming that the thing that makes the most sense was >> > to move all or most of the tests in xfstests into the kernel tests >> > tree. And then you complained that I was making a presumption that >> > this was the only sane thing to do. That's why I said, "if you want >> > to do something insane, be my guest". >> >> So, you think there's only one "sane" solution. That's a massive >> assumption, and that's what I'm pointing out. >> >> It's perfectly sane to treat the kernel tree as just another >> downstream consumer of xfstests, and simple add infrastructure to >> the kernel tree to source and build xfstests from the upstream repo. > > That's what I think is the best approach as well. We'll still have > separate tree for the xfstests which works for everyone and > infrastructure in kernel tree which will simply use it. > > Looking at rcutorture tests in kernel tree, they are indeed using > qemu and it looks like that they are running those tests directly > from init script - we really need an image to boot from. > > We could use virtme > > https://git.kernel.org/cgit/utils/kernel/virtme/virtme.git/ virtme will eventually be able to use a separate OS image, probably in the form of a directory with appropriate xattrs set. I could support images on a block device too, but that's boring :) > > which seems like a best option. Alternatively we could allow users > passing their own image as well. > > Then we would need init script which would download and build > xfstests, xfsprogs and possible other dependencies (such as fio) > and finally run xfstests itself. Colnsole output from the qemu can > be redirected to the file in the host, so that's ok, but we still > need a way to retrieve 'retults' directory from the test. > > We'd also need a devices to test on (at least TEST_DEV and > SCRATCH_DEV). Those could be files a of set size exported to qemu as > block devices. I just pushed a pair of sample scripts that invokes xfstests inside virtme. They're a total of 42 lines, including comments and instructions. You can now do: PATH=3D.:$PATH samples/xfstests test.img scratch.img ~/apps/xfstests/ from inside a virtme checkout. You'll have to compile xfstests first, thou= gh. They will be considerably more useful once I add read-write host windows to virtme. If anyone wants to use virtme for something other than experimentation, let me know and we can talk about interface stability. Some xfstests thoughts: - There's an undocumented way to write results outside the source tree called RESULT_BASE. It would be great if it were documented and spelled consistently. - xfstests does not appreciate using symlinks to device nodes. - SCRATCH_MNT needs to be in /etc/fstab. I think that this should be changed or documented. If the latter, then SCRATCH_DEV seems redundant. Some virtme thoughts: - --script-sh is awkward. Suggestions for a better interface are welcome. - It would be great if the virtconsole driver were less buggy. Even the virtualized ttyS0 is slow enough to account for a significant fraction of boot time. It would also be great if the connection between virtio ports and hvc devices were exposed in sysfs and through /dev symlinks. - earlyprintk=3Dvirtconsole would be awesome. This might need help from qemu, though. Or maybe there's a way to get the debug port to work for that. - I should probably add simple way to use forcibly cached disks. --Andy From tytso@thunk.org Thu Apr 3 12:35:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DA3D97F7E for ; Thu, 3 Apr 2014 12:35:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 57ADDAC001 for ; Thu, 3 Apr 2014 10:35:22 -0700 (PDT) X-ASG-Debug-ID: 1396546520-04cbb054b6a69940001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id T35sdehIfetv4Gyq (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 03 Apr 2014 10:35:20 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WVlXk-0000sL-Rv; Thu, 03 Apr 2014 17:35:12 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id A5A15580C37; Thu, 3 Apr 2014 13:35:04 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1396546504; bh=dzEyQ+Bo838DDxT+jjTKu6/gnYpgKgyydiVPZPRWYDM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Mb0hQcBpTKKaXRoBSUuyuj6RfWlpUBLL0GK2gQ+Qm4bPqCYt/LaPQ57K0QLOSOA4Z 7jlugpbi27qp+nGkwL9/glyyK+Qj8kG6UoK19zvQwH/Ji75llB/E1tR+nbvCYLOR9c +iGjysugXu29DM99IgTn2FZSb74LOj1R5MrP5pCU= Date: Thu, 3 Apr 2014 13:35:04 -0400 From: Theodore Ts'o To: Andy Lutomirski Cc: =?utf-8?B?THVrw6HFoQ==?= Czerner , Dave Chinner , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140403173504.GB23737@thunk.org> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1396546520 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4548 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Apr 03, 2014 at 10:05:26AM -0700, Andy Lutomirski wrote: > > virtme will eventually be able to use a separate OS image, probably in > the form of a directory with appropriate xattrs set. I could support > images on a block device too, but that's boring :) When you say OS image, you mean "root file system, right"? One of the reasons why I'm actually build an actual root-file system image, and didn't try the virtme approach was that I wanted to boot 32-bit kernels on my development machine, which is 64-bit. Having a 32-bit chroot environment would certainly work, though, and would save the effort of creating the root file system image.... (and of course having a 32-bit userspace also is a great way of exercising the ioctl compatibility code paths :-). > from inside a virtme checkout. You'll have to compile xfstests first, though. Fortunately, xfstests-bld will handle do this for you, since it grabs and builds all of the depedencies automatically. More importantly, it allows the dependencies to be saved as part of the test output since that's important when trying to have other people understand how to reproduce a particular test result (since sometimes the latest xfstests requires the latest xfs_io from xfsprogs, so it's a bad idea to depend on the version of xfsprogs shipped by your distribution). For example, for this merge window, I've been using the following to do my tests: fio fio-2.1-19-g0b14f0a (Thu, 23 May 2013 21:27:54 +0200) quota 0d0a674 (Tue, 26 Mar 2013 17:13:33 +0100) xfsprogs v3.2.0-alpha2-60-gaa210c4 (Thu, 13 Mar 2014 21:23:50 +1100) xfstests-bld 1efde7a (Tue, 1 Apr 2014 14:42:07 -0400) xfstests linux-v3.8-336-g3948694 (Thu, 13 Mar 2014 15:20:54 +1100) > They will be considerably more useful once I add read-write host > windows to virtme. Yes, you definitely want that for the results directories. > - There's an undocumented way to write results outside the source > tree called RESULT_BASE. It would be great if it were documented and > spelled consistently. There are a bunch of inconsistencies, which I've chalked up to historical accidents and a desire to not break compatibility with developers' test runners. You mount the $SCRATCH_DIR on SCRATCH_MNT but you mount $TEST_DEV on $TEST_DIR, for example. I've just learned to live with it.... > - SCRATCH_MNT needs to be in /etc/fstab. I think that this should be > changed or documented. If the latter, then SCRATCH_DEV seems > redundant. The various test scripts do need to be able to find the device where the file system lives, and parsing /etc/fstab would be awkward. So if your comment is that either the /etc/fstab entry shouldn't be required, or the xfstests runtime environment should be able to derive $SCRATCH_DEV automatically from $SCRATCH_MNT, or vice versa, instead of having the user specify both, I'd agree that would be nice, but that's why I put together scripts like the ones I have in xfstests-bld --- to make life easier. :-) Cheers, - Ted From luto@amacapital.net Thu Apr 3 12:43:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 727D87F90 for ; Thu, 3 Apr 2014 12:43:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F0378F80B6 for ; Thu, 3 Apr 2014 10:43:19 -0700 (PDT) X-ASG-Debug-ID: 1396546994-04cbb054b9a69df0001-NocioJ Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com [209.85.216.43]) by cuda.sgi.com with ESMTP id ToRS30Z6k8gGT76x (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Apr 2014 10:43:15 -0700 (PDT) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.216.43 Received: by mail-qa0-f43.google.com with SMTP id j15so1974228qaq.2 for ; Thu, 03 Apr 2014 10:43:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=wEwA5xV+i5f33esNl4ClnM58K4E6m6xMCEBI2tBViiA=; b=bmrEXQUgkjQujpSSMNV/y8Uqxileqg39qzmKQWqnIhu2x2sR8ipV9p9bFt/gb0hzxw 0neUQBSfx4cxxIDaKgKXOIZlRvWr7cO+P5nCGuZ5gfHb3G/dAEv698YUGuuBtlqrYDSq lxInNpugyYctGzW7lR9fFGkWDsWXZfNYBD36zbJNEqJhATQqVtySzjrxaIh6Qureb4pK Dv5a2loSl5ColnbtPcEGb6+wAqhOhiN1dE0N8kM/bbwLLb8jyLw6SlZMDJdBXHYGbUW9 8lF24Mp92t07skWZiJaWm+5Q3eDeHEzHaEwi2MEbZkeQrr1v/92K7/rM4Sy4Yg0P4nBv p4Fw== X-Gm-Message-State: ALoCoQnEx9H39PX5h7hV+nGmONTM2YyWLlu+qDpOGdMYFefrorCzI/BfiPy+gjoEm+TjIgu3Yht5 X-Received: by 10.140.23.148 with SMTP id 20mr3883424qgp.89.1396546994467; Thu, 03 Apr 2014 10:43:14 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.126.66 with HTTP; Thu, 3 Apr 2014 10:42:54 -0700 (PDT) In-Reply-To: <20140403173504.GB23737@thunk.org> References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> <20140403173504.GB23737@thunk.org> From: Andy Lutomirski Date: Thu, 3 Apr 2014 10:42:54 -0700 Message-ID: Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all To: "Theodore Ts'o" X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Cc: =?ISO-8859-2?Q?Luk=E1=B9_Czerner?= , Dave Chinner , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qa0-f43.google.com[209.85.216.43] X-Barracuda-Start-Time: 1396546995 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.3.4548 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 3, 2014 at 10:35 AM, Theodore Ts'o wrote: > On Thu, Apr 03, 2014 at 10:05:26AM -0700, Andy Lutomirski wrote: >> >> virtme will eventually be able to use a separate OS image, probably in >> the form of a directory with appropriate xattrs set. I could support >> images on a block device too, but that's boring :) > > When you say OS image, you mean "root file system, right"? One of the > reasons why I'm actually build an actual root-file system image, and > didn't try the virtme approach was that I wanted to boot 32-bit > kernels on my development machine, which is 64-bit. > Yes. I've actually done this to test some vdso stuff. > Having a 32-bit chroot environment would certainly work, though, and > would save the effort of creating the root file system image.... (and > of course having a 32-bit userspace also is a great way of exercising > the ioctl compatibility code paths :-). I agree, as long as there are giant quote marks around chroot. No actual chroot would be involved. I'd like to support non-x86 architectures, too. Last time I tried to convince a modern kernel to boot on a released QEMU on ARM was painful, though. Maybe -M virt is the way to go here. The tricky part here is that virtme currently relies on finding a statically-linked busybox binary in $PATH. It'll need to learn how to find one that will run on the guest, or it will need to learn how to live without busybox. > >> from inside a virtme checkout. You'll have to compile xfstests first, though. > > Fortunately, xfstests-bld will handle do this for you, since it grabs > and builds all of the depedencies automatically. More importantly, it > allows the dependencies to be saved as part of the test output since > that's important when trying to have other people understand how to > reproduce a particular test result (since sometimes the latest > xfstests requires the latest xfs_io from xfsprogs, so it's a bad idea > to depend on the version of xfsprogs shipped by your distribution). > For example, for this merge window, I've been using the following to > do my tests: > > fio fio-2.1-19-g0b14f0a (Thu, 23 May 2013 21:27:54 +0200) > quota 0d0a674 (Tue, 26 Mar 2013 17:13:33 +0100) > xfsprogs v3.2.0-alpha2-60-gaa210c4 (Thu, 13 Mar 2014 21:23:50 +1100) > xfstests-bld 1efde7a (Tue, 1 Apr 2014 14:42:07 -0400) > xfstests linux-v3.8-336-g3948694 (Thu, 13 Mar 2014 15:20:54 +1100) I haven't actually looked at xfstests-bld yet. I suspect it could be made to work with virtme fairly easily. My current hack uses assumes you'll use distro packages for all the dependencies. > >> They will be considerably more useful once I add read-write host >> windows to virtme. > > Yes, you definitely want that for the results directories. > >> - There's an undocumented way to write results outside the source >> tree called RESULT_BASE. It would be great if it were documented and >> spelled consistently. > > There are a bunch of inconsistencies, which I've chalked up to > historical accidents and a desire to not break compatibility with > developers' test runners. You mount the $SCRATCH_DIR on SCRATCH_MNT > but you mount $TEST_DEV on $TEST_DIR, for example. I've just learned > to live with it.... Given that RESULTS_BASE only occurs in an error message, I think it could be fixed without breaking compatibility. > >> - SCRATCH_MNT needs to be in /etc/fstab. I think that this should be >> changed or documented. If the latter, then SCRATCH_DEV seems >> redundant. > > The various test scripts do need to be able to find the device where > the file system lives, and parsing /etc/fstab would be awkward. So if > your comment is that either the /etc/fstab entry shouldn't be > required, or the xfstests runtime environment should be able to derive > $SCRATCH_DEV automatically from $SCRATCH_MNT, or vice versa, instead > of having the user specify both, I'd agree that would be nice, but > that's why I put together scripts like the ones I have in xfstests-bld > --- to make life easier. :-) > > Cheers, > > - Ted -- Andy Lutomirski AMA Capital Management, LLC From sandeen@sandeen.net Thu Apr 3 14:01:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CED947F91 for ; Thu, 3 Apr 2014 14:01:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C837B8F8039 for ; Thu, 3 Apr 2014 12:01:36 -0700 (PDT) X-ASG-Debug-ID: 1396551694-04cbb054b7a6d310001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VHE68HhcKqet7l7B for ; Thu, 03 Apr 2014 12:01:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (unknown [187.157.176.2]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7B42D61ACB6C for ; Thu, 3 Apr 2014 14:01:33 -0500 (CDT) Message-ID: <533DB01C.8020300@sandeen.net> Date: Thu, 03 Apr 2014 13:01:48 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: fix RESULT_BASE typo in check script X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: fix RESULT_BASE typo in check script 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: 1396551695 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- RESULT_BASE is what's set & tested, but RESULTS_BASE was being used in an error message. Signed-off-by: Eric Sandeen --- diff --git a/check b/check index 268417c..a384cb2 100755 --- a/check +++ b/check @@ -358,7 +358,7 @@ trap "_wrapup; exit \$status" 0 1 2 3 15 mkdir -p $RESULT_BASE if [ ! -d $RESULT_BASE ]; then - echo "failed to create results directory $RESULTS_BASE" + echo "failed to create results directory $RESULT_BASE" exit 1; fi From sandeen@redhat.com Thu Apr 3 14:06:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA23C7F9A for ; Thu, 3 Apr 2014 14:06:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E15B6304059 for ; Thu, 3 Apr 2014 12:06:36 -0700 (PDT) X-ASG-Debug-ID: 1396551995-04cb6c5676c5d480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ysCkjBWLpTyJE5vT for ; Thu, 03 Apr 2014 12:06: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s33J6OwI010859 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 3 Apr 2014 15:06:24 -0400 Received: from Liberator-2.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s33J6LUv011431 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 3 Apr 2014 15:06:22 -0400 Message-ID: <533DB140.8010103@redhat.com> Date: Thu, 03 Apr 2014 13:06:40 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: "Theodore Ts'o" , Andy Lutomirski CC: =?UTF-8?B?THVrw6HFoSBDemVybmVy?= , Dave Chinner , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> <20140403173504.GB23737@thunk.org> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all In-Reply-To: <20140403173504.GB23737@thunk.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396551995 X-Barracuda-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/3/14, 11:35 AM, Theodore Ts'o wrote: >> - There's an undocumented way to write results outside the source >> tree called RESULT_BASE. It would be great if it were documented and >> spelled consistently. I'm not actually certain that it was intended to be used this way. See 1686f9ab "xfstests: Introduce a results directory" which explains just where this variable came from and what it's for... So that's probably why it's undocumented; I don't think it was envisioned as a configurable. As for consistency... patch sent for the typo. If the functionality is needed, just make sure it works right if you set it manually, update the user docs, & send a patch. > There are a bunch of inconsistencies, which I've chalked up to > historical accidents and a desire to not break compatibility with > developers' test runners. You mount the $SCRATCH_DIR on SCRATCH_MNT $SCRATCH_DEV you mean. ;) I don't think there's any real resistance to fixing things that really need to be fixed, but this one doesn't seem too critical. OTOH, adding an alias from SCRATCH_MNT to SCRATCH_DIR for consistency could surely be done if anyone cared enough to send the patch. > but you mount $TEST_DEV on $TEST_DIR, for example. I've just learned > to live with it.... > >> - SCRATCH_MNT needs to be in /etc/fstab. I think that this should be >> changed or documented. If the latter, then SCRATCH_DEV seems >> redundant. Hm, I've never needed SCRATCH_MNT in /etc/fstab... > The various test scripts do need to be able to find the device where > the file system lives, and parsing /etc/fstab would be awkward. So if > your comment is that either the /etc/fstab entry shouldn't be > required, or the xfstests runtime environment should be able to derive > $SCRATCH_DEV automatically from $SCRATCH_MNT, or vice versa, instead I guess I don't know why you'd expect to derive one from the other... > of having the user specify both, I'd agree that would be nice, but > that's why I put together scripts like the ones I have in xfstests-bld > --- to make life easier. :-) All I've ever had to do is set up the 4 variables in local.config.example (by copying to local.config & editing appropriately) and it all just works AFAIK. (No doubt docs could be improved, but we can do that by sending patches.) :) -Eric From david@fromorbit.com Thu Apr 3 14:07:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FE7A7F9F for ; Thu, 3 Apr 2014 14:07:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7BACAC001 for ; Thu, 3 Apr 2014 12:07:06 -0700 (PDT) X-ASG-Debug-ID: 1396552023-04cbb054b9a6d790001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id gUWlUHo42bywGNAU for ; Thu, 03 Apr 2014 12:07: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: As9KAGmwPVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EeFwMBAQEBODWCJQEBAQQnExwjEAgDGAklDwUlAwcaE4d4zzgXFo5bB4Q4BJRvg2uWAyk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 05:37:02 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVmya-0002VO-DT; Fri, 04 Apr 2014 06:07:00 +1100 Date: Fri, 4 Apr 2014 06:07:00 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/2] xfs: remove efi from AIL in log recovery Message-ID: <20140403190700.GM16336@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: remove efi from AIL in log recovery References: <20140325195819.638326569@sgi.com> <20140331202615.264666182@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331202615.264666182@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: 1396552023 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 03:25:56PM -0500, Mark Tinguely wrote: > xlog_recover_process_efi{s}() functions are completing the > second half of xfs_bmap_finish() which frees extents. If this > operation fails, the EFI will stay on the AIL and prevents > the xfs_ail_push all_sync() from completing and the mount will > fail to unmount. > > Rather than have a special log recovery flag XFS_EFI_RECOVERED > to decrement the EFI/EFD counter, call the same decrement function > from the log recovery routine that is called then the EFI is added > to the AIL from a log write. .... > =================================================================== > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3634,6 +3634,7 @@ xlog_recover_process_data( > /* > * Process an extent free intent item that was recovered from > * the log. We need to free the extents that it describes. > + * The caller will release this and any following EFIs upon error. > */ > STATIC int > xlog_recover_process_efi( > @@ -3648,6 +3649,13 @@ xlog_recover_process_efi( > xfs_fsblock_t startblock_fsb; > > ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); > + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > + > + /* > + * Decrement the EFI/EFD counter so the EFI is removed after > + * processing the EFD or error handling in the caller. > + */ > + xfs_efi_item_unpin(&efip->efi_item, 0); This should be done where the EFI is inserted into the AIL during recovery, not where it is removed. That means "committed" EFIs in the AIL have the same reference count values for both the normal transaction case and the log recovery case. Brian already caught a bug in your original patch because of this, so lets not leave landmines if we can avoid it. Also, the comment needs to explain why we don't need the reference count (i.e. because it's a committed EFI and hence only the active EFD can hold a reference against it now) and that on error the caller is responsible for removing the EFI from the AIL and freeing it. Finally, I don't think there's any need for the XFS_EFI_RECOVERED bit anymore, because we either process it (and remove it from the AIL) or free it after removing it from the AIL on error and so it won't ever get found in the AIL with that flag set.... > @@ -3750,13 +3751,23 @@ xlog_recover_process_efis( > } > > spin_unlock(&ailp->xa_lock); > - error = xlog_recover_process_efi(log->l_mp, efip); > - spin_lock(&ailp->xa_lock); > + if (error) { > + /* > + * An error happened while processing a previous > + * EFI entry. Since the extents are freed in order, > + * skip the remaining unprocessed EFIs. To do this > + * the EFI entry counter must be decremented once > + * here and the entry will be decremented and removed > + * with the following xfs_efi_release(). > + */ > + xfs_efi_item_unpin(&efip->efi_item, 0); > + } else > + error = xlog_recover_process_efi(log->l_mp, efip); > if (error) > - goto out; > + xfs_efi_release(efip, efip->efi_format.efi_nextents); > + spin_lock(&ailp->xa_lock); > lip = xfs_trans_ail_cursor_next(ailp, &cur); OK, so this now relies on xfs_efi_release() to remove the EFI from the AIL. But the reason the unpin ugliness needs to be done here is that we left a stale AIL reference on the EFI when we inserted it into the AIL. That's another reason for moving that xfs_efi_item_unpin() to the insert code. Also, I'd prefer the large comment decribing the logic flow goes at the head of the function (i.e. describing the overall logic flow of the function) and that call should clean up this logic a lot. Cheers, Dave. -- Dave Chinner david@fromorbit.com From luto@amacapital.net Thu Apr 3 14:21:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF5C17F9C for ; Thu, 3 Apr 2014 14:21:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC75A8F8039 for ; Thu, 3 Apr 2014 12:21:47 -0700 (PDT) X-ASG-Debug-ID: 1396552906-04cb6c5678c5dd30001-NocioJ Received: from mail-qa0-f45.google.com (mail-qa0-f45.google.com [209.85.216.45]) by cuda.sgi.com with ESMTP id 6wNgWKH6tdvKVFf0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 03 Apr 2014 12:21:46 -0700 (PDT) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.216.45 Received: by mail-qa0-f45.google.com with SMTP id cm18so683758qab.32 for ; Thu, 03 Apr 2014 12:21:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=ib3VzulY/+gl3AMCeeHQujMk0g70avI5FVFm2i24Mm0=; b=E834jhQfXdTlaagCKZUOyGKOcSP85XJUIejOo93sv1/GMoGN2c1KIHb5DAeZJpWBEO dIQ4PjpHn7y1RC81Dmleap+QHYwO9UOrSkjj2SO1kCSqYjmUMsQBsks2hIUuRylqUgW+ VFVH+rA3IkNBeInyKaK5LztXfxfgq5fEIJYAim/N8Qq7AeRusVuSNFvW6ljlQim7eeQg rmOIAprQzSuAXcPdsPFS199WPcDBVvKGrnFVgDy+S8eG+v+ye4td+yRiR5n6AUg2gr9q VZxLGt0wVugfYXAyxCXo46kKrpBHvO0z3i4FDs2aOZWY/iOpGxXngERCD3Qtw2pkLqjJ Qm+Q== X-Gm-Message-State: ALoCoQklfHSk26DoPUhm4Mhr8E/6BkNywc5NnH4zZm8tKbKx0T/TUIOmSPJ9dojfvIC4voAh5SB0 X-Received: by 10.224.127.129 with SMTP id g1mr9474925qas.22.1396552906005; Thu, 03 Apr 2014 12:21:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.126.66 with HTTP; Thu, 3 Apr 2014 12:21:25 -0700 (PDT) In-Reply-To: <533DB140.8010103@redhat.com> References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> <20140403173504.GB23737@thunk.org> <533DB140.8010103@redhat.com> From: Andy Lutomirski Date: Thu, 3 Apr 2014 12:21:25 -0700 Message-ID: Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all To: Eric Sandeen X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Cc: "Theodore Ts'o" , =?ISO-8859-2?Q?Luk=E1=B9_Czerner?= , Dave Chinner , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qa0-f45.google.com[209.85.216.45] X-Barracuda-Start-Time: 1396552906 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 3, 2014 at 12:06 PM, Eric Sandeen wrote: > On 4/3/14, 11:35 AM, Theodore Ts'o wrote: > >>> - There's an undocumented way to write results outside the source >>> tree called RESULT_BASE. It would be great if it were documented and >>> spelled consistently. > > I'm not actually certain that it was intended to be used this way. > See 1686f9ab "xfstests: Introduce a results directory" > which explains just where this variable came from and what it's > for... Yeah. A real solution should just create and overmount results. Unfortunately, AFAICT it's currently impossible to create a mountpoint with no underlying dentry or to overmount a symlink, so this can be a bit awkward. >>> - SCRATCH_MNT needs to be in /etc/fstab. I think that this should be >>> changed or documented. If the latter, then SCRATCH_DEV seems >>> redundant. > > Hm, I've never needed SCRATCH_MNT in /etc/fstab... > >> The various test scripts do need to be able to find the device where >> the file system lives, and parsing /etc/fstab would be awkward. So if >> your comment is that either the /etc/fstab entry shouldn't be >> required, or the xfstests runtime environment should be able to derive >> $SCRATCH_DEV automatically from $SCRATCH_MNT, or vice versa, instead > > I guess I don't know why you'd expect to derive one from the other... Sigh. If $SCRATCH_MNT is specified, then the line in /etc/fstab is unnecessary. If $SCRATCH_MNT is not specified, then /etc/fstab will do the trick. What does not work is specifying $SCRATCH_DIR [sic] but not adding an fstab entry. Oops. --Andy From tytso@thunk.org Thu Apr 3 14:30:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F340629DF7 for ; Thu, 3 Apr 2014 14:30:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE0FF304059 for ; Thu, 3 Apr 2014 12:30:48 -0700 (PDT) X-ASG-Debug-ID: 1396553446-04cbb054b9a6e3a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 5q7YUe2XOSoRwr4o (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 03 Apr 2014 12:30:47 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WVnLW-0001ZO-UE; Thu, 03 Apr 2014 19:30:42 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 1B2A6580C37; Thu, 3 Apr 2014 15:30:40 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1396553440; bh=w5NsyIio3ZcL24j5kEfU9d9W2Vh/HWT7VIdunQ5o0qs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=SLXN/0sWKgKxVimoR6AOgcI94IJSs0esLxYshLGIfl6aIgkQKN8ANusgXohqaLSgd RjZ1sWNwYaH37c0YIQYrcd+j1tiwj3YdIQWRCsAFQXKwWiaku+3E3qJ078ygi5YxbT uCmrwZ/jpeM+L6I8kTiEALGF/ozcGIAHNH0K2wTQ= Date: Thu, 3 Apr 2014 15:30:40 -0400 From: Theodore Ts'o To: Eric Sandeen Cc: Andy Lutomirski , =?utf-8?B?THVrw6HFoQ==?= Czerner , Dave Chinner , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140403193039.GD32323@thunk.org> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> <20140403173504.GB23737@thunk.org> <533DB140.8010103@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <533DB140.8010103@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1396553447 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Apr 03, 2014 at 01:06:40PM -0600, Eric Sandeen wrote: > On 4/3/14, 11:35 AM, Theodore Ts'o wrote: > > >> - There's an undocumented way to write results outside the source > >> tree called RESULT_BASE. It would be great if it were documented and > >> spelled consistently. > > I'm not actually certain that it was intended to be used this way. > See 1686f9ab "xfstests: Introduce a results directory" > which explains just where this variable came from and what it's > for... The last paragraph states of the git description states: This is the first (small) step in being able to store test results in an external location for archival/data mining purposes. The question I suppose is whether storing the results in an external location is something that should be xfstests' responsibility, or of the test harnesses that call xfstests. I suspect that since there are so many different ways people might want to archive the results, it does make sense for the test harnesses to handle this job, but I wouldn't want to "presume" on anything that the xfstests developers might choose to do.... - Ted From david@fromorbit.com Thu Apr 3 14:34:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA2567F94 for ; Thu, 3 Apr 2014 14:34:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D4D6AC002 for ; Thu, 3 Apr 2014 12:34:38 -0700 (PDT) X-ASG-Debug-ID: 1396553676-04cb6c5675c5e3b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id UDrAu1UuZQnqtAcy for ; Thu, 03 Apr 2014 12:34: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: AtFKAHW3PVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EfFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3EHzzkXFo5bB4Q4BIx+i1yHU44wKYEsBA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 06:04:16 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVnOx-0002Z2-3A; Fri, 04 Apr 2014 06:34:15 +1100 Date: Fri, 4 Apr 2014 06:34:15 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: free the EFI entries from AIL on forced shutdown Message-ID: <20140403193414.GN16336@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: free the EFI entries from AIL on forced shutdown References: <20140325195733.510384972@sgi.com> <20140325195819.740387237@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325195819.740387237@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: 1396553676 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Mar 25, 2014 at 03:06:35PM -0500, Mark Tinguely wrote: > The extent free intention (EFI) and extent free done (EFD) > log items are in separate transactions. It is possible that > the EFI can be pushed to the AIL before a forced shutdown > where it gets stuck for following reasons: > > No complete EFD in the transaction. This can happen if the > transaction fails to reserve space or the freeing the extent > fails in xfs_bmap_finish(). > > EFD IOP Abort processing. If xfs_trans_cancel() is called with > an abort flag, or if the xfs_trans_commit() is called when the > file system is in forced shutdown or if the log buffer write fails, > then the EFD iop commands will not remove the EFI from the AIL. > > If the EFI entry is left on the AIL, xfs_ail_push all_sync() will > fail to complete, the unmount will hang, and a reboot is required > to get the complete the unmount. > > Do not free the EFI structure immediately on forced shutdowns, but > instead use the IOP calls to match the EFI/EFD entries. A small > wrinkle in the mix is the EFI is not automatically placed on the > AIL by the IOP routines in the cases but may have made it to the > AIL before the abort. We now have to check if the EFI is on the AIL > in the abort IOP cases. > > Signed-off-by: Mark Tinguely > --- > Dave, as I tried to explain, if the error in extent free happen early > enough, the EFD is not usable and is not in the transaction to cause > IOP commands to clean up the EFI. It too must be done manually. > > The "in the AIL" test must be done in the abort IOP commands. I still don't see the reason behind these assertions. It just doesn't make any sense to me that it can't be handled once the EFI has been attached to the EFD, nor why checking AIL status in __xfs_efi_release() does not work correctly... > fs/xfs/xfs_bmap_util.c | 21 +++++++++++++++---- > fs/xfs/xfs_extfree_item.c | 49 +++++++++++++++++++++++++++++++++------------- > fs/xfs/xfs_log_recover.c | 3 +- > fs/xfs/xfs_trans.h | 2 - > 4 files changed, 56 insertions(+), 19 deletions(-) > > Index: b/fs/xfs/xfs_bmap_util.c > =================================================================== > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -116,12 +116,14 @@ xfs_bmap_finish( > > error = xfs_trans_reserve(ntp, &tres, 0, 0); > if (error) > - return error; > + goto error_return; > + > efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count); > for (free = flist->xbf_first; free != NULL; free = next) { > next = free->xbfi_next; > - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, > - free->xbfi_blockcount))) { > + error = xfs_free_extent(ntp, free->xbfi_startblock, > + free->xbfi_blockcount); > + if (error) { > /* > * The bmap free list will be cleaned up at a > * higher level. The EFI will be canceled when > @@ -136,13 +138,24 @@ xfs_bmap_finish( > (error == EFSCORRUPTED) ? > SHUTDOWN_CORRUPT_INCORE : > SHUTDOWN_META_IO_ERROR); > - return error; > + goto error_return; > } > xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, > free->xbfi_blockcount); > xfs_bmap_del_free(flist, NULL, free); > } > return 0; > + > + error_return: > + /* > + * No EFD in the transaction matching the EFI can be used at this > + * point Manually release the EFI and remove from AIL if necessary. > + * If the EFI did not make it into the AIL, then the transaction > + * cancel of the EFI will decrement the EFI/EFD counter and will not > + * attempt to remove itself from the AIL. > + */ > + xfs_efi_release(efi, efi->efi_format.efi_nextents, 0); > + return error; This is inconsistent from a high level logic point of view. The EFI is attached to the EFD after a call to xfs_trans_get_efd() and so cleanup on failure should always occur through the IOP* interfaces (specifically xfs_efd_item_unlock() with an aborted log item). The only case where a xfs_efi_release() call is required is the xfs_trans_reserve() failure case, where nothing in the current transaction context owns the reference on the EFI we are going to pass to the EFD. > } > > int > Index: b/fs/xfs/xfs_extfree_item.c > =================================================================== > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -56,15 +56,22 @@ xfs_efi_item_free( > */ > STATIC void > __xfs_efi_release( > - struct xfs_efi_log_item *efip) > + struct xfs_efi_log_item *efip, > + int abort) > { > struct xfs_ail *ailp = efip->efi_item.li_ailp; > > 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, > - SHUTDOWN_LOG_IO_ERROR); > + /* > + * The EFI may not be on the AIL on abort. > + * xfs_trans_ail_delete() drops the AIL lock. > + */ > + if (abort) > + spin_unlock(&ailp->xa_lock); > + else > + xfs_trans_ail_delete(ailp, &efip->efi_item, > + SHUTDOWN_LOG_IO_ERROR); > xfs_efi_item_free(efip); > } > } "Abort" is not necessary. If it's the last reference, and the EFI is in the AIL, then it needs to be removed. i.e. the check shoul dbe against XFS_LI_IN_AIL, not against a flag passed in by the caller. > @@ -148,10 +155,10 @@ xfs_efi_item_unpin( > ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); > if (lip->li_desc) > xfs_trans_del_item(lip); > - xfs_efi_item_free(efip); > + __xfs_efi_release(efip, 1); > return; > } > - __xfs_efi_release(efip); > + __xfs_efi_release(efip, 0); > } > > /* > @@ -173,8 +180,9 @@ STATIC void > xfs_efi_item_unlock( > struct xfs_log_item *lip) > { > + /* EFI will not be on the AIL if called on abort */ If that is true, then ASSERT() it rather than comment about it. > if (lip->li_flags & XFS_LI_ABORTED) > - xfs_efi_item_free(EFI_ITEM(lip)); > + __xfs_efi_release(EFI_ITEM(lip), 1); > } > > /* > @@ -310,11 +318,12 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf > */ > void > xfs_efi_release(xfs_efi_log_item_t *efip, > - uint nextents) > + uint nextents, > + int abort) > { > ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); > if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { > - __xfs_efi_release(efip); > + __xfs_efi_release(efip, abort); > /* efip may now have been freed, do not reference it again. */ > } > } > @@ -417,8 +426,19 @@ STATIC void > xfs_efd_item_unlock( > struct xfs_log_item *lip) > { > - if (lip->li_flags & XFS_LI_ABORTED) > - xfs_efd_item_free(EFD_ITEM(lip)); > + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > + > + if (!(lip->li_flags & XFS_LI_ABORTED)) > + return; > + > + /* Free the EFI when aborting a commit. The EFI will be either > + * added to the AIL in a CIL push before this abort or unlocked > + * before the EFD unlock. In either case we can check the AIL > + * status now. > + */ We are not freeing the EFI here - we are simply releasing the reference the EFD holds on it because we are about to free the EFD. Nothing else actually matters here - we don't care whether the EFI is in the AIL or not, because that can be handled internally to the xfs_efi_release() code.... > + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents, > + !(efdp->efd_efip->efi_item.li_flags & XFS_LI_IN_AIL)); > + xfs_efd_item_free(efdp); > } > > /* > @@ -434,14 +454,17 @@ xfs_efd_item_committed( > xfs_lsn_t lsn) > { > struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > + int abort = 0; > > /* > * If we got a log I/O error, it's always the case that the LR with the > * EFI got unpinned and freed before the EFD got aborted. > */ > - if (!(lip->li_flags & XFS_LI_ABORTED)) > - xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); > + if (lip->li_flags & XFS_LI_ABORTED && > + !(efdp->efd_efip->efi_item.li_flags & XFS_LI_IN_AIL)) > + abort = 1; > > + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents, abort); All this abort logic can go away if __xfs_efi_release() handles the AIL state internally and all the EFD does is drop the reference to the EFI it owns. This function simply becomes: { struct xfs_efd_log_item *efdp = EFD_ITEM(lip); xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); xfs_efd_item_free(efdp); return (xfs_lsn_t)-1; } No conditional behaviour, always does the same thing regardless of caller context. > } > Index: b/fs/xfs/xfs_log_recover.c > =================================================================== > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3754,8 +3754,9 @@ xlog_recover_process_efis( > /* Skip all EFIs after first EFI in error. */ > if (!error) > error = xlog_recover_process_efi(log->l_mp, efip); > + /* EFI will be on the AIL, so abort == 0 */ > if (error) > - xfs_efi_release(efip, efip->efi_format.efi_nextents); > + xfs_efi_release(efip, efip->efi_format.efi_nextents, 0); Yet another place that has to know what the state of the EFI is to handle it correctly.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 3 14:36:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4CEE57FA1 for ; Thu, 3 Apr 2014 14:36:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DCF79AC003 for ; Thu, 3 Apr 2014 12:36:41 -0700 (PDT) X-ASG-Debug-ID: 1396553799-04bdf0743a987f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8015V46BpSSLX618 for ; Thu, 03 Apr 2014 12:36:40 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: As5KAHW3PVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EfFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3jPORcWjlsHhDgBA5halgMp Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 06:06:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVnRG-0002Zb-EK; Fri, 04 Apr 2014 06:36:38 +1100 Date: Fri, 4 Apr 2014 06:36:38 +1100 From: Dave Chinner To: Dan Carpenter Cc: xfs@oss.sgi.com, kernel-janitors@vger.kernel.org Subject: Re: [patch] xfs: extra semi-colon breaks a condition Message-ID: <20140403193638.GO16336@dastard> X-ASG-Orig-Subj: Re: [patch] xfs: extra semi-colon breaks a condition References: <20140328080313.GA25192@mwanda> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140328080313.GA25192@mwanda> 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: 1396553799 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 28, 2014 at 11:03:13AM +0300, Dan Carpenter wrote: > There were some extra semi-colons here which mean that we return true > unintentionally. > > Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need help') > Signed-off-by: Dan Carpenter Dan, $BEVVIE_OF_CHOICE is on me next time we are in the same place. And bring a handful brown paper bags as well because there's a few people here that need to wear them for a while. :/ Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Thu Apr 3 15:48:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8E4E47F93 for ; Thu, 3 Apr 2014 15:48:41 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66DA3304043; Thu, 3 Apr 2014 13:48:41 -0700 (PDT) Message-ID: <533DC928.7080306@sgi.com> Date: Thu, 03 Apr 2014 15:48:40 -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 2/2] xfs: free the EFI entries from AIL on forced shutdown References: <20140325195733.510384972@sgi.com> <20140325195819.740387237@sgi.com> <20140403193414.GN16336@dastard> In-Reply-To: <20140403193414.GN16336@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/03/14 14:34, Dave Chinner wrote: > On Tue, Mar 25, 2014 at 03:06:35PM -0500, Mark Tinguely wrote: >> The extent free intention (EFI) and extent free done (EFD) >> log items are in separate transactions. It is possible that >> the EFI can be pushed to the AIL before a forced shutdown >> where it gets stuck for following reasons: >> >> No complete EFD in the transaction. This can happen if the >> transaction fails to reserve space or the freeing the extent >> fails in xfs_bmap_finish(). >> >> EFD IOP Abort processing. If xfs_trans_cancel() is called with >> an abort flag, or if the xfs_trans_commit() is called when the >> file system is in forced shutdown or if the log buffer write fails, >> then the EFD iop commands will not remove the EFI from the AIL. >> >> If the EFI entry is left on the AIL, xfs_ail_push all_sync() will >> fail to complete, the unmount will hang, and a reboot is required >> to get the complete the unmount. >> >> Do not free the EFI structure immediately on forced shutdowns, but >> instead use the IOP calls to match the EFI/EFD entries. A small >> wrinkle in the mix is the EFI is not automatically placed on the >> AIL by the IOP routines in the cases but may have made it to the >> AIL before the abort. We now have to check if the EFI is on the AIL >> in the abort IOP cases. >> >> Signed-off-by: Mark Tinguely >> --- >> Dave, as I tried to explain, if the error in extent free happen early >> enough, the EFD is not usable and is not in the transaction to cause >> IOP commands to clean up the EFI. It too must be done manually. >> >> The "in the AIL" test must be done in the abort IOP commands. > > I still don't see the reason behind these assertions. It just > doesn't make any sense to me that it can't be handled once the EFI > has been attached to the EFD, nor why checking AIL status in > __xfs_efi_release() does not work correctly... > >> fs/xfs/xfs_bmap_util.c | 21 +++++++++++++++---- >> fs/xfs/xfs_extfree_item.c | 49 +++++++++++++++++++++++++++++++++------------- >> fs/xfs/xfs_log_recover.c | 3 +- >> fs/xfs/xfs_trans.h | 2 - >> 4 files changed, 56 insertions(+), 19 deletions(-) >> >> Index: b/fs/xfs/xfs_bmap_util.c >> =================================================================== >> --- a/fs/xfs/xfs_bmap_util.c >> +++ b/fs/xfs/xfs_bmap_util.c >> @@ -116,12 +116,14 @@ xfs_bmap_finish( >> >> error = xfs_trans_reserve(ntp,&tres, 0, 0); >> if (error) >> - return error; >> + goto error_return; >> + >> efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count); >> for (free = flist->xbf_first; free != NULL; free = next) { >> next = free->xbfi_next; >> - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, >> - free->xbfi_blockcount))) { >> + error = xfs_free_extent(ntp, free->xbfi_startblock, >> + free->xbfi_blockcount); >> + if (error) { >> /* >> * The bmap free list will be cleaned up at a >> * higher level. The EFI will be canceled when >> @@ -136,13 +138,24 @@ xfs_bmap_finish( >> (error == EFSCORRUPTED) ? >> SHUTDOWN_CORRUPT_INCORE : >> SHUTDOWN_META_IO_ERROR); >> - return error; >> + goto error_return; >> } >> xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, >> free->xbfi_blockcount); ^^^^^^ here is where the EFD is placed in the transaction. It cannot be placed in the transaction earlier because it is not complete. >> xfs_bmap_del_free(flist, NULL, free); >> } >> return 0; >> + >> + error_return: >> + /* >> + * No EFD in the transaction matching the EFI can be used at this >> + * point Manually release the EFI and remove from AIL if necessary. >> + * If the EFI did not make it into the AIL, then the transaction >> + * cancel of the EFI will decrement the EFI/EFD counter and will not >> + * attempt to remove itself from the AIL. >> + */ >> + xfs_efi_release(efi, efi->efi_format.efi_nextents, 0); >> + return error; > > This is inconsistent from a high level logic point of view. The EFI > is attached to the EFD after a call to xfs_trans_get_efd() and so > cleanup on failure should always occur through the IOP* interfaces > (specifically xfs_efd_item_unlock() with an aborted log item). > > The only case where a xfs_efi_release() call is required is the > xfs_trans_reserve() failure case, where nothing in the current > transaction context owns the reference on the EFI we are going to > pass to the EFD. The EFD is not in the transaction in the failed xfs_extent_free failure case and there is not efd IOP call. > >> } >> >> int >> Index: b/fs/xfs/xfs_extfree_item.c >> =================================================================== >> --- a/fs/xfs/xfs_extfree_item.c >> +++ b/fs/xfs/xfs_extfree_item.c >> @@ -56,15 +56,22 @@ xfs_efi_item_free( >> */ >> STATIC void >> __xfs_efi_release( >> - struct xfs_efi_log_item *efip) >> + struct xfs_efi_log_item *efip, >> + int abort) >> { >> struct xfs_ail *ailp = efip->efi_item.li_ailp; >> >> 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, >> - SHUTDOWN_LOG_IO_ERROR); >> + /* >> + * The EFI may not be on the AIL on abort. >> + * xfs_trans_ail_delete() drops the AIL lock. >> + */ >> + if (abort) >> + spin_unlock(&ailp->xa_lock); >> + else >> + xfs_trans_ail_delete(ailp,&efip->efi_item, >> + SHUTDOWN_LOG_IO_ERROR); >> xfs_efi_item_free(efip); >> } >> } > > "Abort" is not necessary. If it's the last reference, and the EFI is > in the AIL, then it needs to be removed. i.e. the check shoul dbe > against XFS_LI_IN_AIL, not against a flag passed in by the caller. You are mistaken. It may or may not be in the AIL. > >> @@ -148,10 +155,10 @@ xfs_efi_item_unpin( >> ASSERT(!(lip->li_flags& XFS_LI_IN_AIL)); >> if (lip->li_desc) >> xfs_trans_del_item(lip); >> - xfs_efi_item_free(efip); >> + __xfs_efi_release(efip, 1); >> return; >> } >> - __xfs_efi_release(efip); >> + __xfs_efi_release(efip, 0); >> } >> >> /* >> @@ -173,8 +180,9 @@ STATIC void >> xfs_efi_item_unlock( >> struct xfs_log_item *lip) >> { >> + /* EFI will not be on the AIL if called on abort */ > > If that is true, then ASSERT() it rather than comment about it. > >> if (lip->li_flags& XFS_LI_ABORTED) >> - xfs_efi_item_free(EFI_ITEM(lip)); >> + __xfs_efi_release(EFI_ITEM(lip), 1); >> } >> >> /* >> @@ -310,11 +318,12 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf >> */ >> void >> xfs_efi_release(xfs_efi_log_item_t *efip, >> - uint nextents) >> + uint nextents, >> + int abort) >> { >> ASSERT(atomic_read(&efip->efi_next_extent)>= nextents); >> if (atomic_sub_and_test(nextents,&efip->efi_next_extent)) { >> - __xfs_efi_release(efip); >> + __xfs_efi_release(efip, abort); >> /* efip may now have been freed, do not reference it again. */ >> } >> } >> @@ -417,8 +426,19 @@ STATIC void >> xfs_efd_item_unlock( >> struct xfs_log_item *lip) >> { >> - if (lip->li_flags& XFS_LI_ABORTED) >> - xfs_efd_item_free(EFD_ITEM(lip)); >> + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); >> + >> + if (!(lip->li_flags& XFS_LI_ABORTED)) >> + return; >> + >> + /* Free the EFI when aborting a commit. The EFI will be either >> + * added to the AIL in a CIL push before this abort or unlocked >> + * before the EFD unlock. In either case we can check the AIL >> + * status now. >> + */ > > We are not freeing the EFI here - we are simply releasing the > reference the EFD holds on it because we are about to free the EFD. > Nothing else actually matters here - we don't care whether the EFI > is in the AIL or not, because that can be handled internally to > the xfs_efi_release() code.... Again. The EFI is in the previous commit. It could have made it to the AIL or is in the same abort. > >> + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents, >> + !(efdp->efd_efip->efi_item.li_flags& XFS_LI_IN_AIL)); >> + xfs_efd_item_free(efdp); >> } >> /* >> @@ -434,14 +454,17 @@ xfs_efd_item_committed( >> xfs_lsn_t lsn) >> { >> struct xfs_efd_log_item *efdp = EFD_ITEM(lip); >> + int abort = 0; >> >> /* >> * If we got a log I/O error, it's always the case that the LR with the >> * EFI got unpinned and freed before the EFD got aborted. >> */ >> - if (!(lip->li_flags& XFS_LI_ABORTED)) >> - xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); >> + if (lip->li_flags & XFS_LI_ABORTED && >> + !(efdp->efd_efip->efi_item.li_flags& XFS_LI_IN_AIL)) >> + abort = 1; >> >> + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents, abort); > > All this abort logic can go away if __xfs_efi_release() > handles the AIL state internally and all the EFD does is drop the > reference to the EFI it owns. This function simply becomes: The EFI in the previous commit could have made it to the AIL or not. > { > struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > > xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); > xfs_efd_item_free(efdp); > return (xfs_lsn_t)-1; > } > > No conditional behaviour, always does the same thing regardless of > caller context. I disagree. It may or may not be in the AIL at this point. > >> } >> Index: b/fs/xfs/xfs_log_recover.c >> =================================================================== >> --- a/fs/xfs/xfs_log_recover.c >> +++ b/fs/xfs/xfs_log_recover.c >> @@ -3754,8 +3754,9 @@ xlog_recover_process_efis( >> /* Skip all EFIs after first EFI in error. */ >> if (!error) >> error = xlog_recover_process_efi(log->l_mp, efip); >> + /* EFI will be on the AIL, so abort == 0 */ >> if (error) >> - xfs_efi_release(efip, efip->efi_format.efi_nextents); >> + xfs_efi_release(efip, efip->efi_format.efi_nextents, 0); > > Yet another place that has to know what the state of the EFI is to > handle it correctly.... We know the EFI is in the AIL here. --Mark. From dgc@oss.sgi.com Thu Apr 3 16:16:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id B49477FB3; Thu, 3 Apr 2014 16:16:18 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-bug-fixes-for-3.15-3, created. xfs-for-linus-v3.14-rc1-2-12927-gc88547a X-Git-Refname: refs/heads/xfs-bug-fixes-for-3.15-3 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: c88547a8119e3b581318ab65e9b72f27f23e641d Message-Id: <20140403211618.B49477FB3@oss.sgi.com> Date: Thu, 3 Apr 2014 16:16:17 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-bug-fixes-for-3.15-3 has been created at c88547a8119e3b581318ab65e9b72f27f23e641d (commit) - Log ----------------------------------------------------------------- commit c88547a8119e3b581318ab65e9b72f27f23e641d Author: Mark Tinguely Date: Fri Apr 4 07:10:49 2014 +1100 xfs: fix directory hash ordering bug Commit f5ea1100 ("xfs: add CRCs to dir2/da node blocks") introduced in 3.10 incorrectly converted the btree hash index array pointer in xfs_da3_fixhashpath(). It resulted in the the current hash always being compared against the first entry in the btree rather than the current block index into the btree block's hash entry array. As a result, it was comparing the wrong hashes, and so could misorder the entries in the btree. For most cases, this doesn't cause any problems as it requires hash collisions to expose the ordering problem. However, when there are hash collisions within a directory there is a very good probability that the entries will be ordered incorrectly and that actually matters when duplicate hashes are placed into or removed from the btree block hash entry array. This bug results in an on-disk directory corruption and that results in directory verifier functions throwing corruption warnings into the logs. While no data or directory entries are lost, access to them may be compromised, and attempts to remove entries from a directory that has suffered from this corruption may result in a filesystem shutdown. xfs_repair will fix the directory hash ordering without data loss occuring. [dchinner: wrote useful a commit message] cc: Reported-by: Hannes Frederic Sowa Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers Signed-off-by: Dave Chinner commit 805eeb8e04706a16cb0b23fd4c4abbb0bc7df82d Author: Dan Carpenter Date: Fri Apr 4 06:56:30 2014 +1100 xfs: extra semi-colon breaks a condition There were some extra semi-colons here which mean that we return true unintentionally. Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need help') Signed-off-by: Dan Carpenter Reviewed-by: Brian Foster Reviewed-by: Eric Sandeen Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Apr 3 16:16:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 00BE629DF9; Thu, 3 Apr 2014 16:16:42 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-v3.14-rc1-2-12968-ga6cf33b X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: fe986f9d88ab8079c91669b7f175081f15491a80 X-Git-Newrev: a6cf33bc566c5fe888bfa9cf6448037c90661f67 Message-Id: <20140403211643.00BE629DF9@oss.sgi.com> Date: Thu, 3 Apr 2014 16:16: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, for-next has been updated a6cf33b Merge branch 'xfs-bug-fixes-for-3.15-3' into for-next c88547a xfs: fix directory hash ordering bug 805eeb8 xfs: extra semi-colon breaks a condition from fe986f9d88ab8079c91669b7f175081f15491a80 (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 a6cf33bc566c5fe888bfa9cf6448037c90661f67 Merge: fe986f9 c88547a Author: Dave Chinner Date: Fri Apr 4 08:07:35 2014 +1100 Merge branch 'xfs-bug-fixes-for-3.15-3' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 4 ++-- fs/xfs/xfs_da_btree.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Thu Apr 3 16:20:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EF6D629E0B for ; Thu, 3 Apr 2014 16:20:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D6EDE8F80A3 for ; Thu, 3 Apr 2014 14:20:07 -0700 (PDT) X-ASG-Debug-ID: 1396560004-04cbb054b8a71be0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tCZm7I5wKzk1PCXw for ; Thu, 03 Apr 2014 14:20:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtFKAJDIPVN5LEcvPGdsb2JhbABYDoJ4g0qFC7ZahV+BHxcDAQEBATg1giUBAQEDATocIwULCAMYCSUPBSUDBxoTh3EHz0MXFo5bB4Q4BJhalDB/VCk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 07:50:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVp3K-0002ti-5B; Fri, 04 Apr 2014 08:20:02 +1100 Date: Fri, 4 Apr 2014 08:20:02 +1100 From: Dave Chinner To: Theodore Ts'o Cc: Eric Sandeen , Andy Lutomirski , =?utf-8?B?THVrw6HFoQ==?= Czerner , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Linux FS Devel , Sedat Dilek , "linux-ext4@vger.kernel.org" Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140403212001.GN17603@dastard> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> <20140403173504.GB23737@thunk.org> <533DB140.8010103@redhat.com> <20140403193039.GD32323@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140403193039.GD32323@thunk.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: 1396560004 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 03, 2014 at 03:30:40PM -0400, Theodore Ts'o wrote: > On Thu, Apr 03, 2014 at 01:06:40PM -0600, Eric Sandeen wrote: > > On 4/3/14, 11:35 AM, Theodore Ts'o wrote: > > > > >> - There's an undocumented way to write results outside the source > > >> tree called RESULT_BASE. It would be great if it were documented and > > >> spelled consistently. > > > > I'm not actually certain that it was intended to be used this way. > > See 1686f9ab "xfstests: Introduce a results directory" > > which explains just where this variable came from and what it's > > for... > > The last paragraph states of the git description states: > > This is the first (small) step in being able to store test results > in an external location for archival/data mining purposes. > > The question I suppose is whether storing the results in an external > location is something that should be xfstests' responsibility, or of > the test harnesses that call xfstests. The idea is that the external test harnesses can set up a destination directory for the results (i.e. RESULT_BASE) and xfstests will write all results into that directory. i.e. setting up a results store and managing it is something that is currently done external to xfstests. Managing a results store is complex and nobody has sent patches to do this in a generic way, so all we currently have is a mechanism to enable such functionality. Patches welcome! > I suspect that since there are > so many different ways people might want to archive the results, it > does make sense for the test harnesses to handle this job, but I > wouldn't want to "presume" on anything that the xfstests developers > might choose to do.... ROWR! :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 3 16:23:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 268F47FB6 for ; Thu, 3 Apr 2014 16:23:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0AEFC8F80B5 for ; Thu, 3 Apr 2014 14:23:26 -0700 (PDT) X-ASG-Debug-ID: 1396560204-04bdf0743a9c150001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id p3lD35eSLc4wMleS for ; Thu, 03 Apr 2014 14:23:24 -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: As1KAJDIPVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EfFwMBAQEBODWCJQEBAQQ6HDMIAxgJGgsPBSUDBy2HeM9DFxaNeREBVxaEIgSYWpQwgVMpgTU Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 07:53:23 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVp6Y-0002uH-L0 for xfs@oss.sgi.com; Fri, 04 Apr 2014 08:23:22 +1100 Date: Fri, 4 Apr 2014 08:23:22 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-v3.14-rc1-2-12968-ga6cf33b Message-ID: <20140403212322.GO17603@dastard> X-ASG-Orig-Subj: Re: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-v3.14-rc1-2-12968-ga6cf33b References: <20140403211643.00BE629DF9@oss.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140403211643.00BE629DF9@oss.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: 1396560204 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 03, 2014 at 04:16:41PM -0500, xfs@oss.sgi.com wrote: > 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 > a6cf33b Merge branch 'xfs-bug-fixes-for-3.15-3' into for-next > c88547a xfs: fix directory hash ordering bug > 805eeb8 xfs: extra semi-colon breaks a condition > from fe986f9d88ab8079c91669b7f175081f15491a80 (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. Folks, this is the branch I plan to tag and send to Linus to pull tomorrow morning. It would be appreciated if people can run eyes over it and test it before I do that. FWIW, I plan to get all the other DIO/getblocks data corruption issues sorted out and send them as a separate pull request (possibly for -rc2) once they have had further testing. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 3 16:26:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 64DB87FB4 for ; Thu, 3 Apr 2014 16:26:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5643F304066 for ; Thu, 3 Apr 2014 14:26:45 -0700 (PDT) X-ASG-Debug-ID: 1396560398-04cb6c5676c61a70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tcKFnmEnxTCxsHiU for ; Thu, 03 Apr 2014 14:26:39 -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: AuZKAJDIPVN5LEcvPGdsb2JhbABYgwaDSlKEObZahV+BHxcDAQEBATg1giUBAQEEIw8BIyMQCAECEQMBAgECAgUhAgIPBSUDBwwOE4d4kEqcGKJhFxaBE41IB4JvgUkEmFqWAyk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 07:56:38 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVp9h-0002uZ-7I; Fri, 04 Apr 2014 08:26:37 +1100 Date: Fri, 4 Apr 2014 08:26:37 +1100 From: Dave Chinner To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 1/2] fsx: Add fallocate collapse range operation Message-ID: <20140403212637.GP17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] fsx: Add fallocate collapse range operation References: <1396452800-25775-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1396560398 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 02, 2014 at 05:55:07PM +0200, Lukáš Czerner wrote: > On Wed, 2 Apr 2014, Lukas Czerner wrote: > > > Date: Wed, 2 Apr 2014 17:33:19 +0200 > > From: Lukas Czerner > > To: xfs@oss.sgi.com > > Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, > > Lukas Czerner > > Subject: [PATCH 1/2] fsx: Add fallocate collapse range operation > > > > This commit adds fallocate FALLOC_FL_COLLAPSE_RANGE support for fsx. > > Btw, this actually makes the fsx fail on ext4 and xfs after a while. > I was trying to find a problem in fsx itself but I think it is > actually ok. That means that we could possibly have bugs in ext4 and > xfs collapse range implementation. More eyes are needed on this! No surprise, really. As it is, your previous ZERO_RANGE additions caused problems for XFS, and those are mostly fixed in the 6 patch series I sent before LSFMM. Hence I wouldn't be surprised if that's what you are seeing (on XFs, at least) and it's not actually COLLAPSE_RANGE that is causing problems... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 3 16:32:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D62BA7F98 for ; Thu, 3 Apr 2014 16:32:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7965304053 for ; Thu, 3 Apr 2014 14:32:14 -0700 (PDT) X-ASG-Debug-ID: 1396560732-04cb6c5678c61c90001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mzfDpm3NcX7w1DjL for ; Thu, 03 Apr 2014 14:32:12 -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: As9KAKvSPVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EfFwMBAQEBODWCJQEBAQQ6HCMQCAMOCgklDwUlAwcaE4d4z1AXFo5bB4Q4AQOYWophiyIp Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 08:02:11 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVpF4-0002vL-L1; Fri, 04 Apr 2014 08:32:10 +1100 Date: Fri, 4 Apr 2014 08:32:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE Message-ID: <20140403213210.GQ17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140313101302.996355155@bombadil.infradead.org> <20140313101433.608283621@bombadil.infradead.org> <20140313112907.GJ4263@dastard> <20140403110730.GB26244@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140403110730.GB26244@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: 1396560732 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 03, 2014 at 04:07:30AM -0700, Christoph Hellwig wrote: > Skipping this for now, filtering the repair output properly is going to > be a lot of work, and I'd rather do a generic unlinked inode list > recovery test instead of tying it to O_TMPFILE. > > With the first patch already reviewed and the second updated those > should be ready to apply now. OK, Thanks for the update. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Apr 3 16:46:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0035729E06 for ; Thu, 3 Apr 2014 16:46:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E22B6304053 for ; Thu, 3 Apr 2014 14:46:30 -0700 (PDT) X-ASG-Debug-ID: 1396561589-04cb6c5675c620e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id scahqKrg7CnPn5iA for ; Thu, 03 Apr 2014 14:46:29 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (unknown [187.157.176.2]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6F5EA602CFD9; Thu, 3 Apr 2014 16:46:13 -0500 (CDT) Message-ID: <533DD6B0.6010102@sandeen.net> Date: Thu, 03 Apr 2014 15:46:24 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Andy Lutomirski , Eric Sandeen CC: Theodore Ts'o , xfs@oss.sgi.com, lsf@lists.linux-foundation.org, Sedat Dilek , Linux FS Devel , =?windows-1252?Q?Luk=E1=9A_Czerner?= , "linux-ext4@vger.kernel.org" Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> <20140401023711.GE4911@thunk.org> <20140401222823.GJ17603@dastard> <20140402142620.GA6901@thunk.org> <20140403011411.GL16336@dastard> <20140403173504.GB23737@thunk.org> <533DB140.8010103@redhat.com> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all In-Reply-To: X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396561589 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/3/14, 1:21 PM, Andy Lutomirski wrote: > On Thu, Apr 3, 2014 at 12:06 PM, Eric Sandeen wrote: ... >>> The various test scripts do need to be able to find the device where >>> the file system lives, and parsing /etc/fstab would be awkward. So if >>> your comment is that either the /etc/fstab entry shouldn't be >>> required, or the xfstests runtime environment should be able to derive >>> $SCRATCH_DEV automatically from $SCRATCH_MNT, or vice versa, instead >> >> I guess I don't know why you'd expect to derive one from the other... > > Sigh. > > If $SCRATCH_MNT is specified, then the line in /etc/fstab is > unnecessary. If $SCRATCH_MNT is not specified, then /etc/fstab will > do the trick. > > What does not work is specifying $SCRATCH_DIR [sic] but not adding an > fstab entry. Oops. Oh, I see. I'd never really thought about xfstests devices as "part of the system" - since they're constantly scribbled on, re-made, etc, and managed wholly by xfstests (at least the scratch device) - so the notion of using fstab was just outside my realm of expected behaviors. :) -Eric From david@fromorbit.com Thu Apr 3 16:53:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2FBFF7FAA for ; Thu, 3 Apr 2014 16:53:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D4DE304064 for ; Thu, 3 Apr 2014 14:53:35 -0700 (PDT) X-ASG-Debug-ID: 1396562013-04cb6c5678c62300001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4TvHzdxoo6bfhu7z for ; Thu, 03 Apr 2014 14:53:33 -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: AtBKABHXPVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EfFwMBAQEBODWCJQEBAQMBJxMcIxAIAxgJJQ8FJQMHGhOHcQfPThcWjXkRAVAHhDgEmFqWAymBLAQFFw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 08:23:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVpZh-0002yt-PO; Fri, 04 Apr 2014 08:53:29 +1100 Date: Fri, 4 Apr 2014 08:53:29 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: free the EFI entries from AIL on forced shutdown Message-ID: <20140403215329.GR17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: free the EFI entries from AIL on forced shutdown References: <20140325195733.510384972@sgi.com> <20140325195819.740387237@sgi.com> <20140403193414.GN16336@dastard> <533DC928.7080306@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <533DC928.7080306@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: 1396562013 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 03, 2014 at 03:48:40PM -0500, Mark Tinguely wrote: > On 04/03/14 14:34, Dave Chinner wrote: > >On Tue, Mar 25, 2014 at 03:06:35PM -0500, Mark Tinguely wrote: > >>The extent free intention (EFI) and extent free done (EFD) > >>log items are in separate transactions. It is possible that > >>the EFI can be pushed to the AIL before a forced shutdown > >>where it gets stuck for following reasons: > >> > >> No complete EFD in the transaction. This can happen if the > >> transaction fails to reserve space or the freeing the extent > >> fails in xfs_bmap_finish(). > >> > >> EFD IOP Abort processing. If xfs_trans_cancel() is called with > >> an abort flag, or if the xfs_trans_commit() is called when the > >> file system is in forced shutdown or if the log buffer write fails, > >> then the EFD iop commands will not remove the EFI from the AIL. > >> > >>If the EFI entry is left on the AIL, xfs_ail_push all_sync() will > >>fail to complete, the unmount will hang, and a reboot is required > >>to get the complete the unmount. > >> > >>Do not free the EFI structure immediately on forced shutdowns, but > >>instead use the IOP calls to match the EFI/EFD entries. A small > >>wrinkle in the mix is the EFI is not automatically placed on the > >>AIL by the IOP routines in the cases but may have made it to the > >>AIL before the abort. We now have to check if the EFI is on the AIL > >>in the abort IOP cases. > >> > >>Signed-off-by: Mark Tinguely > >>--- > >>Dave, as I tried to explain, if the error in extent free happen early > >>enough, the EFD is not usable and is not in the transaction to cause > >>IOP commands to clean up the EFI. It too must be done manually. > >> > >>The "in the AIL" test must be done in the abort IOP commands. > > > >I still don't see the reason behind these assertions. It just > >doesn't make any sense to me that it can't be handled once the EFI > >has been attached to the EFD, nor why checking AIL status in > >__xfs_efi_release() does not work correctly... > > > >> fs/xfs/xfs_bmap_util.c | 21 +++++++++++++++---- > >> fs/xfs/xfs_extfree_item.c | 49 +++++++++++++++++++++++++++++++++------------- > >> fs/xfs/xfs_log_recover.c | 3 +- > >> fs/xfs/xfs_trans.h | 2 - > >> 4 files changed, 56 insertions(+), 19 deletions(-) > >> > >>Index: b/fs/xfs/xfs_bmap_util.c > >>=================================================================== > >>--- a/fs/xfs/xfs_bmap_util.c > >>+++ b/fs/xfs/xfs_bmap_util.c > >>@@ -116,12 +116,14 @@ xfs_bmap_finish( > >> > >> error = xfs_trans_reserve(ntp,&tres, 0, 0); > >> if (error) > >>- return error; > >>+ goto error_return; > >>+ > >> efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count); > >> for (free = flist->xbf_first; free != NULL; free = next) { > >> next = free->xbfi_next; > >>- if ((error = xfs_free_extent(ntp, free->xbfi_startblock, > >>- free->xbfi_blockcount))) { > >>+ error = xfs_free_extent(ntp, free->xbfi_startblock, > >>+ free->xbfi_blockcount); > >>+ if (error) { > >> /* > >> * The bmap free list will be cleaned up at a > >> * higher level. The EFI will be canceled when > >>@@ -136,13 +138,24 @@ xfs_bmap_finish( > >> (error == EFSCORRUPTED) ? > >> SHUTDOWN_CORRUPT_INCORE : > >> SHUTDOWN_META_IO_ERROR); > >>- return error; > >>+ goto error_return; > >> } > >> xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, > >> free->xbfi_blockcount); > > ^^^^^^ > here is where the EFD is placed in the transaction. It cannot be placed > in the transaction earlier because it is not complete. No, that's wrong. The EFD is linked to the transaction in xfs_trans_get_efd() where it calls xfs_trans_add_item(). The above call is where it is logged (i.e. marked dirty), not where it is added to the transaction. > >This is inconsistent from a high level logic point of view. The EFI > >is attached to the EFD after a call to xfs_trans_get_efd() and so > >cleanup on failure should always occur through the IOP* interfaces > >(specifically xfs_efd_item_unlock() with an aborted log item). > > > >The only case where a xfs_efi_release() call is required is the > >xfs_trans_reserve() failure case, where nothing in the current > >transaction context owns the reference on the EFI we are going to > >pass to the EFD. > > The EFD is not in the transaction in the failed xfs_extent_free > failure case and there is not efd IOP call. Yes it is. It may no be dirty, though. > >>--- a/fs/xfs/xfs_extfree_item.c > >>+++ b/fs/xfs/xfs_extfree_item.c > >>@@ -56,15 +56,22 @@ xfs_efi_item_free( > >> */ > >> STATIC void > >> __xfs_efi_release( > >>- struct xfs_efi_log_item *efip) > >>+ struct xfs_efi_log_item *efip, > >>+ int abort) > >> { > >> struct xfs_ail *ailp = efip->efi_item.li_ailp; > >> > >> 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, > >>- SHUTDOWN_LOG_IO_ERROR); > >>+ /* > >>+ * The EFI may not be on the AIL on abort. > >>+ * xfs_trans_ail_delete() drops the AIL lock. > >>+ */ > >>+ if (abort) > >>+ spin_unlock(&ailp->xa_lock); > >>+ else > >>+ xfs_trans_ail_delete(ailp,&efip->efi_item, > >>+ SHUTDOWN_LOG_IO_ERROR); > >> xfs_efi_item_free(efip); > >> } > >> } > > > >"Abort" is not necessary. If it's the last reference, and the EFI is > >in the AIL, then it needs to be removed. i.e. the check shoul dbe > >against XFS_LI_IN_AIL, not against a flag passed in by the caller. > > You are mistaken. It may or may not be in the AIL. No, I'm not mistaken - I'm talking about using a different techinique to determine whether we need to remove the EFI from the AIL or not. That is, we have a flag on *every log item* that tells us whether the item is in the AIL. It is guaranteed to be correct, and we use it in many places to determine if the object we are about to free is in the AIL and hence needs to be removed first. IOWs, we can use introspection to remove the EFI from the AIL when the last reference goes away. The code is simply: if (atomic_dec_and_test(&efip->efi_refcount)) { spin_lock(&ailp->xa_lock); if (efip->efi_item.li_flags & XFS_LI_IN_AIL) { xfs_trans_ail_delete(ailp,&efip->efi_item, SHUTDOWN_LOG_IO_ERROR); } spin_unlock(&ailp->xa_lock); xfs_efi_item_free(efip); } No abort flag is needed. Other examples of this exact same check being done in error handling paths for various log item are xfs_iflush_abort(), xfs_buf_item_unlock() and xfs_qm_dqflush(). > >> if (atomic_sub_and_test(nextents,&efip->efi_next_extent)) { > >>- __xfs_efi_release(efip); > >>+ __xfs_efi_release(efip, abort); > >> /* efip may now have been freed, do not reference it again. */ > >> } > >> } > >>@@ -417,8 +426,19 @@ STATIC void > >> xfs_efd_item_unlock( > >> struct xfs_log_item *lip) > >> { > >>- if (lip->li_flags& XFS_LI_ABORTED) > >>- xfs_efd_item_free(EFD_ITEM(lip)); > >>+ struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > >>+ > >>+ if (!(lip->li_flags& XFS_LI_ABORTED)) > >>+ return; BTW, your email program is still mangling quoted whitespace in the code. Can you please fix it? > >>+ > >>+ /* Free the EFI when aborting a commit. The EFI will be either > >>+ * added to the AIL in a CIL push before this abort or unlocked > >>+ * before the EFD unlock. In either case we can check the AIL > >>+ * status now. > >>+ */ > > > >We are not freeing the EFI here - we are simply releasing the > >reference the EFD holds on it because we are about to free the EFD. > >Nothing else actually matters here - we don't care whether the EFI > >is in the AIL or not, because that can be handled internally to > >the xfs_efi_release() code.... > > Again. The EFI is in the previous commit. It could have made it to > the AIL or is in the same abort. You're still missing the point. It doesn't matter where the EFI is - what matters is that we are freeing the object that holds a reference to the EFI and so we have to drop it. The point of using reference counting and introspection that no caller needs to care about the internal state of the EFI, just that they hold a reference that needs to be dropped. And that means simpler code and that future modifications are much less likely to screw up the EFI error handling. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 3 17:18:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 738327F66 for ; Thu, 3 Apr 2014 17:18:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5C83F304053 for ; Thu, 3 Apr 2014 15:18:31 -0700 (PDT) X-ASG-Debug-ID: 1396563508-04cb6c5678c62c00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 5DMAHo3b88QQO0uA for ; Thu, 03 Apr 2014 15:18:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtFKACvdPVN5LEcvPGdsb2JhbABYgwaDSoULtlqFX4EfFwMBAQEBODWCJQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTh3EHz1EXFo4ECgRJB4Q4BJhalgMpgSwBHwQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Apr 2014 08:48:27 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WVpxq-00032W-Em; Fri, 04 Apr 2014 09:18:26 +1100 Date: Fri, 4 Apr 2014 09:18:26 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140403221826.GS17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> <20140331222246.GF17603@dastard> <20140401135518.GC21540@bfoster.bfoster> <20140401211926.GH17603@dastard> <20140401232022.GA15934@bfoster.bfoster> <20140402051103.GL17603@dastard> <20140402201110.GC3043@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140402201110.GC3043@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1396563508 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 02, 2014 at 04:11:10PM -0400, Brian Foster wrote: > On Wed, Apr 02, 2014 at 04:11:03PM +1100, Dave Chinner wrote: > > On Tue, Apr 01, 2014 at 07:20:23PM -0400, Brian Foster wrote: > > > On Wed, Apr 02, 2014 at 08:19:26AM +1100, Dave Chinner wrote: > > > > On Tue, Apr 01, 2014 at 09:55:18AM -0400, Brian Foster wrote: > > > > Yes, it means that there is a global flush when a project quota runs > > > > out of space, but it means that we only do it once and we don't burn > > > > excessive CPU walking radix trees scanning inodes needlessly every > > > > time we get a storm of processes hammering project quota ENOSPC. > > > > > > > > > > It's not clear to me that excess scanning is an issue, but it seems > > > > Have 100 threads hit ENOSPC on the same project quota at the same > > time on a filesystem with a couple of thousand AGs with a few > > million cached inode, and then you'll see the problem.... > > > > Right, that certainly sounds like a mess if we kicked off a bunch of the > mini-flush scans. I'm curious how much overhead there would be with the > flush out of the picture and a scan can actually go ahead and free up > some space (hopefully) quickly. That's something I'll have to test. > > > > orthogonal to how we organize the enospc logic (at least once the flush > > > is out of the equation). IOW, we'll invoke the scanner with the same > > > frequency either way. Or maybe you are just referring to scanning > > > specifically for the purpose of doing flushes as a waste..? > > > > Well, lots of concurrent scanning for the same purpose is highly > > inefficient - look at the amount of additional serialisation in the > > inode recalim walker that is aimed at reducing concurrency to one > > reclaim thread per AG at a time... > > > > Interesting, and I think this touches a bit on what I mean by the > scanning being somewhat orthogonal to the purpose of this patch. If the > scanning does turn out to be a real problem in this particular context, > why not try to improve the efficiency of the scan? We could include this > kind of per-ag locking for internal scans, or perhaps create a new scan > mode that exits after freeing a specified amount of space, etc. Well, xfs_flush_inodes() serialises callers, so if we flush before scan we already effectively have a method of throttling the EOF block scans ;) The idea of the generic scan code, however, is not to do any serialisation at all. i.e. to be as fast and concurrent as possible. If a caller needs throttling, then we do that at the caller. The reclaim code has /interesting/ serialisation requirements - it has to be as concurrent as possible (because shrinkers can be called concurrently) but not waste CPU scanning the same inodes unnecesarily (hence the cursors). But it also needs to throttle inode allocation to the rate at which we can clean and free them, and hence the mutexes and synchronous inode writeback to throttle and back up excessive reclaim concurrency without wasting CPU. > > I expect that if the serialisation on xfs_flush_inodes() isn't > > sufficient to throttle eofblock scanning concurrency in case like > > the above then we'll know about it pretty quickly. > > > > How much space should we expect xfs_flush_inodes() to free up? Using Depends on the amount of delalloc space. Assume and average indirect block reservation of 4 blocks per delalloc region that is flushed. > your example of the unconditional flush followed by the global scan - it > seems like it could throttle things temporarily by allowing some set of > writers to serialize on a flush and hopefully soon after that other > writers can allocate space again. Once we're past that, those flushing > threads head into the scan just the same. > > So I guess the question is, will the flush satisfy concurrent writers > long enough for one of the flush inducing threads to get into the scan > and prevent others from queuing further? If so, it seems like a > potential positive if the overhead of the flush is less than the > overhead of the "unbounded" scan in the same scenario. If not, it seems > like it could also be a potential net negative because we'll effectively > queue more threads on the flush that could have avoided allocation > failure were a scan already running and freeing space. I guess that all > depends on how long the flush takes, how much data is in cache, storage > hardware, etc. Something else I'll have to experiment with a little > more I suppose... :) Right, but in general I think that the FIFO serialisation behaviour of xfs_flush_inodes() will be sufficent to limit the scanning concurrency, especially if each flush causes a few IOs to be done and so metres out the start of each new scan to a 10-20 new scans per second.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Apr 3 17:19:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C38A27FC5 for ; Thu, 3 Apr 2014 17:19:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B70C2304066 for ; Thu, 3 Apr 2014 15:19:23 -0700 (PDT) X-ASG-Debug-ID: 1396563562-04cbb054b6a73270001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id eWpWrGAONWTkakey for ; Thu, 03 Apr 2014 15:19:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (unknown [187.157.176.2]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D7A6A63D105D; Thu, 3 Apr 2014 17:19:20 -0500 (CDT) Message-ID: <533DDE79.9050207@sandeen.net> Date: Thu, 03 Apr 2014 16:19:37 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Brian Foster CC: xfs-oss Subject: Re: [PATCH] xfs: remove unused transaction pointer args References: <53362976.3060101@sandeen.net> <20140331130932.GA63718@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove unused transaction pointer args In-Reply-To: <20140331130932.GA63718@bfoster.bfoster> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396563562 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4556 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/31/14, 7:09 AM, Brian Foster wrote: > On Fri, Mar 28, 2014 at 09:01:26PM -0500, Eric Sandeen wrote: >> Several functions pass a transaction pointer around, >> but it's never used in those callchains. Remove it. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c >> index 152543c..b308097 100644 >> --- a/fs/xfs/xfs_bmap.c >> +++ b/fs/xfs/xfs_bmap.c >> @@ -1675,7 +1675,6 @@ xfs_bmap_isaeof( >> */ >> int >> xfs_bmap_last_offset( >> - struct xfs_trans *tp, >> struct xfs_inode *ip, >> xfs_fileoff_t *last_block, >> int whichfork) > > Seems Ok to me, but it looks like you could also kill the tp param for > xfs_bmap_last_extent(). I don't see any callers that don't pass NULL... > > Brian Actually I think that'd be a separate change, and not totally obvious that it's one we should make - I'm (lazily) not sure if someone might need to pass in a tp to be used in xfs_iread_extents() some time in the future... -Eric From dx-wl@163.com Fri Apr 4 02:26:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DFAEE7FD3 for ; Fri, 4 Apr 2014 02:26:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C918F304062 for ; Fri, 4 Apr 2014 00:26:30 -0700 (PDT) X-ASG-Debug-ID: 1396596386-04cb6c5677c6f200001-NocioJ Received: from sam.nabble.com (sam.nabble.com [216.139.236.26]) by cuda.sgi.com with ESMTP id 6oe6FqbNfm2LWwOm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 04 Apr 2014 00:26:26 -0700 (PDT) X-Barracuda-Envelope-From: dx-wl@163.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 1WVyWA-0001ci-86 for xfs@oss.sgi.com; Fri, 04 Apr 2014 00:26:26 -0700 Date: Fri, 4 Apr 2014 00:26:26 -0700 (PDT) From: daiguochao To: xfs@oss.sgi.com Message-ID: <1396596386220-35015.post@n7.nabble.com> Subject: 10GB memorys occupied by XFS MIME-Version: 1.0 X-ASG-Orig-Subj: 10GB memorys occupied by XFS 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: 1396596386 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello folks, I used xfs file system in kernel-2.6.32-220.13.1.el6.x86_64 for store pictures. About 100 days system memorys is lost and some nginx process is killed by oom-killer.So,I looked /proc/meminfo and find memorys is lost.Finally, I try to umount xfs system and 10GB memorys is coming back. l look xfs bugzilla no such BUG.I have no idea for it. Cheers, Guochao. some memorys info: 0> free -m total used free shared buffers cached Mem: 11887 11668 219 0 0 2 -/+ buffers/cache: 11665 222 Swap: 0 0 0 130> cat /proc/meminfo MemTotal: 12173268 kB MemFree: 223044 kB Buffers: 244 kB Cached: 4540 kB SwapCached: 0 kB Active: 1700 kB Inactive: 5312 kB Active(anon): 1616 kB Inactive(anon): 1128 kB Active(file): 84 kB Inactive(file): 4184 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 2556 kB Mapped: 1088 kB Shmem: 196 kB Slab: 509708 kB SReclaimable: 7596 kB SUnreclaim: 502112 kB KernelStack: 1096 kB PageTables: 748 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 6086632 kB Committed_AS: 9440 kB VmallocTotal: 34359738367 kB VmallocUsed: 303488 kB VmallocChunk: 34359426132 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 6152 kB DirectMap2M: 2070528 kB DirectMap1G: 10485760 kB -- View this message in context: http://xfs.9218.n7.nabble.com/10GB-memorys-occupied-by-XFS-tp35015.html Sent from the Xfs - General mailing list archive at Nabble.com. From david@fromorbit.com Fri Apr 4 04:04:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EAB527FD0 for ; Fri, 4 Apr 2014 04:04:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D352A304062 for ; Fri, 4 Apr 2014 02:04:03 -0700 (PDT) X-ASG-Debug-ID: 1396602240-04cbb054b7a81ab0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 4LnISQUjjsTBP4Fr for ; Fri, 04 Apr 2014 02:04:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av5YAFt0PlN5LEcvPGdsb2JhbABXgwY7iBqjCAIGkXeBWIVfgR8XAwEBAQE4NYJmHCMYJDQFJQMHLYd4z2kWjluCNQ+BewSYWpN/ggUp Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Apr 2014 19:33:59 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WW02X-0004MY-I8; Fri, 04 Apr 2014 20:03:57 +1100 Date: Fri, 4 Apr 2014 20:03:57 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org Subject: [ANNOUNCE] xfstests: updated to cf1ed54 Message-ID: <20140404090357.GW17603@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: updated to cf1ed54 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396602240 X-Barracuda-URL: http://192.48.176.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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. The new head of the master branch is commit: cf1ed54 check: fix RESULT_BASE typo in check script The major new functionality worth mentioning in this update is the new config file format from Lukas. The existing format config files should continue to work without change, but the new format is much richer and allows specification of multiple different configurations to run test under. Hence testing multiple mount an dmkfs configurations becomes as simple as iterating the configurations in the config file. New Commits: Christoph Hellwig (2): [feb7da1] common: add flink support to _require_xfs_io_command [3bbbc25] generic: add a basic O_TMPFILE test Eric Sandeen (1): [cf1ed54] check: fix RESULT_BASE typo in check script Eryu Guan (1): [dadfd3c] shared: new test to use up free inodes Filipe David Borba Manana (3): [bb2499e] btrfs: add test for btrfs send issuing premature rmdir operations [c99c847] btrfs: add test for btrfs incremental send [e0ff31a] btrfs: add test for btrfs incremental send data corruption Filipe Manana (1): [1a87439] btrfs: add test for btrfs send directory moves/renames Hannes Frederic Sowa (1): [947ee8b] fs: add directories hash collision test Lukas Czerner (10): [4d18f5a] generic: add generic test for fallocate zero range [bf44459] check: Prepare for config section [667308d] check: Add support for sections in config file [f8e4f53] check: Allow to recreate TEST_DEV [b1ffb05] check: Remount file system if MOUNT_OPTIONS changed [7baa3e2] check: unmount TEST_DEV and SCRATCH_DEV after test run [21723cd] generic: Make some shared tests generic [259d680] ext4: Make shared/243 ext4 specific [5f8c711] fsx: Add fallocate collapse range operation [f98d930] fsstress: Add fallocate collapse range operation Code Diffstat: .gitignore | 1 + README.config-sections | 87 +++++++ check | 404 ++++++++++++++++++------------ common/config | 155 +++++++++++- common/rc | 30 ++- ltp/fsstress.c | 20 ++ ltp/fsx.c | 107 +++++++- src/Makefile | 2 +- src/dirhash_collide.c | 223 +++++++++++++++++ tests/btrfs/043 | 149 +++++++++++ tests/btrfs/043.out | 1 + tests/btrfs/044 | 129 ++++++++++ tests/btrfs/044.out | 1 + tests/btrfs/045 | 376 +++++++++++++++++++++++++++ tests/btrfs/045.out | 1 + tests/btrfs/046 | 304 ++++++++++++++++++++++ tests/btrfs/046.out | 213 ++++++++++++++++ tests/btrfs/group | 4 + tests/{shared/243 => ext4/002} | 4 +- tests/{shared/243.out => ext4/002.out} | 2 +- tests/ext4/group | 1 + tests/generic/004 | 65 +++++ tests/generic/004.out | 6 + tests/generic/009 | 78 ++++++ tests/generic/009.out | 333 ++++++++++++++++++++++++ tests/{shared/003 => generic/012} | 6 +- tests/{shared/003.out => generic/012.out} | 2 +- tests/{shared/004 => generic/016} | 6 +- tests/{shared/004.out => generic/016.out} | 2 +- tests/{shared/005 => generic/017} | 4 +- tests/generic/017.out | 4 + tests/{shared/218 => generic/018} | 4 +- tests/{shared/218.out => generic/018.out} | 2 +- tests/{shared/305 => generic/019} | 4 +- tests/{shared/305.out => generic/019.out} | 2 +- tests/{shared/001 => generic/021} | 6 +- tests/{shared/001.out => generic/021.out} | 2 +- tests/{shared/002 => generic/022} | 6 +- tests/{shared/002.out => generic/022.out} | 2 +- tests/generic/group | 9 + tests/shared/005.out | 4 - tests/shared/006 | 97 +++++++ tests/shared/006.out | 2 + tests/shared/group | 10 +- tests/xfs/006 | 63 +++++ tests/xfs/006.out | 28 +++ tests/xfs/group | 1 + 47 files changed, 2746 insertions(+), 216 deletions(-) create mode 100644 README.config-sections create mode 100644 src/dirhash_collide.c create mode 100644 tests/btrfs/043 create mode 100644 tests/btrfs/043.out create mode 100644 tests/btrfs/044 create mode 100644 tests/btrfs/044.out create mode 100755 tests/btrfs/045 create mode 100644 tests/btrfs/045.out create mode 100644 tests/btrfs/046 create mode 100644 tests/btrfs/046.out rename tests/{shared/243 => ext4/002} (99%) rename tests/{shared/243.out => ext4/002.out} (95%) create mode 100755 tests/generic/004 create mode 100644 tests/generic/004.out create mode 100644 tests/generic/009 create mode 100644 tests/generic/009.out rename tests/{shared/003 => generic/012} (93%) mode change 100644 => 100755 rename tests/{shared/003.out => generic/012.out} (97%) rename tests/{shared/004 => generic/016} (93%) mode change 100644 => 100755 rename tests/{shared/004.out => generic/016.out} (97%) rename tests/{shared/005 => generic/017} (97%) mode change 100644 => 100755 create mode 100644 tests/generic/017.out rename tests/{shared/218 => generic/018} (98%) rename tests/{shared/218.out => generic/018.out} (93%) rename tests/{shared/305 => generic/019} (98%) rename tests/{shared/305.out => generic/019.out} (88%) rename tests/{shared/001 => generic/021} (93%) rename tests/{shared/001.out => generic/021.out} (97%) rename tests/{shared/002 => generic/022} (93%) mode change 100644 => 100755 rename tests/{shared/002.out => generic/022.out} (97%) delete mode 100644 tests/shared/005.out create mode 100755 tests/shared/006 create mode 100644 tests/shared/006.out create mode 100755 tests/xfs/006 create mode 100644 tests/xfs/006.out -- Dave Chinner david@fromorbit.com From fdmanana@gmail.com Fri Apr 4 08:07:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C0C317FCD for ; Fri, 4 Apr 2014 08:07:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 699B7AC00E for ; Fri, 4 Apr 2014 06:07:20 -0700 (PDT) X-ASG-Debug-ID: 1396616836-04bdf0743ab2a80001-NocioJ Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com [209.85.217.169]) by cuda.sgi.com with ESMTP id f9nx9KQzZnPMWQet (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Apr 2014 06:07:18 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.169] Received: by mail-lb0-f169.google.com with SMTP id q8so2488313lbi.0 for ; Fri, 04 Apr 2014 06:07:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=FTKOAkdQ5NN2cOtxn4Q0iO3UE3+e9oq8jCMPJ5RCUOA=; b=gbXs/RbL2s7g37+RGH9gbf6F29E+qNMJhwApJ6WyJRvJJFmZwHVWhiwTwkzLTj010q 5/Dd6fJreL47Jq4uUmgoVwZOHr0gfDtWPAQx5+mnn8SOLxxfLXJlfhJxFTLbbxvz/Ha6 ztUSoCNfvYB7yXttAHcsjBHwR4mGN6vdZE0bjLkZBDh+8oJs4Y3AjRV/dy5budBcAHzG e32il3kzLll6j3V4tPHpnaVhxTtHDj12BDOm2VhltoE4pdPVVD2LCnZBjesZSssxYSKZ LPAKy6z30MmQA342CwhLpTO1AA4IhxJmXxavG0ZFCnRYOV3y64VfKsDEt4cFBZAl0rPC zs8g== MIME-Version: 1.0 X-Received: by 10.112.134.230 with SMTP id pn6mr1713283lbb.37.1396616836302; Fri, 04 Apr 2014 06:07:16 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Fri, 4 Apr 2014 06:07:16 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <20140404090357.GW17603@dastard> References: <20140404090357.GW17603@dastard> Date: Fri, 4 Apr 2014 14:07:16 +0100 Message-ID: Subject: Re: [ANNOUNCE] xfstests: updated to cf1ed54 From: Filipe David Manana X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: updated to cf1ed54 To: Dave Chinner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , linux-ext4@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f169.google.com[209.85.217.169] X-Barracuda-Start-Time: 1396616837 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=DKIM_SIGNED, DKIM_VERIFIED, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4561 Rule breakdown below pts rule name 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.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) On Fri, Apr 4, 2014 at 10:03 AM, Dave Chinner wrote: > Hi folks, > > The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has > just been updated. Patches often get missed, so please check if your > outstanding patches were in this update. If they have not been in > this update, please resubmit them to xfs@oss.sgi.com so they can be > picked up in the next update. > > The new head of the master branch is commit: > > cf1ed54 check: fix RESULT_BASE typo in check script > > The major new functionality worth mentioning in this update is the > new config file format from Lukas. The existing format config files > should continue to work without change, but the new format is much > richer and allows specification of multiple different configurations > to run test under. Hence testing multiple mount an dmkfs > configurations becomes as simple as iterating the configurations > in the config file. Hi, I might be missing something, but after checking out these changes, I am no longer able to run btrfs tests. Example: $ ./check btrfs/041 common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set Passed all 0 tests $ cat local.config export TEST_DEV=/dev/sdb export TEST_DIR=/home/fdmanana/btrfs-tests/dev export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" I did check too that my shell environment didn't define/export SCRATCH_DEV. Going back to revision 3948694eb12e9699f558fab5e8169a8b090780d1, using the same exact config, it works. Do I need to adjust something in my config or is it a regression? thanks > > New Commits: > > Christoph Hellwig (2): > [feb7da1] common: add flink support to _require_xfs_io_command > [3bbbc25] generic: add a basic O_TMPFILE test > > Eric Sandeen (1): > [cf1ed54] check: fix RESULT_BASE typo in check script > > Eryu Guan (1): > [dadfd3c] shared: new test to use up free inodes > > Filipe David Borba Manana (3): > [bb2499e] btrfs: add test for btrfs send issuing premature rmdir operations > [c99c847] btrfs: add test for btrfs incremental send > [e0ff31a] btrfs: add test for btrfs incremental send data corruption > > Filipe Manana (1): > [1a87439] btrfs: add test for btrfs send directory moves/renames > > Hannes Frederic Sowa (1): > [947ee8b] fs: add directories hash collision test > > Lukas Czerner (10): > [4d18f5a] generic: add generic test for fallocate zero range > [bf44459] check: Prepare for config section > [667308d] check: Add support for sections in config file > [f8e4f53] check: Allow to recreate TEST_DEV > [b1ffb05] check: Remount file system if MOUNT_OPTIONS changed > [7baa3e2] check: unmount TEST_DEV and SCRATCH_DEV after test run > [21723cd] generic: Make some shared tests generic > [259d680] ext4: Make shared/243 ext4 specific > [5f8c711] fsx: Add fallocate collapse range operation > [f98d930] fsstress: Add fallocate collapse range operation > > > Code Diffstat: > > .gitignore | 1 + > README.config-sections | 87 +++++++ > check | 404 ++++++++++++++++++------------ > common/config | 155 +++++++++++- > common/rc | 30 ++- > ltp/fsstress.c | 20 ++ > ltp/fsx.c | 107 +++++++- > src/Makefile | 2 +- > src/dirhash_collide.c | 223 +++++++++++++++++ > tests/btrfs/043 | 149 +++++++++++ > tests/btrfs/043.out | 1 + > tests/btrfs/044 | 129 ++++++++++ > tests/btrfs/044.out | 1 + > tests/btrfs/045 | 376 +++++++++++++++++++++++++++ > tests/btrfs/045.out | 1 + > tests/btrfs/046 | 304 ++++++++++++++++++++++ > tests/btrfs/046.out | 213 ++++++++++++++++ > tests/btrfs/group | 4 + > tests/{shared/243 => ext4/002} | 4 +- > tests/{shared/243.out => ext4/002.out} | 2 +- > tests/ext4/group | 1 + > tests/generic/004 | 65 +++++ > tests/generic/004.out | 6 + > tests/generic/009 | 78 ++++++ > tests/generic/009.out | 333 ++++++++++++++++++++++++ > tests/{shared/003 => generic/012} | 6 +- > tests/{shared/003.out => generic/012.out} | 2 +- > tests/{shared/004 => generic/016} | 6 +- > tests/{shared/004.out => generic/016.out} | 2 +- > tests/{shared/005 => generic/017} | 4 +- > tests/generic/017.out | 4 + > tests/{shared/218 => generic/018} | 4 +- > tests/{shared/218.out => generic/018.out} | 2 +- > tests/{shared/305 => generic/019} | 4 +- > tests/{shared/305.out => generic/019.out} | 2 +- > tests/{shared/001 => generic/021} | 6 +- > tests/{shared/001.out => generic/021.out} | 2 +- > tests/{shared/002 => generic/022} | 6 +- > tests/{shared/002.out => generic/022.out} | 2 +- > tests/generic/group | 9 + > tests/shared/005.out | 4 - > tests/shared/006 | 97 +++++++ > tests/shared/006.out | 2 + > tests/shared/group | 10 +- > tests/xfs/006 | 63 +++++ > tests/xfs/006.out | 28 +++ > tests/xfs/group | 1 + > 47 files changed, 2746 insertions(+), 216 deletions(-) > create mode 100644 README.config-sections > create mode 100644 src/dirhash_collide.c > create mode 100644 tests/btrfs/043 > create mode 100644 tests/btrfs/043.out > create mode 100644 tests/btrfs/044 > create mode 100644 tests/btrfs/044.out > create mode 100755 tests/btrfs/045 > create mode 100644 tests/btrfs/045.out > create mode 100644 tests/btrfs/046 > create mode 100644 tests/btrfs/046.out > rename tests/{shared/243 => ext4/002} (99%) > rename tests/{shared/243.out => ext4/002.out} (95%) > create mode 100755 tests/generic/004 > create mode 100644 tests/generic/004.out > create mode 100644 tests/generic/009 > create mode 100644 tests/generic/009.out > rename tests/{shared/003 => generic/012} (93%) > mode change 100644 => 100755 > rename tests/{shared/003.out => generic/012.out} (97%) > rename tests/{shared/004 => generic/016} (93%) > mode change 100644 => 100755 > rename tests/{shared/004.out => generic/016.out} (97%) > rename tests/{shared/005 => generic/017} (97%) > mode change 100644 => 100755 > create mode 100644 tests/generic/017.out > rename tests/{shared/218 => generic/018} (98%) > rename tests/{shared/218.out => generic/018.out} (93%) > rename tests/{shared/305 => generic/019} (98%) > rename tests/{shared/305.out => generic/019.out} (88%) > rename tests/{shared/001 => generic/021} (93%) > rename tests/{shared/001.out => generic/021.out} (97%) > rename tests/{shared/002 => generic/022} (93%) > mode change 100644 => 100755 > rename tests/{shared/002.out => generic/022.out} (97%) > delete mode 100644 tests/shared/005.out > create mode 100755 tests/shared/006 > create mode 100644 tests/shared/006.out > create mode 100755 tests/xfs/006 > create mode 100644 tests/xfs/006.out > -- > Dave Chinner > david@fromorbit.com > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From bfoster@redhat.com Fri Apr 4 08:37:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D25D67FE0 for ; Fri, 4 Apr 2014 08:37:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BE1D7304064 for ; Fri, 4 Apr 2014 06:37:12 -0700 (PDT) X-ASG-Debug-ID: 1396618631-04cb6c5678c78bb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fSf42GDEUHeo7kTG for ; Fri, 04 Apr 2014 06:37:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s34Db4jS019423 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 4 Apr 2014 09:37:04 -0400 Received: from laptop.bfoster (vpn-63-111.rdu2.redhat.com [10.10.63.111]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s34Db3NM002091; Fri, 4 Apr 2014 09:37:03 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id E9340120ADC; Fri, 4 Apr 2014 09:37:02 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s34Db1uo013509; Fri, 4 Apr 2014 09:37:01 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 4 Apr 2014 09:37:01 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, Al@disappointment.disaster Subject: Re: [PATCH 5/6] xfs: splitting delalloc extents can run out of reservation Message-ID: <20140404133700.GA12961@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: splitting delalloc extents can run out of reservation References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <1395396710-3824-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395396710-3824-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396618631 X-Barracuda-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, Mar 21, 2014 at 09:11:49PM +1100, Dave Chinner wrote: > From: Dave Chinner > > When we punch a hole in a delalloc extent, we split the indirect > block reservation between the two new extents. If we repeatedly > punch holes in a large delalloc extent, that reservation will > eventually run out and we'll assert fail in xfs_bunmapi() because > the indirect block reservation for the delalloc extent is zero. This > is caused by doing a large delalloc write, then zeroing multiple > ranges of that write using fallocate to punch lots of holes in the > delayed allocation range. > > To avoid this problem, if we split the reservation and require more > indirect blocks for the two new extents than we had for the old > reservation, steal the additional blocks from the hole we punched in > the extent. In most cases we only need a single extra block, so even > if we punch only single block holes we can still retain sufficient > indirect block reservations to avoid problems. > > In doing this "stealing", we need to change where we account for the > delalloc blocks being freed. The block count held on the inode does > not take into account the indirect block reservation, so we still > need to do that before we free the extent. However, the accounting > ofr free space in the superblock need to be done after we've stolen > the blocks fro the freed extent so that they are accounted for > correctly. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_bmap.c | 65 ++++++++++++++++++++++++++++++++++++++++--------------- > 1 file changed, 47 insertions(+), 18 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 5b6092e..4bf6a0e 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -4945,7 +4945,27 @@ xfs_bmap_del_extent( > temp2 = xfs_bmap_worst_indlen(ip, temp2); > new.br_startblock = nullstartblock((int)temp2); > da_new = temp + temp2; > + > + /* > + * Note: if we have an odd number of blocks reserved, > + * then if we keep splitting the delalloc extent like > + * this we end up with a delalloc indlen reservation of > + * zero for one of the two extents. Hence if we end > + * up with the new indlen reservations being larger than > + * the old one, steal blocks from the data reservation > + * we just punched out. Otherwise, just reduce the > + * remaining indlen reservations alternately and hope > + * next time we come here the range getting removed is > + * large enough to fix this all up. > + */ > while (da_new > da_old) { > + if (del->br_blockcount) { > + /* steal a block */ > + da_new--; > + del->br_blockcount--; > + continue; > + } > + > if (temp) { > temp--; > da_new--; > @@ -5255,24 +5275,6 @@ xfs_bunmapi( > } > if (wasdel) { > ASSERT(startblockval(del.br_startblock) > 0); > - /* Update realtime/data freespace, unreserve quota */ > - if (isrt) { > - xfs_filblks_t rtexts; > - > - rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); > - do_div(rtexts, mp->m_sb.sb_rextsize); > - xfs_mod_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 -= del.br_blockcount; > if (cur) > cur->bc_private.b.flags |= > @@ -5302,6 +5304,33 @@ xfs_bunmapi( > } > error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, > &tmp_logflags, whichfork); > + /* > + * xfs_bmap_del_extent may hand delayed alloc blocks back to the > + * indirect block reservations to keep extent split reservations > + * sane. Hence we should only decrement the delayed block count > + * on the inode once we know exactly the amount of delalloc > + * space we actually removed from the inode. > + */ > + if (wasdel && del.br_blockcount) { > + /* Update realtime/data freespace, unreserve quota */ > + if (isrt) { > + xfs_filblks_t rtexts; > + > + rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); > + do_div(rtexts, mp->m_sb.sb_rextsize); > + xfs_mod_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); > + } > + } In xfs_bmapi_reserve_delalloc(), we account alen against the quota, calculate indlen, account both against the sb counters, add alen to i_delayed_blks and continue on... In xfs_bunmap(), we remove br_blockcount from the sb counters and unreserve from the quota then call into xfs_bmap_del_extent(). The latter takes care of removing the indlen blocks from the sb counters if necessary. With these changes, we move the accounting after the del_extent() call and allow the latter to steal from br_blockcount for indlen. This seems like it works for the sb counters. We also adjust i_delayed_blks against the original extent length before it can be modified. The quota reservation looks like it could become inconsistent, however. E.g., some blocks previously accounted against the quota (alen) are now moved over to indlen. If those indlen blocks happen to be cleaned up through del_extent(), they'd only be replenished to the sb counters (near the end of del_extent()). Perhaps we should leave the quota unreserve prior to the del_extent() call or sample the original br_blockcount and use it post del_extent()..? Brian > logflags |= tmp_logflags; > if (error) > goto error0; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From zwu.kernel@gmail.com Fri Apr 4 10:09:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E54987FCE for ; Fri, 4 Apr 2014 10:09:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B87338F80B7 for ; Fri, 4 Apr 2014 08:09:20 -0700 (PDT) X-ASG-Debug-ID: 1396624158-04bdf05dabca5850001-NocioJ Received: from mail-yh0-f54.google.com (mail-yh0-f54.google.com [209.85.213.54]) by cuda.sgi.com with ESMTP id AcXnig3SQnqVS7lD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Apr 2014 08:09:18 -0700 (PDT) X-Barracuda-Envelope-From: zwu.kernel@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 f73so3239596yha.13 for ; Fri, 04 Apr 2014 08:09:18 -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=mime-version:date:message-id:subject:from:to:cc:content-type; bh=CY7Y7eqIhI7lpH82+M3UL/gNzw++EpAQZwNuBt+r+AM=; b=Oc5RiAiuTX65WBHvhHfCuNCZjzKXVZ8dngtLZgz3+w0vO064VxkGBcsly2et/96U2s wdOVtxRLbc36nP98xRMOdWFu61LD/ijJ+guzlCBbyFLH13kZwYuIfd+YiBkTWMFLhtTs LbfW3pHwK6qdjW30410L0OsgphF0hFIzPptjmT8X0jBW4Y+buw8319PljBO6QW0qzvc6 F9Gkw7u7nb64U4OlCZxMqHjFl2luPR0onqCqePWlj2Ang3JV/vGZ2Q45uJ3AjKTOEoye ZlSRuVkyxhddI3II3H1XJ6EzHpgd6gVqJOgHVYMSQ4HQQJHtH3EOaM7AHlgjwgmiCSW/ liMw== MIME-Version: 1.0 X-Received: by 10.236.61.45 with SMTP id v33mr17864744yhc.20.1396624150545; Fri, 04 Apr 2014 08:09:10 -0700 (PDT) Received: by 10.170.207.71 with HTTP; Fri, 4 Apr 2014 08:09:10 -0700 (PDT) Date: Fri, 4 Apr 2014 23:09:10 +0800 Message-ID: Subject: [Bug] XFS: DIO random write + BufferIO read From: Zhi Yong Wu X-ASG-Orig-Subj: [Bug] XFS: DIO random write + BufferIO read To: xfstests Cc: Dave Chinner , jack@suse.cz, "linux-fsdevel@vger.kernel.org" , "Theodore Ts'o" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-yh0-f54.google.com[209.85.213.54] X-Barracuda-Start-Time: 1396624158 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4562 Rule breakdown below pts rule name 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 When i try something on XFS filesytem, i hit one issue as below: One main task create multiple threads at first, Then it will dio random write some files with random offset and length for each thread. When those files get ready, those multiple threads will bufferio read them and check if the data are same as their corresponding buffer. In theory, they should be same, but the actual result isn't what we expect By the way, i did the same try on ext3 filesystem, but didn't get any such issue. Below is the test code: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define AIO_BLKSIZE 4096 #define AIO_MAXIO 64 static long gettid() { return static_cast(pthread_self()); } static void* aioThreadWrapper(void* arg); class DioTest; struct cbParam { cbParam(DioTest* p, int fileseq) :p_(p), fileseq_(fileseq) {} DioTest* p_; int fileseq_; }; class DioTest { public: DioTest(const char* name) { filename = name; memset(&myctx, 0, sizeof(myctx)); io_queue_init(AIO_MAXIO, &myctx); pthread_t tid; pthread_create(&tid, NULL, aioThreadWrapper, this); } void wr_done(int fileseq, struct iocb *iocb, long res, long res2) { close(iocb->aio_fildes); if (res2 != 0) { printf("aio write error n"); abort(); } if (res != iocb->u.c.nbytes) { printf("write missed bytes expect %ld got %ld n", iocb->u.c.nbytes, res); abort(); } size_t length = iocb->u.c.nbytes; size_t offset = iocb->u.c.offset; char path[1024]; snprintf(path, sizeof(path), "%s%d", filename, fileseq); int fd = open(path, O_RDONLY); assert(fd >= 0); char* readbuf = (char*)malloc(length); assert(readbuf); memset(readbuf, 0, length); ssize_t ret = pread(fd, readbuf, length, offset); assert (ret == length); close(fd); int cmp = memcmp(readbuf, iocb->u.c.buf, length); if (cmp != 0) { printf("tid=%ld data dismatch.cmp=%d file=%s offset=%lu length=%lu!\n", gettid(), cmp, path, offset, length); abort(); } printf("tid=%ld check=success file=%s offset=%lu length=%lu\n", gettid(), path, offset, length); free(iocb->u.c.buf); free(iocb); free(readbuf); } bool writeRequest(int fileseq, size_t offset, size_t length) { struct iocb *io = (struct iocb *)malloc(sizeof(struct iocb)); assert (io); char path[1024]; snprintf(path, sizeof(path), "%s%d", filename, fileseq); int fd = open(path, O_RDWR|O_DIRECT|O_CREAT, S_IWUSR | S_IRUSR); assert (fd >= 0); void* buf=NULL; int ret = posix_memalign(&buf, getpagesize(), length); assert(ret == 0); memset(buf, 'a', length); io_prep_pwrite(io, fd, buf, length, offset); io->data = new cbParam(this, fileseq); int rc = io_submit(myctx, 1, &io); if (rc < 0){ printf("tid=%ld io_submit fail.file=%s offset=%lu length=%lu ret=%d errno=%s\n", gettid(), path, offset, length, ret, strerror(errno)); close(fd); free(buf); delete (cbParam*)(io->data); free(io); return false; } assert (rc != 0); printf("tid=%ld file=%s offset=%lu length=%lu\n",gettid(), path, offset, length); return true; } void aioThread() { while (true) { struct io_event events[AIO_MAXIO]; io_callback_t cb; int ret = io_getevents(myctx, 1, AIO_MAXIO, events, NULL); printf("tid=%ld %d io_request completed \n", gettid(), ret); for (int i = 0; i < ret; i++) { struct iocb *io = events[i].obj; printf("tid=%ld events[%d]res = %ld, res2 = %ld\n", gettid(), i, events[i].res, events[i].res2); cbParam* param = (cbParam*)io->data; DioTest* p = param->p_; p->wr_done(param->fileseq_, io, events[i].res, events[i].res2); delete param; } } } private: io_context_t myctx; const char* filename; }; static void* aioThreadWrapper(void* arg) { DioTest* p = (DioTest*)arg; p->aioThread(); return NULL; } int main(int args, char *argv[]) { if (args < 2) { printf("./%s filename", argv[0]); exit(1); } const char* filename = argv[1]; srand(time(NULL)); vector dioTests; const int threadNumber = 9; for (int i = 0; i < threadNumber; ++i) { dioTests.push_back(new DioTest(filename)); } while (true) { size_t offset = (rand() % (64*1024*1024/AIO_BLKSIZE)) * AIO_BLKSIZE; size_t length = 0; while (length == 0) { length = abs(static_cast(rand()*1.0/RAND_MAX*16))*AIO_BLKSIZE; } int seq = rand() % 100; DioTest* p = dioTests[rand() % threadNumber]; for (int i = 0; i < 4; ++i){ p->writeRequest(seq, offset, length); offset += (length + 4096); } usleep(rand() % 10000); } return 0; } -- Regards, Zhi Yong Wu From bfoster@redhat.com Fri Apr 4 10:26:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6428B7FEE for ; Fri, 4 Apr 2014 10:26:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44F7A304062 for ; Fri, 4 Apr 2014 08:26:42 -0700 (PDT) X-ASG-Debug-ID: 1396625200-04cbb054b8a8c780001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bOqpeMU0fE7MZBzg for ; Fri, 04 Apr 2014 08:26: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s34FQcxN028408 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 4 Apr 2014 11:26:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s34FQc2G012575; Fri, 4 Apr 2014 11:26:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EFB121256CC; Fri, 4 Apr 2014 11:26:36 -0400 (EDT) Date: Fri, 4 Apr 2014 11:26:36 -0400 From: Brian Foster To: Dave Chinner Cc: Al@disappointment.disaster, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Message-ID: <20140404152636.GA40629@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <1395396710-3824-3-git-send-email-david@fromorbit.com> <20140329151419.GA33827@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140329151419.GA33827@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396625201 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Mar 29, 2014 at 11:14:19AM -0400, Brian Foster wrote: > On Fri, Mar 21, 2014 at 09:11:46PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > If we fail a write beyond EOF and have to handle it in > > xfs_vm_write_begin(), we truncate the inode back to the current inode > > size. This doesn't take into account the fact that we may have > > already made successful writes to the same page (in the case of block > > size < page size) and hence we can truncate the page cache away from > > blocks with valid data in them. If these blocks are delayed > > allocation blocks, we now have a mismatch between the page cache and > > the extent tree, and this will trigger - at minimum - a delayed > > block count mismatch assert when the inode is evicted from the cache. > > We can also trip over it when block mapping for direct IO - this is > > the most common symptom seen from fsx and fsstress when run from > > xfstests. > > > > Fix it by only truncating away the exact range we are updating state > > for in this write_begin call. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_aops.c | 10 ++++++++-- > > 1 file changed, 8 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > > index e810243..6b4ecc8 100644 > > --- a/fs/xfs/xfs_aops.c > > +++ b/fs/xfs/xfs_aops.c > > @@ -1609,12 +1609,18 @@ xfs_vm_write_begin( > > status = __block_write_begin(page, pos, len, xfs_get_blocks); > > if (unlikely(status)) { > > struct inode *inode = mapping->host; > > + size_t isize = i_size_read(inode); > > > > xfs_vm_write_failed(inode, page, pos, len); > > unlock_page(page); > > > > - if (pos + len > i_size_read(inode)) > > - truncate_pagecache(inode, i_size_read(inode)); > > From what I can see, we have a write_begin/copy/write_end sequence per > page and the inode size is updated down in the write_end path. If the > write fails at write_begin time, then we haven't copied any data and the > inode size hasn't changed. > > The intent of the original code looks like it wants to break off any > blocks that might have been set up beyond EOF before the write happened > to fail. Could you elaborate on how this can kill blocks that might have > been written successfully? Doesn't this only affect post-EOF metadata? > > > + /* > > + * If the write is beyond EOF, we only want to kill blocks > > + * allocated in this write, not blocks that were previously > > + * written successfully. > > + */ > > + if (pos + len > isize) > > + truncate_pagecache_range(inode, pos, pos + len); > > So the cache truncate now covers the range of the write. What happens if > the part of the write is an overwrite? This seems similar to the problem > you've described above... should the truncate start at isize instead? > I ran an experiment on this to confirm my suspicion here. I added a quick little hack to fail any write_begin (set status=-1) for which pos != 0. With that in place: xfs_io -fc "pwrite -b 2k 0 2k" /mnt/file # hexdump /mnt/file 0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd * 0000800 xfs_io -c "pwrite -b 2k 1k 2k" /mnt/file (fails) # hexdump /mnt/file 0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd * 0000400 0000 0000 0000 0000 0000 0000 0000 0000 * 0000800 The failed extending write trashes the data over the previously valid region. Brian > Brian > > > > > page_cache_release(page); > > page = NULL; > > -- > > 1.9.0 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bob.mastors@solidfire.com Fri Apr 4 13:15:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 2A11E7FDA for ; Fri, 4 Apr 2014 13:15:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F3BD8F8054 for ; Fri, 4 Apr 2014 11:15:25 -0700 (PDT) X-ASG-Debug-ID: 1396635323-04cb6c5675c82500001-NocioJ Received: from mail-vc0-f169.google.com (mail-vc0-f169.google.com [209.85.220.169]) by cuda.sgi.com with ESMTP id AisVtTE6qQrJnW6Z (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Apr 2014 11:15:24 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.220.169 Received: by mail-vc0-f169.google.com with SMTP id ik5so3523362vcb.28 for ; Fri, 04 Apr 2014 11:15:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=r8XYTMIq2GPEgkqZx+cYwBzocnVFkXiL2SSOy4Mtd/Q=; b=IzVH74TtlkUg3z0mde6fWnwFPlxiJsXyRLnL37YoUe0e5UyZW+N1hilXU9gz+GeUG/ tGJQaqM+HYFhMQrQOkmsa4hkQDxdHin7JNccmzQO59Fdx5jQcaaw47OKBbGafSSpJPb0 P5cgJQWUySL+nCDcx2lBadrRCHduvYjJ1xZdl/lKXWyuCpmRrTRi4td1oYN9ruMrGRAa xqgKRgCjnZaetQACpD006dC4XBpHxDOWOnO4yic+1VDvPWcwk8VqlU/fToQTbDLlhvDN Zh4LIFtE5lYeAydFi3Iq0i+zbuexUjebQSkJsVeK8/rKAmzzsZzZgK4SUn/3MR6Y23G2 Yvjg== X-Gm-Message-State: ALoCoQk01H3TQulGfiMR2R0ZSp/62vpIgtp3T7VPhr3Srcom2JV49Sf/ftsgVXBqamdyr1roZCJ/ MIME-Version: 1.0 X-Received: by 10.52.166.18 with SMTP id zc18mr356059vdb.65.1396635323248; Fri, 04 Apr 2014 11:15:23 -0700 (PDT) Received: by 10.52.30.52 with HTTP; Fri, 4 Apr 2014 11:15:23 -0700 (PDT) Date: Fri, 4 Apr 2014 12:15:23 -0600 Message-ID: Subject: xfs umount with i/o error hang/memory corruption From: Bob Mastors X-ASG-Orig-Subj: xfs umount with i/o error hang/memory corruption To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c20232530cc004f63b809f X-Barracuda-Connect: mail-vc0-f169.google.com[209.85.220.169] X-Barracuda-Start-Time: 1396635324 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=FRT_VALIUM2, FUZZY_VLIUM, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FRT_VALIUM2 BODY: ReplaceTags: Valium (2) 0.00 FUZZY_VLIUM BODY: Attempt to obfuscate words in spam 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c20232530cc004f63b809f Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Greetings, I am new to xfs and am running into a problem and would appreciate any guidance on how to proceed. After an i/o error from the block device that xfs is using, an umount results in a message like: [ 370.636473] XFS (sdx): Log I/O Error Detected. Shutting down filesystem [ 370.644073] XFS (h =EF=BF=BD=EF=BF=BD=EF=BF=BDh"h =EF= =BF=BD=EF=BF=BD=EF=BF=BDH#h =EF=BF=BD=EF=BF=BD=EF=BF=BDbsg): Please umount the filesystem and rectify the problem(s) Note the garbage on the previous line which suggests memory corruption. About half the time I get the garbled log message. About half the time umount hangs. And then I get this kind of error and the system is unresponsive: Message from syslogd@debian at Apr 4 09:27:40 ... kernel:[ 680.080022] BUG: soft lockup - CPU#2 stuck for 22s! [umount:2849= ] The problem appears to be similar to this issue: http://www.spinics.net/lists/linux-xfs/msg00061.html I can reproduce the problem easily using open-iscsi to create the block device with an iscsi initiator. I use lio to create an iscsi target. The problem is triggered by doing an iscsi logout which causes the block device to return i/o errors to xfs. Steps to reproduce the problem are below. Using VirtualBox, I can reproduce it with two processors but not one. I first saw this on a 3.8 kernel and most recently reproduced it with 3.14+= . Thanks, Bob virtual box setup ----------------- 1 GB ram 8 GB disk 2 processors Operating System: Linux Version: Debian (64 bit) Bridged networking iso: debian-7.4.0-amd64-netinst.iso Software selection select SSH server select Standard system utilities deselect everything else dhcp ip address: 172.17.5.129 upgrade linux to 3.14.0+ ------------------------ ssh 172.17.5.129 su cd /mnt/ksrc/linux make modules_install make install reboot install tools ------------- ssh 172.17.5.129 su apt-get install xfsprogs apt-get install open-iscsi apt-get install --no-install-recommends targetcli python-urwid reboot reproduce bug ------------- ssh 172.17.5.129 su targetcli cd backstores fileio/ create name=3Dfile_backend file_or_dev=3Dmy_disk size=3D100M /iscsi create portals/ create 172.17.5.129 cd < luns/ create /backstores/fileio/file_backend cd < set attribute authentication=3D0 demo_mode_write_protect=3D0 generate_node_acls=3D1 cache_dynamic_acls=3D1 exit iscsiadm -m discovery -t sendtargets -p 172.17.5.129 iscsiadm -m node --login --target iqn.from_previous_iscsiadm_cmd_output fdisk -l mkfs -t xfs -f /dev/sdXX mkdir /mnt/vola mount -t xfs /dev/sdXX /mnt/vola iscsiadm -m node -U all umount /mnt/vola --001a11c20232530cc004f63b809f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Greetings,

I am new to xfs a= nd am running into a problem
and would appreciate any guidance on= how to proceed.

After an i/o error from the block= device that xfs is using,
an umount results in a message like:
[ =C2=A0370.636473] XFS= (sdx): Log I/O Error Detected. =C2=A0Shutting down filesystem
[ = =C2=A0370.644073] XFS (h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =EF=BF=BD=EF=BF= =BD=EF=BF=BDh"h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=EF=BF=BD=EF=BF=BD= =EF=BF=BDH#h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=EF=BF=BD=EF=BF=BD=EF=BF=BDb= sg): Please umount the filesystem and rectify the problem(s)
Note the garbage on the previous line which suggests memory corruption= .
About half the time I get the garbled log message. About half t= he time umount hangs.

And then I get this kind of = error and the system is unresponsive:
Message from syslogd@debian at Apr =C2=A04 09:27:40 ...
=C2= =A0kernel:[ =C2=A0680.080022] BUG: soft lockup - CPU#2 stuck for 22s! [umou= nt:2849]

The problem appears to be similar to this= issue:

I can reproduce the problem easily using open-iscsi to create
the block device with an iscsi initiator.
I use lio to create an = iscsi target.

The problem is triggered by doing an= iscsi logout which causes
the block device to return i/o errors = to xfs.
Steps to reproduce the problem are below.

Usi= ng VirtualBox, I can reproduce it with two processors but not one.
I first saw this on a 3.8 kernel and most recently reproduced it with 3.1= 4+.

Thanks,
Bob

vir= tual box setup
-----------------
1 GB ram
8 G= B disk
2 processors
Operating System: Linux
Version: Debian (64 bit)
Bridged networking
iso: debian= -7.4.0-amd64-netinst.iso
Software selection
=C2=A0 =C2= =A0 select SSH server
=C2=A0 =C2=A0 select Standard system utilit= ies
=C2=A0 =C2=A0 deselect everything else
=C2=A0 =C2=A0=C2=A0
dhcp ip address: 172.17.5.129
=
upgrade linux to 3.14.0+
------------------------<= /div>
ssh 172.17.5.129
su
cd /mnt/ksrc/linux
<= div>make modules_install
make install
reboot

install tools
-------------
ssh 172.17.5.129
su
ap= t-get install xfsprogs
apt-get install open-iscsi
apt-g= et install --no-install-recommends targetcli python-urwid
reboot

reproduce bug
-------------<= /div>
ssh 172.17.5.129
su
targetcli
=C2= =A0 =C2=A0 cd backstores
=C2=A0 =C2=A0 fileio/ create name=3Dfile= _backend file_or_dev=3Dmy_disk size=3D100M
=C2=A0 =C2=A0 /iscsi create
=C2=A0 =C2=A0 portals/ create 17= 2.17.5.129
=C2=A0 =C2=A0 cd <
=C2=A0 =C2=A0 luns/ cr= eate /backstores/fileio/file_backend
=C2=A0 =C2=A0 cd <
<= div>=C2=A0 =C2=A0 set attribute authentication=3D0 demo_mode_write_protect= =3D0 generate_node_acls=3D1 cache_dynamic_acls=3D1
=C2=A0 =C2=A0 exit

iscsiadm -m discovery -t s= endtargets -p 172.17.5.129
iscsiadm -m node --login --target iqn.= from_previous_iscsiadm_cmd_output
fdisk -l
mkfs -t xfs = -f /dev/sdXX
mkdir /mnt/vola
mount -t xfs /dev/sdXX /mnt/vola
i= scsiadm -m node -U all
umount /mnt/vola
--001a11c20232530cc004f63b809f-- From stan@hardwarefreak.com Fri Apr 4 13:50:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 234637FF0 for ; Fri, 4 Apr 2014 13:50:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0D00AC003 for ; Fri, 4 Apr 2014 11:50:51 -0700 (PDT) X-ASG-Debug-ID: 1396637450-04bdf0743ac0590001-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 j0gWP50KiAaVlCxb for ; Fri, 04 Apr 2014 11:50:50 -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 18D106C1AF; Fri, 4 Apr 2014 13:50:50 -0500 (CDT) Message-ID: <533EFF07.6050308@hardwarefreak.com> Date: Fri, 04 Apr 2014 13:50:47 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Bob Mastors , xfs@oss.sgi.com Subject: Re: xfs umount with i/o error hang/memory corruption References: X-ASG-Orig-Subj: Re: xfs umount with i/o error hang/memory corruption In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1396637450 X-Barracuda-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/4/2014 1:15 PM, Bob Mastors wrote: > Greetings, > > I am new to xfs and am running into a problem > and would appreciate any guidance on how to proceed. > > After an i/o error from the block device that xfs is using, > an umount results in a message like: > [ 370.636473] XFS (sdx): Log I/O Error Detected. Shutting down filesystem > [ 370.644073] XFS (h ���h"h ���H#h ���bsg): > Please umount the filesystem and rectify the problem(s) > Note the garbage on the previous line which suggests memory corruption. > About half the time I get the garbled log message. About half the time > umount hangs. > > And then I get this kind of error and the system is unresponsive: > Message from syslogd@debian at Apr 4 09:27:40 ... > kernel:[ 680.080022] BUG: soft lockup - CPU#2 stuck for 22s! [umount:2849] > > The problem appears to be similar to this issue: > http://www.spinics.net/lists/linux-xfs/msg00061.html > > I can reproduce the problem easily using open-iscsi to create > the block device with an iscsi initiator. > I use lio to create an iscsi target. > > The problem is triggered by doing an iscsi logout which causes > the block device to return i/o errors to xfs. > Steps to reproduce the problem are below. This is not a problem but the expected behavior. XFS is designed to do this to prevent filesystem corruption. Logging out of a LUN is no different than pulling the power plug on a direct attached disk drive. Surely you would not do that to a running filesystem. > Using VirtualBox, I can reproduce it with two processors but not one. > I first saw this on a 3.8 kernel and most recently reproduced it with 3.14+. ... The only problem I see here is that XFS should be shutting down every time the disk device disappears. Which means in your test cases where it does not, your VM environment isn't passing the IO errors up the stack, and it should be. Which means your VM environment is broken. Cheers, Stan From bob.mastors@solidfire.com Fri Apr 4 14:47:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 BC2D87FF8 for ; Fri, 4 Apr 2014 14:47:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51700AC012 for ; Fri, 4 Apr 2014 12:47:32 -0700 (PDT) X-ASG-Debug-ID: 1396640849-04bdf05daccb0f60001-NocioJ Received: from mail-vc0-f175.google.com (mail-vc0-f175.google.com [209.85.220.175]) by cuda.sgi.com with ESMTP id esplIrFApjn4o1VQ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Apr 2014 12:47:30 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.220.175 Received: by mail-vc0-f175.google.com with SMTP id lh14so3455567vcb.6 for ; Fri, 04 Apr 2014 12:47:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=4yzdpAfEwdEZjUpNqoo1Hpc8cOZ5g/8GQrOWIxfFhSM=; b=IFH9IfEhP4xNPE86a0S68Qsx7gU+dpil5DJulY3/K/Ojlf/fGwC8Ca4DpCz/HmwyIn xxv2weVmGnHVxkphA5uAoavNnEp6hcJyQvxRHVgANr6pkHRvzT6QPJdcPydU8++ANrW+ L93J87mQcOUSZ0MqgdFJ1cS89Mka12IVUI7ty3jjIaNTkeDTDPbL12ZBhWqd5yc8IW/n Qa+55BbFe2zbY/agvly7FdrJa7QWvYPuFttbjaDUAeyB6vddz4XMdR2kvRb/iBXAH7de XkHo/ZOTuUskx9/n1D+sfxHJsB/4HDwvXbsCxUPgzPADAvBkWZ4YjUKcKT5e4zB/7EIo No9g== X-Gm-Message-State: ALoCoQksa7ZLtPDWyIUSy/c0sml4xUmz6BJk0ORNk2qxrrLeqmVlMFIyJTYYUBLyj9qXazcq3JEw MIME-Version: 1.0 X-Received: by 10.58.207.74 with SMTP id lu10mr6493697vec.15.1396640848940; Fri, 04 Apr 2014 12:47:28 -0700 (PDT) Received: by 10.52.30.52 with HTTP; Fri, 4 Apr 2014 12:47:28 -0700 (PDT) In-Reply-To: <533EFF07.6050308@hardwarefreak.com> References: <533EFF07.6050308@hardwarefreak.com> Date: Fri, 4 Apr 2014 13:47:28 -0600 Message-ID: Subject: Re: xfs umount with i/o error hang/memory corruption From: Bob Mastors X-ASG-Orig-Subj: Re: xfs umount with i/o error hang/memory corruption To: stan@hardwarefreak.com Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b6783ceae22de04f63cc9de X-Barracuda-Connect: mail-vc0-f175.google.com[209.85.220.175] X-Barracuda-Start-Time: 1396640849 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4571 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 --047d7b6783ceae22de04f63cc9de Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 4, 2014 at 12:50 PM, Stan Hoeppner wrot= e: > On 4/4/2014 1:15 PM, Bob Mastors wrote: > > Greetings, > > > > I am new to xfs and am running into a problem > > and would appreciate any guidance on how to proceed. > > > > After an i/o error from the block device that xfs is using, > > an umount results in a message like: > > [ 370.636473] XFS (sdx): Log I/O Error Detected. Shutting down > filesystem > > [ 370.644073] XFS (h =EF=BF=BD=EF=BF=BD=EF=BF=BDh"h = =EF=BF=BD=EF=BF=BD=EF=BF=BDH#h =EF=BF=BD=EF=BF=BD=EF=BF=BDbsg): > > Please umount the filesystem and rectify the problem(s) > > Note the garbage on the previous line which suggests memory corruption. > > About half the time I get the garbled log message. About half the time > > umount hangs. > > > > And then I get this kind of error and the system is unresponsive: > > Message from syslogd@debian at Apr 4 09:27:40 ... > > kernel:[ 680.080022] BUG: soft lockup - CPU#2 stuck for 22s! > [umount:2849] > > > > The problem appears to be similar to this issue: > > http://www.spinics.net/lists/linux-xfs/msg00061.html > > > > I can reproduce the problem easily using open-iscsi to create > > the block device with an iscsi initiator. > > I use lio to create an iscsi target. > > > > The problem is triggered by doing an iscsi logout which causes > > the block device to return i/o errors to xfs. > > Steps to reproduce the problem are below. > > This is not a problem but the expected behavior. XFS is designed to do > this to prevent filesystem corruption. Logging out of a LUN is no > different than pulling the power plug on a direct attached disk drive. > Surely you would not do that to a running filesystem. > Sorry, I don't think I was clear on the nature of the problem and it's wide ranging effects. Using iscsi to access block storage on another server is the goal. A failure on the other server is possible which could result in the iscsi initiator returning i/o errors to xfs. The behavior that I would like from xfs is to put the filesystem in some kind of offline state on an i/o error from the block device. Today xfs usually has this desirable behavior. But there is a corner case were instead xfs hangs the entire server, forcing a hard reboot. On a large file server with many filesystems using iscsi to talk to block storage on multiple block servers, I would like the failure of a single block server to only impact the filesystems that are dependent on the block server, and to not impact the other filesystems. Bob > Using VirtualBox, I can reproduce it with two processors but not one. > > I first saw this on a 3.8 kernel and most recently reproduced it with > 3.14+. > ... > > The only problem I see here is that XFS should be shutting down every > time the disk device disappears. Which means in your test cases where > it does not, your VM environment isn't passing the IO errors up the > stack, and it should be. Which means your VM environment is broken. > > Cheers, > > Stan > > > --047d7b6783ceae22de04f63cc9de Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On F= ri, Apr 4, 2014 at 12:50 PM, Stan Hoeppner <stan@hardwarefreak.com> wrote:
This is not a problem but the expected behavior. =C2=A0XFS is designe= d to do
this to prevent filesystem corruption. =C2=A0Logging out of a LUN is no
different than pulling the power plug on a direct attached disk drive.
Surely you would not do that to a running filesystem.
= Sorry, I don't think I was clear on the nature of the problem and it= 9;s wide ranging effects.
Using iscsi to access block storage on = another server is the goal.
A failure on the other server is possible which could result in the is= csi initiator returning i/o errors to xfs.

The beh= avior that I would like from xfs is to put the filesystem in some kind of o= ffline state
on an i/o error from the block device. Today xfs usually has this desi= rable behavior.
But there is a corner case were instead xfs hangs= the entire server, forcing a hard reboot.

On a la= rge file server with many filesystems using iscsi to talk to block storage = on multiple
block servers, I would like the failure of a single block server to on= ly impact the filesystems
that are dependent on the block server,= and to not impact the other filesystems.

Bob

> Using VirtualBox, I can reproduce it with two processors but not one.<= br> > I first saw this on a 3.8 kernel and most recently reproduced it with = 3.14+.
...

The only problem I see here is that XFS should be shutting down every
time the disk device disappears. =C2=A0Which means in your test cases where=
it does not, your VM environment isn't passing the IO errors up the
stack, and it should be. =C2=A0Which means your VM environment is broken.
Cheers,

Stan



--047d7b6783ceae22de04f63cc9de-- From stan@hardwarefreak.com Fri Apr 4 15:24:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 430307FF5 for ; Fri, 4 Apr 2014 15:24:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33BB0304064 for ; Fri, 4 Apr 2014 13:24:15 -0700 (PDT) X-ASG-Debug-ID: 1396643054-04cbb054b8a973d0001-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 4DC4MBBGOdIswrKh for ; Fri, 04 Apr 2014 13:24:14 -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 338A96C184; Fri, 4 Apr 2014 15:24:14 -0500 (CDT) Message-ID: <533F14EC.6040705@hardwarefreak.com> Date: Fri, 04 Apr 2014 15:24:12 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: daiguochao , xfs@oss.sgi.com Subject: Re: 10GB memorys occupied by XFS References: <1396596386220-35015.post@n7.nabble.com> X-ASG-Orig-Subj: Re: 10GB memorys occupied by XFS In-Reply-To: <1396596386220-35015.post@n7.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1396643054 X-Barracuda-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/4/2014 2:26 AM, daiguochao wrote: > Hello folks, Hello, Note that your problems are not XFS specific, but can occur with any Linux filesystem. > I used xfs file system in kernel-2.6.32-220.13.1.el6.x86_64 for store > pictures. About 100 days system memorys is lost and some nginx process is > killed by oom-killer.So,I looked /proc/meminfo and find memorys is > lost.Finally, I try to umount xfs system and 10GB memorys is coming back. l > look xfs bugzilla no such BUG.I have no idea for it. > > Cheers, > > Guochao. > > some memorys info: > > 0> free -m > total used free shared buffers cached > Mem: 11887 11668 219 0 0 2 > -/+ buffers/cache: 11665 222 > Swap: 0 0 0 First problem: no swap Second problem: cache is not being reclaimed Read vfs_cache_pressure at: https://www.kernel.org/doc/Documentation/sysctl/vm.txt You've likely set this value to zero. Changing it to 200 should prompt the kernel to reclaim dentries and inodes aggressively, preventing the oom-killer from kicking in. Cheers, Stan From bfoster@redhat.com Fri Apr 4 15:36:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CDC6E7FFE for ; Fri, 4 Apr 2014 15:36:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B010B8F8066 for ; Fri, 4 Apr 2014 13:36:05 -0700 (PDT) X-ASG-Debug-ID: 1396643764-04cbb054b8a97880001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id x0pOHWEGmc682kTW for ; Fri, 04 Apr 2014 13:36:04 -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 s34KZSYV017629 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 4 Apr 2014 16:35:28 -0400 Received: from laptop.bfoster (vpn-63-111.rdu2.redhat.com [10.10.63.111]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s34KZQpt010916; Fri, 4 Apr 2014 16:35:27 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 77696120ADC; Fri, 4 Apr 2014 16:35:26 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s34KZNt0016480; Fri, 4 Apr 2014 16:35:23 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 4 Apr 2014 16:35:22 -0400 From: Brian Foster To: Namjae Jeon Cc: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com, Namjae Jeon , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Ashish Sangwan , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: [PATCH 2/3] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140404203521.GA15122@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <1396277668-10861-1-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396277668-10861-1-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396643764 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Mar 31, 2014 at 11:54:28PM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > 1) Make sure that both offset and len are block size aligned. > 2) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 3) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > 4) Allocate unwritten extents for the hole created in step 3. > 5) Update the i_size of inode by len bytes. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > --- > fs/xfs/xfs_bmap.c | 371 ++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_bmap.h | 9 +- > fs/xfs/xfs_bmap_util.c | 123 +++++++++++++++- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 17 ++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 518 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 5b6092e..66635a5 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -5389,7 +5389,7 @@ error0: > * into, this will be considered invalid operation and we abort immediately. > */ > int > -xfs_bmap_shift_extents( > +xfs_bmap_shift_extents_left( > struct xfs_trans *tp, > struct xfs_inode *ip, > int *done, > @@ -5418,7 +5418,7 @@ xfs_bmap_shift_extents( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > - XFS_ERROR_REPORT("xfs_bmap_shift_extents", > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", > XFS_ERRLEVEL_LOW, mp); > return XFS_ERROR(EFSCORRUPTED); > } > @@ -5571,3 +5571,370 @@ del_cursor: > > return error; > } > + > +/* > + * Splits an extent into two extents at split_fsb block that it is > + * the first block of the current_ext. @current_ext is a target extent > + * to be splitted. @split_fsb is a block where the extents is spliited. > + * If split_fsb lies in a hole or the first block of extents, just return 0. > + */ > +STATIC int > +xfs_bmap_split_extent_at( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *current_ext, > + xfs_fsblock_t *firstfsb, > + struct xfs_bmap_free *free_list) > +{ > + int whichfork = XFS_DATA_FORK; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec new; /* splitted extent */ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_ifork *ifp; > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > + int error = 0; > + int logflags; > + int i = 0; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + ifp = XFS_IFORK_PTR(ip, whichfork); > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + /* Read in all the extents */ > + error = xfs_iread_extents(tp, ip, whichfork); > + if (error) > + return error; > + } > + > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); > + /* > + * gotp can be null in 2 cases: 1) if there are no extents > + * or 2) split_fsb lies in a hole beyond which there are > + * no extents. Either way, we are done. > + */ > + if (!gotp) > + return 0; > + > + xfs_bmbt_get_all(gotp, &got); > + > + /* > + * Check split_fsb lies in a hole or the start boundary offset > + * of the extent. > + */ > + if (got.br_startoff >= split_fsb) > + return 0; > + > + gotblkcnt = split_fsb - got.br_startoff; > + new.br_startoff = split_fsb; > + new.br_startblock = got.br_startblock + gotblkcnt; > + new.br_blockcount = got.br_blockcount - gotblkcnt; > + new.br_state = got.br_state; > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstfsb; > + cur->bc_private.b.flist = free_list; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_bmbt_set_blockcount(gotp, gotblkcnt); > + got.br_blockcount = gotblkcnt; > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + /* Add new extent */ > + (*current_ext)++; > + xfs_iext_insert(ip, *current_ext, 1, &new, 0); > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, > + new.br_startblock, new.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); > + cur->bc_rec.b.br_state = new.br_state; > + > + error = xfs_btree_insert(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + /* > + * Convert to a btree if necessary. > + */ > + if (xfs_bmap_needs_btree(ip, whichfork)) { > + int tmp_logflags; /* partial log flag return val */ > + ASSERT(cur == NULL); > + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, > + &cur, 0, &tmp_logflags, whichfork); > + logflags |= tmp_logflags; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > + > +int > +xfs_bmap_split_extent( > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *split_ext) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t firstfsb; > + int committed; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + tp->t_flags |= XFS_TRANS_RESERVE; Any reason this (or the other cases) has to be reserve enabled? > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + > + /* > + * check for running out of space > + */ > + if (error) { > + /* > + * Free the transaction structure. > + */ > + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > + xfs_trans_cancel(tp, 0); > + return error; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; We should probably have an xfs_qm_dqattach() call before we get here. As it is, it looks like the first one is in xfs_alloc_file_space(). > + > + xfs_trans_ijoin(tp, ip, 0); > + xfs_bmap_init(&free_list, &firstfsb); > + > + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, > + &firstfsb, &free_list); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + > + return error; > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > + * Shift extent records to the right to make a hole. > + * The maximum number of extents to be shifted in a single operation > + * is @num_exts, and @current_ext keeps track of the current extent > + * index we have shifted. @offset_shift_fsb is the length by which each > + * extent is shifted. @end_ext is the last extent to be shifted. > + */ > +int > +xfs_bmap_shift_extents_right( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + int *done, > + xfs_fileoff_t offset_shift_fsb, > + xfs_extnum_t *current_ext, > + xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, > + struct xfs_bmap_free *flist, > + int num_exts) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec right; > + xfs_ifork_t *ifp; > + xfs_fileoff_t startoff; > + xfs_filblks_t blockcount = 0; > + int error = 0; > + int i; > + int whichfork = XFS_DATA_FORK; > + int logflags; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + ifp = XFS_IFORK_PTR(ip, whichfork); > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstblock; > + cur->bc_private.b.flist = flist; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + /* start shifting extents to right */ > + while (num_exts-- > 0) { > + if (*current_ext < end_ext) { > + *done = 1; > + break; > + } > + > + gotp = xfs_iext_get_ext(ifp, *current_ext); > + xfs_bmbt_get_all(gotp, &got); > + startoff = got.br_startoff + offset_shift_fsb; > + > + /* > + * Before shifting extent into hole, make sure that the hole > + * is large enough to accomodate the shift. This checking has > + * to be performed for all except the last extent. > + */ > + if ((XFS_IFORK_NEXTENTS(ip, whichfork) - 1) != *current_ext) { > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, > + *current_ext + 1), &right); > + if (startoff + got.br_blockcount > right.br_startoff) { > + error = XFS_ERROR(EINVAL); > + if (error) > + goto del_cursor; > + } > + } > + > + /* Check if we can merge 2 adjacent extents */ > + if ((XFS_IFORK_NEXTENTS(ip, whichfork) - 1) != *current_ext && > + right.br_startoff == startoff + got.br_blockcount && > + right.br_startblock == > + got.br_startblock + got.br_blockcount && > + right.br_state == got.br_state && > + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { > + blockcount = right.br_blockcount + got.br_blockcount; > + > + /* Make cursor point to the extent we will update */ > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, > + right.br_startoff, > + right.br_startblock, > + right.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_iext_remove(ip, *current_ext + 1, 1, 0); > + if (cur) { > + error = xfs_btree_delete(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > + > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + if (got.br_blockcount < blockcount) { > + xfs_bmbt_set_blockcount(gotp, blockcount); > + got.br_blockcount = blockcount; > + } A comment would be nice here for this bit that fixes up the blockcount in the extent merge case. You also probably want to reset blockcount. ;) > + > + > + xfs_bmbt_set_startoff(gotp, startoff); > + got.br_startoff = startoff; > + > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + (*current_ext)--; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index f84bd7a..91ca1a7 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, > int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, > xfs_extnum_t num); > uint xfs_default_attroffset(struct xfs_inode *ip); > -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, > +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, > int *done, xfs_fileoff_t start_fsb, > xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, > xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > int num_exts); > +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, > + xfs_extnum_t *split_ext); > +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, > + int *done, xfs_fsblock_t offset_shift_fsb, > + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > + int num_exts); > > #endif /* __XFS_BMAP_H__ */ > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 01f6a64..8b10d6d 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1539,7 +1539,7 @@ xfs_collapse_file_space( > * We are using the write transaction in which max 2 bmbt > * updates are allowed > */ > - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, > + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, > shift_fsb, ¤t_ext, > &first_block, &free_list, > XFS_BMAP_MAX_SHIFT_EXTENTS); > @@ -1563,6 +1563,127 @@ out: > } > > /* > + * xfs_insert_file_space() > + * This routine allocate disk space and shift extent for the given file. > + * The first thing we do is to sync dirty data and invalidate page cache > + * over the region on which insert range is working. And split an extent > + * to two extents at given offset by calling xfs_bmap_split_extent. > + * And shift all extent records which are laying between [offset, > + * last allocated extent] to the right to reserve hole range. Lastly > + * allocate an unwritten extent in hole range created by shifting extents. > + * > + * RETURNS: > + * 0 on success > + * errno on error > + * > + */ > +int > +xfs_insert_file_space( > + struct xfs_inode *ip, > + loff_t offset, > + loff_t len) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t first_block; > + int done = 0; > + int committed; > + int error; > + uint rounding; > + xfs_fileoff_t start_fsb; > + xfs_fileoff_t shift_fsb; > + xfs_extnum_t split_ext; > + xfs_extnum_t current_ext = 0; > + xfs_off_t ioffset; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + trace_xfs_insert_file_space(ip); > + > + /* wait for the completion of any pending DIOs */ > + inode_dio_wait(VFS_I(ip)); > + > + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); > + ioffset = offset & ~(rounding - 1); > + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > + ioffset, -1); > + if (error) > + return error; > + truncate_pagecache_range(VFS_I(ip), ioffset, -1); > + > + start_fsb = XFS_B_TO_FSB(mp, offset); > + shift_fsb = XFS_B_TO_FSB(mp, len); > + > + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); > + if (error) > + return error; > + > + current_ext = XFS_IFORK_NEXTENTS(ip, XFS_DATA_FORK) - 1; > + while (!error && !done) { > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + tp->t_flags |= XFS_TRANS_RESERVE; > + /* > + * We would need to reserve permanent block for transaction. > + * This will come into picture when after shifting extent into > + * hole we found that adjacent extents can be merged which > + * may lead to freeing of a block during record update. > + */ > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + if (error) { > + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > + xfs_trans_cancel(tp, 0); > + break; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + > + xfs_bmap_init(&free_list, &first_block); > + > + /* > + * We are using the write transaction in which max 2 bmbt > + * updates are allowed > + */ > + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, > + ¤t_ext, split_ext, > + &first_block, &free_list, > + XFS_BMAP_MAX_SHIFT_EXTENTS); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + if (error) > + goto out; > + } > + > + /* make unwritten extent in a hole range. */ > + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); There is potential for this to fail with ENOSPC or due to quota after we've already inserted the address range in the file and moved the extent over. Are we Ok with that behavior? Even if so, what is the caller left with? Even though I think it would be nicer if we were to fail in that scenario sooner, I could understand if we completed the extent shift and just left a hole in the inserted region. As it is, it looks like the caller will skip updating the file size and thus some file data might fall after EOF, which is probably not what we want. I don't know if it's worth worrying about the same thing if we happen to fail earlier in the middle of shifting extents over..? Brian > + > +out: > + return error; > + > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > * We need to check that the format of the data fork in the temporary inode is > * valid for the target inode before doing the swap. This is not a problem with > * attr1 because of the fixed fork offset, but attr2 has a dynamically sized > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index 935ed2b..d62ab4b 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, > xfs_off_t len); > int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, > xfs_off_t len); > +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, > + xfs_off_t len); > > /* EOF block manipulation functions */ > bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 003c005..6603b36 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -824,7 +824,8 @@ xfs_file_fallocate( > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > @@ -846,6 +847,20 @@ xfs_file_fallocate( > error = xfs_collapse_file_space(ip, offset, len); > if (error) > goto out_unlock; > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > + > + if (offset & blksize_mask || len & blksize_mask) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + ASSERT(offset < i_size_read(inode)); > + new_size = i_size_read(inode) + len; > + > + error = xfs_insert_file_space(ip, offset, len); > + if (error) > + goto out_unlock; > } else { > if (!(mode & FALLOC_FL_KEEP_SIZE) && > offset + len > i_size_read(inode)) { > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index a4ae41c..c870288 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -604,6 +604,7 @@ DEFINE_INODE_EVENT(xfs_inactive_symlink); > DEFINE_INODE_EVENT(xfs_alloc_file_space); > DEFINE_INODE_EVENT(xfs_free_file_space); > DEFINE_INODE_EVENT(xfs_collapse_file_space); > +DEFINE_INODE_EVENT(xfs_insert_file_space); > DEFINE_INODE_EVENT(xfs_readdir); > #ifdef CONFIG_XFS_POSIX_ACL > DEFINE_INODE_EVENT(xfs_get_acl); > -- > 1.7.11-rc0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Fri Apr 4 16:12:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 17FF77FB8 for ; Fri, 4 Apr 2014 16:12:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0863C304062 for ; Fri, 4 Apr 2014 14:12:41 -0700 (PDT) X-ASG-Debug-ID: 1396645959-04cbb054b9a986f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8iBCHPl8ZFhZtzMO for ; Fri, 04 Apr 2014 14:12: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: Ak0HAKkfP1N5LEcv/2dsb2JhbABZgwY7gw+oIAiZLoEjF3SCJQEBAQQ6HCMQCAMYCSUPBSUDIROHeNBCFo5bB4Q4BJhakkCDRCk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2014 07:42:38 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WWBPV-00063S-4O; Sat, 05 Apr 2014 08:12:25 +1100 Date: Sat, 5 Apr 2014 08:12:25 +1100 From: Dave Chinner To: Filipe David Manana Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , linux-ext4@vger.kernel.org, lczerner@redhat.com Subject: Re: [ANNOUNCE] xfstests: updated to cf1ed54 Message-ID: <20140404211224.GX17603@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: updated to cf1ed54 References: <20140404090357.GW17603@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: 1396645959 X-Barracuda-URL: http://192.48.176.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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) On Fri, Apr 04, 2014 at 02:07:16PM +0100, Filipe David Manana wrote: > On Fri, Apr 4, 2014 at 10:03 AM, Dave Chinner wrote: > > Hi folks, > > > > The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has > > just been updated. Patches often get missed, so please check if your > > outstanding patches were in this update. If they have not been in > > this update, please resubmit them to xfs@oss.sgi.com so they can be > > picked up in the next update. > > > > The new head of the master branch is commit: > > > > cf1ed54 check: fix RESULT_BASE typo in check script > > > > The major new functionality worth mentioning in this update is the > > new config file format from Lukas. The existing format config files > > should continue to work without change, but the new format is much > > richer and allows specification of multiple different configurations > > to run test under. Hence testing multiple mount an dmkfs > > configurations becomes as simple as iterating the configurations > > in the config file. > > Hi, > > I might be missing something, but after checking out these changes, I > am no longer able to run btrfs tests. Example: > > $ ./check btrfs/041 > common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set > Passed all 0 tests > > $ cat local.config > export TEST_DEV=/dev/sdb > export TEST_DIR=/home/fdmanana/btrfs-tests/dev > export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" > export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" OK, that'll be a bug in the new config file parsing code. Lukas, can you have a look at this? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 4 16:20:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A1E517F78 for ; Fri, 4 Apr 2014 16:20:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1CAC8AC003 for ; Fri, 4 Apr 2014 14:20:31 -0700 (PDT) X-ASG-Debug-ID: 1396646429-04cbb054b6a98b10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id rhSLx9pIsC6MVEs4 for ; Fri, 04 Apr 2014 14:20:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlIHAOAgP1N5LEcv/2dsb2JhbABZgwY7gw9Sp04IkXeHN4EjF3SCJQEBAQMBAQIgDwEjIwULCAECGAICBSECAg8FFBEDIROHcQcOkTecGKJiFoETjGYRAVAHgm+BSQSWBIJWkkCDRCmBNQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2014 07:50:28 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WWBX6-00064j-4f; Sat, 05 Apr 2014 08:20:16 +1100 Date: Sat, 5 Apr 2014 08:20:16 +1100 From: Dave Chinner To: Bob Mastors Cc: xfs@oss.sgi.com Subject: Re: xfs umount with i/o error hang/memory corruption Message-ID: <20140404212016.GY17603@dastard> X-ASG-Orig-Subj: Re: xfs umount with i/o error hang/memory corruption References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396646429 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4574 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 04, 2014 at 12:15:23PM -0600, Bob Mastors wrote: > Greetings, > > I am new to xfs and am running into a problem > and would appreciate any guidance on how to proceed. > > After an i/o error from the block device that xfs is using, > an umount results in a message like: > [ 370.636473] XFS (sdx): Log I/O Error Detected. Shutting down filesystem > [ 370.644073] XFS (h ���h"h ���H#h ���bsg): > Please umount the filesystem and rectify the problem(s) > Note the garbage on the previous line which suggests memory corruption. > About half the time I get the garbled log message. About half the time > umount hangs. I got an email about this last night with a different trigger - thin provisioning failing log IO in the unmount path. I know what the problem is, I just don't have a fix for it yet. To confirm it's the same problem, can you post the entirity of the dmesg where the error occurs? In essence, the log IO failure is triggering a shutdown, and as part of the shutdown process it wakes anyone waiting on a log force. The log quiesce code that waits for log completion during unmount uses a log force to ensure the log is idle before tearing down all the log structures and finishing the unmount. Unfortunatey, the log force the unmount blocks on is woken prematurely by the shutdown, and hence it runs before the log IO processing is completed. Hence the use after free. > And then I get this kind of error and the system is unresponsive: > Message from syslogd@debian at Apr 4 09:27:40 ... > kernel:[ 680.080022] BUG: soft lockup - CPU#2 stuck for 22s! [umount:2849] > > The problem appears to be similar to this issue: > http://www.spinics.net/lists/linux-xfs/msg00061.html Similar symptoms, but not the same bug. > The problem is triggered by doing an iscsi logout which causes > the block device to return i/o errors to xfs. > Steps to reproduce the problem are below. Seems similar to the thinp ENOSPC issue I mentioned above - data IO errors occur, then you do an unmount, which causes a log IO error writing the superblock, and then this happens.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 4 16:26:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C24D48007 for ; Fri, 4 Apr 2014 16:26:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88D868F8035 for ; Fri, 4 Apr 2014 14:26:56 -0700 (PDT) X-ASG-Debug-ID: 1396646813-04bdf05dabcb46b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id uizSvD7GGsgf8mA1 for ; Fri, 04 Apr 2014 14:26:54 -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: AnAGAC4jP1N5LEcv/2dsb2JhbABZgwaDSsFWgSMXdIIlAQEBBCcTHCMQCAMOBwMJDBkPBSUDIROHeNApFxaOWwcKhC4EmFqSQINEKQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2014 07:56:52 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WWBdI-00065V-At; Sat, 05 Apr 2014 08:26:40 +1100 Date: Sat, 5 Apr 2014 08:26:40 +1100 From: Dave Chinner To: Brian Foster Cc: Al@disappointment.disaster, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Message-ID: <20140404212640.GZ17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <1395396710-3824-3-git-send-email-david@fromorbit.com> <20140329151419.GA33827@bfoster.bfoster> <20140404152636.GA40629@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140404152636.GA40629@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396646813 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4574 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 04, 2014 at 11:26:36AM -0400, Brian Foster wrote: > On Sat, Mar 29, 2014 at 11:14:19AM -0400, Brian Foster wrote: > > On Fri, Mar 21, 2014 at 09:11:46PM +1100, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > If we fail a write beyond EOF and have to handle it in > > > xfs_vm_write_begin(), we truncate the inode back to the current inode > > > size. This doesn't take into account the fact that we may have > > > already made successful writes to the same page (in the case of block > > > size < page size) and hence we can truncate the page cache away from > > > blocks with valid data in them. If these blocks are delayed > > > allocation blocks, we now have a mismatch between the page cache and > > > the extent tree, and this will trigger - at minimum - a delayed > > > block count mismatch assert when the inode is evicted from the cache. > > > We can also trip over it when block mapping for direct IO - this is > > > the most common symptom seen from fsx and fsstress when run from > > > xfstests. > > > > > > Fix it by only truncating away the exact range we are updating state > > > for in this write_begin call. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > fs/xfs/xfs_aops.c | 10 ++++++++-- > > > 1 file changed, 8 insertions(+), 2 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > > > index e810243..6b4ecc8 100644 > > > --- a/fs/xfs/xfs_aops.c > > > +++ b/fs/xfs/xfs_aops.c > > > @@ -1609,12 +1609,18 @@ xfs_vm_write_begin( > > > status = __block_write_begin(page, pos, len, xfs_get_blocks); > > > if (unlikely(status)) { > > > struct inode *inode = mapping->host; > > > + size_t isize = i_size_read(inode); > > > > > > xfs_vm_write_failed(inode, page, pos, len); > > > unlock_page(page); > > > > > > - if (pos + len > i_size_read(inode)) > > > - truncate_pagecache(inode, i_size_read(inode)); > > > > From what I can see, we have a write_begin/copy/write_end sequence per > > page and the inode size is updated down in the write_end path. If the > > write fails at write_begin time, then we haven't copied any data and the > > inode size hasn't changed. > > > > The intent of the original code looks like it wants to break off any > > blocks that might have been set up beyond EOF before the write happened > > to fail. Could you elaborate on how this can kill blocks that might have > > been written successfully? Doesn't this only affect post-EOF metadata? > > > > > + /* > > > + * If the write is beyond EOF, we only want to kill blocks > > > + * allocated in this write, not blocks that were previously > > > + * written successfully. > > > + */ > > > + if (pos + len > isize) > > > + truncate_pagecache_range(inode, pos, pos + len); > > > > So the cache truncate now covers the range of the write. What happens if > > the part of the write is an overwrite? This seems similar to the problem > > you've described above... should the truncate start at isize instead? > > > > I ran an experiment on this to confirm my suspicion here. I added a > quick little hack to fail any write_begin (set status=-1) for which pos > != 0. With that in place: > > xfs_io -fc "pwrite -b 2k 0 2k" /mnt/file > > # hexdump /mnt/file > 0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd > * > 0000800 > > xfs_io -c "pwrite -b 2k 1k 2k" /mnt/file > (fails) > > # hexdump /mnt/file > 0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd > * > 0000400 0000 0000 0000 0000 0000 0000 0000 0000 > * > 0000800 > > The failed extending write trashes the data over the previously valid > region. Good catch, Brian! That is indeed a problem with the fix I made. Not intentional, as the comment probably lead you to beleive. I did say I wasn't entirely sure all the fixes were correct, and I greatly appreciate your diligence here. The fix should probably be: /* * If the write is beyond EOF, we only want to kill blocks * allocated in this write, not blocks that were previously * written successfully. */ if (pos + len > isize) { ssize_t start = max_t(ssize_t, pos, isize); truncate_pagecache_range(inode, start, pos + len); } So if the write overlaps EOF we don't truncate away data from before EOF. It also has the effect of not truncating data in previous writes between isize and pos, which was the bug I was trying to fix... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 4 16:32:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A99F8014 for ; Fri, 4 Apr 2014 16:32:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52C55304066 for ; Fri, 4 Apr 2014 14:32:25 -0700 (PDT) X-ASG-Debug-ID: 1396647142-04cbb054b6a99020001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id E8asEmFqnYPgnxov for ; Fri, 04 Apr 2014 14:32:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnAGAHIkP1N5LEcv/2dsb2JhbABZgwaDSsFWgSMXdIIlAQEBAwEnExwjBQsIAw4HAwkMGQ8FJQMhE4dxB9AnFxaODk0HCoMagRQEjH6LXIdPinGDRCmBLQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2014 08:02:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WWBiK-00066H-Mz; Sat, 05 Apr 2014 08:31:52 +1100 Date: Sat, 5 Apr 2014 08:31:52 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, Al@disappointment.disaster Subject: Re: [PATCH 5/6] xfs: splitting delalloc extents can run out of reservation Message-ID: <20140404213152.GA17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: splitting delalloc extents can run out of reservation References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <1395396710-3824-6-git-send-email-david@fromorbit.com> <20140404133700.GA12961@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140404133700.GA12961@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396647142 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4574 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 04, 2014 at 09:37:01AM -0400, Brian Foster wrote: > On Fri, Mar 21, 2014 at 09:11:49PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > When we punch a hole in a delalloc extent, we split the indirect > > block reservation between the two new extents. If we repeatedly > > punch holes in a large delalloc extent, that reservation will > > eventually run out and we'll assert fail in xfs_bunmapi() because > > the indirect block reservation for the delalloc extent is zero. This > > is caused by doing a large delalloc write, then zeroing multiple > > ranges of that write using fallocate to punch lots of holes in the > > delayed allocation range. > > > > To avoid this problem, if we split the reservation and require more > > indirect blocks for the two new extents than we had for the old > > reservation, steal the additional blocks from the hole we punched in > > the extent. In most cases we only need a single extra block, so even > > if we punch only single block holes we can still retain sufficient > > indirect block reservations to avoid problems. > > > > In doing this "stealing", we need to change where we account for the > > delalloc blocks being freed. The block count held on the inode does > > not take into account the indirect block reservation, so we still > > need to do that before we free the extent. However, the accounting > > ofr free space in the superblock need to be done after we've stolen > > the blocks fro the freed extent so that they are accounted for > > correctly. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_bmap.c | 65 ++++++++++++++++++++++++++++++++++++++++--------------- > > 1 file changed, 47 insertions(+), 18 deletions(-) > > > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > > index 5b6092e..4bf6a0e 100644 > > --- a/fs/xfs/xfs_bmap.c > > +++ b/fs/xfs/xfs_bmap.c > > @@ -4945,7 +4945,27 @@ xfs_bmap_del_extent( > > temp2 = xfs_bmap_worst_indlen(ip, temp2); > > new.br_startblock = nullstartblock((int)temp2); > > da_new = temp + temp2; > > + > > + /* > > + * Note: if we have an odd number of blocks reserved, > > + * then if we keep splitting the delalloc extent like > > + * this we end up with a delalloc indlen reservation of > > + * zero for one of the two extents. Hence if we end > > + * up with the new indlen reservations being larger than > > + * the old one, steal blocks from the data reservation > > + * we just punched out. Otherwise, just reduce the > > + * remaining indlen reservations alternately and hope > > + * next time we come here the range getting removed is > > + * large enough to fix this all up. > > + */ > > while (da_new > da_old) { > > + if (del->br_blockcount) { > > + /* steal a block */ > > + da_new--; > > + del->br_blockcount--; > > + continue; > > + } > > + > > if (temp) { > > temp--; > > da_new--; > > @@ -5255,24 +5275,6 @@ xfs_bunmapi( > > } > > if (wasdel) { > > ASSERT(startblockval(del.br_startblock) > 0); > > - /* Update realtime/data freespace, unreserve quota */ > > - if (isrt) { > > - xfs_filblks_t rtexts; > > - > > - rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); > > - do_div(rtexts, mp->m_sb.sb_rextsize); > > - xfs_mod_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 -= del.br_blockcount; > > if (cur) > > cur->bc_private.b.flags |= > > @@ -5302,6 +5304,33 @@ xfs_bunmapi( > > } > > error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, > > &tmp_logflags, whichfork); > > + /* > > + * xfs_bmap_del_extent may hand delayed alloc blocks back to the > > + * indirect block reservations to keep extent split reservations > > + * sane. Hence we should only decrement the delayed block count > > + * on the inode once we know exactly the amount of delalloc > > + * space we actually removed from the inode. > > + */ > > + if (wasdel && del.br_blockcount) { > > + /* Update realtime/data freespace, unreserve quota */ > > + if (isrt) { > > + xfs_filblks_t rtexts; > > + > > + rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); > > + do_div(rtexts, mp->m_sb.sb_rextsize); > > + xfs_mod_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); > > + } > > + } > > In xfs_bmapi_reserve_delalloc(), we account alen against the quota, > calculate indlen, account both against the sb counters, add alen to > i_delayed_blks and continue on... *nod* > In xfs_bunmap(), we remove br_blockcount from the sb counters and > unreserve from the quota then call into xfs_bmap_del_extent(). The > latter takes care of removing the indlen blocks from the sb counters if > necessary. *nod* > With these changes, we move the accounting after the del_extent() call > and allow the latter to steal from br_blockcount for indlen. This seems > like it works for the sb counters. *nod* > We also adjust i_delayed_blks against > the original extent length before it can be modified. The quota > reservation looks like it could become inconsistent, however. E.g., some > blocks previously accounted against the quota (alen) are now moved over > to indlen. Yes, you are right - it will cause inconsistency. That's a lesser evil than not having a reservation at all, but I can probably fix that up. > If those indlen blocks happen to be cleaned up through > del_extent(), they'd only be replenished to the sb counters (near the > end of del_extent()). Perhaps we should leave the quota unreserve prior > to the del_extent() call or sample the original br_blockcount and use it > post del_extent()..? That's a possibility. I really only looked at fixing the reservation issue and keeping the sb counters correct, not the quota aspect of it. I'll go back and see what I can come up with that solves this problem, too. Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From bob.mastors@solidfire.com Fri Apr 4 16:40:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C59DA7FFF for ; Fri, 4 Apr 2014 16:40:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38398AC00F for ; Fri, 4 Apr 2014 14:40:42 -0700 (PDT) X-ASG-Debug-ID: 1396647639-04cb6c5675c88f60001-NocioJ Received: from mail-vc0-f175.google.com (mail-vc0-f175.google.com [209.85.220.175]) by cuda.sgi.com with ESMTP id DsLUsckxNxiDFUhf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Apr 2014 14:40:39 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.220.175 Received: by mail-vc0-f175.google.com with SMTP id lh14so3549862vcb.6 for ; Fri, 04 Apr 2014 14:40:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=lfN8LAIm5hBiUNdaAeCxD3FJCMlFQ0YW1cO6rRismJg=; b=cBFguDr2cWjx0vploy5DsvesZK0cX27phiONiU8fFPvaJByPWzRrYpOnbcUU4UjsGo iir7z2LtQ4QuxCHWg9gygNYjPGmhfcpEaN58xg1coaiOlWSq+ztGtk06LEmMQ6ZtU7wC hse6pADVhdbbk/JvDZiQ+8sKSiWmAqOr6EwV8X6PVLwJktKowqswqe6rLo/10vfhErC2 oQcTv0KiqhAL9NxxPzxYIkIJdOyksfGUAGGlO5MENl0phFIfjj7LQdbyL8w29L8cKJFn 2cLsh2tHN5ZhwNNTaPQ52B74uWgT7Jgz5SelGBlT4pf0b+B8qjo0eNYUaU6VYPrSSz9Z pWYQ== X-Gm-Message-State: ALoCoQnKzSU2gq/o5iqm9pxU762jfQNP8BE9cntu2mUVBkouMIuHWqK/YLlehCcf+XROYqs2JAo+ MIME-Version: 1.0 X-Received: by 10.58.211.69 with SMTP id na5mr2068001vec.30.1396647638867; Fri, 04 Apr 2014 14:40:38 -0700 (PDT) Received: by 10.52.30.52 with HTTP; Fri, 4 Apr 2014 14:40:38 -0700 (PDT) In-Reply-To: <20140404212016.GY17603@dastard> References: <20140404212016.GY17603@dastard> Date: Fri, 4 Apr 2014 15:40:38 -0600 Message-ID: Subject: Re: xfs umount with i/o error hang/memory corruption From: Bob Mastors X-ASG-Orig-Subj: Re: xfs umount with i/o error hang/memory corruption To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7bd6c21a6436c404f63e5edd X-Barracuda-Connect: mail-vc0-f175.google.com[209.85.220.175] X-Barracuda-Start-Time: 1396647639 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4574 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bd6c21a6436c404f63e5edd Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Apr 4, 2014 at 3:20 PM, Dave Chinner wrote: > On Fri, Apr 04, 2014 at 12:15:23PM -0600, Bob Mastors wrote: > > Greetings, > > > > I am new to xfs and am running into a problem > > and would appreciate any guidance on how to proceed. > > > > After an i/o error from the block device that xfs is using, > > an umount results in a message like: > > [ 370.636473] XFS (sdx): Log I/O Error Detected. Shutting down > filesystem > > [ 370.644073] XFS (h =EF=BF=BD=EF=BF=BD=EF=BF=BDh"h = =EF=BF=BD=EF=BF=BD=EF=BF=BDH#h =EF=BF=BD=EF=BF=BD=EF=BF=BDbsg): > > Please umount the filesystem and rectify the problem(s) > > Note the garbage on the previous line which suggests memory corruption. > > About half the time I get the garbled log message. About half the time > > umount hangs. > > I got an email about this last night with a different trigger - thin > provisioning failing log IO in the unmount path. I know what the > problem is, I just don't have a fix for it yet. > > To confirm it's the same problem, can you post the entirity of the > dmesg where the error occurs? > Here is the console output from putting a BUG() call in xfs_do_force_shutdown after the "Please umount ..." message. Let me know if want something else. I don't know how much help I can be on this, but I can run more tests or try out fixes. Thanks, Bob [ 111.004665] XFS (sdb): Mounting Filesystem [ 111.099442] XFS (sdb): Ending clean mount [ 129.548644] XFS (sdb): metadata I/O error: block 0x19022 ("xlog_iodone") error 19 numblks 64 [ 129.618739] XFS (sdb): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address =3D 0xffffffffa04c8001 [ 129.699768] XFS (sdb): Log I/O Error Detected. Shutting down filesystem [ 129.699924] XFS (sdb): Unable to update superblock counters. Freespace may not be correct on next mount. [ 129.699927] XFS (sdb): xfs_log_force: error 5 returned. [ 129.716031] XFS (P=E5=B0=82/): Please umount the filesystem and rectify = the problem(s) [ 129.718411] ------------[ cut here ]------------ [ 129.719120] Kernel BUG at ffffffffa04726ac [verbose debug info unavailable] [ 129.720016] invalid opcode: 0000 [#1] SMP [ 129.720016] Modules linked in: xfs(F) libcrc32c ib_srpt tcm_qla2xxx qla2xxx tcm_loop tcm_fc libfc scsi_transport_fc scsi_tgt iscsi_target_mod target_core_pscsi target_core_file target_core_iblock target_core_mod configfs ib_iser rdma_cm iw_cm ib_cm ib_sa ib_mad ib_core ib_addr iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi nfsd nfs_acl nfs lockd fscac\ he sunrpc snd_intel8x0 snd_ac97_codec parport_pc parport ac97_bus snd_pcm psmouse snd_timer serio_raw snd joydev evbug mac_hid pcspkr i2c_piix4 soundcore hid_generic usbhid hid e1000 ahci libahci [ 129.720016] CPU: 1 PID: 234 Comm: kworker/1:1H Tainted: GF 3.14.0+ #1 [ 129.720016] Hardware name: innotek GmbH VirtualBox, BIOS VirtualBox 12/01/2006 [ 129.720016] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 129.720016] task: ffff88002f598000 ti: ffff88002fecc000 task.ti: ffff88002fecc000 [ 129.720016] RIP: 0010:[] [] xfs_do_force_shutdown+0x9c/0x170 [xfs] [ 129.720016] RSP: 0018:ffff88002fecdd68 EFLAGS: 00010296 [ 129.720016] RAX: 0000000000000043 RBX: 0000000000000002 RCX: 0000000000000000 [ 129.720016] RDX: ffff88003fd0efb0 RSI: ffff88003fd0d3d8 RDI: ffff88003fd0d3d8 [ 129.720016] RBP: ffff88002fecdd98 R08: 0000000000000000 R09: 0000000000000000 [ 129.720016] R10: 00000000000001cf R11: 00000000000001ce R12: ffff880028865000 [ 129.720016] R13: 0000000000000002 R14: 0000000000000000 R15: 0000000000000000 [ 129.720016] FS: 0000000000000000(0000) GS:ffff88003fd00000(0000) knlGS:0000000000000000 [ 129.720016] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [ 129.720016] CR2: 00000000006105e8 CR3: 0000000001c0e000 CR4: 00000000000006e0 [ 129.720016] Stack: [ 129.720016] ffffffffa04c8001 0000000000000000 ffff880030140300 ffff88003026dc00 [ 129.720016] ffff88002fa13980 0000000000000000 ffff88002fecddc8 ffffffffa04c8001 [ 129.720016] ffff88003653cf48 ffff88002fa13a20 ffff88002fa13980 ffffe8ffffd01e00 [ 129.720016] Call Trace: [ 129.720016] [] ? xlog_iodone+0x91/0xa0 [xfs] [ 129.720016] [] xlog_iodone+0x91/0xa0 [xfs] [ 129.720016] [] xfs_buf_iodone_work+0x5e/0xc0 [xfs] [ 129.720016] [] process_one_work+0x174/0x4a0 [ 129.720016] [] worker_thread+0x11b/0x370 [ 129.720016] [] ? manage_workers.isra.20+0x2d0/0x2d0 [ 129.720016] [] kthread+0xc9/0xe0 [ 129.720016] [] ? flush_kthread_worker+0xb0/0xb0 [ 129.720016] [] ret_from_fork+0x7c/0xb0 [ 129.720016] [] ? flush_kthread_worker+0xb0/0xb0 [ 129.720016] Code: d0 45 85 ed 0f 85 a5 00 00 00 f6 c3 20 66 90 75 7e 83 e3 10 0f 84 b5 00 00 00 48 c7 c6 18 8c 4e a0 4c 89 e7 31 c0 e8 54 92 00 00 <0f> 0b 66 90 48 8b 45 08 49 89 d1 41 89 c8 48 c7 c2 d0 4f 4e a0 [ 129.720016] RIP [] xfs_do_force_shutdown+0x9c/0x170 [xfs] [ 129.720016] RSP [ 129.777164] ---[ end trace d335180e3c345156 ]--- [ 129.777953] BUG: unable to handle kernel paging request at ffffffffffffffd8 [ 129.779087] IP: [] kthread_data+0x10/0x20 [ 129.779960] PGD 1c0f067 PUD 1c11067 PMD 0 [ 129.780900] Oops: 0000 [#2] SMP [ 129.781150] Modules linked in: xfs(F) libcrc32c ib_srpt tcm_qla2xxx qla2xxx tcm_loop tcm_fc libfc scsi_transport_fc scsi_tgt iscsi_target_mod target_core_pscsi target_core_file target_core_iblock target_core_mod configfs ib_iser rdma_cm iw_cm ib_cm ib_sa ib_mad ib_core ib_addr iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi nfsd nfs_acl nfs lockd fscac\ he sunrpc snd_intel8x0 snd_ac97_codec parport_pc parport ac97_bus snd_pcm psmouse snd_timer serio_raw snd joydev evbug mac_hid pcspkr i2c_piix4 soundcore hid_generic usbhid hid e1000 ahci libahci [ 129.781150] CPU: 1 PID: 234 Comm: kworker/1:1H Tainted: GF D 3.14.0+ #1 [ 129.781150] Hardware name: innotek GmbH VirtualBox, BIOS VirtualBox 12/01/2006 [ 129.781150] task: ffff88002f598000 ti: ffff88002fecc000 task.ti: ffff88002fecc000 [ 129.781150] RIP: 0010:[] [] kthread_data+0x10/0x20 [ 129.781150] RSP: 0018:ffff88002fecd9f8 EFLAGS: 00010046 [ 129.781150] RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff81e75380 [ 129.781150] RDX: 0000000000000001 RSI: 0000000000000001 RDI: ffff88002f598000 [ 129.781150] RBP: ffff88002fecd9f8 R08: 0000000000000000 R09: 0000000000000164 [ 129.781150] R10: ffffffff8104c8b4 R11: 0000000000000000 R12: 0000000000000001 [ 129.781150] R13: ffff88002f5984e0 R14: ffff88003d9f8000 R15: ffff88002f5983d8 [ 129.781150] FS: 0000000000000000(0000) GS:ffff88003fd00000(0000) knlGS:0000000000000000 [ 129.781150] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [ 129.781150] CR2: 0000000000000028 CR3: 0000000001c0e000 CR4: 00000000000006e0 [ 129.781150] Stack: [ 129.781150] ffff88002fecda18 ffffffff8106c526 ffff88003fd13140 0000000000000001 [ 129.781150] ffff88002fecda98 ffffffff816ca7cf 0000000000000001 ffff88002f598000 [ 129.781150] ffff88002f598000 0000000000013140 ffff88002fecdfd8 0000000000013140 [ 129.781150] Call Trace: [ 129.781150] [] wq_worker_sleeping+0x16/0xa0 [ 129.781150] [] __schedule+0x56f/0x7c0 [ 129.781150] [] schedule+0x29/0x70 [ 129.781150] [] do_exit+0x6e5/0xa70 [ 129.781150] [] ? printk+0x4d/0x4f [ 129.781150] [] oops_end+0xa1/0xf0 [ 129.781150] [] die+0x58/0x90 [ 129.781150] [] do_trap+0xcb/0x170 [ 129.781150] [] do_invalid_op+0xad/0x100 [ 129.781150] [] ? xfs_do_force_shutdown+0x9c/0x170 [xfs] [ 129.781150] [] ? printk+0x4d/0x4f [ 129.781150] [] invalid_op+0x18/0x20 [ 129.781150] [] ? xfs_do_force_shutdown+0x9c/0x170 [xfs] [ 129.781150] [] ? xfs_do_force_shutdown+0x9c/0x170 [xfs] [ 129.781150] [] ? xlog_iodone+0x91/0xa0 [xfs] [ 129.781150] [] xlog_iodone+0x91/0xa0 [xfs] [ 129.781150] [] xfs_buf_iodone_work+0x5e/0xc0 [xfs] [ 129.781150] [] process_one_work+0x174/0x4a0 [ 129.781150] [] worker_thread+0x11b/0x370 [ 129.781150] [] ? manage_workers.isra.20+0x2d0/0x2d0 [ 129.781150] [] kthread+0xc9/0xe0 [ 129.781150] [] ? flush_kthread_worker+0xb0/0xb0 [ 129.781150] [] ret_from_fork+0x7c/0xb0 [ 129.781150] [] ? flush_kthread_worker+0xb0/0xb0 [ 129.781150] Code: 00 48 89 e5 5d 48 8b 40 c8 48 c1 e8 02 83 e0 01 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 8b 87 88 04 00 00 55 48 89 e5 <48> 8b 40 d8 5d c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 [ 129.781150] RIP [] kthread_data+0x10/0x20 [ 129.781150] RSP [ 129.781150] CR2: ffffffffffffffd8 [ 129.781150] ---[ end trace d335180e3c345157 ]--- [ 129.781150] Fixing recursive fault but reboot is needed! > In essence, the log IO failure is triggering a shutdown, and as part > of the shutdown process it wakes anyone waiting on a log force. > The log quiesce code that waits for log completion during unmount > uses a log force to ensure the log is idle before tearing down all > the log structures and finishing the unmount. Unfortunatey, the log > force the unmount blocks on is woken prematurely by the shutdown, > and hence it runs before the log IO processing is completed. Hence > the use after free. > > > And then I get this kind of error and the system is unresponsive: > > Message from syslogd@debian at Apr 4 09:27:40 ... > > kernel:[ 680.080022] BUG: soft lockup - CPU#2 stuck for 22s! > [umount:2849] > > > > The problem appears to be similar to this issue: > > http://www.spinics.net/lists/linux-xfs/msg00061.html > > Similar symptoms, but not the same bug. > > > The problem is triggered by doing an iscsi logout which causes > > the block device to return i/o errors to xfs. > > Steps to reproduce the problem are below. > > Seems similar to the thinp ENOSPC issue I mentioned above - data IO > errors occur, then you do an unmount, which causes a log IO error > writing the superblock, and then this happens.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --047d7bd6c21a6436c404f63e5edd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On F= ri, Apr 4, 2014 at 3:20 PM, Dave Chinner <david@fromorbit.com> wrote:
On Fri, Apr 04, 2014 at 12:15:23PM -0600, = Bob Mastors wrote:
> Greetings,
>
> I am new to xfs and am running into a problem
> and would appreciate any guidance on how to proceed.
>
> After an i/o error from the block device that xfs is using,
> an umount results in a message like:
> [ =C2=A0370.636473] XFS (sdx): Log I/O Error Detected. =C2=A0Shutting = down filesystem
> [ =C2=A0370.644073] XFS (h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =EF=BF= =BD=EF=BF=BD=EF=BF=BDh"h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=EF=BF=BD= =EF=BF=BD=EF=BF=BDH#h =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=EF=BF=BD=EF=BF=BD= =EF=BF=BDbsg):
> Please umount the filesystem and rectify the problem(s)
> Note the garbage on the previous line which suggests memory corruption= .
> About half the time I get the garbled log message. About half the time=
> umount hangs.

I got an email about this last night with a different trigger - thin<= br> provisioning failing log IO in the unmount path. I know what the
problem is, I just don't have a fix for it yet.

To confirm it's the same problem, can you post the entirity of the
dmesg where the error occurs?
Here is the console outp= ut from putting a BUG() call =C2=A0in xfs_do_force_shutdown
after= the "Please umount ..." message.
Let me know if want s= omething else.

I don't know how much help I can be on this, but I = can run more tests
or try out fixes.

Tha= nks,
Bob

[ =C2=A0111.004665] XFS (s= db): Mounting Filesystem
[ =C2=A0111.099442] XFS (sdb): Ending clean mount
[ =C2=A012= 9.548644] XFS (sdb): metadata I/O error: block 0x19022 ("xlog_iodone&q= uot;) error 19 numblks 64
[ =C2=A0129.618739] XFS (sdb): xfs_do_f= orce_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. =C2=A0Re= turn address =3D 0xffffffffa04c8001
[ =C2=A0129.699768] XFS (sdb): Log I/O Error Detected. =C2=A0Shutting = down filesystem
[ =C2=A0129.699924] XFS (sdb): Unable to update s= uperblock counters. Freespace may not be correct on next mount.
[= =C2=A0129.699927] XFS (sdb): xfs_log_force: error 5 returned.
[ =C2=A0129.716031] XFS (P=E5=B0=82/): Please umount the filesystem an= d rectify the problem(s)
[ =C2=A0129.718411] ------------[ cut he= re ]------------
[ =C2=A0129.719120] Kernel BUG at ffffffffa04726= ac [verbose debug info unavailable]
[ =C2=A0129.720016] invalid opcode: 0000 [#1] SMP
[ =C2=A012= 9.720016] Modules linked in: xfs(F) libcrc32c ib_srpt tcm_qla2xxx qla2xxx t= cm_loop tcm_fc libfc scsi_transport_fc scsi_tgt iscsi_target_mod target_cor= e_pscsi target_core_file target_core_iblock target_core_mod configfs ib_ise= r rdma_cm iw_cm ib_cm ib_sa ib_mad ib_core ib_addr iscsi_tcp libiscsi_tcp l= ibiscsi scsi_transport_iscsi nfsd nfs_acl nfs lockd fscac\
he sunrpc snd_intel8x0 snd_ac97_codec parport_pc parport ac97_bus snd_= pcm psmouse snd_timer serio_raw snd joydev evbug mac_hid pcspkr i2c_piix4 s= oundcore hid_generic usbhid hid e1000 ahci libahci
[ =C2=A0129.72= 0016] CPU: 1 PID: 234 Comm: kworker/1:1H Tainted: GF =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A03.14.0+ #1
[ =C2=A0129.720016] Hardware name: innotek GmbH VirtualBox, BIOS Virtu= alBox 12/01/2006
[ =C2=A0129.720016] Workqueue: xfslogd xfs_buf_i= odone_work [xfs]
[ =C2=A0129.720016] task: ffff88002f598000 ti: f= fff88002fecc000 task.ti: ffff88002fecc000
[ =C2=A0129.720016] RIP: 0010:[<ffffffffa04726ac>] =C2=A0[<ff= ffffffa04726ac>] xfs_do_force_shutdown+0x9c/0x170 [xfs]
[ =C2= =A0129.720016] RSP: 0018:ffff88002fecdd68 =C2=A0EFLAGS: 00010296
= [ =C2=A0129.720016] RAX: 0000000000000043 RBX: 0000000000000002 RCX: 000000= 0000000000
[ =C2=A0129.720016] RDX: ffff88003fd0efb0 RSI: ffff88003fd0d3d8 RDI: f= fff88003fd0d3d8
[ =C2=A0129.720016] RBP: ffff88002fecdd98 R08: 00= 00000000000000 R09: 0000000000000000
[ =C2=A0129.720016] R10: 000= 00000000001cf R11: 00000000000001ce R12: ffff880028865000
[ =C2=A0129.720016] R13: 0000000000000002 R14: 0000000000000000 R15: 0= 000000000000000
[ =C2=A0129.720016] FS: =C2=A00000000000000000(00= 00) GS:ffff88003fd00000(0000) knlGS:0000000000000000
[ =C2=A0129.= 720016] CS: =C2=A00010 DS: 0000 ES: 0000 CR0: 000000008005003b
[ =C2=A0129.720016] CR2: 00000000006105e8 CR3: 0000000001c0e000 CR4: 0= 0000000000006e0
[ =C2=A0129.720016] Stack:
[ =C2=A0129.= 720016] =C2=A0ffffffffa04c8001 0000000000000000 ffff880030140300 ffff880030= 26dc00
[ =C2=A0129.720016] =C2=A0ffff88002fa13980 0000000000000000 ffff88002fecddc= 8 ffffffffa04c8001
[ =C2=A0129.720016] =C2=A0ffff88003653cf48 fff= f88002fa13a20 ffff88002fa13980 ffffe8ffffd01e00
[ =C2=A0129.72001= 6] Call Trace:
[ =C2=A0129.720016] =C2=A0[<ffffffffa04c8001>] ? xlog_iodone+0x91/0xa= 0 [xfs]
[ =C2=A0129.720016] =C2=A0[<ffffffffa04c8001>] xlog= _iodone+0x91/0xa0 [xfs]
[ =C2=A0129.720016] =C2=A0[<ffffffffa0= 46ac3e>] xfs_buf_iodone_work+0x5e/0xc0 [xfs]
[ =C2=A0129.720016] =C2=A0[<ffffffff8106ad04>] process_one_work+= 0x174/0x4a0
[ =C2=A0129.720016] =C2=A0[<ffffffff8106c0ab>] = worker_thread+0x11b/0x370
[ =C2=A0129.720016] =C2=A0[<ffffffff= 8106bf90>] ? manage_workers.isra.20+0x2d0/0x2d0
[ =C2=A0129.720016] =C2=A0[<ffffffff81072c29>] kthread+0xc9/0xe0=
[ =C2=A0129.720016] =C2=A0[<ffffffff81072b60>] ? flush_kth= read_worker+0xb0/0xb0
[ =C2=A0129.720016] =C2=A0[<ffffffff816d= 6aec>] ret_from_fork+0x7c/0xb0
[ =C2=A0129.720016] =C2=A0[<ffffffff81072b60>] ? flush_kthread_w= orker+0xb0/0xb0
[ =C2=A0129.720016] Code: d0 45 85 ed 0f 85 a5 00= 00 00 f6 c3 20 66 90 75 7e 83 e3 10 0f 84 b5 00 00 00 48 c7 c6 18 8c 4e a0= 4c 89 e7 31 c0 e8 54 92 00 00 <0f> 0b 66 90 48 8b 45 08 49 89 d1 41 = 89 c8 48 c7 c2 d0 4f 4e a0
[ =C2=A0129.720016] RIP =C2=A0[<ffffffffa04726ac>] xfs_do_force_= shutdown+0x9c/0x170 [xfs]
[ =C2=A0129.720016] =C2=A0RSP <ffff8= 8002fecdd68>
[ =C2=A0129.777164] ---[ end trace d335180e3c3451= 56 ]---
[ =C2=A0129.777953] BUG: unable to handle kernel paging r= equest at ffffffffffffffd8
[ =C2=A0129.779087] IP: [<ffffffff81072c80>] kthread_data+0x10/0= x20
[ =C2=A0129.779960] PGD 1c0f067 PUD 1c11067 PMD 0
[= =C2=A0129.780900] Oops: 0000 [#2] SMP
[ =C2=A0129.781150] Module= s linked in: xfs(F) libcrc32c ib_srpt tcm_qla2xxx qla2xxx tcm_loop tcm_fc l= ibfc scsi_transport_fc scsi_tgt iscsi_target_mod target_core_pscsi target_c= ore_file target_core_iblock target_core_mod configfs ib_iser rdma_cm iw_cm = ib_cm ib_sa ib_mad ib_core ib_addr iscsi_tcp libiscsi_tcp libiscsi scsi_tra= nsport_iscsi nfsd nfs_acl nfs lockd fscac\
he sunrpc snd_intel8x0 snd_ac97_codec parport_pc parport ac97_bus snd_= pcm psmouse snd_timer serio_raw snd joydev evbug mac_hid pcspkr i2c_piix4 s= oundcore hid_generic usbhid hid e1000 ahci libahci
[ =C2=A0129.78= 1150] CPU: 1 PID: 234 Comm: kworker/1:1H Tainted: GF =C2=A0 =C2=A0 D =C2=A0= =C2=A0 =C2=A03.14.0+ #1
[ =C2=A0129.781150] Hardware name: innotek GmbH VirtualBox, BIOS Virtu= alBox 12/01/2006
[ =C2=A0129.781150] task: ffff88002f598000 ti: f= fff88002fecc000 task.ti: ffff88002fecc000
[ =C2=A0129.781150] RIP= : 0010:[<ffffffff81072c80>] =C2=A0[<ffffffff81072c80>] kthread_= data+0x10/0x20
[ =C2=A0129.781150] RSP: 0018:ffff88002fecd9f8 =C2=A0EFLAGS: 00010046<= /div>
[ =C2=A0129.781150] RAX: 0000000000000000 RBX: 0000000000000000 R= CX: ffffffff81e75380
[ =C2=A0129.781150] RDX: 0000000000000001 RS= I: 0000000000000001 RDI: ffff88002f598000
[ =C2=A0129.781150] RBP: ffff88002fecd9f8 R08: 0000000000000000 R09: 0= 000000000000164
[ =C2=A0129.781150] R10: ffffffff8104c8b4 R11: 00= 00000000000000 R12: 0000000000000001
[ =C2=A0129.781150] R13: fff= f88002f5984e0 R14: ffff88003d9f8000 R15: ffff88002f5983d8
[ =C2=A0129.781150] FS: =C2=A00000000000000000(0000) GS:ffff88003fd000= 00(0000) knlGS:0000000000000000
[ =C2=A0129.781150] CS: =C2=A0001= 0 DS: 0000 ES: 0000 CR0: 000000008005003b
[ =C2=A0129.781150] CR2= : 0000000000000028 CR3: 0000000001c0e000 CR4: 00000000000006e0
[ =C2=A0129.781150] Stack:
[ =C2=A0129.781150] =C2=A0ffff880= 02fecda18 ffffffff8106c526 ffff88003fd13140 0000000000000001
[ = =C2=A0129.781150] =C2=A0ffff88002fecda98 ffffffff816ca7cf 0000000000000001 = ffff88002f598000
[ =C2=A0129.781150] =C2=A0ffff88002f598000 0000000000013140 ffff88002fecdfd= 8 0000000000013140
[ =C2=A0129.781150] Call Trace:
[ =C2=A0129.781150] =C2=A0[<ffffffff8106c526>] wq_worker_sleep= ing+0x16/0xa0
[ =C2=A0129.781150] =C2=A0[<ffffffff816ca7cf>] __schedule+0x56f/0x7c0=
[ =C2=A0129.781150] =C2=A0[<ffffffff816caaf9>] schedule+0x= 29/0x70
[ =C2=A0129.781150] =C2=A0[<ffffffff81052075>] do_e= xit+0x6e5/0xa70
[ =C2=A0129.781150] =C2=A0[<ffffffff816c2303>] ? printk+0x4d/0x4f
[ =C2=A0129.781150] =C2=A0[<ffffffff816cf0e1>] oops_end+0xa1/0= xf0
[ =C2=A0129.781150] =C2=A0[<ffffffff81006208>] die+0x58= /0x90
[ =C2=A0129.781150] =C2=A0[<ffffffff816ce93b>] do_tra= p+0xcb/0x170
[ =C2=A0129.781150] =C2=A0[<ffffffff8100308d>] do_invalid_op+0xa= d/0x100
[ =C2=A0129.781150] =C2=A0[<ffffffffa04726ac>] ? xf= s_do_force_shutdown+0x9c/0x170 [xfs]
[ =C2=A0129.781150] =C2=A0[&= lt;ffffffff816c2303>] ? printk+0x4d/0x4f
[ =C2=A0129.781150] =C2=A0[<ffffffff816d8088>] invalid_op+0x18/0= x20
[ =C2=A0129.781150] =C2=A0[<ffffffffa04726ac>] ? xfs_do= _force_shutdown+0x9c/0x170 [xfs]
[ =C2=A0129.781150] =C2=A0[<f= fffffffa04726ac>] ? xfs_do_force_shutdown+0x9c/0x170 [xfs]
[ =C2=A0129.781150] =C2=A0[<ffffffffa04c8001>] ? xlog_iodone+0x9= 1/0xa0 [xfs]
[ =C2=A0129.781150] =C2=A0[<ffffffffa04c8001>]= xlog_iodone+0x91/0xa0 [xfs]
[ =C2=A0129.781150] =C2=A0[<fffff= fffa046ac3e>] xfs_buf_iodone_work+0x5e/0xc0 [xfs]
[ =C2=A0129.781150] =C2=A0[<ffffffff8106ad04>] process_one_work+= 0x174/0x4a0
[ =C2=A0129.781150] =C2=A0[<ffffffff8106c0ab>] = worker_thread+0x11b/0x370
[ =C2=A0129.781150] =C2=A0[<ffffffff= 8106bf90>] ? manage_workers.isra.20+0x2d0/0x2d0
[ =C2=A0129.781150] =C2=A0[<ffffffff81072c29>] kthread+0xc9/0xe0=
[ =C2=A0129.781150] =C2=A0[<ffffffff81072b60>] ? flush_kth= read_worker+0xb0/0xb0
[ =C2=A0129.781150] =C2=A0[<ffffffff816d= 6aec>] ret_from_fork+0x7c/0xb0
[ =C2=A0129.781150] =C2=A0[<ffffffff81072b60>] ? flush_kthread_w= orker+0xb0/0xb0
[ =C2=A0129.781150] Code: 00 48 89 e5 5d 48 8b 40= c8 48 c1 e8 02 83 e0 01 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48= 8b 87 88 04 00 00 55 48 89 e5 <48> 8b 40 d8 5d c3 66 2e 0f 1f 84 00 = 00 00 00 00 0f 1f 44 00 00
[ =C2=A0129.781150] RIP =C2=A0[<ffffffff81072c80>] kthread_data+= 0x10/0x20
[ =C2=A0129.781150] =C2=A0RSP <ffff88002fecd9f8><= /div>
[ =C2=A0129.781150] CR2: ffffffffffffffd8
[ =C2=A0129.7= 81150] ---[ end trace d335180e3c345157 ]---
[ =C2=A0129.781150] Fixing recursive fault but reboot is needed!
=


In essence, the log IO failure is triggering a shutdown, and as part
of the shutdown process it wakes anyone waiting on a log force.
The log quiesce code that waits for log completion during unmount
uses a log force to ensure the log is idle before tearing down all
the log structures and finishing the unmount. Unfortunatey, the log
force the unmount blocks on is woken prematurely by the shutdown,
and hence it runs before the log IO processing is completed. Hence
the use after free.

> And then I get this kind of error and the system is unresponsive:
> Message from syslogd@debian at Apr =C2=A04 09:27:40 ...
> =C2=A0kernel:[ =C2=A0680.080022] BUG: soft lockup - CPU#2 stuck for 22= s! [umount:2849]
>
> The problem appears to be similar to this issue:
> http://www.spinics.net/lists/linux-xfs/msg00061.html

Similar symptoms, but not the same bug.

> The problem is triggered by doing an iscsi logout which causes
> the block device to return i/o errors to xfs.
> Steps to reproduce the problem are below.

Seems similar to the thinp ENOSPC issue I mentioned above - data IO errors occur, then you do an unmount, which causes a log IO error
writing the superblock, and then this happens....

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--047d7bd6c21a6436c404f63e5edd-- From david@fromorbit.com Fri Apr 4 16:57:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 83C3A7FC4 for ; Fri, 4 Apr 2014 16:57:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F10DFAC003 for ; Fri, 4 Apr 2014 14:57:28 -0700 (PDT) X-ASG-Debug-ID: 1396648646-04cb6c5675c89560001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id NXS3QzIFh7fqjpL3 for ; Fri, 04 Apr 2014 14:57:26 -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: AnYGAF0qP1N5LEcv/2dsb2JhbABZgwaDSlLBBYEiF3SCJQEBAQQjDwEjIxAIAQIYAgIFIQICDwUlAyETh3iROZwYomQXFoETjGYRAVAHgm+BSQSYWpJAg0QpgTU Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2014 08:27:25 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WWC6q-0006Cv-LN; Sat, 05 Apr 2014 08:57:12 +1100 Date: Sat, 5 Apr 2014 08:57:12 +1100 From: Dave Chinner To: Bob Mastors Cc: xfs@oss.sgi.com Subject: Re: xfs umount with i/o error hang/memory corruption Message-ID: <20140404215712.GP16336@dastard> X-ASG-Orig-Subj: Re: xfs umount with i/o error hang/memory corruption References: <20140404212016.GY17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396648646 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 04, 2014 at 03:40:38PM -0600, Bob Mastors wrote: > On Fri, Apr 4, 2014 at 3:20 PM, Dave Chinner wrote: > > > On Fri, Apr 04, 2014 at 12:15:23PM -0600, Bob Mastors wrote: > > > Greetings, > > > > > > I am new to xfs and am running into a problem > > > and would appreciate any guidance on how to proceed. > > > > > > After an i/o error from the block device that xfs is using, > > > an umount results in a message like: > > > [ 370.636473] XFS (sdx): Log I/O Error Detected. Shutting down > > filesystem > > > [ 370.644073] XFS (h ���h"h ���H#h ���bsg): > > > Please umount the filesystem and rectify the problem(s) > > > Note the garbage on the previous line which suggests memory corruption. > > > About half the time I get the garbled log message. About half the time > > > umount hangs. > > > > I got an email about this last night with a different trigger - thin > > provisioning failing log IO in the unmount path. I know what the > > problem is, I just don't have a fix for it yet. > > > > To confirm it's the same problem, can you post the entirity of the > > dmesg where the error occurs? > > > Here is the console output from putting a BUG() call in > xfs_do_force_shutdown > after the "Please umount ..." message. > Let me know if want something else. > > I don't know how much help I can be on this, but I can run more tests > or try out fixes. I'll let you know when I have a fix for you to try - probably early next week as it's Saturday morning right now... > [ 129.548644] XFS (sdb): metadata I/O error: block 0x19022 ("xlog_iodone") > error 19 numblks 64 > [ 129.618739] XFS (sdb): xfs_do_force_shutdown(0x2) called from line 1170 > of file fs/xfs/xfs_log.c. Return address = 0xffffffffa04c8001 > [ 129.699768] XFS (sdb): Log I/O Error Detected. Shutting down filesystem > [ 129.699924] XFS (sdb): Unable to update superblock counters. Freespace > may not be correct on next mount. > [ 129.699927] XFS (sdb): xfs_log_force: error 5 returned. > [ 129.716031] XFS (P専/): Please umount the filesystem and rectify the Yup, that is identical to the bug report I got from the dm-thinp folks. Thanks for the quick followup! Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Apr 4 17:06:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9AFEF7FFA for ; Fri, 4 Apr 2014 17:06:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 600A38F8039 for ; Fri, 4 Apr 2014 15:06:01 -0700 (PDT) X-ASG-Debug-ID: 1396649158-04bdf05daacb5700001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id lAH1kITAfZEKHLRU for ; Fri, 04 Apr 2014 15:05:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtMGAHArP1N5LEcv/2dsb2JhbABZgwY7gw+oIQKZNIEiF3SCZhwjGCQ0BSUDiCzQThaOBFeEPwSYWpJAg0QpgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Apr 2014 08:35:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WWCF7-0006FB-5z; Sat, 05 Apr 2014 09:05:45 +1100 Date: Sat, 5 Apr 2014 09:05:45 +1100 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] XFS updates for 3.15-rc1 Message-ID: <20140404220545.GQ16336@dastard> X-ASG-Orig-Subj: [GIT PULL] XFS updates for 3.15-rc1 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1396649158 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Please pull the following XFS updates for 3.15-rc1. There are a couple of new fallocate features in this request - it was decided that it was easiest to push them through the XFS tree using topic branches and have the ext4 support be based on those branches. Hence you may see some overlap with the ext4 tree merge depending on how they including those topic branches into their tree. Other than that, there is O_TMPFILE support, some cleanups and bug fixes. I've used a signed tag for this pull like you wanted me to do. I think a few people signed my new gpg key last week at LSFMM so it shouldn't be completely bare. Hopefully I haven't screwed anything up - let me know if there's anything you'd like me to do differently in future. Cheers, Dave. The following changes since commit 38dbfb59d1175ef458d006556061adeaa8751b72: Linus 3.14-rc1 (2014-02-02 16:42:13 -0800) are available in the git repository at: git://oss.sgi.com/xfs/xfs.git tags/xfs-for-linus-3.15-rc1 for you to fetch changes up to a6cf33bc566c5fe888bfa9cf6448037c90661f67: Merge branch 'xfs-bug-fixes-for-3.15-3' into for-next (2014-04-04 08:07:35 +1100) ---------------------------------------------------------------- xfs: update for 3.15-rc1 The main changes in the XFS tree for 3.15-rc1 are: - O_TMPFILE support - allowing AIO+DIO writes beyond EOF - FALLOC_FL_COLLAPSE_RANGE support for fallocate syscall and XFS implementation - FALLOC_FL_ZERO_RANGE support for fallocate syscall and XFS implementation - IO verifier cleanup and rework - stack usage reduction changes - vm_map_ram NOIO context fixes to remove lockdep warings - various bug fixes and cleanups ---------------------------------------------------------------- Ben Myers (1): MAINTAINERS: SGI no longer maintaining XFS Brian Foster (3): xfs: use tr_growrtalloc for growing rt files xfs: use tr_qm_dqalloc log reservation for dquot alloc xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation Christoph Hellwig (4): direct-io: add flag to allow aio writes beyond i_size xfs: always use unwritten extents for direct I/O writes xfs: allow appending aio writes xfs: ensure correct timestamp updates from truncate Dan Carpenter (1): xfs: extra semi-colon breaks a condition Dave Chinner (16): xfs: ensure correct log item buffer alignment Merge branch 'xfs-fixes-for-3.15' into for-next Merge remote-tracking branch 'xfs-async-aio-extend' into for-next xfs: always do log forces via the workqueue xfs: allocate xfs_da_args to reduce stack footprint xfs: fix directory inode iolock lockdep false positive xfs: don't leak EFSBADCRC to userspace xfs: use NOIO contexts for vm_map_ram xfs: xfs_check_page_type buffer checks need help xfs: inode log reservations are still too small Merge branch 'xfs-collapse-range' into for-next Merge branch 'xfs-stack-fixes' into for-next Merge branch 'xfs-verifier-cleanup' into for-next Merge branch 'xfs-bug-fixes-for-3.15-2' into for-next Merge branch 'xfs-O_TMPFILE-support' into for-next Merge branch 'xfs-bug-fixes-for-3.15-3' into for-next Eric Sandeen (12): xfs: remove unused tr_swrite xfs: sanitize sb_inopblock in xfs_mount_validate_sb xfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb xfs: skip verification on initial "guess" superblock read xfs: limit superblock corruption errors to actual corruption xfs: skip pointless CRC updates after verifier failures xfs: Use defines for CRC offsets in all cases xfs: add helper for verifying checksums on xfs_bufs xfs: add helper for updating checksums on xfs_bufs xfs: add xfs_verifier_error() xfs: print useful caller information in xfs_error_report xfs: modify verifiers to differentiate CRC from other errors Jie Liu (3): xfs: convert xfs_log_commit_cil() to void xfs: return -E2BIG if hit the maximum size limits of ACLs xfs: remove XFS_TRANS_DEBUG dead code Lukas Czerner (2): fs: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate xfs: Add support for FALLOC_FL_ZERO_RANGE Mark Tinguely (1): xfs: fix directory hash ordering bug Namjae Jeon (2): fs: Add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate xfs: Add support FALLOC_FL_COLLAPSE_RANGE for fallocate Zhi Yong Wu (3): xfs: factor prid related codes into xfs_get_initial_prid() xfs: add O_TMPFILE support xfs: allow linkat() on O_TMPFILE files MAINTAINERS | 1 - fs/direct-io.c | 18 ++- fs/open.c | 29 +++- fs/xfs/kmem.c | 21 ++- fs/xfs/xfs_acl.c | 2 +- fs/xfs/xfs_ag.h | 6 + fs/xfs/xfs_alloc.c | 45 +++--- fs/xfs/xfs_alloc_btree.c | 16 +- fs/xfs/xfs_aops.c | 84 +++++++---- fs/xfs/xfs_attr_leaf.c | 17 ++- fs/xfs/xfs_attr_remote.c | 15 +- fs/xfs/xfs_bmap.c | 193 ++++++++++++++++++++++++ fs/xfs/xfs_bmap.h | 15 ++ fs/xfs/xfs_bmap_btree.c | 16 +- fs/xfs/xfs_bmap_util.c | 97 +++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_btree.c | 14 +- fs/xfs/xfs_buf.c | 11 ++ fs/xfs/xfs_buf.h | 14 ++ fs/xfs/xfs_buf_item.c | 19 --- fs/xfs/xfs_da_btree.c | 19 +-- fs/xfs/xfs_dinode.h | 2 + fs/xfs/xfs_dir2.c | 342 +++++++++++++++++++++++++++---------------- fs/xfs/xfs_dir2_block.c | 17 ++- fs/xfs/xfs_dir2_data.c | 20 +-- fs/xfs/xfs_dir2_leaf.c | 17 ++- fs/xfs/xfs_dir2_node.c | 17 ++- fs/xfs/xfs_dquot.c | 2 +- fs/xfs/xfs_dquot_buf.c | 11 +- fs/xfs/xfs_error.c | 27 +++- fs/xfs/xfs_error.h | 1 + fs/xfs/xfs_file.c | 26 +++- fs/xfs/xfs_format.h | 2 + fs/xfs/xfs_ialloc.c | 36 +++-- fs/xfs/xfs_ialloc_btree.c | 16 +- fs/xfs/xfs_inode.c | 123 +++++++++++++++- fs/xfs/xfs_inode.h | 12 ++ fs/xfs/xfs_inode_buf.c | 7 +- fs/xfs/xfs_iomap.c | 10 +- fs/xfs/xfs_iops.c | 46 +++++- fs/xfs/xfs_linux.h | 2 + fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 74 +++++++--- fs/xfs/xfs_mount.c | 27 +++- fs/xfs/xfs_rtalloc.c | 2 +- fs/xfs/xfs_sb.c | 23 ++- fs/xfs/xfs_sb.h | 2 + fs/xfs/xfs_shared.h | 4 +- fs/xfs/xfs_symlink.c | 9 +- fs/xfs/xfs_symlink_remote.c | 16 +- fs/xfs/xfs_trace.h | 1 + fs/xfs/xfs_trans.c | 12 +- fs/xfs/xfs_trans_buf.c | 11 ++ fs/xfs/xfs_trans_resv.c | 82 +++++++++-- fs/xfs/xfs_trans_resv.h | 3 +- include/linux/fs.h | 3 + include/uapi/linux/falloc.h | 35 +++++ 57 files changed, 1256 insertions(+), 440 deletions(-) From v.mingchen@gmail.com Sat Apr 5 00:52:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B700A7F5D for ; Sat, 5 Apr 2014 00:52:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A198C304053 for ; Fri, 4 Apr 2014 22:52:48 -0700 (PDT) X-ASG-Debug-ID: 1396677164-04cb6c5676c94060001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id MLVDBdukjTwvFuzT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 04 Apr 2014 22:52:44 -0700 (PDT) X-Barracuda-Envelope-From: v.mingchen@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.171] Received: by mail-ig0-f171.google.com with SMTP id c1so1797399igq.10 for ; Fri, 04 Apr 2014 22:52:43 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=AoQaZ9hPqNrUA43l5bpHXVnZYUfvDFOmDu/vCmv0TPU=; b=s2lOgS7xG/42HG72Wunp8m9esOVPiDjVXILkWdKuE1sNSEPkQguqavL73pyCFg15eP 8EiPNzXMWdjck106lECSAgamf6aSJZV/tyXMmVOo6rX4i3E5DV9tACA/oI9xDQcCoo/+ g/8IK0KfvsPCH4jRUY3Y/JWnBVpv7xr9I8KfCD8ScNbofSebR8w4mddLYAHA5trRimCk WbsGU3ZpY/1w6bNEGFaLzwf0t2g6S67dpk9gmzsY0lvQEudSkMUYyyyxEfg5oINQTXAO byKh5VcEpK7NdOHpzTj+oK+X7Gjnh07gcdxSfNW4QWJSyUgt4dPMRTZWxTYKewoFd071 p9qA== MIME-Version: 1.0 X-Received: by 10.50.253.130 with SMTP id aa2mr7567236igd.39.1396677163898; Fri, 04 Apr 2014 22:52:43 -0700 (PDT) Received: by 10.64.159.5 with HTTP; Fri, 4 Apr 2014 22:52:43 -0700 (PDT) Date: Sat, 5 Apr 2014 01:52:43 -0400 Message-ID: Subject: [PATCH] xfstest: log operations properly to generic/001.full From: Ming Chen X-ASG-Orig-Subj: [PATCH] xfstest: log operations properly to generic/001.full To: xfs@oss.sgi.com Cc: Erez Zadok , david@fromorbit.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1396677164 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4585 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 Part of the operations were written to 001.full from the awk script, while the rest were piped to 001.full using tee. The resultant 001.full did not reflect what are really performed. This makes debugging difficult. Signed-off-by: Ming Chen --- tests/generic/001 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/generic/001 b/tests/generic/001 index 6e5f3dd..e1142ed 100755 --- a/tests/generic/001 +++ b/tests/generic/001 @@ -190,7 +190,7 @@ _mark_iteration() # _chain() { - $AWK_PROG -v full_file=$seqres.full -v verify=$verify <$tmp.config ' + $AWK_PROG -v verify=$verify <$tmp.config ' BEGIN { nfile = 0 } /^\#/ { next } { file[nfile] = $1 @@ -210,7 +210,7 @@ END { srand('$iter') printf "if [ ! -f %s ]; then echo \"%s missing!\"; exit; fi\n",file[j],file[j] printf "if [ -f %s.0 ]; then echo \"%s.0 already present!\"; exit; fi\n",file[j],file[j] printf "cp %s %s.0 || exit 1\n",file[j],file[j] - printf "ls -i %s.0\n", file[j] >full_file; + printf "ls -i %s.0\n", file[j]; total_size += size[j] printf "# total size = %d\n", total_size } @@ -219,7 +219,7 @@ END { srand('$iter') printf "if [ ! -f %s.%d ]; then echo \"%s.%d missing!\"; exit; fi\n",file[j],link[j]-1,file[j],link[j]-1 printf "if [ -f %s.%d ]; then echo \"%s.%d already present!\"; exit; fi\n",file[j],link[j],file[j],link[j] printf "cp %s.%d %s.%d || exit 1\n",file[j],link[j]-1,file[j],link[j] - printf "ls -i %s.%d\n", file[j], link[j] >full_file; + printf "ls -i %s.%d\n", file[j], link[j]; total_size += size[j] printf "# total size = %d\n", total_size } @@ -231,7 +231,7 @@ END { srand('$iter') for (j=0; j 0) { printf "mv %s.%d %s.last\n",file[j],link[j]-1,file[j] - printf "ls -i %s.last\n", file[j] >full_file; + printf "ls -i %s.last\n", file[j]; } for (i=0; i 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 98032800E for ; Sat, 5 Apr 2014 08:00:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 20F7AAC003 for ; Sat, 5 Apr 2014 06:00:18 -0700 (PDT) X-ASG-Debug-ID: 1396702815-04cbb054b8abda40001-NocioJ Received: from mail-we0-f193.google.com (mail-we0-f193.google.com [74.125.82.193]) by cuda.sgi.com with ESMTP id pdxlAKC3tUqXbBF3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Apr 2014 06:00:16 -0700 (PDT) X-Barracuda-Envelope-From: spravce70@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.193 Received: by mail-we0-f193.google.com with SMTP id w61so1429649wes.4 for ; Sat, 05 Apr 2014 06:00:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=WOatJMZieWcgImuEoMRHQ1zYwFDA1/YMO6IHmS4Jbow=; b=El8DXeF0D6IEXqlX94P2dGbkRTQI9tpkjwQqzq35ioGA/6Sp4lYqIx/YbHzCksxDbK g+8sWoV6zzMZAmtvZHq7CzseBdvr516vy82fg+EELkO+gH86SY16Qnu7zOUKTM05s7d6 wghC6Bs7UZ7qMiIIcGMmf57xX0XBJUjYFvOZCkj1LCbU5iz73IMvmS30xhnS3aiAPkO4 9naRbHRKsXEhPdp3dXbfopXneQf17ej0GsKCngQFn+AhytM+oLNMCWPMEpk6PLuiUEQ7 +iaiHptKJerjt2oK32KmbBc0hlmBXgW5V8fcw0BmOQZwLdCZ0EnCM99/XygPgppma6gZ m2wQ== MIME-Version: 1.0 X-Received: by 10.194.21.193 with SMTP id x1mr27603500wje.33.1396702815532; Sat, 05 Apr 2014 06:00:15 -0700 (PDT) Received: by 10.217.86.70 with HTTP; Sat, 5 Apr 2014 06:00:15 -0700 (PDT) Date: Sat, 5 Apr 2014 14:00:15 +0100 Message-ID: Subject: poplach From: =?ISO-8859-1?Q?jednotka_spr=E1vce?= X-ASG-Orig-Subj: poplach To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=047d7b5d56102d3e0104f64b3778 X-Barracuda-Connect: mail-we0-f193.google.com[74.125.82.193] X-Barracuda-Start-Time: 1396702816 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4592 Rule breakdown below pts rule name 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 --047d7b5d56102d3e0104f64b3778 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: base64 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpVcG96b3Ju7G7tOiBUb3RvIGplIG96 buFtZW7tIHNlcnZpcyBvZCBzcHLhdm7taG8gc3T4ZWRpc2thDQpwb2t1ZCBqZGUgbyBk+Wxlvml0 6SBpbmZvcm1hY2UgbmEgc3b9Y2gg+uh0ZWNoIOhpIHNsdb5ieS4NCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KDQpW4b5lbv0geuFrYXpu7Wt1LA0KDQpQb2Rpdm7pIElQIHogamlu 6WhvIG3tc3RhIGJ5bGEgbmVk4XZubyBw+GlobOFzaXQgZG8gc3bpaG8gZS1tYWlsb3bpaG8g+uh0 dQ0KYSBteSBqc21lIHNlIHJvemhvZGxpIG9tZXppdCBzdvlqIProZXQgbmEgbmG57SBuZXVzdOFs 6SBzbmFoeSBjaHLhbml0IHN2+WoNCvroZXQsIGJ1ZGVtZSBzbGVkb3ZhdCBzdvlqIProZXQgcHJv IHD47XBhZG7pIHBvZHZvZG7pIOhpbm5vc3RpLg0KDQpW/XNsZWRrZW0gamUsIL5lIGpzbWUgc2Ug b2QgduFzIHZ5vmFkb3ZhdCBwb3R2cnplbu0gYSBvduz4aXQgaW5mb3JtYWNlIG8NCnZhuWVtIPro dHUgZG9rb27oZW7tbSBwcm9jZXN1IHBvdHZyemVu7S4NCg0KUPhpaGzhuWVu7SB3ZWJvdukgc3Ry 4W5reToNCkUtbWFpbDoNCmhlc2xvOg0KUmUtUG90dnJ6ZW7tIGhlc2xhOg0KDQpQb3NsYXQgdv25 ZSB1dmVkZW7pIGluZm9ybWFjZSBpaG5lZCwgbmVibyB24bkg+uhldCBidWRlIG9kcG9qZW4uDQoN ClMgcG96ZHJhdmVtLA0KT2Rib3IgcHJldmVuY2UgcG9kdm9k+Q0K --047d7b5d56102d3e0104f64b3778 Content-Type: text/html; charset=ISO-8859-2 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+VXBvem9y buxu7TogVG90byBqZSBvem7hbWVu7SBzZXJ2aXMgb2Qgc3By4XZu7WhvIHN0+GVkaXNrYTxicj5w b2t1ZCBqZGUgbyBk+Wxlvml06SBpbmZvcm1hY2UgbmEgc3b9Y2gg+uh0ZWNoIOhpIHNsdb5ieS48 YnI+DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj48YnI+VuG+ZW79IHrha2F6 bu1rdSw8YnI+PGJyPlBvZGl2bukgSVAgeiBqaW7paG8gbe1zdGEgYnlsYSBuZWThdm5vIHD4aWhs 4XNpdCBkbyBzdulobyBlLW1haWxvdulobyD66HR1IGEgbXkganNtZSBzZSByb3pob2RsaSBvbWV6 aXQgc3b5aiD66GV0IG5hIG5hue0gbmV1c3ThbOkgc25haHkgY2hy4W5pdCBzdvlqIProZXQsIGJ1 ZGVtZSBzbGVkb3ZhdCBzdvlqIProZXQgcHJvIHD47XBhZG7pIHBvZHZvZG7pIOhpbm5vc3RpLjxi cj4NCjxicj5W/XNsZWRrZW0gamUsIL5lIGpzbWUgc2Ugb2QgduFzIHZ5vmFkb3ZhdCBwb3R2cnpl bu0gYSBvduz4aXQgaW5mb3JtYWNlIG8gdmG5ZW0g+uh0dSBkb2tvbuhlbu1tIHByb2Nlc3UgcG90 dnJ6ZW7tLjxicj48YnI+UPhpaGzhuWVu7SB3ZWJvdukgc3Ry4W5reTo8YnI+RS1tYWlsOjxicj5o ZXNsbzo8YnI+UmUtUG90dnJ6ZW7tIGhlc2xhOjxicj48YnI+UG9zbGF0IHb9uWUgdXZlZGVu6SBp bmZvcm1hY2UgaWhuZWQsIG5lYm8gduG5IProZXQgYnVkZSBvZHBvamVuLjxicj4NCjxicj5TIHBv emRyYXZlbSw8YnI+T2Rib3IgcHJldmVuY2UgcG9kdm9k+Txicj48L2Rpdj4NCg== --047d7b5d56102d3e0104f64b3778-- From ywlqx@chinamold.org Sat Apr 5 08:32:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=FH_FROMEML_NOTLD, HTML_IMAGE_RATIO_02,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 4A0B17F69 for ; Sat, 5 Apr 2014 08:32:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3061A304043 for ; Sat, 5 Apr 2014 06:32:25 -0700 (PDT) X-ASG-Debug-ID: 1396704741-04cbb054b6ac01b0001-NocioJ Received: from smtp.ireland.lumisnia.biz (ireland.lumisnia.biz [192.129.201.182]) by cuda.sgi.com with ESMTP id QwS1e4TDfwV89VfA for ; Sat, 05 Apr 2014 06:32:21 -0700 (PDT) X-Barracuda-Envelope-From: ywlqx@chinamold.org X-Barracuda-Apparent-Source-IP: 192.129.201.182 Reply-To: peter@pf-mold.com Message-ID: From: PFMOLD To: Subject: China mold&molding Date: Sat, 5 Apr 2014 21:31:57 +0800 X-ASG-Orig-Subj: China mold&molding Mime-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_08E9_01BD9205.136FAA10" X-Priority: 1 X-MSMail-Priority: High X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7601.17609 X-Barracuda-Connect: ireland.lumisnia.biz[192.129.201.182] X-Barracuda-Start-Time: 1396704741 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.95 X-Barracuda-Spam-Status: No, SCORE=0.95 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA090e, EXTRA_MPART_TYPE, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4592 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 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 This is a multi-part message in MIME format. ------=_NextPart_000_08E9_01BD9205.136FAA10 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0742_01BD9205.136FAA10" ------=_NextPart_001_0742_01BD9205.136FAA10 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 RGVhciBGcmllbmRzLA0KDQpQRiBpcyBhIHByb2Zlc3Npb25hbCBJbmplY3Rpb24gTW9sZCwgUGxh c3RpYyBtb2xkaW5nLERpZS1jYXN0aW5nIG1hbnVmYWN0dXJlciB3aXRoIG1vcmUgdGhhbiBkZWNh ZGUgZXhwZXJpZW5jZSANCmxvY2F0ZWQgaW4gQ2hpbmEuIHdlIGFsc28gb2ZmZXIgQ05DcyBtYWNo aW5pbmcsUmFwaWQgUHJvdG90eXBpbmcsIHNpbGstc2NyZWVuIGFuZCBhc3NlbWJseSBzZXJ2aWNl cy4NCg0KT3VyIGFkdmFudGFnZXM6DQoNCjEtIFdlIHdpbGwgcXVvdGUgeW91ciBSRlEgd2l0aGlu ICAxMiBob3Vycy4NCjItIFdlIGhhdmUgcmljaCBleHByZWllbmNlIGZvciBETUUsSEFTQ08gc3Rh bmRhcmQuDQozLSBPdXIgODAlIG1vbGRzIGFyZSBleHBvcnRlZC4NCjQtIFdlIHByb3ZpZGUgb25l LXN0b3Agc2VydmljZTogZGVzaWduLCBtYW51ZmFjdHVyaW5nLCBzaWxrLXNjcmVuLCBwYWNrYWdl IGFuZCBkZWxpdmVyeS4NCjUtIEdvb2QgY29tbXVuaWNhdGlvbiB3aXRoIHJpY2ggZXhwZXJpZW5j ZSBzYWxlcyBhbmQgZW5naW5lZXIgaW4gRW5nbGlzaC4NCjYtIFF1YWxpdHksIGNvc3QgYW5kIGRl bGl2ZXJ5IGluIHRpbWUgYXJlIGFsbCBpbXBvcnRhbnQuDQoNCg0KRm9yIG1vcmUgaW5mb3JtYXRp b24gcGxlYXNlIHZpZXcgd3d3LnBmLW1vbGQuY29tIC4gTG9va2luZyBmb3J3YXJkIHRvIHlvdXIg UkZRLg0KDQpUaGFua3MgJiBCZXN0IHJlZ2FyZHMNCg0KUGV0ZXINClBGIEluZHVzdHJ5IENvLiwg TGltaXRlZC4gDQpUZWw6Kzg2LTc1NS0yODMyNjY1NiBGYXg6Kzg2LTc1NS0yODMyNjY1NQ0KV2Vi OiB3d3cucGYtbW9sZC5jb20gDQpFbWFpbDptYW5hZ2VyQHBmbW9sZC5jb20gIHBmbW9sZEBob3Rt YWlsLmNvbQ0KU2t5cGU6cGZtb2xkICgyNCBob3VycyBvbmxpbmUpDQoNCmlmIHlvdSBkb24ndCB3 YW50IHRvIHJlY2VpdmUgb3VyIGVtYWlsIGFnYWluo7pVbnN1YnNjcmliZQ0KDQoyMDE0LzQvNQ== ------=_NextPart_001_0742_01BD9205.136FAA10 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxodG1sIHhtbG5zOm8+PGhlYWQ+DQo8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNo YXJzZXQ9Z2IyMzEyIiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjwvaGVhZD4NCjxib2R5Pg0K PHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48c3BhbiANCnN0 eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9IkZP TlQtRkFNSUxZOiAiPjxmb250IA0KZmFjZT1BcmlhbD48Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAx MHB0Ij48Zm9udCBjb2xvcj1ibHVlPkRlYXIgDQpGcmllbmRzLDwvZm9udD48L2ZvbnQ+PC9mb250 Pjwvc3Bhbj48L3NwYW4+PC9wPg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBj bSAwY20gMHB0Ij48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxzcGFu IGxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250IA0KZmFjZT1BcmlhbD48Zm9u dCBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCANCmNvbG9yPWJsdWU+PC9mb250PjwvZm9u dD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj4mbmJzcDs8L3A+DQo8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5 bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xF X0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpm YWNlPUFyaWFsPjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGNvbG9yPWJsdWU+ UEYmbmJzcDtpcyBhIA0KcHJvZmVzc2lvbmFsPGIgc3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0 OiBub3JtYWwiPiBJbmplY3Rpb24gTW9sZCwgUGxhc3RpYyANCm1vbGRpbmcsRGllLWNhc3Rpbmcg bWFudWZhY3R1cmVyPC9iPiB3aXRoIG1vcmUgdGhhbiBkZWNhZGUgZXhwZXJpZW5jZSANCjxicj48 L2ZvbnQ+PC9mb250PjwvZm9udD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29r bWFyazogT0xFX0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+ PGZvbnQgDQpmYWNlPUFyaWFsPjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGNv bG9yPWJsdWU+bG9jYXRlZCBpbiBDaGluYS4gd2UgDQphbHNvIG9mZmVyIDxiIHN0eWxlPSJtc28t YmlkaS1mb250LXdlaWdodDogbm9ybWFsIj5DTkNzIG1hY2hpbmluZzwvYj4sPC9mb250PjxiIA0K c3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwiPjxmb250IGNvbG9yPWJsdWU+UmFw aWQgUHJvdG90eXBpbmcsIA0Kc2lsay1zY3JlZW4gYW5kIDwvZm9udD48L2I+PC9mb250PjwvZm9u dD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxMiI+ PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpmYWNlPUFyaWFs Pjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGNvbG9yPWJsdWU+PGIgDQpzdHls ZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+YXNzZW1ibHkmbmJzcDs8L2I+c2Vydmlj ZXMuPGJyPjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bhbj48L3NwYW4+PHNwYW4gDQpzdHlsZT0i bXNvLWJvb2ttYXJrOiBPTEVfTElOSzEyIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSJGT05ULUZB TUlMWTogIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMDAwMGZmIj48 Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4Ij48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEy cHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBG T05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMDAwMGZmIj48c3BhbiANCnN0eWxlPSJGT05ULVNJ WkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4gbGFuZz1FTi1VUyANCnN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6 IGJsdWUiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTkszIj48c3BhbiBzdHls ZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzQiPjxzcGFuIA0KbGFuZz1FTi1VUyANCnN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6 IGJsdWUiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxMiI+PHNwYW4gbGFu Zz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBDT0xPUjogIzAwMDBmZiI+PGZvbnQgc3R5bGU9IkZPTlQtU0laRTogMTJweCI+PGZvbnQg DQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWwiPjxmb250IA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJweDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzAwMDBmZiI+ PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWwiPjxicj48 Zm9udCBjb2xvcj1yZWQ+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB0OyBGT05ULUZBTUlM WTogQXJpYWw7IEZPTlQtVkFSSUFOVDogbm9ybWFsOyBWRVJUSUNBTC1BTElHTjogYmFzZWxpbmU7 IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6IGJsYWNrOyBG T05ULVNUWUxFOiBub3JtYWw7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9u dC1rZXJuaW5nOiAxMi4wcHQ7IGxhbmd1YWdlOiBlbi1VUzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5 OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tY29sb3ItaW5kZXg6IDE7 IHRleHQtY29tYmluZTogbGV0dGVyczsgbXNvLXRleHQtcmFpc2U6IDAlOyBtc28tc3R5bGUtdGV4 dG91dGxpbmUtdHlwZTogbm9uZTsgbXNvLXN0eWxlLXRleHRmaWxsLXR5cGU6IHNvbGlkOyBtc28t c3R5bGUtdGV4dGZpbGwtZmlsbC10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLXRleHRmaWxs LWZpbGwtY29sb3I6IGJsYWNrOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1hbHBoYTogMTAwLjAl Ij48Zm9udCANCmNvbG9yPWJsdWUgc2l6ZT0yPk91ciANCmFkdmFudGFnZXM6PGJyPjwvcD48L2Zv bnQ+PC9zcGFuPjwvZm9udD48L3NwYW4+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bh bj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2ZvbnQ+PC9mb250 PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6 IE9MRV9MSU5LMTIiPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250 IA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IHN0eWxlPSJG T05ULVNJWkU6IDEycHgiPjxmb250IA0Kc3R5bGU9IkZPTlQtU0laRTogMTJweDsgRk9OVC1GQU1J TFk6IEFyaWFsIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBB cmlhbDsgQ09MT1I6ICMwMDAwZmYiPjxzcGFuIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJweDsgRk9O VC1GQU1JTFk6IEFyaWFsIj48c3BhbiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZSI+PHNwYW4g DQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzMiPjxzcGFuIHN0eWxlPSJtc28tYm9va21h cms6IE9MRV9MSU5LNCI+PHNwYW4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZSI+PHNwYW4g DQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzEyIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxl PSJGT05ULUZBTUlMWTogIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAj MDAwMGZmIj48Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4Ij48Zm9udCANCnN0eWxlPSJGT05U LVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpF OiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMDAwMGZmIj48c3BhbiANCnN0eWxl PSJGT05ULVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgY29sb3I9cmVkPg0K PHAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyB1bmljb2RlLWJpZGk6IGVtYmVk OyBXT1JELUJSRUFLOiBub3JtYWw7IERJUkVDVElPTjogbHRyOyBURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDMuMzZwdCAwaW4gMHB0IDAuNThpbjsgTElORS1IRUlHSFQ6IG5vcm1hbDsgVEVYVC1J TkRFTlQ6IC0wLjU4aW47IGxhbmd1YWdlOiB6aC1DTjsgbXNvLWxpbmUtYnJlYWstb3ZlcnJpZGU6 IG5vbmU7IHB1bmN0dWF0aW9uLXdyYXA6IGhhbmdpbmciPjxmb250IA0KY29sb3I9Ymx1ZSBzaXpl PTI+PC9mb250PjwvcD4NCjxwIA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgdW5p Y29kZS1iaWRpOiBlbWJlZDsgV09SRC1CUkVBSzogbm9ybWFsOyBESVJFQ1RJT046IGx0cjsgVEVY VC1BTElHTjogbGVmdDsgTUFSR0lOOiAzLjM2cHQgMGluIDBwdCAwLjU4aW47IExJTkUtSEVJR0hU OiBub3JtYWw7IFRFWFQtSU5ERU5UOiAtMC41OGluOyBsYW5ndWFnZTogemgtQ047IG1zby1saW5l LWJyZWFrLW92ZXJyaWRlOiBub25lOyBwdW5jdHVhdGlvbi13cmFwOiBoYW5naW5nIj48c3BhbiAN CnN0eWxlPSJGT05ULVNJWkU6IDE0cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1WQVJJQU5U OiBub3JtYWw7IFZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IEZPTlQtV0VJR0hUOiBib2xkOyBDT0xPUjogYmxhY2s7IEZPTlQtU1RZTEU6IG5vcm1hbDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDEyLjBwdDsgbGFu Z3VhZ2U6IGVuLVVTOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250 LWZhbWlseTogQXJpYWw7IG1zby1jb2xvci1pbmRleDogMTsgdGV4dC1jb21iaW5lOiBsZXR0ZXJz OyBtc28tdGV4dC1yYWlzZTogMCU7IG1zby1zdHlsZS10ZXh0b3V0bGluZS10eXBlOiBub25lOyBt c28tc3R5bGUtdGV4dGZpbGwtdHlwZTogc29saWQ7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLXRo ZW1lY29sb3I6IHRleHQxOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1jb2xvcjogYmxhY2s7IG1z by1zdHlsZS10ZXh0ZmlsbC1maWxsLWFscGhhOiAxMDAuMCUiPjxmb250IA0KY29sb3I9Ymx1ZSBz aXplPTI+MS0gV2Ugd2lsbCBxdW90ZSB5b3VyIFJGUSB3aXRoaW4mbmJzcDsgMTIgDQpob3Vycy48 L2ZvbnQ+PC9zcGFuPjwvcD4NCjxwIA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsg dW5pY29kZS1iaWRpOiBlbWJlZDsgV09SRC1CUkVBSzogbm9ybWFsOyBESVJFQ1RJT046IGx0cjsg VEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAzLjM2cHQgMGluIDBwdCAwLjU4aW47IExJTkUtSEVJ R0hUOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAtMC41OGluOyBsYW5ndWFnZTogemgtQ047IG1zby1s aW5lLWJyZWFrLW92ZXJyaWRlOiBub25lOyBwdW5jdHVhdGlvbi13cmFwOiBoYW5naW5nIj48c3Bh biANCnN0eWxlPSJGT05ULVNJWkU6IDE0cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1WQVJJ QU5UOiBub3JtYWw7IFZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgVEVYVC1UUkFOU0ZPUk06IG5v bmU7IEZPTlQtV0VJR0hUOiBib2xkOyBDT0xPUjogYmxhY2s7IEZPTlQtU1RZTEU6IG5vcm1hbDsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDEyLjBwdDsg bGFuZ3VhZ2U6IGVuLVVTOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1m b250LWZhbWlseTogQXJpYWw7IG1zby1jb2xvci1pbmRleDogMTsgdGV4dC1jb21iaW5lOiBsZXR0 ZXJzOyBtc28tdGV4dC1yYWlzZTogMCU7IG1zby1zdHlsZS10ZXh0b3V0bGluZS10eXBlOiBub25l OyBtc28tc3R5bGUtdGV4dGZpbGwtdHlwZTogc29saWQ7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxs LXRoZW1lY29sb3I6IHRleHQxOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1jb2xvcjogYmxhY2s7 IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLWFscGhhOiAxMDAuMCUiPjxmb250IA0KY29sb3I9Ymx1 ZSBzaXplPTI+Mi0gV2UgaGF2ZSByaWNoIGV4cHJlaWVuY2UgZm9yIERNRSxIQVNDTyANCnN0YW5k YXJkLjwvZm9udD48L3NwYW4+PC9wPg0KPHAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046IGJhc2Vs aW5lOyB1bmljb2RlLWJpZGk6IGVtYmVkOyBXT1JELUJSRUFLOiBub3JtYWw7IERJUkVDVElPTjog bHRyOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDMuMzZwdCAwaW4gMHB0IDAuNThpbjsgTElO RS1IRUlHSFQ6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6IC0wLjU4aW47IGxhbmd1YWdlOiB6aC1DTjsg bXNvLWxpbmUtYnJlYWstb3ZlcnJpZGU6IG5vbmU7IHB1bmN0dWF0aW9uLXdyYXA6IGhhbmdpbmci PjxzcGFuIA0Kc3R5bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05U LVZBUklBTlQ6IG5vcm1hbDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBURVhULVRSQU5TRk9S TTogbm9uZTsgRk9OVC1XRUlHSFQ6IGJvbGQ7IENPTE9SOiBibGFjazsgRk9OVC1TVFlMRTogbm9y bWFsOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMTIu MHB0OyBsYW5ndWFnZTogZW4tVVM7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWNvbG9yLWluZGV4OiAxOyB0ZXh0LWNvbWJpbmU6 IGxldHRlcnM7IG1zby10ZXh0LXJhaXNlOiAwJTsgbXNvLXN0eWxlLXRleHRvdXRsaW5lLXR5cGU6 IG5vbmU7IG1zby1zdHlsZS10ZXh0ZmlsbC10eXBlOiBzb2xpZDsgbXNvLXN0eWxlLXRleHRmaWxs LWZpbGwtdGhlbWVjb2xvcjogdGV4dDE7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLWNvbG9yOiBi bGFjazsgbXNvLXN0eWxlLXRleHRmaWxsLWZpbGwtYWxwaGE6IDEwMC4wJSI+PGZvbnQgDQpjb2xv cj1ibHVlIHNpemU9Mj4zLSZuYnNwO091ciA4MCUgbW9sZHMgYXJlIGV4cG9ydGVkLjwvZm9udD48 L3NwYW4+PC9wPg0KPHAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyB1bmljb2Rl LWJpZGk6IGVtYmVkOyBXT1JELUJSRUFLOiBub3JtYWw7IERJUkVDVElPTjogbHRyOyBURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDMuMzZwdCAwaW4gMHB0IDAuNThpbjsgTElORS1IRUlHSFQ6IG5v cm1hbDsgVEVYVC1JTkRFTlQ6IC0wLjU4aW47IGxhbmd1YWdlOiB6aC1DTjsgbXNvLWxpbmUtYnJl YWstb3ZlcnJpZGU6IG5vbmU7IHB1bmN0dWF0aW9uLXdyYXA6IGhhbmdpbmciPjxzcGFuIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVZBUklBTlQ6IG5v cm1hbDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9O VC1XRUlHSFQ6IGJvbGQ7IENPTE9SOiBibGFjazsgRk9OVC1TVFlMRTogbm9ybWFsOyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMTIuMHB0OyBsYW5ndWFn ZTogZW4tVVM7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQtZmFt aWx5OiBBcmlhbDsgbXNvLWNvbG9yLWluZGV4OiAxOyB0ZXh0LWNvbWJpbmU6IGxldHRlcnM7IG1z by10ZXh0LXJhaXNlOiAwJTsgbXNvLXN0eWxlLXRleHRvdXRsaW5lLXR5cGU6IG5vbmU7IG1zby1z dHlsZS10ZXh0ZmlsbC10eXBlOiBzb2xpZDsgbXNvLXN0eWxlLXRleHRmaWxsLWZpbGwtdGhlbWVj b2xvcjogdGV4dDE7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLWNvbG9yOiBibGFjazsgbXNvLXN0 eWxlLXRleHRmaWxsLWZpbGwtYWxwaGE6IDEwMC4wJSI+PGZvbnQgDQpjb2xvcj1ibHVlIHNpemU9 Mj40LSBXZSBwcm92aWRlIG9uZS1zdG9wIHNlcnZpY2U6IGRlc2lnbiwgbWFudWZhY3R1cmluZywg DQpzaWxrLXNjcmVuLCBwYWNrYWdlIGFuZCBkZWxpdmVyeS48L2ZvbnQ+PC9zcGFuPjwvcD4NCjxw IA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgdW5pY29kZS1iaWRpOiBlbWJlZDsg V09SRC1CUkVBSzogbm9ybWFsOyBESVJFQ1RJT046IGx0cjsgVEVYVC1BTElHTjogbGVmdDsgTUFS R0lOOiAzLjM2cHQgMGluIDBwdCAwLjU4aW47IExJTkUtSEVJR0hUOiBub3JtYWw7IFRFWFQtSU5E RU5UOiAtMC41OGluOyBsYW5ndWFnZTogemgtQ047IG1zby1saW5lLWJyZWFrLW92ZXJyaWRlOiBu b25lOyBwdW5jdHVhdGlvbi13cmFwOiBoYW5naW5nIj48c3BhbiANCnN0eWxlPSJGT05ULVNJWkU6 IDE0cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1WQVJJQU5UOiBub3JtYWw7IFZFUlRJQ0FM LUFMSUdOOiBiYXNlbGluZTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJR0hUOiBib2xk OyBDT0xPUjogYmxhY2s7IEZPTlQtU1RZTEU6IG5vcm1hbDsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDEyLjBwdDsgbGFuZ3VhZ2U6IGVuLVVTOyBtc28t YXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWw7IG1z by1jb2xvci1pbmRleDogMTsgdGV4dC1jb21iaW5lOiBsZXR0ZXJzOyBtc28tdGV4dC1yYWlzZTog MCU7IG1zby1zdHlsZS10ZXh0b3V0bGluZS10eXBlOiBub25lOyBtc28tc3R5bGUtdGV4dGZpbGwt dHlwZTogc29saWQ7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLXRoZW1lY29sb3I6IHRleHQxOyBt c28tc3R5bGUtdGV4dGZpbGwtZmlsbC1jb2xvcjogYmxhY2s7IG1zby1zdHlsZS10ZXh0ZmlsbC1m aWxsLWFscGhhOiAxMDAuMCUiPjxmb250IA0KY29sb3I9Ymx1ZSBzaXplPTI+NS0gR29vZCBjb21t dW5pY2F0aW9uIHdpdGggcmljaCBleHBlcmllbmNlIHNhbGVzIGFuZCBlbmdpbmVlciANCmluIEVu Z2xpc2guPC9mb250Pjwvc3Bhbj48L3A+DQo8cCANCnN0eWxlPSJWRVJUSUNBTC1BTElHTjogYmFz ZWxpbmU7IHVuaWNvZGUtYmlkaTogZW1iZWQ7IFdPUkQtQlJFQUs6IG5vcm1hbDsgRElSRUNUSU9O OiBsdHI7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMy4zNnB0IDBpbiAwcHQgMC41OGluOyBM SU5FLUhFSUdIVDogbm9ybWFsOyBURVhULUlOREVOVDogLTAuNThpbjsgbGFuZ3VhZ2U6IHpoLUNO OyBtc28tbGluZS1icmVhay1vdmVycmlkZTogbm9uZTsgcHVuY3R1YXRpb24td3JhcDogaGFuZ2lu ZyI+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB0OyBGT05ULUZBTUlMWTogQXJpYWw7IEZP TlQtVkFSSUFOVDogbm9ybWFsOyBWRVJUSUNBTC1BTElHTjogYmFzZWxpbmU7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6IGJsYWNrOyBGT05ULVNUWUxFOiBu b3JtYWw7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAx Mi4wcHQ7IGxhbmd1YWdlOiBlbi1VUzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNv LWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tY29sb3ItaW5kZXg6IDE7IHRleHQtY29tYmlu ZTogbGV0dGVyczsgbXNvLXRleHQtcmFpc2U6IDAlOyBtc28tc3R5bGUtdGV4dG91dGxpbmUtdHlw ZTogbm9uZTsgbXNvLXN0eWxlLXRleHRmaWxsLXR5cGU6IHNvbGlkOyBtc28tc3R5bGUtdGV4dGZp bGwtZmlsbC10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLXRleHRmaWxsLWZpbGwtY29sb3I6 IGJsYWNrOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1hbHBoYTogMTAwLjAlIj48Zm9udCANCmNv bG9yPWJsdWUgc2l6ZT0yPjYtIFF1YWxpdHksIGNvc3QgYW5kIGRlbGl2ZXJ5IGluIHRpbWUgYXJl IGFsbCANCmltcG9ydGFudC48L2ZvbnQ+PC9zcGFuPjwvcD48L2ZvbnQ+PC9zcGFuPjwvZm9udD48 Zm9udCBjb2xvcj1ibHVlPg0KPHAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9Ik1BUkdJTjogMGNt IDBjbSAwcHQiPjxicj48L2ZvbnQ+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48 L2ZvbnQ+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwv c3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksx MiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09M T1I6IGJsdWUiPjxicj48Zm9udCANCmNvbG9yPWJsdWU+Rm9yIG1vcmUgaW5mb3JtYXRpb24gcGxl YXNlIHZpZXcgPC9mb250PjxhIA0KaHJlZj0iaHR0cDovL3d3dy5wZi1tb2xkLmNvbSI+PGZvbnQg Y29sb3I9Ymx1ZT53d3cucGYtbW9sZC5jb208L2ZvbnQ+PC9hPjxmb250IA0KY29sb3I9Ymx1ZT4m bmJzcDsuIExvb2tpbmcgZm9yd2FyZCB0byB5b3VyIA0KUkZRLjwvZm9udD48YnI+PC9zcGFuPjwv Zm9udD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksx MiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09M T1I6IGJsdWUiPjxicj48Zm9udCANCmNvbG9yPWJsdWU+VGhhbmtzICYgQmVzdCByZWdhcmRzPC9m b250Pjwvc3Bhbj48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz1Nc29Ob3JtYWwg c3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazog T0xFX0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQg DQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNl cmlmJzsgQ09MT1I6IGJsdWUiPjxmb250IA0KY29sb3I9Ymx1ZT48YnI+UGV0ZXI8L2ZvbnQ+PC9z cGFuPjwvZm9udD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xF X0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpz dHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1VUyAN CnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlm JzsgQ09MT1I6IGJsdWUiPjwvcD48L3NwYW4+PC9mb250Pjwvc3Bhbj48L3NwYW4+DQo8cCBjbGFz cz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxzcGFuIA0Kc3R5bGU9Im1z by1ib29rbWFyazogT0xFX0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1J TFk6ICI+PGZvbnQgDQpmYWNlPUFyaWFsPjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiIGNv bG9yPSMwMDAwZmY+PGZvbnQgY29sb3I9IzAwMDBmZj48c3BhbiANCnN0eWxlPSJGT05ULVNJWkU6 IDEwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4 OyBDT0xPUjogIzAwMDBmZiI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBDT0xPUjog IzAwMDBmZiI+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogOyBD T0xPUjogIzAwMDBmZiI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBDT0xPUjogIzAw MDBmZiI+PGZvbnQgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzMzOTk2NiI+ PHN0cm9uZz48Zm9udCBjb2xvcj1ibHVlPlBGIEluZHVzdHJ5IA0KQ28uLCBMaW1pdGVkLjwvZm9u dD48L3N0cm9uZz48c3Ryb25nPjxmb250IGNvbG9yPWJsdWU+IA0KPC9mb250Pjwvc3Ryb25nPjwv Zm9udD48L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2ZvbnQ+PC9m b250Pjwvc3Bhbj48L3NwYW4+PC9wPg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46 IDBjbSAwY20gMHB0Ij48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxz cGFuIGxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250IA0KZmFjZT1BcmlhbD48 Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0IiBjb2xvcj0jMDAwMGZmPjxmb250IGNvbG9yPSMw MDAwZmY+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB4OyBGT05ULUZBTUlMWTogQXJpYWwi Pjxmb250IA0Kc3R5bGU9IkZPTlQtU0laRTogMTJweDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IA0K c3R5bGU9IkZPTlQtU0laRTogMTJweDsgQ09MT1I6ICMwMDAwZmYiPjxzcGFuIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJweDsgRk9OVC1GQU1JTFk6IDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJweDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMzMzk5NjYiPjxzdHJvbmc+PGZvbnQgDQpjb2xvcj1ibHVl PlRlbDorODYtNzU1LTI4MzI2NjU2IA0KRmF4Ois4Ni03NTUtMjgzMjY2NTU8L2ZvbnQ+PC9zdHJv bmc+PC9mb250Pjwvc3Bhbj48L2ZvbnQ+PC9mb250PjwvZm9udD48L3A+DQo8ZGl2IHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiCh5EFyaWFsoeQ7IENPTE9SOiAjMDAwMGZmIj4N CjxkaXY+PGZvbnQgc2l6ZT0yPjxzcGFuIHN0eWxlPSJGT05ULUZBTUlMWTogIj48Zm9udCBjb2xv cj1ibHVlPldlYjogPC9mb250PjxhIA0KaHJlZj0iaHR0cDovL3d3dy5wZi1tb2xkLmNvbSI+PGZv bnQgY29sb3I9Ymx1ZT53d3cucGYtbW9sZC5jb208L2ZvbnQ+PC9hPjxmb250IA0KY29sb3I9Ymx1 ZT4mbmJzcDs8L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2Rpdj4NCjxkaXY+PGZvbnQgc2l6ZT0yPjxz cGFuIHN0eWxlPSJGT05ULUZBTUlMWTogIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEycHg7 IENPTE9SOiAjMDAwMGZmIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEycHg7IENPTE9SOiAj MDAwMGZmIj48Zm9udCANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMzM5OTY2 Ij48Zm9udCANCmNvbG9yPWJsdWU+RW1haWw6bWFuYWdlckBwZm1vbGQuY29tJm5ic3A7IDwvZm9u dD48YSANCmhyZWY9Im1haWx0bzpwZm1vbGRAaG90bWFpbC5jb20iPjxmb250IA0KY29sb3I9Ymx1 ZT5wZm1vbGRAaG90bWFpbC5jb208L2ZvbnQ+PC9hPjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bh bj48L2ZvbnQ+PC9kaXY+DQo8ZGl2Pjxmb250IHNpemU9Mj48c3BhbiBzdHlsZT0iRk9OVC1GQU1J TFk6ICI+PC9zcGFuPjwvZm9udD48c3BhbiANCmNsYXNzPWVjeE1zb0h5cGVybGluayANCnN0eWxl PSJGT05ULVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMzMzk5NjYiPjxm b250IA0KY29sb3I9Ymx1ZT5Ta3lwZTpwZm1vbGQgKDI0IGhvdXJzIG9ubGluZSk8YnIgDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICI+PC9mb250Pjwvc3Bhbj48c3BhbiBjbGFzcz1lY3hNc29IeXBlcmxp bmsgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAj MzM5OTY2Ij48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LNiI+PHNwYW4gc3R5 bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxMyI+PHNwYW4gDQpzdHlsZT0ibXNvLWJvb2ttYXJr OiBPTEVfTElOSzQ2Ij48c3BhbiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZTsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdCI+PC9kaXY+DQo8ZGl2 Pg0KPHA+PGZvbnQgY29sb3I9Ymx1ZT5pZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIG91ciBl bWFpbCBhZ2FpbqO6PC9mb250PjxhIA0KaHJlZj0iaHR0cDovL3d3dy5wZi1tZmcuY29tL3JldHVy bi9yZXR1cm4uYXNwP21haWxfaWQ9cGZtb2xkJmVtYWlsPXhmc0Bvc3Muc2dpLmNvbSIgDQp0YXJn ZXQ9X2JsYW5rPjxmb250IGNvbG9yPWJsdWU+VW5zdWJzY3JpYmU8L2ZvbnQ+PC9hPjwvcD4NCjxw Pjxmb250IGNvbG9yPWJsdWU+PGltZyBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgDQpzcmM9Imh0 dHA6Ly93d3cucGYtbWZnLmNvbS9yZXR1cm4vc3RhdC5hc3A/bWFpbF9pZD1wZm1vbGQmZW1haWw9 eGZzQG9zcy5zZ2kuY29tIiANCmFsaWduPWJhc2VsaW5lPjxicj4yMDE0LzQvNTwvZm9udD48L3A+ DQo8cD48Zm9udCBjb2xvcj1ibHVlPjxzcGFuIHN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5L MTIiPjxzcGFuIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgY29sb3I9 cmVkPjxpbWcgc3R5bGU9IkhFSUdIVDogMjIxcHg7IFdJRFRIOiAzMDZweCIgDQpib3JkZXI9MCBo c3BhY2U9MCBhbHQ9IiIgc3JjPSJjaWQ6MDAwMzMwRjMxMkVDXzAyOThDOEU1XzA2RjA5Njk0IiB3 aWR0aD03MzEgDQphbGlnbj1iYXNlbGluZSBoZWlnaHQ9NDg0PjxzcGFuIHN0eWxlPSJtc28tYm9v a21hcms6IE9MRV9MSU5LMTIiPjxzcGFuIA0KbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6 ICI+PGZvbnQgY29sb3I9cmVkPjxpbWcgDQpzdHlsZT0iSEVJR0hUOiAyMjFweDsgV0lEVEg6IDMx MXB4IiBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgDQpzcmM9ImNpZDowMDA2QkVGNEU5ODlfMDk2 RjM4QUJfMEUwRjM5MDAiIHdpZHRoPTg3OSBhbGlnbj1iYXNlbGluZSANCmhlaWdodD02NTc+PC9m b250Pjwvc3Bhbj48L3NwYW4+PC9mb250Pjwvc3Bhbj48L3NwYW4+PC9mb250PjwvcD48L3NwYW4+ PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9kaXY+PC9zcGFuPjwvZm9udD48L3NwYW4+PC9mb250Pjwv Zm9udD48L3NwYW4+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48IS0tZW5kZnJh Z21lbnQtLT48IS0tZW5kZnJhZ21lbnQtLT48L2Rpdj48L2JvZHk+PC9odG1sPg0K ------=_NextPart_001_0742_01BD9205.136FAA10-- ------=_NextPart_000_08E9_01BD9205.136FAA10 Content-Type: image/jpeg; name="mold.jpg" Content-Transfer-Encoding: base64 Content-ID: <000330F312EC_0298C8E5_06F09694> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAHmAtsDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5vkto lcjy0H4VWkhjA4RQPXFaE8fzH61WkUZI7VbRzJkUEETwkmNSQcZxUcsUYOAij6VZt12qy5681HIv zHipGQ28aEnKKfqKm8mLn92v5UyIbXqbnBFctS9zpp7FeWJBIhEa4yMjFdlLpFjcabIUtIVcoMMq AHniuOuB8hx1FdvpEnnaSp7GP+VOF2glocv8BBbapoGpJqVvHf3FlfpmS5USMUOAVJPbrXvPi3wP ob+HNS+y6LYQTfZmaOSK3VWU4yCCBxXz/wDBf/iX+OPGujnHzgzIufckEfgwr6jtmGpaHC3UTQYP 4rXS1eJHZnwn4gu7qG1k8u4mjZccq5BrovB1yb/w5ZTSkyy7SrO5ySQSOTWX41szaXuoQEf6uR0/ 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 ------=_NextPart_000_08E9_01BD9205.136FAA10 Content-Type: image/jpeg; name="plastic parts.jpg" Content-Transfer-Encoding: base64 Content-ID: <0006BEF4E989_096F38AB_0E0F3900> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAKSA28DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBRu+bC sTnFPQvtxl0PoBTRuV2y465FTZP/AD05PPSrehzNvUFTK/OWBHdu9TIgGQhP59KRHAB3MDkdxUiM xIPyqPp1rO91oPyHIXUY3yfQLUyMV3Dc5PvTBNjAJBI9jUy7cE5XNF/Im2uoJM/Tf196sbnUHcX4 54pioGG7Kg+op5XoDJgfzqbq9wt3FBc4PJA9TUmSSQwIzzyaYjDbnzefYVMrEHIKn1yKSaYeQ5XH 3irDvkGpROGBCyNu9AaB/wAA59RTkIAJ2qT2Pc0wsh6ykAAyygCniVmAIZ2H1pBwPuge3rUinjBX k+9TzXDlEBlYfcfp1yKlQKB824EHpUYBI+9sIz0FSJucDD9PUVXM+oW6D/3CnbySfenKsSNgF+en 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 2Q== ------=_NextPart_000_08E9_01BD9205.136FAA10-- From pocas.jamie@gmail.com Sat Apr 5 13:20:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBC867F87 for ; Sat, 5 Apr 2014 13:20:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CE758F804C for ; Sat, 5 Apr 2014 11:19:57 -0700 (PDT) X-ASG-Debug-ID: 1396721993-04bdf0743a104040001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id LnSDGo0S4hBtjKUw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 05 Apr 2014 11:19:54 -0700 (PDT) X-Barracuda-Envelope-From: pocas.jamie@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id c11so3400599lbj.26 for ; Sat, 05 Apr 2014 11:19:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=XOkzy03+onV2iuYfA3q1O0M4WQGd/t8DYxTnMYkI7t0=; b=f7tpJDoQVouk6MxrmqNJLH9FgJoRrUanRKks7EEA2H8JQ0kGRnjxbBlyVyCka4jrGg 3lkJAdfrBtN4QbW8tiGkpVV4WyUeZ9aCPZ56Ds6/e4wkX6dUrQyf2DfkVfyuUQb/BUnx DoIvqjoBKWITIPUH3ZG3vLsX/QuDu002J2E0EcrnanQXWIgir5x4zmHljaMALXG+OFcJ 1/+5M4dDDME1Wgc839NTSaLD5vd3/TVERcRYD5c4gd5J3F83TkMmHrW6CM6zfJeQmO7C iDmZ+cvKldj0CPRiKVKqlVoda0pBraBTWV13YgmcRI90tjQwtNedbthI9Lyp2Am45AcK lL3g== MIME-Version: 1.0 X-Received: by 10.112.24.9 with SMTP id q9mr13012322lbf.23.1396721993290; Sat, 05 Apr 2014 11:19:53 -0700 (PDT) Received: by 10.114.200.71 with HTTP; Sat, 5 Apr 2014 11:19:53 -0700 (PDT) In-Reply-To: <20140402044749.GK17603@dastard> References: <20140401204215.GG17603@dastard> <20140402044749.GK17603@dastard> Date: Sat, 5 Apr 2014 14:19:53 -0400 Message-ID: Subject: Re: xfs: invalid requests to request_fn from xfs_repair From: Jamie Pocas X-ASG-Orig-Subj: Re: xfs: invalid requests to request_fn from xfs_repair To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113437fc42962b04f64fae87 X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1396721994 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4597 Rule breakdown below pts rule name 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 --001a113437fc42962b04f64fae87 Content-Type: text/plain; charset=ISO-8859-1 On Wed, Apr 2, 2014 at 12:47 AM, Dave Chinner wrote: > > > > While iterating through segments in rq_for_each_segment(), for some > > > > requests I am seeing some odd behavior. > > > > > > > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 903 > // Ok, > > > > this looks normal > > > > segment 1: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 7 // > > > > Whoah... this doesn't look right to me > > > > > > Seems fine to me. There's absolutely no reason two separate IOs > > > can't be sub-page sector aligned or discontiguous given the above > > > configuration. If that's what the getblocks callback returned to the > > > DIO layer, then that's what you're going to see in the bios... > > > > > > > > I guess my assumption that sectors would be adjacent was invalid, but > this > > is what I have read in ldd3 and other books and seen in some driver > > examples. So I apologize for my folly and it's another lesson in not > > believing everything you see on the net. The back half of my driver is > > really optimized for transferring a single contiguous lba & transfer > length > > pair (ala SCSI WRITE 16 for example). However in desperation, I had > changed > > the driver to support requests like this (with disjoint sector ranges) > but > > it still seemed odd to me that occasionally some requests would even have > > multiple segments that would *write* the same sectors/lengths. For > example > > I also see requests like the following. > > > > Given: rq_data_dir(rq) == 1 (i.e. a write) > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Ok > > segment 1: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > > Again? > > segment 2: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > Yet > > again? > > segment 3: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > > Really? > > ... > > segment 126: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > > What's going on? > > // Reminder: segment limit is 128 > > segment 127: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 1 // > > Haha, bet you though I was going to say sector = 0! > > That really looks to me like a bug in whatever is building that iter > structure. It looks like there's an off-by-one on each page (should > be 8 sectors not 7) and the bi_sector is not being set correctly to > the sector offset of the bio within the IO. i.e. for a contiguous > IO it should look something like: > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 8 > segment 1: iter.bio->bi_sector = 8, blk_rq_cur_sectors(rq) = 8 > segment 2: iter.bio->bi_sector = 16, blk_rq_cur_sectors(rq) = 8 > .... > segment 127: iter.bio->bi_sector = 1016, blk_rq_cur_sectors(rq) = 8 > > I highly doubt the direct IO code is doing something wrong, because > a mapping bug like that would show up everywhere and not just in your > special driver.... > > I agree that the iterator *looks* wrong, Like I said earlier, I am just using the rq_for_each_segment() macro (defined in include/linux/blkdev.h and expands to a few dozen lines of code). This is the recommended way of iterating requests instead of using the lower level bio iterating functions or going it yourself which is why it's recommended to use that instead of going deeper and breaking compatibility when the kernel changes. I suspect it's the request itself which was constructed incorrectly, or contains bios that should not have been grouped into the same request, or contains bios that have their bi_sector set incorrectly. > > > The read syscall is for a byte offset (from the fd, set by lseek) > > > and a length, not a range of contiguous sectors on the device. That > > > off/len tuple gets mapped by the underlying filesystem or device > > > into an sector/len via a getblocks callback in the dio code and the > > > bios are then built according to the mappings that are returned. So > > > in many cases the IO that hits the block device looks nothing at all > > > like the IO that came from userspace. > > > > > > > > In general if I were reading a file I agree 100%, but this was the read > > call issued by xfs_repair to read the superblock directly from a block > > device. So I, perhaps wrongly, anticipated straightforward requests or > > maybe even a single 512k request coming down to the request_fn. I should > > have mentioned that this was observed while using xfs_repair earlier in > the > > email though, so no offense intended. There's more of the xfs_repair > strace > > in my response to your next comment below. It fails very early as you can > > imagine when xfs_repair can't read the superblock. > > I figured that this is what you were talking about, but remember > that the block device also does it's own offset->sector mapping in > the direct IO layer. So it's entirely possible that the mapping > function (i.e the getblocks callback) is broken and that is why you > are seeing weird mappings in the bios being built by the direct Io > code. > > This is the xfs_repair tool being run directly against a block device, so if I am reading the fs/direct-io.c code correctly this means that the mapping function (get_block_t) is using fs/block_dev.c:blkdev_get_block(). Is that correct? That function is very short and simple, so I can't imagine how there would be a bug in there. If it were a file on an xfs filesystem, the get_block_t callback would be xfs_get_blocks or xfs_get_blocks_direct (which both internally call __xfs_get_blocks). Is my understanding correct? --001a113437fc42962b04f64fae87 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable


On Wed, Apr 2, 2014 at 12:47 AM, Dave Chinner <david@fromorbit.com> wrote:
> > > While iterating through segments = in rq_for_each_segment(), for some
> > > requests I am seeing some odd behavior.
> > >
> > > segment 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(= rq) =3D 903 =A0 // Ok,
> > > this looks normal
> > > segment 1: iter.bio->bi_sector =3D 1023, blk_rq_cur_secto= rs(rq) =3D 7 //
> > > Whoah... this doesn't look right to me
> >
> > Seems fine to me. There's absolutely no reason two separate I= Os
> > can't be sub-page sector aligned or discontiguous given the a= bove
> > configuration. If that's what the getblocks callback returned= to the
> > DIO layer, then that's what you're going to see in the bi= os...
> >
> >
> I guess my assumption that sectors would be adjacent was invalid, but = this
> is what I have read in ldd3 and other books and seen in some driver > examples. So I apologize for my folly and it's another lesson in n= ot
> believing everything you see on the net. The back half of my driver is=
> really optimized for transferring a single contiguous lba & transf= er length
> pair (ala SCSI WRITE 16 for example). However in desperation, I had ch= anged
> the driver to support requests like this (with disjoint sector ranges)= but
> it still seemed odd to me that occasionally some requests would even h= ave
> multiple segments that would *write* the same sectors/lengths. For exa= mple
> I also see requests like the following.
>
> Given: rq_data_dir(rq) =3D=3D 1 (i.e. a write)
> segment =A0 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0// Ok
> segment =A0 1: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0//
> Again?
> segment =A0 2: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0// Yet
> again?
> segment =A0 3: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0//
> Really?
> ...
> segment 126: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D = 7 =A0 =A0//
> What's going on?
> // Reminder: segment limit is 128
> segment 127: iter.bio->bi_sector =3D 1023, blk_rq_cur_sectors(rq) = =3D 1 //
> Haha, bet you though I was going to say sector =3D 0!

That really looks to me like a bug in whatever is building that= iter
structure. It looks like there's an off-by-one on each page (should
be 8 sectors not 7) and the bi_sector is not being set correctly to
the sector offset of the bio within the IO. i.e. for a contiguous
IO it should look something like:

segment =A0 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D 8 segment =A0 1: iter.bio->bi_sector =3D 8, blk_rq_cur_sectors(rq) =3D 8 segment =A0 2: iter.bio->bi_sector =3D 16, blk_rq_cur_sectors(rq) =3D 8<= br> ....
segment 127: iter.bio->bi_sector =3D 1016, blk_rq_cur_sectors(rq) =3D 8<= br>
I highly doubt the direct IO code is doing something wrong, because
a mapping bug like that would show up everywhere and not just in your
special driver....


I agree that the iterator *= looks* wrong, Like I said earlier, I am just using the rq_for_each_segment(= ) macro (defined in include/linux/blkdev.h and expands to a few dozen lines= of code). This is the recommended way of iterating requests instead of usi= ng the lower level bio iterating functions or going it yourself which is wh= y it's recommended to use that instead of going deeper and breaking com= patibility when the kernel changes. I suspect it's the request itself w= hich was constructed incorrectly, or contains bios that should not have bee= n grouped into the same request, or contains bios that have their bi_sector= set incorrectly.
=A0
> > The read syscall is for a byte offset (from the fd, set by lseek)=
> > and a length, not a range of contiguous sectors on the device. Th= at
> > off/len tuple gets mapped by the underlying filesystem or device<= br> > > into an sector/len via a getblocks callback in the dio code and t= he
> > bios are then built according to the mappings that are returned. = So
> > in many cases the IO that hits the block device looks nothing at = all
> > like the IO that came from userspace.
> >
> >
> In general if I were reading a file I agree 100%, but this was the rea= d
> call issued by xfs_repair to read the superblock directly from a block=
> device. So I, perhaps wrongly, anticipated straightforward requests or=
> maybe even a single 512k request coming down to the request_fn. I shou= ld
> have mentioned that this was observed while using xfs_repair earlier i= n the
> email though, so no offense intended. There's more of the xfs_repa= ir strace
> in my response to your next comment below. It fails very early as you = can
> imagine when xfs_repair can't read the superblock.

I figured that this is what you were talking about, but remember
that the block device also does it's own offset->sector mapping in the direct IO layer. So it's entirely possible that the mapping
function (i.e the getblocks callback) is broken and that is why you
are seeing weird mappings in the bios being built by the direct Io
code.


This is the xfs_repair tool= being run directly against a block device, so if I am reading the fs/direc= t-io.c code correctly this means that the mapping function (get_block_t) is= using fs/block_dev.c:blkdev_get_block(). Is that correct? That function is= very short and simple, so I can't imagine how there would be a bug in = there. If it were a file on an xfs filesystem, the get_block_t callback wou= ld be xfs_get_blocks or xfs_get_blocks_direct (which both internally call _= _xfs_get_blocks). Is my understanding correct?

--001a113437fc42962b04f64fae87-- From shelleystoll@centurylink.net Sun Apr 6 01:07:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 DB37E7F72 for ; Sun, 6 Apr 2014 01:07:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E533AC001 for ; Sat, 5 Apr 2014 23:07:33 -0700 (PDT) X-ASG-Debug-ID: 1396764451-04bdf05dabd176a0001-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id 9FoeeO4StMu5P1HI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 05 Apr 2014 23:07:32 -0700 (PDT) X-Barracuda-Envelope-From: shelleystoll@centurylink.net X-Barracuda-Apparent-Source-IP: 205.219.233.9 DKIM-Signature: v=1; a=rsa-sha1; d=centurylink.net; s=ctl201402; c=relaxed/simple; q=dns/txt; i=@centurylink.net; t=1396764451; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=4u/+dLPf9s7J54AvuRy6c0sHqc4=; b=aqfsJZc0bcGYHfiQAapc8F5zM2ubSKVczv/zEi24ePRyMksp7JH/YoGSxOB+vacK YeygyawNLqSSFHyFjyPXnWPS4VJJWQ56177z25asmBibcj/fyZiXehgjgKTBH3Ux Rfz58fhO0vHARl9G9DiDdITwHolCkqo+3pEXya8hJK5/iltLYz/Lvk1GjzL2qHLV YwB9lKdi14uo6P33KE8leinqXi2wv65n6dPkRRXYqeG9c4SIaCHno22wVTXB8sup uHTdEt8VI3EhmivSfvpsUknsz3ojYQ+87mSlYPQLPSsh9658Bsrf2tdtQnGKDr8M I9paiiEmyHUyHtU1pSUJyw==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=Odca/2vY c=1 sm=1 a=FKkrIqjQGGEA:10 a=YTHtZiAxaJsA:10 a=MzwfC8u3ySIA:10 a=I_5RNyk1AAAA:8 a=-QcuZwI7RXoEWNwVY98A:9 a=QEXdDO2ut3YA:10 a=jPGQmDyKrkUA:10 a=6kyDnRRGWDYA:10 a=jajOwhiGRwo8t67hjKMA:9 a=_W_S_7VecoQA:10 a=i4PDXFCCRecA:10 a=o7mz3cH5LgUA:10 a=zLzno4ilJRxFgvUXMpLPGQ==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: c2hlbGxleXN0b2xsQGNlbnR1cnlsaW5rLm5ldA== Authentication-Results: smtp02.agate.dfw.synacor.com header.from=shelleystoll@centurylink.net; sender-id=neutral Authentication-Results: smtp02.agate.dfw.synacor.com smtp.mail=shelleystoll@centurylink.net; spf=neutral; sender-id=neutral Received-SPF: neutral (smtp02.agate.dfw.synacor.com: 10.40.66.5 is neither permitted nor denied by domain of centurylink.net) Received: from [10.40.66.5] ([10.40.66.5:52909] helo=md38.agate.dfw.synacor.com) by smtp.centurylink.net (envelope-from ) (ecelerity 3.5.1.37854 r(Momo-dev:3.5.1.0)) with ESMTP id 97/D9-11309-22FE0435; Sun, 06 Apr 2014 02:07:30 -0400 Date: Sun, 6 Apr 2014 02:07:30 -0400 (EDT) From: Mrs Aliyah To: info@me.org Message-ID: <634650642.59100051.1396764450009.JavaMail.root@centurylink.net> Subject: RE: MIME-Version: 1.0 X-ASG-Orig-Subj: RE: Content-Type: multipart/alternative; boundary="----=_Part_59100050_179431290.1396764450008" X-Originating-IP: [10.40.0.30] X-Mailer: Zimbra 7.2.2_GA_2852 (ZimbraWebClient - FF3.0 (Win)/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1396764452 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4613 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_59100050_179431290.1396764450008 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit -- i have an inheritance for you contact me ------=_Part_59100050_179431290.1396764450008 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit


--
i have an inheritance for you contact me
------=_Part_59100050_179431290.1396764450008-- From anastasiou@teiser.gr Mon Apr 7 03:24:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 553CB7F56 for ; Mon, 7 Apr 2014 03:24:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26B0A30404E for ; Mon, 7 Apr 2014 01:24:15 -0700 (PDT) X-ASG-Debug-ID: 1396859052-04bdf05daad77010001-NocioJ Received: from teiser.gr (mail.teiser.gr [195.130.67.2]) by cuda.sgi.com with ESMTP id yTe4WEzIyt0ztNXA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 07 Apr 2014 01:24:13 -0700 (PDT) X-Barracuda-Envelope-From: anastasiou@teiser.gr X-Barracuda-Apparent-Source-IP: 195.130.67.2 Received: from mail.teiser.gr ([195.130.67.2]) by teiser.gr with esmtpa (Exim 4.72 (FreeBSD)) (envelope-from ) id 1WX4mz-000IzU-A6; Mon, 07 Apr 2014 11:20:21 +0300 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Mon, 07 Apr 2014 10:20:21 +0200 From: Karin LOCK To: undisclosed-recipients:; Subject: =?UTF-8?Q?=CF=80=CF=81=CE=BF=CF=83=CF=86=CE=BF=CF=81=CE=AC=20?= =?UTF-8?Q?=CE=B4=CE=B1=CE=BD=CE=B5=CE=AF=CE=BF=CF=85=20=CF=83=CE=B5=20=32?= =?UTF-8?Q?=25?= Reply-To: lockkarin@gmail.com X-ASG-Orig-Subj: =?UTF-8?Q?=CF=80=CF=81=CE=BF=CF=83=CF=86=CE=BF=CF=81=CE=AC=20?= =?UTF-8?Q?=CE=B4=CE=B1=CE=BD=CE=B5=CE=AF=CE=BF=CF=85=20=CF=83=CE=B5=20=32?= =?UTF-8?Q?=25?= Mail-Reply-To: lockkarin@gmail.com Message-ID: X-Sender: anastasiou@teiser.gr User-Agent: RoundCube Webmail/0.2 X-Barracuda-Connect: mail.teiser.gr[195.130.67.2] X-Barracuda-Start-Time: 1396859053 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4646 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA620a Custom Rule SA620a 0.20 BSF_SC7_SA298e Custom Rule SA298e -- Γεια σας, Σας ενδιαφέÏει σε ένα οικονομικό δάνειο στο 2%; επικοινωνήστε μαζί μου για λεπτομέÏειες και Ï€Ïοϋποθέσεις. ταχυδÏομείο μου: lockkarin@gmail.com σας ευχαÏιστώ From linkinjeon@gmail.com Mon Apr 7 09:11:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C33FE7F4E for ; Mon, 7 Apr 2014 09:11:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27E88AC009 for ; Mon, 7 Apr 2014 07:11:52 -0700 (PDT) X-ASG-Debug-ID: 1396879909-04cbb054b6b78d20001-NocioJ Received: from mail-qg0-f47.google.com (mail-qg0-f47.google.com [209.85.192.47]) by cuda.sgi.com with ESMTP id LYFCE4QBXm4sJ50w (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Apr 2014 07:11:50 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.47 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.47] Received: by mail-qg0-f47.google.com with SMTP id i50so758139qgf.6 for ; Mon, 07 Apr 2014 07:11:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.47] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.47] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=BIAYeSFwkiwj0u3VUrsTKbNwCsfCKaQjRYREBZSwSZs=; b=Q1sisIbCjDx3Pd66PVYhktuuq3bd9Ds3pIXoJ68VKhgHjgG1RC9bLqtPipMNJyGTe9 ZsqzR5aW0sx0n38ePHRbl6gKQxbWpf9Ni+usv1pDTp+4H1w9MK0AeMNwQjE/Wzcsm5HB hk/bv+rVCOXHm5wfaM1PyBz0U19GbGwTeZo9dU35/bcoNPPnhXAh60gJb6/OoaR+DmUM GRkTPqzRpwAHiNrUBLa8B+xZtMUmHuL50ZDsoZsaxDPquirhC/KlTdmjWMfg4fXDSwQQ Be/ylQLJVsL3eRFrxKpBLfh7yjY1cUz+igQi+xnBSC7jnTNQQCi38nw40zV1Jwby/RwR 5xfg== MIME-Version: 1.0 X-Received: by 10.229.214.74 with SMTP id gz10mr3970350qcb.19.1396879909597; Mon, 07 Apr 2014 07:11:49 -0700 (PDT) Received: by 10.96.18.167 with HTTP; Mon, 7 Apr 2014 07:11:49 -0700 (PDT) In-Reply-To: <20140404203521.GA15122@laptop.bfoster> References: <1396277668-10861-1-git-send-email-linkinjeon@gmail.com> <20140404203521.GA15122@laptop.bfoster> Date: Mon, 7 Apr 2014 23:11:49 +0900 Message-ID: Subject: Re: [PATCH 2/3] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate From: Namjae Jeon X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate To: Brian Foster Cc: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com, Namjae Jeon , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Ashish Sangwan , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qg0-f47.google.com[209.85.192.47] X-Barracuda-Start-Time: 1396879910 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4652 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature >> + >> +int >> +xfs_bmap_split_extent( >> + struct xfs_inode *ip, >> + xfs_fileoff_t split_fsb, >> + xfs_extnum_t *split_ext) >> +{ >> + struct xfs_mount *mp = ip->i_mount; >> + struct xfs_trans *tp; >> + struct xfs_bmap_free free_list; >> + xfs_fsblock_t firstfsb; >> + int committed; >> + int error; >> + >> + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); >> + tp->t_flags |= XFS_TRANS_RESERVE; > > Any reason this (or the other cases) has to be reserve enabled? Hi Brian. No Particular reason apart from following the same pattern we used in collapse range patches. During Collapse range review, Dave Chinner also suggested that we should not use reserved pool: "This probably shouldn't use XFS_TRANS_RESERVE. If we are at ENOSPC, then the operation simply fails. Yes, we've already punched the hole, so we shouldn't get ENOSPC here, but I don't think it's worth dipping into the reserve pool as it has much more important uses..." I will remove this and from other places in next version. (and probably the same need to be done for collapse range) > >> + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, >> + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); >> + >> + /* >> + * check for running out of space >> + */ >> + if (error) { >> + /* >> + * Free the transaction structure. >> + */ >> + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); >> + xfs_trans_cancel(tp, 0); >> + return error; >> + } >> + >> + xfs_ilock(ip, XFS_ILOCK_EXCL); >> + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, >> + ip->i_gdquot, ip->i_pdquot, >> + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, >> + XFS_QMOPT_RES_REGBLKS); >> + if (error) >> + goto error1; > > We should probably have an xfs_qm_dqattach() call before we get here. As > it is, it looks like the first one is in xfs_alloc_file_space(). Okay, I will check about this point. > >> + >> +/* >> + * Shift extent records to the right to make a hole. >> + * The maximum number of extents to be shifted in a single operation >> + * is @num_exts, and @current_ext keeps track of the current extent >> + * index we have shifted. @offset_shift_fsb is the length by which each >> + * extent is shifted. @end_ext is the last extent to be shifted. >> + */ >> +int >> +xfs_bmap_shift_extents_right( >> + struct xfs_trans *tp, >> + struct xfs_inode *ip, >> + int *done, >> + xfs_fileoff_t offset_shift_fsb, >> + xfs_extnum_t *current_ext, >> + xfs_extnum_t end_ext, >> + xfs_fsblock_t *firstblock, >> + struct xfs_bmap_free *flist, >> + int num_exts) >> +{ >> + struct xfs_mount *mp = ip->i_mount; >> + struct xfs_btree_cur *cur; >> + struct xfs_bmbt_rec_host *gotp; >> + struct xfs_bmbt_irec got; >> + struct xfs_bmbt_irec right; >> + xfs_ifork_t *ifp; >> + xfs_fileoff_t startoff; >> + xfs_filblks_t blockcount = 0; >> + int error = 0; >> + int i; >> + int whichfork = XFS_DATA_FORK; >> + int logflags; >> + >> + if (unlikely(XFS_TEST_ERROR( >> + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && >> + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), >> + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { >> + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", >> + XFS_ERRLEVEL_LOW, mp); >> + return XFS_ERROR(EFSCORRUPTED); >> + } >> + >> + if (XFS_FORCED_SHUTDOWN(mp)) >> + return XFS_ERROR(EIO); >> + >> + ASSERT(current_ext != NULL); >> + >> + /* We are going to change core inode */ >> + logflags = XFS_ILOG_CORE; >> + ifp = XFS_IFORK_PTR(ip, whichfork); >> + >> + if (ifp->if_flags & XFS_IFBROOT) { >> + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); >> + cur->bc_private.b.firstblock = *firstblock; >> + cur->bc_private.b.flist = flist; >> + cur->bc_private.b.flags = 0; >> + } else { >> + cur = NULL; >> + logflags |= XFS_ILOG_DEXT; >> + } >> + >> + /* start shifting extents to right */ >> + while (num_exts-- > 0) { >> + if (*current_ext < end_ext) { >> + *done = 1; >> + break; >> + } >> + >> + gotp = xfs_iext_get_ext(ifp, *current_ext); >> + xfs_bmbt_get_all(gotp, &got); >> + startoff = got.br_startoff + offset_shift_fsb; >> + >> + /* >> + * Before shifting extent into hole, make sure that the hole >> + * is large enough to accomodate the shift. This checking has >> + * to be performed for all except the last extent. >> + */ >> + if ((XFS_IFORK_NEXTENTS(ip, whichfork) - 1) != *current_ext) { >> + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, >> + *current_ext + 1), &right); >> + if (startoff + got.br_blockcount > right.br_startoff) { >> + error = XFS_ERROR(EINVAL); >> + if (error) >> + goto del_cursor; >> + } >> + } >> + >> + /* Check if we can merge 2 adjacent extents */ >> + if ((XFS_IFORK_NEXTENTS(ip, whichfork) - 1) != *current_ext && >> + right.br_startoff == startoff + got.br_blockcount && >> + right.br_startblock == >> + got.br_startblock + got.br_blockcount && >> + right.br_state == got.br_state && >> + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { >> + blockcount = right.br_blockcount + got.br_blockcount; >> + >> + /* Make cursor point to the extent we will update */ >> + if (cur) { >> + error = xfs_bmbt_lookup_eq(cur, >> + right.br_startoff, >> + right.br_startblock, >> + right.br_blockcount, >> + &i); >> + if (error) >> + goto del_cursor; >> + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); >> + } >> + >> + xfs_iext_remove(ip, *current_ext + 1, 1, 0); >> + if (cur) { >> + error = xfs_btree_delete(cur, &i); >> + if (error) >> + goto del_cursor; >> + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); >> + } >> + XFS_IFORK_NEXT_SET(ip, whichfork, >> + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); >> + >> + } >> + >> + if (cur) { >> + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, >> + got.br_startblock, >> + got.br_blockcount, >> + &i); >> + if (error) >> + goto del_cursor; >> + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); >> + } >> + >> + if (got.br_blockcount < blockcount) { >> + xfs_bmbt_set_blockcount(gotp, blockcount); >> + got.br_blockcount = blockcount; >> + } > > A comment would be nice here for this bit that fixes up the blockcount > in the extent merge case. You also probably want to reset blockcount. ;) Right. Blockcount needs to be reset. Although we are shifting just a single extent, It does not matter in current situation. But as a generic API for shifting extents, It is better to reset the blockcount. > >> + >> + >> + xfs_bmbt_set_startoff(gotp, startoff); >> + got.br_startoff = startoff; >> + >> + if (cur) { >> + error = xfs_bmbt_update(cur, got.br_startoff, >> + got.br_startblock, >> + got.br_blockcount, >> + got.br_state); >> + if (error) >> + goto del_cursor; >> + } >> + >> + (*current_ext)--; >> + } >> + >> +del_cursor: >> + if (cur) >> + xfs_btree_del_cursor(cur, >> + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); >> + xfs_trans_log_inode(tp, ip, logflags); >> + return error; >> +} >> diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h >> index f84bd7a..91ca1a7 100644 >> --- a/fs/xfs/xfs_bmap.h >> +++ b/fs/xfs/xfs_bmap.h >> @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct >> xfs_inode *ip, >> int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, >> xfs_extnum_t num); >> uint xfs_default_attroffset(struct xfs_inode *ip); >> -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, >> +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode >> *ip, >> int *done, xfs_fileoff_t start_fsb, >> xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, >> xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, >> int num_exts); >> +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t >> split_offset, >> + xfs_extnum_t *split_ext); >> +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode >> *ip, >> + int *done, xfs_fsblock_t offset_shift_fsb, >> + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, >> + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, >> + int num_exts); >> >> #endif /* __XFS_BMAP_H__ */ >> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c >> index 01f6a64..8b10d6d 100644 >> --- a/fs/xfs/xfs_bmap_util.c >> +++ b/fs/xfs/xfs_bmap_util.c >> @@ -1539,7 +1539,7 @@ xfs_collapse_file_space( >> * We are using the write transaction in which max 2 bmbt >> * updates are allowed >> */ >> - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, >> + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, >> shift_fsb, ¤t_ext, >> &first_block, &free_list, >> XFS_BMAP_MAX_SHIFT_EXTENTS); >> @@ -1563,6 +1563,127 @@ out: >> } >> >> /* >> + * xfs_insert_file_space() >> + * This routine allocate disk space and shift extent for the given file. >> + * The first thing we do is to sync dirty data and invalidate page cache >> + * over the region on which insert range is working. And split an extent >> + * to two extents at given offset by calling xfs_bmap_split_extent. >> + * And shift all extent records which are laying between [offset, >> + * last allocated extent] to the right to reserve hole range. Lastly >> + * allocate an unwritten extent in hole range created by shifting >> extents. >> + * >> + * RETURNS: >> + * 0 on success >> + * errno on error >> + * >> + */ >> +int >> +xfs_insert_file_space( >> + struct xfs_inode *ip, >> + loff_t offset, >> + loff_t len) >> +{ >> + struct xfs_mount *mp = ip->i_mount; >> + struct xfs_trans *tp; >> + struct xfs_bmap_free free_list; >> + xfs_fsblock_t first_block; >> + int done = 0; >> + int committed; >> + int error; >> + uint rounding; >> + xfs_fileoff_t start_fsb; >> + xfs_fileoff_t shift_fsb; >> + xfs_extnum_t split_ext; >> + xfs_extnum_t current_ext = 0; >> + xfs_off_t ioffset; >> + >> + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); >> + trace_xfs_insert_file_space(ip); >> + >> + /* wait for the completion of any pending DIOs */ >> + inode_dio_wait(VFS_I(ip)); >> + >> + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); >> + ioffset = offset & ~(rounding - 1); >> + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, >> + ioffset, -1); >> + if (error) >> + return error; >> + truncate_pagecache_range(VFS_I(ip), ioffset, -1); >> + >> + start_fsb = XFS_B_TO_FSB(mp, offset); >> + shift_fsb = XFS_B_TO_FSB(mp, len); >> + >> + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); >> + if (error) >> + return error; >> + >> + current_ext = XFS_IFORK_NEXTENTS(ip, XFS_DATA_FORK) - 1; >> + while (!error && !done) { >> + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); >> + tp->t_flags |= XFS_TRANS_RESERVE; >> + /* >> + * We would need to reserve permanent block for transaction. >> + * This will come into picture when after shifting extent into >> + * hole we found that adjacent extents can be merged which >> + * may lead to freeing of a block during record update. >> + */ >> + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, >> + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); >> + if (error) { >> + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); >> + xfs_trans_cancel(tp, 0); >> + break; >> + } >> + >> + xfs_ilock(ip, XFS_ILOCK_EXCL); >> + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, >> + ip->i_gdquot, ip->i_pdquot, >> + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, >> + XFS_QMOPT_RES_REGBLKS); >> + if (error) >> + goto error1; >> + >> + xfs_trans_ijoin(tp, ip, 0); >> + >> + xfs_bmap_init(&free_list, &first_block); >> + >> + /* >> + * We are using the write transaction in which max 2 bmbt >> + * updates are allowed >> + */ >> + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, >> + ¤t_ext, split_ext, >> + &first_block, &free_list, >> + XFS_BMAP_MAX_SHIFT_EXTENTS); >> + if (error) >> + goto error0; >> + >> + error = xfs_bmap_finish(&tp, &free_list, &committed); >> + if (error) >> + goto error0; >> + >> + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); >> + if (error) >> + goto out; >> + } >> + >> + /* make unwritten extent in a hole range. */ >> + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); > > There is potential for this to fail with ENOSPC or due to quota after > we've already inserted the address range in the file and moved the > extent over. Are we Ok with that behavior? > > Even if so, what is the caller left with? Even though I think it would > be nicer if we were to fail in that scenario sooner, I could understand > if we completed the extent shift and just left a hole in the inserted > region. As it is, it looks like the caller will skip updating the file > size and thus some file data might fall after EOF, which is probably not > what we want. I don't know if it's worth worrying about the same thing > if we happen to fail earlier in the middle of shifting extents over..? Good point. We should not skip updating the file size even if we fail after shifting a single extent. i.e. even if there is a single successful shift, there has to be inode size update otherwise the user will loose data. Failing in between the extent shifting will have the same effect as with collapse range. We will end up with a hole somewhere between the EOF and the shift start point. This is the limitation with journal filesystem where we have to reserve journal blocks in advance and commit transactions in between the shifting operation. If a user is well equipped with xfs_bmap, He can still reissue insert range commands after checking the files's extent tree. Thanks for review! > > Brian > >> + >> +out: >> + return error; >> + >> +error0: >> + xfs_bmap_cancel(&free_list); >> +error1: >> + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); >> + return error; >> +} >> + >> +/* >> * We need to check that the format of the data fork in the temporary >> inode is >> * valid for the target inode before doing the swap. This is not a >> problem with >> * attr1 because of the fixed fork offset, but attr2 has a dynamically >> sized >> diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h >> index 935ed2b..d62ab4b 100644 >> --- a/fs/xfs/xfs_bmap_util.h >> +++ b/fs/xfs/xfs_bmap_util.h >> @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, >> xfs_off_t offset, >> xfs_off_t len); >> int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, >> xfs_off_t len); >> +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, >> + xfs_off_t len); >> >> /* EOF block manipulation functions */ >> bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); >> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c >> index 003c005..6603b36 100644 >> --- a/fs/xfs/xfs_file.c >> +++ b/fs/xfs/xfs_file.c >> @@ -824,7 +824,8 @@ xfs_file_fallocate( >> if (!S_ISREG(inode->i_mode)) >> return -EINVAL; >> if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | >> - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) >> + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | >> + FALLOC_FL_INSERT_RANGE)) >> return -EOPNOTSUPP; >> >> xfs_ilock(ip, XFS_IOLOCK_EXCL); >> @@ -846,6 +847,20 @@ xfs_file_fallocate( >> error = xfs_collapse_file_space(ip, offset, len); >> if (error) >> goto out_unlock; >> + } else if (mode & FALLOC_FL_INSERT_RANGE) { >> + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; >> + >> + if (offset & blksize_mask || len & blksize_mask) { >> + error = -EINVAL; >> + goto out_unlock; >> + } >> + >> + ASSERT(offset < i_size_read(inode)); >> + new_size = i_size_read(inode) + len; >> + >> + error = xfs_insert_file_space(ip, offset, len); >> + if (error) >> + goto out_unlock; >> } else { >> if (!(mode & FALLOC_FL_KEEP_SIZE) && >> offset + len > i_size_read(inode)) { >> diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h >> index a4ae41c..c870288 100644 >> --- a/fs/xfs/xfs_trace.h >> +++ b/fs/xfs/xfs_trace.h >> @@ -604,6 +604,7 @@ DEFINE_INODE_EVENT(xfs_inactive_symlink); >> DEFINE_INODE_EVENT(xfs_alloc_file_space); >> DEFINE_INODE_EVENT(xfs_free_file_space); >> DEFINE_INODE_EVENT(xfs_collapse_file_space); >> +DEFINE_INODE_EVENT(xfs_insert_file_space); >> DEFINE_INODE_EVENT(xfs_readdir); >> #ifdef CONFIG_XFS_POSIX_ACL >> DEFINE_INODE_EVENT(xfs_get_acl); >> -- >> 1.7.11-rc0 >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > From bfoster@redhat.com Mon Apr 7 10:39:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4731C7F54 for ; Mon, 7 Apr 2014 10:39:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32D60304043 for ; Mon, 7 Apr 2014 08:39:10 -0700 (PDT) X-ASG-Debug-ID: 1396885148-04cb6c5675d72ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6CHGTERk7tL66DAW for ; Mon, 07 Apr 2014 08:39: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-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 s37Fd8sl026593 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 7 Apr 2014 11:39:08 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s37Fd7ok002331 for ; Mon, 7 Apr 2014 11:39:08 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 812A21256CC; Mon, 7 Apr 2014 11:39:06 -0400 (EDT) Date: Mon, 7 Apr 2014 11:39:06 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: [FAQ v2] XFS speculative preallocation Message-ID: <20140407153906.GC48184@bfoster.bfoster> X-ASG-Orig-Subj: [FAQ v2] XFS speculative preallocation MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: 1396885149 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is v2 of the speculative preallocation FAQ bits. The initial proposal was here: http://oss.sgi.com/archives/xfs/2014-03/msg00316.html This version includes some updates based on review from arekm and dchinner. Most notably, the content has been broken down into a few more questions. Unless there are further major changes required, I'll plan to post something along these lines to the wiki when my account is approved. Thanks for the feedback! Brian --- Q: Why do files on XFS use more data blocks than expected? A: The XFS speculative preallocation algorithm allocates extra blocks beyond end of file (EOF) to minimise file fragmentation during buffered write workloads. Workloads that benefit from this behaviour include slowly growing files, concurrent writers and mixed reader/writer workloads. It also provides fragmentation resistence in situations where memory pressure prevents adequate buffering of dirty data to allow formation of large contiguous regions of data in memory. This post-EOF block allocation is accounted identically to blocks within EOF. It is visible in 'st_blocks' counts via stat() system calls, accounted as globally allocated space and against quotas that apply to the associated file. The space is reported by various userspace utilities (stat, du, df, ls) and thus provides a common source of confusion for administrators. Post-EOF blocks are temporary in most situations and are usually reclaimed via several possible mechanisms in XFS. See the FAQ entry on speculative preallocation for details. Q: What is speculative preallocation? A: XFS speculatively preallocates post-EOF blocks on file extending writes in anticipation of future extending writes. The size of a preallocation is dynamic and depends on the runtime state of the file and fs. Generally speaking, preallocation is disabled for very small files and preallocation sizes grow as files grow larger. Preallocations are capped to the maximum extent size supported by the filesystem. Preallocation size is throttled automatically as the filesystem approaches low free space conditions or other allocation limits on a file (such as a quota). In most cases, speculative preallocation is automatically reclaimed when a file is closed. Preallocation may also persist beyond the lifecycle of the file descriptor. Certain application behaviors that are known to cause fragmentation, such as file server workloads, slowly growing files, etc., benefit from this and delay the removal of preallocated blocks beyond fd close. Q: How can I speed up or avoid delayed removal of speculative preallocation? A: Remove the inode from the VFS cache or unmount the filesystem to remove speculative preallocations associated with an inode. Linux 3.8 (and later) includes a scanner to perform background trimming of files with lingering post-EOF preallocations. The scanner bypasses dirty files to avoid interference with ongoing writes. A 5 minute scan interval is used by default and can be adjusted via the following file (value in seconds): /proc/sys/fs/xfs/speculative_prealloc_lifetime Q: Is speculative preallocation permanent? A: Although speculative preallocation can lead to reports of excess space usage, the preallocated space is not permanent unless explicitly made so via fallocate or a similar interface. Preallocated space can also be encoded permanently in situations where file size is extended beyond a range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated blocks are reclaimed on file close, inode reclaim, unmount or in the background once file write activity subsides. Q: My workload has known characteristics - can I tune speculative preallocation to an optimal fixed size? A: The 'allocsize=' mount option configures the XFS block allocation algorithm to use a fixed allocation size. Speculative preallocation is not dynamically resized when the allocsize mount option is set and thus the potential for fragmentation is increased. XFS historically set allocsize to 64k by default. From rjohnston@sgi.com Mon Apr 7 13:20:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 735A87F60 for ; Mon, 7 Apr 2014 13:20:39 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9A669AC012; Mon, 7 Apr 2014 11:20:35 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.123.3; Mon, 7 Apr 2014 13:20:34 -0500 Message-ID: <5342EC72.8060007@sgi.com> Date: Mon, 7 Apr 2014 13:20:34 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: =?UTF-8?B?QXJrYWRpdXN6IE1pxZtraWV3aWN6?= , CC: Dave Chinner Subject: Re: xfsprogs 3.1.12 and 3.2.0 releases? References: <201401201822.48520.arekm@maven.pl> In-Reply-To: <201401201822.48520.arekm@maven.pl> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [128.162.233.55] On 01/20/2014 11:22 AM, Arkadiusz MiÅ›kiewicz wrote: > > Hello. > > What's needed for both 3.1.12 and 3.2.0 releases to happen? > > If 3.2.0 is to be released soon then nice. Dave, AFAIK it is waiting for you > and xfs_db crc work only? > > If 3.2.0 is far away then it would be nice to see 3.1.12 with bugfixes only > (for those paranoid about new stuff) but 3.1.13 very soon after that with > backported features like project quota support, parallelism, performance > improvements. > > Obviously I hope 3.2.0 is soon and there is no need to waste effort on 3.1.x. > Is there any interest in a 3.1.12 release or will a 3.2.x release happen soon? From tinguely@eagdhcp-232-178.americas.sgi.com Mon Apr 7 14:04:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A4F6F7F6C for ; Mon, 7 Apr 2014 14:04:30 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 557C8304032 for ; Mon, 7 Apr 2014 12:04:27 -0700 (PDT) Received: from eagdhcp-232-178.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s37J4SaO002955 for ; Mon, 7 Apr 2014 14:04:28 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-178.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5/Submit) id s37J4SEd002954; Mon, 7 Apr 2014 14:04:28 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140407190101.292316075@sgi.com> User-Agent: quilt/0.51-1 Date: Mon, 07 Apr 2014 14:00:34 -0500 From: Mark Tinguely To: XFS Mailing List Subject: [PATCH] xfsprogs: fix directory hash ordering bug References: <20140328173430.622616177@sgi.com> Content-Disposition: inline; filename=libxfs-fix-directory-bad-hash-order.patch Commit f5ea1100 ("xfs: add CRCs to dir2/da node blocks") introduced in 3.10 incorrectly converted the btree hash index array pointer in xfs_da3_fixhashpath(). It resulted in the the current hash always being compared against the first entry in the btree rather than the current block index into the btree block's hash entry array. As a result, it was comparing the wrong hashes, and so could misorder the entries in the btree. For most cases, this doesn't cause any problems as it requires hash collisions to expose the ordering problem. However, when there are hash collisions within a directory there is a very good probability that the entries will be ordered incorrectly and that actually matters when duplicate hashes are placed into or removed from the btree block hash entry array. This bug results in an on-disk directory corruption and that results in directory verifier functions throwing corruption warnings into the logs. While no data or directory entries are lost, access to them may be compromised, and attempts to remove entries from a directory that has suffered from this corruption may result in a filesystem shutdown. xfs_repair will fix the directory hash ordering without data loss occuring. [dchinner: wrote useful a commit message] Ported from equivalent kernel commit c88547a8. Signed-off-by: Mark Tinguely --- libxfs/xfs_da_btree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/libxfs/xfs_da_btree.c =================================================================== --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -1313,7 +1313,7 @@ xfs_da3_fixhashpath( node = blk->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); btree = xfs_da3_node_tree_p(node); - if (be32_to_cpu(btree->hashval) == lasthash) + if (be32_to_cpu(btree[blk->index]->hashval) == lasthash) break; blk->hashval = lasthash; btree[blk->index].hashval = cpu_to_be32(lasthash); From sandeen@sandeen.net Mon Apr 7 14:08:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C452A7F77 for ; Mon, 7 Apr 2014 14:08:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5450304039 for ; Mon, 7 Apr 2014 12:08:33 -0700 (PDT) X-ASG-Debug-ID: 1396897711-04cb6c5676d84e60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BUISesnz4qzL6xcO for ; Mon, 07 Apr 2014 12:08: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A78E763C77A3; Mon, 7 Apr 2014 14:08:31 -0500 (CDT) Message-ID: <5342F7AF.9040507@sandeen.net> Date: Mon, 07 Apr 2014 14:08:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Brian Foster , xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation In-Reply-To: <20140407153906.GC48184@bfoster.bfoster> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396897711 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/14, 10:39 AM, Brian Foster wrote: > Hi all, > > This is v2 of the speculative preallocation FAQ bits. The initial > proposal was here: > > http://oss.sgi.com/archives/xfs/2014-03/msg00316.html > > This version includes some updates based on review from arekm and > dchinner. Most notably, the content has been broken down into a few more > questions. Unless there are further major changes required, I'll plan to > post something along these lines to the wiki when my account is > approved. Thanks for the feedback! > > Brian > > --- > > Q: Why do files on XFS use more data blocks than expected? > > A: > > The XFS speculative preallocation algorithm allocates extra blocks > beyond end of file (EOF) to minimise file fragmentation during buffered s/minimise/minimize/ > write workloads. Workloads that benefit from this behaviour include > slowly growing files, concurrent writers and mixed reader/writer > workloads. It also provides fragmentation resistence in situations where s/resistence/resistance/ > memory pressure prevents adequate buffering of dirty data to allow > formation of large contiguous regions of data in memory. > > This post-EOF block allocation is accounted identically to blocks within > EOF. It is visible in 'st_blocks' counts via stat() system calls, > accounted as globally allocated space and against quotas that apply to > the associated file. The space is reported by various userspace > utilities (stat, du, df, ls) and thus provides a common source of > confusion for administrators. Post-EOF blocks are temporary in most > situations and are usually reclaimed via several possible mechanisms in > XFS. "usually reclaimed" - is it ever "never" reclaimed, then? > See the FAQ entry on speculative preallocation for details. > > Q: What is speculative preallocation? > > A: > > XFS speculatively preallocates post-EOF blocks on file extending writes > in anticipation of future extending writes. The size of a preallocation > is dynamic and depends on the runtime state of the file and fs. > Generally speaking, preallocation is disabled for very small files and > preallocation sizes grow as files grow larger. > > Preallocations are capped to the maximum extent size supported by the > filesystem. Preallocation size is throttled automatically as the > filesystem approaches low free space conditions or other allocation > limits on a file (such as a quota). > > In most cases, speculative preallocation is automatically reclaimed when > a file is closed. Preallocation may also persist beyond the lifecycle of > the file descriptor. Certain application behaviors that are known to > cause fragmentation, such as file server workloads, slowly growing > files, etc., benefit from this and delay the removal of preallocated > blocks beyond fd close. this is a little handwavy. "It's reclaimed when it's closed, except when it's not?" Can we say something more informative here? > Q: How can I speed up or avoid delayed removal of speculative > preallocation? > > A: > > Remove the inode from the VFS cache or unmount the filesystem to remove > speculative preallocations associated with an inode. How does a user remove an inode from the VFS cache? ;) So far the answer to this question sounds like "no." We can't remove a single inode; drop_caches is way too heavy weight, and unmount isn't really viable in most cases. > Linux 3.8 (and later) includes a scanner to perform background trimming > of files with lingering post-EOF preallocations. The scanner bypasses > dirty files to avoid interference with ongoing writes. A 5 minute scan > interval is used by default and can be adjusted via the following file > (value in seconds): > > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > Q: Is speculative preallocation permanent? > > A: > > Although speculative preallocation can lead to reports of excess space > usage, the preallocated space is not permanent unless explicitly made so > via fallocate or a similar interface. Preallocated space can also be > encoded permanently in situations where file size is extended beyond a > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated (maybe "an extending truncate") > blocks are reclaimed on file close, inode reclaim, unmount or in the > background once file write activity subsides. > > Q: My workload has known characteristics - can I tune speculative > preallocation to an optimal fixed size? > > A: > > The 'allocsize=' mount option configures the XFS block allocation > algorithm to use a fixed allocation size. Speculative preallocation is > not dynamically resized when the allocsize mount option is set and thus > the potential for fragmentation is increased. XFS historically set > allocsize to 64k by default. Thanks, -Eric From arekm@maven.pl Mon Apr 7 14:09:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1392F7F82 for ; Mon, 7 Apr 2014 14:09:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C3FCAC00E for ; Mon, 7 Apr 2014 12:09:04 -0700 (PDT) X-ASG-Debug-ID: 1396897741-04bdf05dabdb3220001-NocioJ Received: from mail-ee0-f41.google.com (mail-ee0-f41.google.com [74.125.83.41]) by cuda.sgi.com with ESMTP id C96AIXNdRnakycc8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Apr 2014 12:09:02 -0700 (PDT) X-Barracuda-Envelope-From: arekm@maven.pl X-Barracuda-Apparent-Source-IP: 74.125.83.41 Received: by mail-ee0-f41.google.com with SMTP id t10so25325eei.0 for ; Mon, 07 Apr 2014 12:09:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=from:to:subject:date:user-agent:references:in-reply-to:mime-version :content-type:content-transfer-encoding:message-id; bh=g6ScF/qZDGqln96UkWoz8j7wLfvDWlU29SD8NHeILCc=; b=F8No2Ld48G546aplBlg26+ywo6GKeOYJO/p8DXGwFIvcKKrBxIV03xuK/xNzRtIMzw NKxhmM4ssU7UgPU3Exs/Jg/53rHbytckO1XbB+14964fy2LUljvS/IUCQU0DyIEnvdzp SktlnMo/qrzRNgEJYSnxlL5NfbFzWROl6BABY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:user-agent:references :in-reply-to:mime-version:content-type:content-transfer-encoding :message-id; bh=g6ScF/qZDGqln96UkWoz8j7wLfvDWlU29SD8NHeILCc=; b=U9Km9HowwUXjieOyQvma603wfwXj6uNxGAWz91bNsIl2tEQaCm8e/gH3Vw7e0FJYUF QT9uBvBRWVjJGFDq/gl+3x4TQcX+eN1+CAm7Am00qnCIj5TfTnCYp6DWcxmzoPFcbHF9 CLafI82ynoQB39b1jOZTT3jXZHV7qpSYgaeGpSIVpU4MSGlQBCs9VUgMJBc1m6EV32V6 Oly1mLqp6uhYlkITx/zVf4/JpI4hKwhjw4ApfM5bVob0skGWl5BBFvQLVkxyqSWc8OFg ExWRruDj/KDbRTUtuF/GnVC+nBmTJyePtvOhJhLrCtC/zJXfrjKdF67MCvqb/VRtsM9N +FBw== X-Gm-Message-State: ALoCoQklasNs89QfX0Zot22hFBec28qVivJPEYnZlBotWOo4IoOc3J8NlEoc0mY/SKSqSmChE/YV X-Received: by 10.14.87.7 with SMTP id x7mr4611569eee.44.1396897740901; Mon, 07 Apr 2014 12:09:00 -0700 (PDT) Received: from t400.localnet (89-65-189-48.dynamic.chello.pl. [89.65.189.48]) by mx.google.com with ESMTPSA id y7sm43589377eev.5.2014.04.07.12.09.00 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Apr 2014 12:09:00 -0700 (PDT) From: Arkadiusz =?utf-8?q?Mi=C5=9Bkiewicz?= To: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Date: Mon, 7 Apr 2014 21:08:59 +0200 X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation User-Agent: KMail/1.13.7 (Linux/3.14.0-final-dirty; KDE/4.12.3; x86_64; ; ) References: <20140407153906.GC48184@bfoster.bfoster> In-Reply-To: <20140407153906.GC48184@bfoster.bfoster> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201404072108.59322.arekm@maven.pl> X-Barracuda-Connect: mail-ee0-f41.google.com[74.125.83.41] X-Barracuda-Start-Time: 1396897742 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4662 Rule breakdown below pts rule name 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 Monday 07 of April 2014, Brian Foster wrote: > Q: How can I speed up or avoid delayed removal of speculative > preallocation? >=20 > A: >=20 > Remove the inode from the VFS cache or unmount the filesystem to remove > speculative preallocations associated with an inode. "Remove all inodes from the VFS cache" + ? AFAIK there is no way to remove= =20 single inode from cache. Example would be nice, too. =2D-=20 Arkadiusz Mi=C5=9Bkiewicz, arekm / maven.pl From bfoster@redhat.com Mon Apr 7 14:56:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BDB757F6D for ; Mon, 7 Apr 2014 14:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 470B6AC013 for ; Mon, 7 Apr 2014 12:56:09 -0700 (PDT) X-ASG-Debug-ID: 1396900568-04bdf05dacdb6e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NBR1dO2fxLJXeRLz for ; Mon, 07 Apr 2014 12:56:08 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s37Ju7cC027674 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Apr 2014 15:56:08 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s37Ju6VQ001497; Mon, 7 Apr 2014 15:56:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CAC7D1256CC; Mon, 7 Apr 2014 15:56:04 -0400 (EDT) Date: Mon, 7 Apr 2014 15:56:04 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140407195604.GD48184@bfoster.bfoster> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <5342F7AF.9040507@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5342F7AF.9040507@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396900568 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 07, 2014 at 02:08:31PM -0500, Eric Sandeen wrote: > On 4/7/14, 10:39 AM, Brian Foster wrote: > > Hi all, > > > > This is v2 of the speculative preallocation FAQ bits. The initial > > proposal was here: > > > > http://oss.sgi.com/archives/xfs/2014-03/msg00316.html > > > > This version includes some updates based on review from arekm and > > dchinner. Most notably, the content has been broken down into a few more > > questions. Unless there are further major changes required, I'll plan to > > post something along these lines to the wiki when my account is > > approved. Thanks for the feedback! > > > > Brian > > > > --- > > > > Q: Why do files on XFS use more data blocks than expected? > > > > A: > > > > The XFS speculative preallocation algorithm allocates extra blocks > > beyond end of file (EOF) to minimise file fragmentation during buffered > > s/minimise/minimize/ > Fixed. > > write workloads. Workloads that benefit from this behaviour include > > slowly growing files, concurrent writers and mixed reader/writer > > workloads. It also provides fragmentation resistence in situations where > > s/resistence/resistance/ > Fixed. > > memory pressure prevents adequate buffering of dirty data to allow > > formation of large contiguous regions of data in memory. > > > > This post-EOF block allocation is accounted identically to blocks within > > EOF. It is visible in 'st_blocks' counts via stat() system calls, > > accounted as globally allocated space and against quotas that apply to > > the associated file. The space is reported by various userspace > > utilities (stat, du, df, ls) and thus provides a common source of > > confusion for administrators. Post-EOF blocks are temporary in most > > situations and are usually reclaimed via several possible mechanisms in > > XFS. > > "usually reclaimed" - is it ever "never" reclaimed, then? > I worded it that way because of the several little corner cases that can turn preallocations permanent. E.g., the extending truncate case and IIRC, an fallocate on an inode means the space won't be trimmed either. > > See the FAQ entry on speculative preallocation for details. > > > > Q: What is speculative preallocation? > > > > A: > > > > XFS speculatively preallocates post-EOF blocks on file extending writes > > in anticipation of future extending writes. The size of a preallocation > > is dynamic and depends on the runtime state of the file and fs. > > Generally speaking, preallocation is disabled for very small files and > > preallocation sizes grow as files grow larger. > > > > Preallocations are capped to the maximum extent size supported by the > > filesystem. Preallocation size is throttled automatically as the > > filesystem approaches low free space conditions or other allocation > > limits on a file (such as a quota). > > > > In most cases, speculative preallocation is automatically reclaimed when > > a file is closed. Preallocation may also persist beyond the lifecycle of > > the file descriptor. Certain application behaviors that are known to > > cause fragmentation, such as file server workloads, slowly growing > > files, etc., benefit from this and delay the removal of preallocated > > blocks beyond fd close. > > this is a little handwavy. "It's reclaimed when it's closed, except > when it's not?" Can we say something more informative here? > This used to say: "In most cases, speculative preallocation is automatically reclaimed when a file is closed. The preallocation may persist after file close if an open, write, close pattern is repeated on a file. In this scenario, post-EOF preallocation is trimmed once the inode is reclaimed from cache or the filesystem unmounted." The point I want to get it across here is simply that the default case is to reclaim on close. The delayed reclaim scenario is the exception based on a heuristic. How about this? "In most cases, speculative preallocation is automatically reclaimed when a file is closed. Applications that repeatedly trigger preallocation and reclaim cycles (e.g., this is common in file server or log file workloads) can cause fragmentation. Therefore, this pattern is detected and causes the preallocation to persist beyond the lifecycle of the file descriptor." > > Q: How can I speed up or avoid delayed removal of speculative > > preallocation? > > > > A: > > > > Remove the inode from the VFS cache or unmount the filesystem to remove > > speculative preallocations associated with an inode. > > How does a user remove an inode from the VFS cache? ;) > > So far the answer to this question sounds like "no." > > We can't remove a single inode; drop_caches is way too heavy weight, > and unmount isn't really viable in most cases. > I guess there's a fine line between informing what mechanisms remove the preallocations and what is potentially recommending people take inappropriate actions to clear preallocated blocks. My initial intent was to simply inform that the traditional post-eof preallocation is not permanent (e.g. "don't worry, in the worst case this space is reclaimed on inode reclaim or umount"). Given that and this is a user FAQ, I'm sympathetic to nuking the "remove from cache" bit. The answer to this question becomes "use the scanner" (as described below) and the bits about reclaim/umount remain referenced indirectly in the answer to the next question. Thoughts? > > Linux 3.8 (and later) includes a scanner to perform background trimming > > of files with lingering post-EOF preallocations. The scanner bypasses > > dirty files to avoid interference with ongoing writes. A 5 minute scan > > interval is used by default and can be adjusted via the following file > > (value in seconds): > > > > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > > > Q: Is speculative preallocation permanent? > > > > A: > > > > Although speculative preallocation can lead to reports of excess space > > usage, the preallocated space is not permanent unless explicitly made so > > via fallocate or a similar interface. Preallocated space can also be > > encoded permanently in situations where file size is extended beyond a > > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > > (maybe "an extending truncate") > Ok. Thanks for the feedback. Brian > > blocks are reclaimed on file close, inode reclaim, unmount or in the > > background once file write activity subsides. > > > > Q: My workload has known characteristics - can I tune speculative > > preallocation to an optimal fixed size? > > > > A: > > > > The 'allocsize=' mount option configures the XFS block allocation > > algorithm to use a fixed allocation size. Speculative preallocation is > > not dynamically resized when the allocsize mount option is set and thus > > the potential for fragmentation is increased. XFS historically set > > allocsize to 64k by default. > > Thanks, > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Apr 7 14:58:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A1F077F73 for ; Mon, 7 Apr 2014 14:58:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7407930404E for ; Mon, 7 Apr 2014 12:58:24 -0700 (PDT) X-ASG-Debug-ID: 1396900703-04bdf05daadb70d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id K5mVM2wQcMYhjBAN for ; Mon, 07 Apr 2014 12:58:23 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s37JwMWJ000850 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Apr 2014 15:58:22 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s37JwL0G011550; Mon, 7 Apr 2014 15:58:21 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4A1E81256CC; Mon, 7 Apr 2014 15:58:20 -0400 (EDT) Date: Mon, 7 Apr 2014 15:58:20 -0400 From: Brian Foster To: Arkadiusz =?utf-8?Q?Mi=C5=9Bkiewicz?= Cc: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140407195819.GE48184@bfoster.bfoster> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <201404072108.59322.arekm@maven.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <201404072108.59322.arekm@maven.pl> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396900703 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 07, 2014 at 09:08:59PM +0200, Arkadiusz MiÅ›kiewicz wrote: > On Monday 07 of April 2014, Brian Foster wrote: > > > Q: How can I speed up or avoid delayed removal of speculative > > preallocation? > > > > A: > > > > Remove the inode from the VFS cache or unmount the filesystem to remove > > speculative preallocations associated with an inode. > > "Remove all inodes from the VFS cache" + ? AFAIK there is no way to remove > single inode from cache. Example would be nice, too. > Yeah, that's confusing. If people prefer this bit to stay (I prefer to nuke it, as noted in my previous reply), then I'll have to word it more accurately and cautiously. Thanks. Brian > -- > Arkadiusz MiÅ›kiewicz, arekm / maven.pl > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Mon Apr 7 14:58:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 520D67F87 for ; Mon, 7 Apr 2014 14:58:44 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14590304053; Mon, 7 Apr 2014 12:58:44 -0700 (PDT) Message-ID: <53430375.3060203@sgi.com> Date: Mon, 07 Apr 2014 14:58:45 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> In-Reply-To: <20140407153906.GC48184@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/07/14 10:39, Brian Foster wrote: > Hi all, > > This is v2 of the speculative preallocation FAQ bits. The initial > proposal was here: > > http://oss.sgi.com/archives/xfs/2014-03/msg00316.html > > This version includes some updates based on review from arekm and > dchinner. Most notably, the content has been broken down into a few more > questions. Unless there are further major changes required, I'll plan to > post something along these lines to the wiki when my account is > approved. Thanks for the feedback! > > Brian > > --- > > Q: Why do files on XFS use more data blocks than expected? > > A: > > The XFS speculative preallocation algorithm allocates extra blocks > beyond end of file (EOF) to minimise file fragmentation during buffered ^^^ beyond here and then later adopt post-EOF phrasing. ... > See the FAQ entry on speculative preallocation for details. > > Q: What is speculative preallocation? > > A: > > XFS speculatively preallocates post-EOF blocks on file extending writes > in anticipation of future extending writes. The size of a preallocation > is dynamic and depends on the runtime state of the file and fs. > Generally speaking, preallocation is disabled for very small files and vague what is very small? ^^^ ... > Q: Is speculative preallocation permanent? > > A: > > Although speculative preallocation can lead to reports of excess space > usage, the preallocated space is not permanent unless explicitly made so > via fallocate or a similar interface. Preallocated space can also be > encoded permanently in situations where file size is extended beyond a > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > blocks are reclaimed on file close, inode reclaim, unmount or in the > background once file write activity subsides. Switch order? Normally, preallocated blocks are reclaimed on file close, inode reclaim, unmount or in the background once file write activity subsides. They can be explictly made permanent . > > Q: My workload has known characteristics - can I tune speculative > preallocation to an optimal fixed size? > > A: > > The 'allocsize=' mount option configures the XFS block allocation > algorithm to use a fixed allocation size. Speculative preallocation is > not dynamically resized when the allocsize mount option is set and thus > the potential for fragmentation is increased. XFS historically set sets the > allocsize to 64k by default. > Q: Can I disable S-P-A ? -Mark. From sandeen@sandeen.net Mon Apr 7 14:59:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AE5387F8E for ; Mon, 7 Apr 2014 14:59:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B6638F8039 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5677d88bb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id YgEo58BhbFhK08B2 for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 34F4B61D1A46; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 07/19] xfs: remove unused args from xfs_alloc_buftarg() Date: Mon, 7 Apr 2014 14:58:54 -0500 X-ASG-Orig-Subj: [PATCH 07/19] xfs: remove unused args from xfs_alloc_buftarg() Message-Id: <1396900746-22201-8-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_buf.c | 4 +--- fs/xfs/xfs_buf.h | 2 +- fs/xfs/xfs_super.c | 8 +++----- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 03742ea..3b48a57 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1636,9 +1636,7 @@ xfs_setsize_buftarg_early( xfs_buftarg_t * xfs_alloc_buftarg( struct xfs_mount *mp, - struct block_device *bdev, - int external, - const char *fsname) + struct block_device *bdev) { xfs_buftarg_t *btp; diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 0aee9b8..f10e8c9 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -373,7 +373,7 @@ static inline void xfs_buf_relse(xfs_buf_t *bp) * Handling of buftargs. */ extern xfs_buftarg_t *xfs_alloc_buftarg(struct xfs_mount *, - struct block_device *, int, const char *); + struct block_device *); extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index c10197e..20b2ddf 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -765,20 +765,18 @@ xfs_open_devices( * Setup xfs_mount buffer target pointers */ error = ENOMEM; - mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev, 0, mp->m_fsname); + mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev); if (!mp->m_ddev_targp) goto out_close_rtdev; if (rtdev) { - mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev, 1, - mp->m_fsname); + mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev); if (!mp->m_rtdev_targp) goto out_free_ddev_targ; } if (logdev && logdev != ddev) { - mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev, 1, - mp->m_fsname); + mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev); if (!mp->m_logdev_targp) goto out_free_rtdev_targ; } else { -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 08C197F8E for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 824FBAC013 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900747-04cb6c5675d88b90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id C6w7exS2Vhbk7BvM for ; Mon, 07 Apr 2014 12:59:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id B0DAD63C77A3; Mon, 7 Apr 2014 14:59:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 00/19] xfs: remove a bunch of unused function args Date: Mon, 7 Apr 2014 14:58:47 -0500 X-ASG-Orig-Subj: [PATCH 00/19] xfs: remove a bunch of unused function args Message-Id: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900747 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I did some mindless work during a plane ride. ;) If the granularity of these patches is just too much, I could certainly collapse them into fewer, bigger patches, but I figured that this would make them super-trivial to review. Most have no interesting commit messages aside from the subject, because the subject says it all. Compile-tested only, TBH. Thanks, -Eric From sandeen@sandeen.net Mon Apr 7 14:59:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 18D307F91 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E98C6304039 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cbb054b8b993c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 3HaZnuHMV5QIIXN5 for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 44ACF61D1A47; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 08/19] xfs: remove unused flags arg from _xfs_buf_get_pages() Date: Mon, 7 Apr 2014 14:58:55 -0500 X-ASG-Orig-Subj: [PATCH 08/19] xfs: remove unused flags arg from _xfs_buf_get_pages() Message-Id: <1396900746-22201-9-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_buf.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 3b48a57..2423741 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -216,8 +216,7 @@ _xfs_buf_alloc( STATIC int _xfs_buf_get_pages( xfs_buf_t *bp, - int page_count, - xfs_buf_flags_t flags) + int page_count) { /* Make sure that we have a page list */ if (bp->b_pages == NULL) { @@ -330,7 +329,7 @@ use_alloc_page: end = (BBTOB(bp->b_maps[0].bm_bn + bp->b_length) + PAGE_SIZE - 1) >> PAGE_SHIFT; page_count = end - start; - error = _xfs_buf_get_pages(bp, page_count, flags); + error = _xfs_buf_get_pages(bp, page_count); if (unlikely(error)) return error; @@ -767,7 +766,7 @@ xfs_buf_associate_memory( bp->b_pages = NULL; bp->b_addr = mem; - rval = _xfs_buf_get_pages(bp, page_count, 0); + rval = _xfs_buf_get_pages(bp, page_count); if (rval) return rval; @@ -800,7 +799,7 @@ xfs_buf_get_uncached( goto fail; page_count = PAGE_ALIGN(numblks << BBSHIFT) >> PAGE_SHIFT; - error = _xfs_buf_get_pages(bp, page_count, 0); + error = _xfs_buf_get_pages(bp, page_count); if (error) goto fail_free_buf; -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1FE2A7F92 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82740AC014 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900747-04cb6c5677d88ba0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dZlgVuVHrZpq1rEV for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id E2FDA63C3B1D; Mon, 7 Apr 2014 14:59:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 03/19] xfs: remove unused mp arg from xfs_bmdr_maxrecs() Date: Mon, 7 Apr 2014 14:58:50 -0500 X-ASG-Orig-Subj: [PATCH 03/19] xfs: remove unused mp arg from xfs_bmdr_maxrecs() Message-Id: <1396900746-22201-4-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900747 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_bmap_btree.c | 8 +++----- fs/xfs/xfs_bmap_btree.h | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index b308097..eeb673b 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -94,7 +94,7 @@ xfs_bmap_compute_maxlevels( maxleafents = MAXAEXTNUM; sz = XFS_BMDR_SPACE_CALC(MINABTPTRS); } - maxrootrecs = xfs_bmdr_maxrecs(mp, sz, 0); + maxrootrecs = xfs_bmdr_maxrecs(sz, 0); minleafrecs = mp->m_bmap_dmnr[0]; minnoderecs = mp->m_bmap_dmnr[1]; maxblocks = (maxleafents + minleafrecs - 1) / minleafrecs; diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 706bc3f..a9d6b7b 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -84,7 +84,7 @@ xfs_bmdr_to_bmbt( rblock->bb_level = dblock->bb_level; ASSERT(be16_to_cpu(rblock->bb_level) > 0); rblock->bb_numrecs = dblock->bb_numrecs; - dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); + dmxr = xfs_bmdr_maxrecs(dblocklen, 0); fkp = XFS_BMDR_KEY_ADDR(dblock, 1); tkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1); fpp = XFS_BMDR_PTR_ADDR(dblock, 1, dmxr); @@ -443,7 +443,7 @@ xfs_bmbt_to_bmdr( ASSERT(rblock->bb_level != 0); dblock->bb_level = rblock->bb_level; dblock->bb_numrecs = rblock->bb_numrecs; - dmxr = xfs_bmdr_maxrecs(mp, dblocklen, 0); + dmxr = xfs_bmdr_maxrecs(dblocklen, 0); fkp = XFS_BMBT_KEY_ADDR(mp, rblock, 1); tkp = XFS_BMDR_KEY_ADDR(dblock, 1); fpp = XFS_BMAP_BROOT_PTR_ADDR(mp, rblock, 1, rblocklen); @@ -672,8 +672,7 @@ xfs_bmbt_get_dmaxrecs( { if (level != cur->bc_nlevels - 1) return cur->bc_mp->m_bmap_dmxr[level != 0]; - return xfs_bmdr_maxrecs(cur->bc_mp, cur->bc_private.b.forksize, - level == 0); + return xfs_bmdr_maxrecs(cur->bc_private.b.forksize, level == 0); } STATIC void @@ -914,7 +913,6 @@ xfs_bmbt_maxrecs( */ int xfs_bmdr_maxrecs( - struct xfs_mount *mp, int blocklen, int leaf) { diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index 6e42e1e..819a8a4 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -130,7 +130,7 @@ extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int, xfs_bmdr_block_t *, int); extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur *, int level); -extern int xfs_bmdr_maxrecs(struct xfs_mount *, int blocklen, int leaf); +extern int xfs_bmdr_maxrecs(int blocklen, int leaf); extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf); extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 48A437F8E for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 053E430404E for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900747-04bdf05dabdb71d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id QDH1PXbbo1Cs7lwf for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id C46E463C77A8; Mon, 7 Apr 2014 14:59:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 01/19] xfs: remove unused tp arg from xfs_bmap_last_offset() and callers Date: Mon, 7 Apr 2014 14:58:48 -0500 X-ASG-Orig-Subj: [PATCH 01/19] xfs: remove unused tp arg from xfs_bmap_last_offset() and callers Message-Id: <1396900746-22201-2-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- remove unused transaction pointer from various callchains leading to xfs_bmap_last_offset(). Signed-off-by: Eric Sandeen --- fs/xfs/xfs_bmap.c | 1 - fs/xfs/xfs_bmap.h | 4 ++-- fs/xfs/xfs_dir2.c | 26 ++++++++++++-------------- fs/xfs/xfs_dir2.h | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_iomap.c | 2 +- 8 files changed, 20 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 152543c..b308097 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1675,7 +1675,6 @@ xfs_bmap_isaeof( */ int xfs_bmap_last_offset( - struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t *last_block, int whichfork) diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 33b41f3..52ad38d 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -146,8 +146,8 @@ 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_last_offset(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); diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index ce16ef0..7575a3b 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -230,11 +230,11 @@ xfs_dir_createname( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_addname(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_addname(&args); @@ -303,11 +303,11 @@ xfs_dir_lookup( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_lookup(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_lookup(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_lookup(&args); @@ -360,11 +360,11 @@ xfs_dir_removename( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_removename(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_removename(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_removename(&args); @@ -410,11 +410,11 @@ xfs_dir_replace( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_replace(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_replace(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_replace(&args); @@ -456,11 +456,11 @@ xfs_dir_canenter( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_addname(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_addname(&args); @@ -525,7 +525,6 @@ xfs_dir2_grow_inode( */ int xfs_dir2_isblock( - xfs_trans_t *tp, xfs_inode_t *dp, int *vp) /* out: 1 is block, 0 is not block */ { @@ -534,7 +533,7 @@ xfs_dir2_isblock( int rval; mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); @@ -547,7 +546,6 @@ xfs_dir2_isblock( */ int xfs_dir2_isleaf( - xfs_trans_t *tp, xfs_inode_t *dp, int *vp) /* out: 1 is leaf, 0 is not leaf */ { @@ -556,7 +554,7 @@ xfs_dir2_isleaf( int rval; mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); return 0; diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index cec70e0..64a6b19 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -142,8 +142,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); +extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); +extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_buf *bp); diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index ae47ec6..f8170bc 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1707,7 +1707,7 @@ xfs_dir2_node_to_leaf( /* * Get the last offset in the file. */ - if ((error = xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) { + if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { return error; } fo -= mp->m_dirblkfsbs; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 48c7d18..807946d 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1726,7 +1726,7 @@ xfs_dir2_node_addname_int( if (dbno == -1) { xfs_fileoff_t fo; /* freespace block number */ - if ((error = xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) + if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) return error; lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); fbno = ifbno; diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index aead369..a18000f 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -687,7 +687,7 @@ xfs_readdir( lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_getdents(dp, ctx); - else if ((rval = xfs_dir2_isblock(NULL, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) ; else if (v) rval = xfs_dir2_block_getdents(dp, ctx); diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 22d1cbe..2b2739c 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -734,7 +734,7 @@ xfs_iomap_write_allocate( */ nimaps = 1; end_fsb = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); - error = xfs_bmap_last_offset(NULL, ip, &last_block, + error = xfs_bmap_last_offset(ip, &last_block, XFS_DATA_FORK); if (error) goto trans_cancel; -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 514E67F93 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E2108F8039 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5675d88bb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EjuojFhKYweGUbvb for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 6E30063BEED7; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 11/19] xfs: remove unused mp arg from xfs_dir2 dataptr/byte functions Date: Mon, 7 Apr 2014 14:58:58 -0500 X-ASG-Orig-Subj: [PATCH 11/19] xfs: remove unused mp arg from xfs_dir2 dataptr/byte functions Message-Id: <1396900746-22201-12-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_da_format.h | 10 +++++----- fs/xfs/xfs_dir2_block.c | 8 ++++---- fs/xfs/xfs_dir2_readdir.c | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index a19d3f8..1432b57 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -541,7 +541,7 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) * 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) +xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) { return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; } @@ -550,7 +550,7 @@ xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) * 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) +xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) { return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); } @@ -571,7 +571,7 @@ xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) 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)); + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -590,7 +590,7 @@ xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) 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)); + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -629,7 +629,7 @@ 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)); + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); } /* diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 90cdbf4..976842e 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -536,7 +536,7 @@ xfs_dir2_block_addname( * Fill in the leaf entry. */ blp[mid].hashval = cpu_to_be32(args->hashval); - blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, + blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh); /* @@ -1169,7 +1169,7 @@ xfs_dir2_sf_to_block( *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dp, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); - blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, + blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); /* * Create entry for .. @@ -1183,7 +1183,7 @@ xfs_dir2_sf_to_block( *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dp, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); - blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, + blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); offset = dp->d_ops->data_first_offset; /* @@ -1237,7 +1237,7 @@ xfs_dir2_sf_to_block( name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> hashname(&name)); - blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, + blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); offset = (int)((char *)(tagp + 1) - (char *)hdr); if (++i == sfp->count) diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index a99967b..50b72f7 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -531,7 +531,7 @@ xfs_dir2_leaf_getdents( * Inside the loop we keep the main offset value as a byte offset * in the directory file. */ - curoff = xfs_dir2_dataptr_to_byte(mp, ctx->pos); + curoff = xfs_dir2_dataptr_to_byte(ctx->pos); /* * Force this conversion through db so we truncate the offset @@ -635,7 +635,7 @@ xfs_dir2_leaf_getdents( length = dp->d_ops->data_entsize(dep->namelen); filetype = dp->d_ops->data_get_ftype(dep); - ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff; + ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), xfs_dir3_get_dtype(mp, filetype))) @@ -653,10 +653,10 @@ xfs_dir2_leaf_getdents( /* * All done. Set output offset value to current offset. */ - if (curoff > xfs_dir2_dataptr_to_byte(mp, XFS_DIR2_MAX_DATAPTR)) + if (curoff > xfs_dir2_dataptr_to_byte(XFS_DIR2_MAX_DATAPTR)) ctx->pos = XFS_DIR2_MAX_DATAPTR & 0x7fffffff; else - ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff; + ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; kmem_free(map_info); if (bp) xfs_trans_brelse(NULL, bp); -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7734F7F96 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 09D3FAC015 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5676d88bb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8mKjS07FoiFuQpxU for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 527E461D1A56; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 09/19] xfs: remove unused bip arg from xfs_buf_item_log_segment() Date: Mon, 7 Apr 2014 14:58:56 -0500 X-ASG-Orig-Subj: [PATCH 09/19] xfs: remove unused bip arg from xfs_buf_item_log_segment() Message-Id: <1396900746-22201-10-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_buf_item.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 3314911..a5cd696 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -826,7 +826,6 @@ xfs_buf_item_init( */ static void xfs_buf_item_log_segment( - struct xfs_buf_log_item *bip, uint first, uint last, uint *map) @@ -934,7 +933,7 @@ xfs_buf_item_log( if (end > last) end = last; - xfs_buf_item_log_segment(bip, first, end, + xfs_buf_item_log_segment(first, end, &bip->bli_formats[i].blf_data_map[0]); start += bp->b_maps[i].bm_len; -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9177D7F9A for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 78D618F8054 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cbb054b9b993c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id JKlj4AsoRkvcuSkD for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 1198863C3A3D; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 05/19] xfs: remove unused level arg from xfs_btree_read_buf_block() Date: Mon, 7 Apr 2014 14:58:52 -0500 X-ASG-Orig-Subj: [PATCH 05/19] xfs: remove unused level arg from xfs_btree_read_buf_block() Message-Id: <1396900746-22201-6-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_btree.c | 32 +++++++++++++------------------- 1 files changed, 13 insertions(+), 19 deletions(-) diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 9adaae4..e20d61b 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -1161,7 +1161,6 @@ STATIC int xfs_btree_read_buf_block( struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr, - int level, int flags, struct xfs_btree_block **block, struct xfs_buf **bpp) @@ -1519,8 +1518,8 @@ xfs_btree_increment( union xfs_btree_ptr *ptrp; ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); - error = xfs_btree_read_buf_block(cur, ptrp, --lev, - 0, &block, &bp); + --lev; + error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); if (error) goto error0; @@ -1618,8 +1617,8 @@ xfs_btree_decrement( union xfs_btree_ptr *ptrp; ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); - error = xfs_btree_read_buf_block(cur, ptrp, --lev, - 0, &block, &bp); + --lev; + error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); if (error) goto error0; xfs_btree_setbuf(cur, lev, bp); @@ -1669,7 +1668,7 @@ xfs_btree_lookup_get_block( return 0; } - error = xfs_btree_read_buf_block(cur, pp, level, 0, blkp, &bp); + error = xfs_btree_read_buf_block(cur, pp, 0, blkp, &bp); if (error) return error; @@ -2020,7 +2019,7 @@ xfs_btree_lshift( goto out0; /* Set up the left neighbor as "left". */ - error = xfs_btree_read_buf_block(cur, &lptr, level, 0, &left, &lbp); + error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); if (error) goto error0; @@ -2204,7 +2203,7 @@ xfs_btree_rshift( goto out0; /* Set up the right neighbor as "right". */ - error = xfs_btree_read_buf_block(cur, &rptr, level, 0, &right, &rbp); + error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); if (error) goto error0; @@ -2472,7 +2471,7 @@ xfs_btree_split( * point back to right instead of to left. */ if (!xfs_btree_ptr_is_null(cur, &rrptr)) { - error = xfs_btree_read_buf_block(cur, &rrptr, level, + error = xfs_btree_read_buf_block(cur, &rrptr, 0, &rrblock, &rrbp); if (error) goto error0; @@ -2686,8 +2685,7 @@ xfs_btree_new_root( lbp = bp; xfs_btree_buf_to_ptr(cur, lbp, &lptr); left = block; - error = xfs_btree_read_buf_block(cur, &rptr, - cur->bc_nlevels - 1, 0, &right, &rbp); + error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); if (error) goto error0; bp = rbp; @@ -2698,8 +2696,7 @@ xfs_btree_new_root( xfs_btree_buf_to_ptr(cur, rbp, &rptr); right = block; xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); - error = xfs_btree_read_buf_block(cur, &lptr, - cur->bc_nlevels - 1, 0, &left, &lbp); + error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); if (error) goto error0; bp = lbp; @@ -3651,8 +3648,7 @@ xfs_btree_delrec( rptr = cptr; right = block; rbp = bp; - error = xfs_btree_read_buf_block(cur, &lptr, level, - 0, &left, &lbp); + error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); if (error) goto error0; @@ -3669,8 +3665,7 @@ xfs_btree_delrec( lptr = cptr; left = block; lbp = bp; - error = xfs_btree_read_buf_block(cur, &rptr, level, - 0, &right, &rbp); + error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); if (error) goto error0; @@ -3742,8 +3737,7 @@ xfs_btree_delrec( /* If there is a right sibling, point it to the remaining block. */ xfs_btree_get_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); if (!xfs_btree_ptr_is_null(cur, &cptr)) { - error = xfs_btree_read_buf_block(cur, &cptr, level, - 0, &rrblock, &rrbp); + error = xfs_btree_read_buf_block(cur, &cptr, 0, &rrblock, &rrbp); if (error) goto error0; xfs_btree_set_sibling(cur, rrblock, &lptr, XFS_BB_LEFTSIB); -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B09867F90 for ; Mon, 7 Apr 2014 14:59:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D7A3304039 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900747-04bdf05daadb71d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id iOlqQkUxvGmqnYjy for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id D479163C3B03; Mon, 7 Apr 2014 14:59:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 02/19] xfs: remove unused mp arg from xfs_attr3_rmt_hdr_ok() Date: Mon, 7 Apr 2014 14:58:49 -0500 X-ASG-Orig-Subj: [PATCH 02/19] xfs: remove unused mp arg from xfs_attr3_rmt_hdr_ok() Message-Id: <1396900746-22201-3-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_attr_remote.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 5549d69..90b2b58 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -68,7 +68,6 @@ xfs_attr3_rmt_blocks( */ static bool xfs_attr3_rmt_hdr_ok( - struct xfs_mount *mp, void *ptr, xfs_ino_t ino, uint32_t offset, @@ -254,7 +253,7 @@ xfs_attr_rmtval_copyout( byte_cnt = min(*valuelen, byte_cnt); if (xfs_sb_version_hascrc(&mp->m_sb)) { - if (!xfs_attr3_rmt_hdr_ok(mp, src, ino, *offset, + if (!xfs_attr3_rmt_hdr_ok(src, ino, *offset, byte_cnt, bno)) { xfs_alert(mp, "remote attribute header mismatch bno/off/len/owner (0x%llx/0x%x/Ox%x/0x%llx)", -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 60A177FA2 for ; Mon, 7 Apr 2014 14:59:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 39D068F8059 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cbb054b6b993b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4zDJkkz7wpKjho72 for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 00E0263C3A3B; Mon, 7 Apr 2014 14:59:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 04/19] xfs: remove unused mp arg from xfs_bmap_forkoff_reset() Date: Mon, 7 Apr 2014 14:58:51 -0500 X-ASG-Orig-Subj: [PATCH 04/19] xfs: remove unused mp arg from xfs_bmap_forkoff_reset() Message-Id: <1396900746-22201-5-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_bmap.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index eeb673b..03b6ff2 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -233,7 +233,6 @@ xfs_default_attroffset( */ STATIC void xfs_bmap_forkoff_reset( - xfs_mount_t *mp, xfs_inode_t *ip, int whichfork) { @@ -905,7 +904,7 @@ xfs_bmap_local_to_extents_empty( ASSERT(ifp->if_bytes == 0); ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); - xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); + xfs_bmap_forkoff_reset(ip, whichfork); ifp->if_flags &= ~XFS_IFINLINE; ifp->if_flags |= XFS_IFEXTENTS; XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5CCDD7F95 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 396E2304053 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5676d88bb0002-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MsXBOyr716rs6sCH for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id C78AE63BE834; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 17/19] xfs: remove unused xfs_mount arg from xfs_symlink_hdr_ok() Date: Mon, 7 Apr 2014 14:59:04 -0500 X-ASG-Orig-Subj: [PATCH 17/19] xfs: remove unused xfs_mount arg from xfs_symlink_hdr_ok() Message-Id: <1396900746-22201-18-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_shared.h | 2 +- fs/xfs/xfs_symlink.c | 2 +- fs/xfs/xfs_symlink_remote.c | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_shared.h b/fs/xfs/xfs_shared.h index 18dca8c..46d0e7b 100644 --- a/fs/xfs/xfs_shared.h +++ b/fs/xfs/xfs_shared.h @@ -236,7 +236,7 @@ int xfs_log_calc_minimum_size(struct xfs_mount *); int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); int xfs_symlink_hdr_set(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, uint32_t size, struct xfs_buf *bp); -bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, +bool xfs_symlink_hdr_ok(xfs_ino_t ino, uint32_t offset, uint32_t size, struct xfs_buf *bp); void xfs_symlink_local_to_remote(struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 14e58f2..3d1c3bb 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -88,7 +88,7 @@ xfs_readlink_bmap( cur_chunk = bp->b_addr; if (xfs_sb_version_hascrc(&mp->m_sb)) { - if (!xfs_symlink_hdr_ok(mp, ip->i_ino, offset, + if (!xfs_symlink_hdr_ok(ip->i_ino, offset, byte_cnt, bp)) { error = EFSCORRUPTED; xfs_alert(mp, diff --git a/fs/xfs/xfs_symlink_remote.c b/fs/xfs/xfs_symlink_remote.c index 8e3045e..4d873d3 100644 --- a/fs/xfs/xfs_symlink_remote.c +++ b/fs/xfs/xfs_symlink_remote.c @@ -80,7 +80,6 @@ xfs_symlink_hdr_set( */ bool xfs_symlink_hdr_ok( - struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, uint32_t size, -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4865B7F9F for ; Mon, 7 Apr 2014 14:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8EEFAC017 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900749-04cbb054b6b993c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jdlXxQYJ6ryENHuT for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 894F163BECB9; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 13/19] xfs: remove unused length arg from alloc_block ops Date: Mon, 7 Apr 2014 14:59:00 -0500 X-ASG-Orig-Subj: [PATCH 13/19] xfs: remove unused length arg from alloc_block ops Message-Id: <1396900746-22201-14-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_alloc_btree.c | 1 - fs/xfs/xfs_bmap_btree.c | 1 - fs/xfs/xfs_btree.c | 6 +++--- fs/xfs/xfs_btree.h | 2 +- fs/xfs/xfs_ialloc_btree.c | 1 - 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index 1308542..1abd9c3 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -70,7 +70,6 @@ xfs_allocbt_alloc_block( struct xfs_btree_cur *cur, union xfs_btree_ptr *start, union xfs_btree_ptr *new, - int length, int *stat) { int error; diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index a9d6b7b..8bdbd11 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -519,7 +519,6 @@ xfs_bmbt_alloc_block( struct xfs_btree_cur *cur, union xfs_btree_ptr *start, union xfs_btree_ptr *new, - int length, int *stat) { xfs_alloc_arg_t args; /* block allocation args */ diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index e20d61b..752b735 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -2373,7 +2373,7 @@ xfs_btree_split( xfs_btree_buf_to_ptr(cur, lbp, &lptr); /* Allocate the new block. If we can't do it, we're toast. Give up. */ - error = cur->bc_ops->alloc_block(cur, &lptr, &rptr, 1, stat); + error = cur->bc_ops->alloc_block(cur, &lptr, &rptr, stat); if (error) goto error0; if (*stat == 0) @@ -2546,7 +2546,7 @@ xfs_btree_new_iroot( pp = xfs_btree_ptr_addr(cur, 1, block); /* Allocate the new block. If we can't do it, we're toast. Give up. */ - error = cur->bc_ops->alloc_block(cur, pp, &nptr, 1, stat); + error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); if (error) goto error0; if (*stat == 0) { @@ -2650,7 +2650,7 @@ xfs_btree_new_root( cur->bc_ops->init_ptr_from_cur(cur, &rptr); /* Allocate the new block. If we can't do it, we're toast. Give up. */ - error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, 1, stat); + error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); if (error) goto error0; if (*stat == 0) diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 91e34f2..875f687 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -129,7 +129,7 @@ struct xfs_btree_ops { int (*alloc_block)(struct xfs_btree_cur *cur, union xfs_btree_ptr *start_bno, union xfs_btree_ptr *new_bno, - int length, int *stat); + int *stat); int (*free_block)(struct xfs_btree_cur *cur, struct xfs_buf *bp); /* update last record information */ diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index c8fa5bb..5121ec5 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -71,7 +71,6 @@ xfs_inobt_alloc_block( struct xfs_btree_cur *cur, union xfs_btree_ptr *start, union xfs_btree_ptr *new, - int length, int *stat) { xfs_alloc_arg_t args; /* block allocation args */ -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9C0F77F9B for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 749538F8052 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5675d88ba0002-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ALM34BrdNEIN5cP9 for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id D956D63BE835; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 18/19] xfs: remove unused ail pointer arg from xfs_trans_ail_cursor_done() Date: Mon, 7 Apr 2014 14:59:05 -0500 X-ASG-Orig-Subj: [PATCH 18/19] xfs: remove unused ail pointer arg from xfs_trans_ail_cursor_done() Message-Id: <1396900746-22201-19-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_log_recover.c | 4 ++-- fs/xfs/xfs_trans.c | 2 +- fs/xfs/xfs_trans_ail.c | 5 ++--- fs/xfs/xfs_trans_priv.h | 3 +-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index bce53ac..7801052 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3145,7 +3145,7 @@ xlog_recover_efd_pass2( } lip = xfs_trans_ail_cursor_next(ailp, &cur); } - xfs_trans_ail_cursor_done(ailp, &cur); + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); return 0; @@ -3757,7 +3757,7 @@ xlog_recover_process_efis( lip = xfs_trans_ail_cursor_next(ailp, &cur); } out: - xfs_trans_ail_cursor_done(ailp, &cur); + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); return error; } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index c812c5c..737eb04 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -827,7 +827,7 @@ xfs_trans_committed_bulk( xfs_log_item_batch_insert(ailp, &cur, log_items, i, commit_lsn); spin_lock(&ailp->xa_lock); - xfs_trans_ail_cursor_done(ailp, &cur); + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); } diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index a728735..cb0f3a8 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -173,7 +173,6 @@ xfs_trans_ail_cursor_next( */ void xfs_trans_ail_cursor_done( - struct xfs_ail *ailp, struct xfs_ail_cursor *cur) { cur->item = NULL; @@ -368,7 +367,7 @@ xfsaild_push( * If the AIL is empty or our push has reached the end we are * done now. */ - xfs_trans_ail_cursor_done(ailp, &cur); + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); goto out_done; } @@ -453,7 +452,7 @@ xfsaild_push( break; lsn = lip->li_lsn; } - xfs_trans_ail_cursor_done(ailp, &cur); + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); if (xfs_buf_delwri_submit_nowait(&ailp->xa_buf_list)) diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 12e86af..bd12818 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -133,8 +133,7 @@ struct xfs_log_item * xfs_trans_ail_cursor_last(struct xfs_ail *ailp, xfs_lsn_t lsn); struct xfs_log_item * xfs_trans_ail_cursor_next(struct xfs_ail *ailp, struct xfs_ail_cursor *cur); -void xfs_trans_ail_cursor_done(struct xfs_ail *ailp, - struct xfs_ail_cursor *cur); +void xfs_trans_ail_cursor_done(struct xfs_ail_cursor *cur); #if BITS_PER_LONG != 64 static inline void -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A643B7FA0 for ; Mon, 7 Apr 2014 14:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22361AC019 for ; Mon, 7 Apr 2014 12:59:11 -0700 (PDT) X-ASG-Debug-ID: 1396900749-04cb6c5676d88bc0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id CVioAj1A5Do9GpjL for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id B6BA863BEA5D; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 16/19] xfs: remove unused tp arg from xfs_symlink_local_to_remote() Date: Mon, 7 Apr 2014 14:59:03 -0500 X-ASG-Orig-Subj: [PATCH 16/19] xfs: remove unused tp arg from xfs_symlink_local_to_remote() Message-Id: <1396900746-22201-17-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_bmap.c | 5 ++--- fs/xfs/xfs_shared.h | 2 +- fs/xfs/xfs_symlink_remote.c | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 03b6ff2..6a1e702 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -919,8 +919,7 @@ 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_trans *tp, - struct xfs_buf *bp, + void (*init_fn)(struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp)) { @@ -977,7 +976,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(tp, bp, ip, ifp); + 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); diff --git a/fs/xfs/xfs_shared.h b/fs/xfs/xfs_shared.h index 8c5035a..18dca8c 100644 --- a/fs/xfs/xfs_shared.h +++ b/fs/xfs/xfs_shared.h @@ -238,7 +238,7 @@ int xfs_symlink_hdr_set(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, uint32_t size, struct xfs_buf *bp); bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, uint32_t size, struct xfs_buf *bp); -void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, +void xfs_symlink_local_to_remote(struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp); #endif /* __XFS_SHARED_H__ */ diff --git a/fs/xfs/xfs_symlink_remote.c b/fs/xfs/xfs_symlink_remote.c index bf59a2b..8e3045e 100644 --- a/fs/xfs/xfs_symlink_remote.c +++ b/fs/xfs/xfs_symlink_remote.c @@ -173,7 +173,6 @@ const struct xfs_buf_ops xfs_symlink_buf_ops = { void xfs_symlink_local_to_remote( - struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp) -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 30AB27F9E for ; Mon, 7 Apr 2014 14:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B376EAC018 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900749-04bdf0743a1c8930001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nONW2juHsNzMjA2m for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 97FCC63BECC5; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 14/19] xfs: remove unused pag ptr arg from iterator execute functions Date: Mon, 7 Apr 2014 14:59:01 -0500 X-ASG-Orig-Subj: [PATCH 14/19] xfs: remove unused pag ptr arg from iterator execute functions Message-Id: <1396900746-22201-15-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_icache.c | 12 ++++-------- fs/xfs/xfs_icache.h | 6 ++---- fs/xfs/xfs_qm_syscalls.c | 1 - 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 98d3524..c48df5f 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -507,8 +507,7 @@ STATIC int xfs_inode_ag_walk( struct xfs_mount *mp, struct xfs_perag *pag, - int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags, + int (*execute)(struct xfs_inode *ip, int flags, void *args), int flags, void *args, @@ -582,7 +581,7 @@ restart: for (i = 0; i < nr_found; i++) { if (!batch[i]) continue; - error = execute(batch[i], pag, flags, args); + error = execute(batch[i], flags, args); IRELE(batch[i]); if (error == EAGAIN) { skipped++; @@ -636,8 +635,7 @@ xfs_eofblocks_worker( int xfs_inode_ag_iterator( struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags, + int (*execute)(struct xfs_inode *ip, int flags, void *args), int flags, void *args) @@ -664,8 +662,7 @@ xfs_inode_ag_iterator( int xfs_inode_ag_iterator_tag( struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags, + int (*execute)(struct xfs_inode *ip, int flags, void *args), int flags, void *args, @@ -1209,7 +1206,6 @@ xfs_inode_match_id( STATIC int xfs_inode_free_eofblocks( struct xfs_inode *ip, - struct xfs_perag *pag, int flags, void *args) { diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 9ed68bb..9cf017b 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -60,12 +60,10 @@ int xfs_icache_free_eofblocks(struct xfs_mount *, struct xfs_eofblocks *); void xfs_eofblocks_worker(struct work_struct *); int xfs_inode_ag_iterator(struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, - int flags, void *args), + int (*execute)(struct xfs_inode *ip, int flags, void *args), int flags, void *args); int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, - int flags, void *args), + int (*execute)(struct xfs_inode *ip, int flags, void *args), int flags, void *args, int tag); static inline int diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 3daf5ea..72cbe65 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -959,7 +959,6 @@ xfs_qm_export_flags( STATIC int xfs_dqrele_inode( struct xfs_inode *ip, - struct xfs_perag *pag, int flags, void *args) { -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FBC07F9D for ; Mon, 7 Apr 2014 14:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 91450AC014 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900749-04cbb054b9b993d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mAliBH8pDV5ltDXz for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id ED30263BE836; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 19/19] xfs: remove unused trans pointer arg from xlog_recover_unmount_trans() Date: Mon, 7 Apr 2014 14:59:06 -0500 X-ASG-Orig-Subj: [PATCH 19/19] xfs: remove unused trans pointer arg from xlog_recover_unmount_trans() Message-Id: <1396900746-22201-20-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_log_recover.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 7801052..690a64d 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3520,8 +3520,7 @@ out: STATIC int xlog_recover_unmount_trans( - struct xlog *log, - struct xlog_recover *trans) + struct xlog *log) { /* Do nothing now */ xfs_warn(log->l_mp, "%s: Unmount LR", __func__); @@ -3595,7 +3594,7 @@ xlog_recover_process_data( trans, pass); break; case XLOG_UNMOUNT_TRANS: - error = xlog_recover_unmount_trans(log, trans); + error = xlog_recover_unmount_trans(log); break; case XLOG_WAS_CONT_TRANS: error = xlog_recover_add_to_cont_trans(log, -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7AA2B7F98 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6302F8F8039 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5677d88bb0002-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id zJvnWcVWdMQrUIrm for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id A843A63BEBE7; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 15/19] xfs: remove unused bp arg from xfs_iflush_fork() Date: Mon, 7 Apr 2014 14:59:02 -0500 X-ASG-Orig-Subj: [PATCH 15/19] xfs: remove unused bp arg from xfs_iflush_fork() Message-Id: <1396900746-22201-16-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_inode.c | 4 ++-- fs/xfs/xfs_inode_fork.c | 3 +-- fs/xfs/xfs_inode_fork.h | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 3a137e9..be29b80 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3260,9 +3260,9 @@ xfs_iflush_int( } } - xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK, bp); + xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK); if (XFS_IFORK_Q(ip)) - xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK, bp); + xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK); xfs_inobp_check(mp, bp); /* diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 73514c0..b031e8d 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -798,8 +798,7 @@ xfs_iflush_fork( xfs_inode_t *ip, xfs_dinode_t *dip, xfs_inode_log_item_t *iip, - int whichfork, - xfs_buf_t *bp) + int whichfork) { char *cp; xfs_ifork_t *ifp; diff --git a/fs/xfs/xfs_inode_fork.h b/fs/xfs/xfs_inode_fork.h index eb329a1..7d3b1ed 100644 --- a/fs/xfs/xfs_inode_fork.h +++ b/fs/xfs/xfs_inode_fork.h @@ -127,8 +127,7 @@ typedef struct xfs_ifork { int xfs_iformat_fork(struct xfs_inode *, struct xfs_dinode *); void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, - struct xfs_inode_log_item *, int, - struct xfs_buf *); + struct xfs_inode_log_item *, int); 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); -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8475C7F99 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EBA5AC016 for ; Mon, 7 Apr 2014 12:59:09 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cb6c5675d88ba0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XvA4DzCc5lowaVxl for ; Mon, 07 Apr 2014 12:59:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 226B463C38A6; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 06/19] xfs: remove unused blocksize arg from xfs_setsize_buftarg() Date: Mon, 7 Apr 2014 14:58:53 -0500 X-ASG-Orig-Subj: [PATCH 06/19] xfs: remove unused blocksize arg from xfs_setsize_buftarg() Message-Id: <1396900746-22201-7-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- fs/xfs/xfs_buf.c | 4 +--- fs/xfs/xfs_buf.h | 2 +- fs/xfs/xfs_super.c | 5 +---- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9c061ef..03742ea 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1596,7 +1596,6 @@ xfs_free_buftarg( int xfs_setsize_buftarg( xfs_buftarg_t *btp, - unsigned int blocksize, unsigned int sectorsize) { /* Set up metadata sector size info */ @@ -1631,8 +1630,7 @@ xfs_setsize_buftarg_early( xfs_buftarg_t *btp, struct block_device *bdev) { - return xfs_setsize_buftarg(btp, PAGE_SIZE, - bdev_logical_block_size(bdev)); + return xfs_setsize_buftarg(btp, bdev_logical_block_size(bdev)); } xfs_buftarg_t * diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 9953395..0aee9b8 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -376,7 +376,7 @@ extern xfs_buftarg_t *xfs_alloc_buftarg(struct xfs_mount *, struct block_device *, int, const char *); extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); extern void xfs_wait_buftarg(xfs_buftarg_t *); -extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); +extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int); #define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev) #define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index d971f49..c10197e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -811,8 +811,7 @@ xfs_setup_devices( { int error; - error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize, - mp->m_sb.sb_sectsize); + error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_sectsize); if (error) return error; @@ -822,14 +821,12 @@ xfs_setup_devices( if (xfs_sb_version_hassector(&mp->m_sb)) log_sector_size = mp->m_sb.sb_logsectsize; error = xfs_setsize_buftarg(mp->m_logdev_targp, - mp->m_sb.sb_blocksize, log_sector_size); if (error) return error; } if (mp->m_rtdev_targp) { error = xfs_setsize_buftarg(mp->m_rtdev_targp, - mp->m_sb.sb_blocksize, mp->m_sb.sb_sectsize); if (error) return error; -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5BF337F94 for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38A5A304039 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900748-04cbb054b7b993c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UXV3wzPVrVs0DNsE for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 60B4B61D1A5F; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 10/19] xfs: remove unused tp arg from xfs_da_reada_buf & callers Date: Mon, 7 Apr 2014 14:58:57 -0500 X-ASG-Orig-Subj: [PATCH 10/19] xfs: remove unused tp arg from xfs_da_reada_buf & callers Message-Id: <1396900746-22201-11-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900748 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This one hits a few functions as we unravel the unused arg up through the callers. Signed-off-by: Eric Sandeen --- fs/xfs/xfs_da_btree.c | 8 +++----- fs/xfs/xfs_da_btree.h | 6 +++--- fs/xfs/xfs_dir2_data.c | 3 +-- fs/xfs/xfs_dir2_priv.h | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 4 ++-- fs/xfs/xfs_file.c | 2 +- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 796272a..da4692e 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2461,7 +2461,6 @@ xfs_buf_map_from_irec( */ static int xfs_dabuf_map( - struct xfs_trans *trans, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, @@ -2557,7 +2556,7 @@ xfs_da_get_buf( *bpp = NULL; mapp = ↦ nmap = 1; - error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + error = xfs_dabuf_map(dp, bno, mappedbno, whichfork, &mapp, &nmap); if (error) { /* mapping a hole is not an error, but we don't continue */ @@ -2605,7 +2604,7 @@ xfs_da_read_buf( *bpp = NULL; mapp = ↦ nmap = 1; - error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + error = xfs_dabuf_map(dp, bno, mappedbno, whichfork, &mapp, &nmap); if (error) { /* mapping a hole is not an error, but we don't continue */ @@ -2678,7 +2677,6 @@ out_free: */ xfs_daddr_t xfs_da_reada_buf( - struct xfs_trans *trans, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, @@ -2692,7 +2690,7 @@ xfs_da_reada_buf( mapp = ↦ nmap = 1; - error = xfs_dabuf_map(trans, dp, bno, mappedbno, whichfork, + error = xfs_dabuf_map(dp, bno, mappedbno, whichfork, &mapp, &nmap); if (error) { /* mapping a hole is not an error, but we don't continue */ diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6e95ea7..4cc6a46 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -183,9 +183,9 @@ 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); -xfs_daddr_t xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp, - xfs_dablk_t bno, xfs_daddr_t mapped_bno, - int whichfork, const struct xfs_buf_ops *ops); +xfs_daddr_t xfs_da_reada_buf(struct xfs_inode *dp, 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, struct xfs_buf *dead_buf); diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 70acff4..b00df36 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -329,12 +329,11 @@ xfs_dir3_data_read( int 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, + return xfs_da_reada_buf(dp, bno, mapped_bno, XFS_DATA_FORK, &xfs_dir3_data_reada_buf_ops); } diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 8b9d228..2429960 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -54,8 +54,8 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args, 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_dir3_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, - xfs_dablk_t bno, xfs_daddr_t mapped_bno); +extern int xfs_dir3_data_readahead(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, diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index a18000f..a99967b 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -434,7 +434,7 @@ xfs_dir2_leaf_readbuf( */ if (i > mip->ra_current && map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) { - xfs_dir3_data_readahead(NULL, dp, + xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, XFS_FSB_TO_DADDR(mp, map[mip->ra_index].br_startblock + @@ -447,7 +447,7 @@ xfs_dir2_leaf_readbuf( * use our mapping, but this is a very rare case. */ else if (i > mip->ra_current) { - xfs_dir3_data_readahead(NULL, dp, + xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, -1); mip->ra_current = i; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 64b48ea..340f2af 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -917,7 +917,7 @@ xfs_dir_open( */ mode = xfs_ilock_data_map_shared(ip); if (ip->i_d.di_nextents > 0) - xfs_dir3_data_readahead(NULL, ip, 0, -1); + xfs_dir3_data_readahead(ip, 0, -1); xfs_iunlock(ip, mode); return 0; } -- 1.7.1 From sandeen@sandeen.net Mon Apr 7 14:59:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C83077F9C for ; Mon, 7 Apr 2014 14:59:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 422CDAC013 for ; Mon, 7 Apr 2014 12:59:10 -0700 (PDT) X-ASG-Debug-ID: 1396900749-04cb6c5678d88bc0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LSLu4LFcDbhOCs4H for ; Mon, 07 Apr 2014 12:59:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 7C10963BEED8; Mon, 7 Apr 2014 14:59:08 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 12/19] xfs: remove unused mp arg from xfs_calc_dquots_per_chunk() Date: Mon, 7 Apr 2014 14:58:59 -0500 X-ASG-Orig-Subj: [PATCH 12/19] xfs: remove unused mp arg from xfs_calc_dquots_per_chunk() Message-Id: <1396900746-22201-13-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396900749 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- And because this gets passed to xfs_bmap_local_to_extents() as *init_fn(), change that prototype too. Signed-off-by: Eric Sandeen --- fs/xfs/xfs_dquot_buf.c | 5 ++--- fs/xfs/xfs_qm.c | 3 +-- fs/xfs/xfs_quota_defs.h | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_dquot_buf.c b/fs/xfs/xfs_dquot_buf.c index d401457..a470668 100644 --- a/fs/xfs/xfs_dquot_buf.c +++ b/fs/xfs/xfs_dquot_buf.c @@ -35,7 +35,6 @@ int xfs_calc_dquots_per_chunk( - struct xfs_mount *mp, unsigned int nbblks) /* basic block units */ { unsigned int ndquots; @@ -194,7 +193,7 @@ xfs_dquot_buf_verify_crc( if (mp->m_quotainfo) ndquots = mp->m_quotainfo->qi_dqperchunk; else - ndquots = xfs_calc_dquots_per_chunk(mp, + ndquots = xfs_calc_dquots_per_chunk( XFS_BB_TO_FSB(mp, bp->b_length)); for (i = 0; i < ndquots; i++, d++) { @@ -225,7 +224,7 @@ xfs_dquot_buf_verify( if (mp->m_quotainfo) ndquots = mp->m_quotainfo->qi_dqperchunk; else - ndquots = xfs_calc_dquots_per_chunk(mp, bp->b_length); + ndquots = xfs_calc_dquots_per_chunk(bp->b_length); /* * On the first read of the buffer, verify that each dquot is valid. diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 348e4d2..23cc8dc 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -870,8 +870,7 @@ xfs_qm_init_quotainfo( /* Precalc some constants */ qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB); - qinf->qi_dqperchunk = xfs_calc_dquots_per_chunk(mp, - qinf->qi_dqchunklen); + qinf->qi_dqperchunk = xfs_calc_dquots_per_chunk(qinf->qi_dqchunklen); mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD); diff --git a/fs/xfs/xfs_quota_defs.h b/fs/xfs/xfs_quota_defs.h index b3b2b10..137e209 100644 --- a/fs/xfs/xfs_quota_defs.h +++ b/fs/xfs/xfs_quota_defs.h @@ -156,6 +156,6 @@ typedef __uint16_t xfs_qwarncnt_t; extern int xfs_dqcheck(struct xfs_mount *mp, xfs_disk_dquot_t *ddq, xfs_dqid_t id, uint type, uint flags, char *str); -extern int xfs_calc_dquots_per_chunk(struct xfs_mount *mp, unsigned int nbblks); +extern int xfs_calc_dquots_per_chunk(unsigned int nbblks); #endif /* __XFS_QUOTA_H__ */ -- 1.7.1 From bfoster@redhat.com Mon Apr 7 16:45:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 475D47FC6 for ; Mon, 7 Apr 2014 16:45:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33EF68F804B for ; Mon, 7 Apr 2014 14:45:34 -0700 (PDT) X-ASG-Debug-ID: 1396907129-04cbb054b6ba1070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ARIEPvubEZqSVIhd; Mon, 07 Apr 2014 14:45:30 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s37LjTIR004338 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Apr 2014 17:45:29 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s37LjTwg016408; Mon, 7 Apr 2014 17:45:29 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B99531256CC; Mon, 7 Apr 2014 17:45:27 -0400 (EDT) Date: Mon, 7 Apr 2014 17:45:27 -0400 From: Brian Foster To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140407214527.GA43531@bfoster.bfoster> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <53430375.3060203@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53430375.3060203@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396907130 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 07, 2014 at 02:58:45PM -0500, Mark Tinguely wrote: > On 04/07/14 10:39, Brian Foster wrote: > >Hi all, > > > >This is v2 of the speculative preallocation FAQ bits. The initial > >proposal was here: > > > >http://oss.sgi.com/archives/xfs/2014-03/msg00316.html > > > >This version includes some updates based on review from arekm and > >dchinner. Most notably, the content has been broken down into a few more > >questions. Unless there are further major changes required, I'll plan to > >post something along these lines to the wiki when my account is > >approved. Thanks for the feedback! > > > >Brian > > > >--- > > > >Q: Why do files on XFS use more data blocks than expected? > > > >A: > > > >The XFS speculative preallocation algorithm allocates extra blocks > >beyond end of file (EOF) to minimise file fragmentation during buffered > ^^^ beyond here and then later adopt post-EOF phrasing. > I think you're suggesting a broader terminology change, but I'm not quite following. Could you be specific about what "later" bits should change? What phrasing in particular..? > ... > > >See the FAQ entry on speculative preallocation for details. > > > >Q: What is speculative preallocation? > > > >A: > > > >XFS speculatively preallocates post-EOF blocks on file extending writes > >in anticipation of future extending writes. The size of a preallocation > >is dynamic and depends on the runtime state of the file and fs. > >Generally speaking, preallocation is disabled for very small files and > vague what is very small? ^^^ > ... I originally pointed out 64k, but that and other heuristic details that are subject to change were purged in v2. I'm personally not against including something that indicates the default and the notion that it's subject to change. I don't feel too strongly about it either way. Thoughts appreciated. > > > >Q: Is speculative preallocation permanent? > > > >A: > > > >Although speculative preallocation can lead to reports of excess space > >usage, the preallocated space is not permanent unless explicitly made so > >via fallocate or a similar interface. Preallocated space can also be > >encoded permanently in situations where file size is extended beyond a > >range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > >blocks are reclaimed on file close, inode reclaim, unmount or in the > >background once file write activity subsides. > > Switch order? > > Normally, preallocated > blocks are reclaimed on file close, inode reclaim, unmount or in the > background once file write activity subsides. They can be explictly > made permanent . > Thoughts on the following? "Preallocated blocks are normally reclaimed on file close, inode reclaim, unmount or in the background once file write activity subsides. They can be explicitly made permanent via fallocate or a similar interface. They can be implicitly made permanent in situations where file size is extended beyond a range of post-EOF blocks (i.e., via an extending truncate)." > > > >Q: My workload has known characteristics - can I tune speculative > >preallocation to an optimal fixed size? > > > >A: > > > >The 'allocsize=' mount option configures the XFS block allocation > >algorithm to use a fixed allocation size. Speculative preallocation is > >not dynamically resized when the allocsize mount option is set and thus > >the potential for fragmentation is increased. XFS historically set > > sets the > > >allocsize to 64k by default. > > > > > Q: Can I disable S-P-A ? > A: No..? ;) Are you proposing this with the similar intent to the previous Q (i.e., "what's the alternative to the default behavior?"), or with the notion that Dave pointed out how technically preallocation is not really "off?" Or something else? If the former, we could modify the question: "My workload has known characteristics - can I disable speculative preallocation or tune it to an optimal fixed size?" Or something along those lines. Would anybody object to also pointing out that 'allocsize=4k' (or allocsize=?) could be considered "speculative preallocation == off" from the user's perspective? Thanks for the feedback. Brian > -Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Mon Apr 7 17:21:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 199B37FF2 for ; Mon, 7 Apr 2014 17:21:07 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id D6022304039; Mon, 7 Apr 2014 15:21:03 -0700 (PDT) Message-ID: <534324D0.3080701@sgi.com> Date: Mon, 07 Apr 2014 17:21: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: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <53430375.3060203@sgi.com> <20140407214527.GA43531@bfoster.bfoster> In-Reply-To: <20140407214527.GA43531@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/07/14 16:45, Brian Foster wrote: > On Mon, Apr 07, 2014 at 02:58:45PM -0500, Mark Tinguely wrote: >> On 04/07/14 10:39, Brian Foster wrote: >>> Hi all, >>> >>> This is v2 of the speculative preallocation FAQ bits. The initial >>> proposal was here: >>> >>> http://oss.sgi.com/archives/xfs/2014-03/msg00316.html >>> >>> This version includes some updates based on review from arekm and >>> dchinner. Most notably, the content has been broken down into a few more >>> questions. Unless there are further major changes required, I'll plan to >>> post something along these lines to the wiki when my account is >>> approved. Thanks for the feedback! >>> >>> Brian >>> >>> --- >>> >>> Q: Why do files on XFS use more data blocks than expected? >>> >>> A: >>> >>> The XFS speculative preallocation algorithm allocates extra blocks >>> beyond end of file (EOF) to minimise file fragmentation during buffered >> ^^^ beyond here and then later adopt post-EOF phrasing. >> > > I think you're suggesting a broader terminology change, but I'm not > quite following. Could you be specific about what "later" bits should > change? What phrasing in particular..? You use "blocks beyond end of file (EOF)" here and then later use the terminology of "post-EOF" through the rest of the document. Just pointing out the change in terminology. > >> ... >> >>> See the FAQ entry on speculative preallocation for details. >>> >>> Q: What is speculative preallocation? >>> >>> A: >>> >>> XFS speculatively preallocates post-EOF blocks on file extending writes >>> in anticipation of future extending writes. The size of a preallocation >>> is dynamic and depends on the runtime state of the file and fs. >>> Generally speaking, preallocation is disabled for very small files and >> vague what is very small? ^^^ >> ... > > I originally pointed out 64k, but that and other heuristic details that > are subject to change were purged in v2. I'm personally not against > including something that indicates the default and the notion that it's > subject to change. I don't feel too strongly about it either way. > Thoughts appreciated. I think the details are good since everyone has a different idea on "very small". The FAQ can be changed with the code. You can expect the TOT FAQ to represent Linux 3.0-stable. >> >> >>> Q: Is speculative preallocation permanent? >>> >>> A: >>> >>> Although speculative preallocation can lead to reports of excess space >>> usage, the preallocated space is not permanent unless explicitly made so >>> via fallocate or a similar interface. Preallocated space can also be >>> encoded permanently in situations where file size is extended beyond a >>> range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated >>> blocks are reclaimed on file close, inode reclaim, unmount or in the >>> background once file write activity subsides. >> >> Switch order? >> >> Normally, preallocated >> blocks are reclaimed on file close, inode reclaim, unmount or in the >> background once file write activity subsides. They can be explictly >> made permanent . >> > > Thoughts on the following? > > "Preallocated blocks are normally reclaimed on file close, inode > reclaim, unmount or in the background once file write activity subsides. > They can be explicitly made permanent via fallocate or a similar > interface. They can be implicitly made permanent in situations where > file size is extended beyond a range of post-EOF blocks (i.e., via an > extending truncate)." > Looks good to me. >>> >>> Q: My workload has known characteristics - can I tune speculative >>> preallocation to an optimal fixed size? >>> >>> A: >>> >>> The 'allocsize=' mount option configures the XFS block allocation >>> algorithm to use a fixed allocation size. Speculative preallocation is >>> not dynamically resized when the allocsize mount option is set and thus >>> the potential for fragmentation is increased. XFS historically set >> >> sets the >> >>> allocsize to 64k by default. >>> >> >> >> Q: Can I disable S-P-A ? >> > > A: No..? ;) > > Are you proposing this with the similar intent to the previous Q (i.e., > "what's the alternative to the default behavior?"), or with the notion > that Dave pointed out how technically preallocation is not really "off?" > Or something else? If the former, we could modify the question: > > "My workload has known characteristics - can I disable speculative > preallocation or tune it to an optimal fixed size?" > > Or something along those lines. Would anybody object to also pointing > out that 'allocsize=4k' (or allocsize=?) could be considered > "speculative preallocation == off" from the user's perspective? > That sounds good to me. If they know it is there, eventually someone will ask "can I turn it off?". I would be happy with the answer of "no, but it can be tuned" and don't tell them how to effectively turn it off. > Thanks for the feedback. > > Brian > Thanks for the FAQ. --Mark. From david@fromorbit.com Mon Apr 7 17:55:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D826D7FC1 for ; Mon, 7 Apr 2014 17:55:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A455AC012 for ; Mon, 7 Apr 2014 15:55:02 -0700 (PDT) X-ASG-Debug-ID: 1396911299-04cb6c5675d94cb0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ejjRDPovXYsV9DUS for ; Mon, 07 Apr 2014 15:55:00 -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: AmtVACgsQ1N5LEcvPGdsb2JhbABZgwaDSoULtwSFX4ErFwMBAQEBODWCJQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTh3EHy1EXFo5bB4MkgRQElG+Da5YCKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 08:24:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXIRK-0005gk-59; Tue, 08 Apr 2014 08:54:54 +1000 Date: Tue, 8 Apr 2014 08:54:54 +1000 From: Dave Chinner To: Brian Foster Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140407225454.GB27017@dastard> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <53430375.3060203@sgi.com> <20140407214527.GA43531@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140407214527.GA43531@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396911299 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 05:45:27PM -0400, Brian Foster wrote: > On Mon, Apr 07, 2014 at 02:58:45PM -0500, Mark Tinguely wrote: > > On 04/07/14 10:39, Brian Foster wrote: > > >See the FAQ entry on speculative preallocation for details. > > > > > >Q: What is speculative preallocation? > > > > > >A: > > > > > >XFS speculatively preallocates post-EOF blocks on file extending writes > > >in anticipation of future extending writes. The size of a preallocation > > >is dynamic and depends on the runtime state of the file and fs. > > >Generally speaking, preallocation is disabled for very small files and > > vague what is very small? ^^^ > > ... > > I originally pointed out 64k, but that and other heuristic details that > are subject to change were purged in v2. I'm personally not against > including something that indicates the default and the notion that it's > subject to change. I don't feel too strongly about it either way. > Thoughts appreciated. As i said in the original - if we put specific values in here or describe the exact heuristics, then it will be wrong the moment we change the code. If someone wants to know the exact details on how it works, then they can look at the code for the kernel they are running, because the behaviour can (and does) change from kernel to kernel. > > >Q: Is speculative preallocation permanent? > > > > > >A: > > > > > >Although speculative preallocation can lead to reports of excess space > > >usage, the preallocated space is not permanent unless explicitly made so > > >via fallocate or a similar interface. Preallocated space can also be > > >encoded permanently in situations where file size is extended beyond a > > >range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > > >blocks are reclaimed on file close, inode reclaim, unmount or in the > > >background once file write activity subsides. > > > > Switch order? > > > > Normally, preallocated > > blocks are reclaimed on file close, inode reclaim, unmount or in the > > background once file write activity subsides. They can be explictly > > made permanent . > > > > Thoughts on the following? > > "Preallocated blocks are normally reclaimed on file close, inode > reclaim, unmount or in the background once file write activity subsides. > They can be explicitly made permanent via fallocate or a similar > interface. They can be implicitly made permanent in situations where > file size is extended beyond a range of post-EOF blocks (i.e., via an > extending truncate)." Speculative prealloc may end up permanent on a crash, because the in-memory state used to track and reclaim the speculative preallocation is lost. > > >Q: My workload has known characteristics - can I tune speculative > > >preallocation to an optimal fixed size? > > > > > >A: > > > > > >The 'allocsize=' mount option configures the XFS block allocation > > >algorithm to use a fixed allocation size. Speculative preallocation is > > >not dynamically resized when the allocsize mount option is set and thus > > >the potential for fragmentation is increased. XFS historically set > > > > sets the > > > > >allocsize to 64k by default. > > > > > > > > > Q: Can I disable S-P-A ? > > > > A: No..? ;) That's the correct answer ;) > Are you proposing this with the similar intent to the previous Q (i.e., > "what's the alternative to the default behavior?"), or with the notion > that Dave pointed out how technically preallocation is not really "off?" > Or something else? If the former, we could modify the question: > > "My workload has known characteristics - can I disable speculative > preallocation or tune it to an optimal fixed size?" Yup, I'd change the questions like that. > Or something along those lines. Would anybody object to also pointing > out that 'allocsize=4k' (or allocsize=?) could be considered > "speculative preallocation == off" from the user's perspective? >From a users perspective, fixed size preallocation with anything less than allocsize=64k would be "off". That was the old default, and no user ever noticed that speculative prealloc was occurring except on large files when it failed to prevent fragmentation.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 17:57:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BD0127FC8 for ; Mon, 7 Apr 2014 17:57:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E116304039 for ; Mon, 7 Apr 2014 15:57:15 -0700 (PDT) X-ASG-Debug-ID: 1396911431-04cbb054b8ba5830001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Fmtm3vRS4bBWwPM9 for ; Mon, 07 Apr 2014 15:57:12 -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: Ar1ZACgsQ1N5LEcvPGdsb2JhbABZgwY7gw+FC6MsAgaTUIVfgSsXAwEBAQE4NYIlAQEBBDocIxAIAxgJJQ8FJQMHGhOHeMtRFxaMXYF+B4MkgRQEmFqWAis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 08:27:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXITW-0005hV-Mv; Tue, 08 Apr 2014 08:57:10 +1000 Date: Tue, 8 Apr 2014 08:57:10 +1000 From: Dave Chinner To: Mark Tinguely Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140407225710.GC27017@dastard> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <53430375.3060203@sgi.com> <20140407214527.GA43531@bfoster.bfoster> <534324D0.3080701@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534324D0.3080701@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: 1396911431 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 05:21:04PM -0500, Mark Tinguely wrote: > On 04/07/14 16:45, Brian Foster wrote: > >On Mon, Apr 07, 2014 at 02:58:45PM -0500, Mark Tinguely wrote: > >>On 04/07/14 10:39, Brian Foster wrote: > >>>XFS speculatively preallocates post-EOF blocks on file extending writes > >>>in anticipation of future extending writes. The size of a preallocation > >>>is dynamic and depends on the runtime state of the file and fs. > >>>Generally speaking, preallocation is disabled for very small files and > >> vague what is very small? ^^^ > >>... > > > >I originally pointed out 64k, but that and other heuristic details that > >are subject to change were purged in v2. I'm personally not against > >including something that indicates the default and the notion that it's > >subject to change. I don't feel too strongly about it either way. > >Thoughts appreciated. > > > I think the details are good since everyone has a different idea on > "very small". The FAQ can be changed with the code. You can expect > the TOT FAQ to represent Linux 3.0-stable. What's that supposed to mean? The FAQ on the xfs.org website does not represent a specific release. It is supposed to contain the most up-to-date information we have about various topics. If there's something specific to a kernel version we need to mention, then that's explicitly stated in the FAQ entry.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 18:23:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E98E77FFC for ; Mon, 7 Apr 2014 18:23:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C364E304059 for ; Mon, 7 Apr 2014 16:23:13 -0700 (PDT) X-ASG-Debug-ID: 1396912991-04cb6c5675d965b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id gcPoGQ2WzQQGgi9C for ; Mon, 07 Apr 2014 16:23:12 -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: AmdVADcyQ1N5LEcvPGdsb2JhbABZgwaDSoULtwqFX4EmFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3jLRBcWjlsHgySBFASYWophiyEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 08:53:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXIsg-0005lL-4a; Tue, 08 Apr 2014 09:23:10 +1000 Date: Tue, 8 Apr 2014 09:23:10 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 16/19] xfs: remove unused tp arg from xfs_symlink_local_to_remote() Message-ID: <20140407232310.GD27017@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/19] xfs: remove unused tp arg from xfs_symlink_local_to_remote() References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> <1396900746-22201-17-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396900746-22201-17-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396912991 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 02:59:03PM -0500, Eric Sandeen wrote: > Signed-off-by: Eric Sandeen > --- > fs/xfs/xfs_bmap.c | 5 ++--- > fs/xfs/xfs_shared.h | 2 +- > fs/xfs/xfs_symlink_remote.c | 1 - > 3 files changed, 3 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 03b6ff2..6a1e702 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -919,8 +919,7 @@ 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_trans *tp, > - struct xfs_buf *bp, > + void (*init_fn)(struct xfs_buf *bp, > struct xfs_inode *ip, > struct xfs_ifork *ifp)) > { This one I disagree with - this local-to-remote change is only done within a transaction context. The existing conversions don't require any special operations that require logging different objects, but the possibility exists and so we really do need to pass the transaction structure through this API. e.g. we really should convert the directory code over to use the generic xfs_bmap_local_to_extents() function rather than rolling it's own version of essentially the same thing, and that requires passing the transaction structure through the init_fn interface. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 18:29:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FC5F8004 for ; Mon, 7 Apr 2014 18:29:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0ED2AC012 for ; Mon, 7 Apr 2014 16:29:01 -0700 (PDT) X-ASG-Debug-ID: 1396913329-04cbb054b8ba7670001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id MgfFZNFMMMbuyWTs for ; Mon, 07 Apr 2014 16:28:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmdVAGgzQ1N5LEcvPGdsb2JhbABZgwaDSoULtwqFX4EmFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3jLRBcWjlsHgySBFASYWpYCKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 08:58:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXIy6-0005mH-Rp; Tue, 08 Apr 2014 09:28:46 +1000 Date: Tue, 8 Apr 2014 09:28:46 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/19] xfs: remove a bunch of unused function args Message-ID: <20140407232846.GE27017@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/19] xfs: remove a bunch of unused function args References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396900746-22201-1-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396913329 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4670 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 02:58:47PM -0500, Eric Sandeen wrote: > I did some mindless work during a plane ride. ;) > > If the granularity of these patches is just too much, I could certainly > collapse them into fewer, bigger patches, but I figured that this would > make them super-trivial to review. > > Most have no interesting commit messages aside from the subject, because > the subject says it all. > > Compile-tested only, TBH. Looks good, except for the patch I specifically commented on. FWIW, this sort of cleanup will help reduce some of the register pressure these code paths have, and that in turn will help reduce stack usage, so if you can find more... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 18:30:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EBCCA8005 for ; Mon, 7 Apr 2014 18:30:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C26AC304059 for ; Mon, 7 Apr 2014 16:30:49 -0700 (PDT) X-ASG-Debug-ID: 1396913447-04cb6c5677d96e30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Boy9I9szh3R0Qbua for ; Mon, 07 Apr 2014 16:30:47 -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: AnxVAIo0Q1N5LEcvPGdsb2JhbABZgwaDSlKEObcKhV+BJhcDAQEBATg1giUBAQEEIw8BIyMQCAMOCgICBSECAg8FJQMHGhOHeKkWoi8XFoETjHtNB4JvNYEUBJhalgIrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 09:00:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXJ01-0005mU-V3; Tue, 08 Apr 2014 09:30:45 +1000 Date: Tue, 8 Apr 2014 09:30:45 +1000 From: Dave Chinner To: Rich Johnston Cc: Arkadiusz =?utf-8?Q?Mi=C5=9Bkiewicz?= , xfs@oss.sgi.com Subject: Re: xfsprogs 3.1.12 and 3.2.0 releases? Message-ID: <20140407233045.GF27017@dastard> X-ASG-Orig-Subj: Re: xfsprogs 3.1.12 and 3.2.0 releases? References: <201401201822.48520.arekm@maven.pl> <5342EC72.8060007@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <5342EC72.8060007@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: 1396913447 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 01:20:34PM -0500, Rich Johnston wrote: > On 01/20/2014 11:22 AM, Arkadiusz MiÅ›kiewicz wrote: > > > >Hello. > > > >What's needed for both 3.1.12 and 3.2.0 releases to happen? > > > >If 3.2.0 is to be released soon then nice. Dave, AFAIK it is waiting for you > >and xfs_db crc work only? > > > >If 3.2.0 is far away then it would be nice to see 3.1.12 with bugfixes only > >(for those paranoid about new stuff) but 3.1.13 very soon after that with > >backported features like project quota support, parallelism, performance > >improvements. > > > >Obviously I hope 3.2.0 is soon and there is no need to waste effort on 3.1.x. > > > Is there any interest in a 3.1.12 release or will a 3.2.x release > happen soon? 3.2.x should happen soon. I've got a few patches to integrate and test and then we can move to a 3.2-rc1 release and go from there. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Apr 7 18:43:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 37BCA7F7E for ; Mon, 7 Apr 2014 18:43:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 21D268F8035 for ; Mon, 7 Apr 2014 16:43:32 -0700 (PDT) X-ASG-Debug-ID: 1396914211-04cb6c5675d97a90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id G4dKxzLzZA9eiE4B for ; Mon, 07 Apr 2014 16:43:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (unknown [67.51.122.226]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1484B63C77A3; Mon, 7 Apr 2014 18:43:30 -0500 (CDT) Message-ID: <53433821.1080506@sandeen.net> Date: Mon, 07 Apr 2014 18:43:29 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH 00/19] xfs: remove a bunch of unused function args References: <1396900746-22201-1-git-send-email-sandeen@redhat.com> <20140407232846.GE27017@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/19] xfs: remove a bunch of unused function args In-Reply-To: <20140407232846.GE27017@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396914211 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/7/14, 6:28 PM, Dave Chinner wrote: > On Mon, Apr 07, 2014 at 02:58:47PM -0500, Eric Sandeen wrote: >> I did some mindless work during a plane ride. ;) >> >> If the granularity of these patches is just too much, I could certainly >> collapse them into fewer, bigger patches, but I figured that this would >> make them super-trivial to review. >> >> Most have no interesting commit messages aside from the subject, because >> the subject says it all. >> >> Compile-tested only, TBH. > > Looks good, except for the patch I specifically commented on. > > FWIW, this sort of cleanup will help reduce some of the register > pressure these code paths have, and that in turn will help reduce > stack usage, so if you can find more... yep I was thinking along those lines. I think this is all of them; more show up w/ GCC warnings but some are for ops that need the superset of args. I'll do one more pass to be sure there aren't any knock-on effects w/ these changes. Thanks, -Eric > Cheers, > > Dave. > From david@fromorbit.com Mon Apr 7 19:15:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D78BA7FF3 for ; Mon, 7 Apr 2014 19:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 53E50AC012 for ; Mon, 7 Apr 2014 17:15:05 -0700 (PDT) X-ASG-Debug-ID: 1396916099-04cb6c5677d99850001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id xqT7oJoGRswaoD3d for ; Mon, 07 Apr 2014 17:15:00 -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: Ar1ZABk/Q1N5LEcvPGdsb2JhbABZgwY7gw+FC6MzAgaTUIVfgSYXAwEBAQE4NYIlAQEBBDocIxAIAxgJJQ8FJQMHGhOHeMtVFo5bB4Q4BJhalgIr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 09:44:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXJgZ-0005rn-BD; Tue, 08 Apr 2014 10:14:43 +1000 Date: Tue, 8 Apr 2014 10:14:43 +1000 From: Dave Chinner To: Filipe David Manana Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , linux-ext4@vger.kernel.org Subject: Re: [ANNOUNCE] xfstests: updated to cf1ed54 Message-ID: <20140408001443.GG27017@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: updated to cf1ed54 References: <20140404090357.GW17603@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396916099 X-Barracuda-URL: http://192.48.176.15: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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4671 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) On Fri, Apr 04, 2014 at 02:07:16PM +0100, Filipe David Manana wrote: > On Fri, Apr 4, 2014 at 10:03 AM, Dave Chinner wrote: > > Hi folks, > > > > The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has > > just been updated. Patches often get missed, so please check if your > > outstanding patches were in this update. If they have not been in > > this update, please resubmit them to xfs@oss.sgi.com so they can be > > picked up in the next update. > > > > The new head of the master branch is commit: > > > > cf1ed54 check: fix RESULT_BASE typo in check script > > > > The major new functionality worth mentioning in this update is the > > new config file format from Lukas. The existing format config files > > should continue to work without change, but the new format is much > > richer and allows specification of multiple different configurations > > to run test under. Hence testing multiple mount an dmkfs > > configurations becomes as simple as iterating the configurations > > in the config file. > > Hi, > > I might be missing something, but after checking out these changes, I > am no longer able to run btrfs tests. Example: > > $ ./check btrfs/041 > common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set > Passed all 0 tests > > $ cat local.config > export TEST_DEV=/dev/sdb > export TEST_DIR=/home/fdmanana/btrfs-tests/dev > export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" > export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" Are you sure that's the config file that is being picked up? I can't test btrfs at the moment because it appears to be completely screwed in a TOT kernel right now - it doesn't even show up in /proc/filesystems and doesn't emit anything on dmesg to indicate that initialisation of the built in btrfs code has failed or even been attempted. It's simply MIA.... However, using that same SCRATCH_DEV_POOL config for xfs or ext4 works just fine on my test machines with the current TOT xfstests and kernel code. $ cat configs/test2.config TEST_DIR=/mnt/test SCRATCH_MNT=/mnt/scratch TEST_DEV=/dev/vda SCRATCH_DEV_POOL="/dev/vdc /dev/vdd" $ sudo MKFS_OPTIONS="-m crc=1" ./check generic/001 FSTYP -- xfs (debug) PLATFORM -- Linux/x86_64 test2 3.14.0-rc1-dgc+ MKFS_OPTIONS -- -f -m crc=1 /dev/vdc MOUNT_OPTIONS -- /dev/vdc /mnt/scratch generic/001 4s ... 3s Ran: generic/001 Passed all 1 tests $ So, as you can see I can't reproduce your problem myself right now. Could you add a "set -x" line to the start of check and post the output? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 19:33:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D29EF7FD5 for ; Mon, 7 Apr 2014 19:33:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B532A30405F for ; Mon, 7 Apr 2014 17:33:15 -0700 (PDT) X-ASG-Debug-ID: 1396917193-04cb6c5676d9a7e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id LmvljrYbeVpr5ax5 for ; Mon, 07 Apr 2014 17:33:13 -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: AmdVAJpCQ1N5LEcvPGdsb2JhbABZgwaDSoULtwuFX4ElFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3jLPhcWjlsHhDgEmFqKYYshKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 10:03:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXJyR-0005uT-4r; Tue, 08 Apr 2014 10:33:11 +1000 Date: Tue, 8 Apr 2014 10:33:11 +1000 From: Dave Chinner To: Kyle McMartin Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents Message-ID: <20140408003311.GH27017@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents References: <20140324181907.GF23291@redacted.bos.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140324181907.GF23291@redacted.bos.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396917193 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4671 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 24, 2014 at 02:19:07PM -0400, Kyle McMartin wrote: > Remove the ifdef-hell imported from glibc around getdents64. Everything > since 2.4.1 supports things properly and this seems like a sensible > clean up, so lets just assume it exists and handle it by falling back > if not. > > Additionally, if the old getdents syscall doesn't exist, just stub out > the actual syscall and return ENOSYS. > > --- Kyle, these two patches are missing your SOB. I'm going to assume you wrote this yourself (given the history, it's a fair bet :) and add them in - let me know if then assumption is wrong so I can correct it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 19:55:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0EEBE7FD8 for ; Mon, 7 Apr 2014 19:55:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4460304059 for ; Mon, 7 Apr 2014 17:55:26 -0700 (PDT) X-ASG-Debug-ID: 1396918523-04cbb054b9bacee0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id hl1EidHuyPNvRNHc for ; Mon, 07 Apr 2014 17:55:25 -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: AmpVAIRIQ1N5LEcvPGdsb2JhbABZgwaDSoULtwyFX4EjFwMBAQEBODWCJQEBAQQ6HCMQCAMOBwMJJQ8FJQMHGhOHeMs6FxaOWweEOASYWophiyEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 10:24:23 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXKIr-0005wU-5G; Tue, 08 Apr 2014 10:54:17 +1000 Date: Tue, 8 Apr 2014 10:54:17 +1000 From: Dave Chinner To: Namjae Jeon Cc: viro@zeniv.linux.org.uk, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140408005417.GI27017@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate References: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396918523 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 11:53:31PM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > FALLOC_FL_INSERT_RANGE was mentioned as the opposite command of collapse > range from discussion between Hugh Dickins and Dave Chinner. > > In continuation of the work of making the process of non linear editing of > media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE > for fallocate. > > This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space > in between the file within the range specified by offset and len. User can > write new data in this space. e.g. ads. > Like collapse range, currently we have the limitation that offset and len > should be block size aligned for both XFS and Ext4. > > The semantics of the flag are : > 1) It allocates new zeroed out on disk space of len bytes starting > at offset byte without overwriting any existing data. All the data blocks > from offset to EOF are shifted towards right to make space for inserting > new blocks > 2) It should be used exclusively. No other fallocate flag in combination. > 3) Offset and length supplied to fallocate should be fs block size aligned > in case of xfs and ext4. > 4) Insert range does not work for the case when offset is overlapping/beyond > i_size. If the user wants to allocate space at the end of file they are > advised to use either ftruncate(2) or fallocate(2) with mode 0. > 5) It increses the size of file by len bytes. > > Namjae Jeon (3): > fs: Add FALLOC_FL_INSERT_RANGE flags for fallocate > xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate > ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate > TODO : xfsprog: xfsio: Add support FALLOC_FL_INSERT_RANGE for fallocate > TODO : xfstests: Add insert range testcase Namjae, what's your proposed timeframe on getting the xfs_io and tes cases sorted out? I'm just trying to plan ahead for the next couple of months (i.e. the 3.16 merge cycle), so some indication of whether I can expect this to be complete and ready for merge within that timeframe would be helpful to me. FWIW, it would be really nice if you could add support for fsx and fsstress for this as well as adding corner case tests. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 7 20:50:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6AED78028 for ; Mon, 7 Apr 2014 20:50:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3564AC012 for ; Mon, 7 Apr 2014 18:50:27 -0700 (PDT) X-ASG-Debug-ID: 1396921824-04cb6c5678d9f750001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tmtEJzI2ZGPwNDVU for ; Mon, 07 Apr 2014 18:50:25 -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: AmRFAJtVQ1N5LEcvPGdsb2JhbABZgwY7gw+8F4VfgSMXAwEBAQE4NYIlAQEBAwE6HBgLBQsIAxgJJQ8FJQMHGhOHcQcOyxsTBBaNcxFXB4MkgRQElG+Da5YCK4Et Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Apr 2014 11:20:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXLAy-00063x-3t; Tue, 08 Apr 2014 11:50:12 +1000 Date: Tue, 8 Apr 2014 11:50:12 +1000 From: Dave Chinner To: Keyur Govande Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS fragmentation on file append Message-ID: <20140408015012.GB22917@dastard> X-ASG-Orig-Subj: Re: XFS fragmentation on file append References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1396921824 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [cc the XFS mailing list ] On Mon, Apr 07, 2014 at 06:53:46PM -0400, Keyur Govande wrote: > Hello, > > I'm currently investigating a MySQL performance degradation on XFS due > to file fragmentation. > > The box has a 16 drive RAID 10 array with a 1GB battery backed cache > running on a 12 core box. > > xfs_info shows: > meta-data=/dev/sda4 isize=256 agcount=24, agsize=24024992 blks > = sectsz=512 attr=2, projid32bit=0 > data = bsize=4096 blocks=576599552, imaxpct=5 > = sunit=16 swidth=512 blks > naming = version 2 bsize=4096 ascii-ci=0 > log = internal bsize=4096 blocks=281552, version=2 > = sectsz=512 sunit=16 blks, lazy-count=1 > realtime = none extsz=4096 blocks=0, rtextents=0 > > The kernel version is: 3.14.0-1.el6.elrepo.x86_64 and the XFS > partition is mounted with: rw,noatime,allocsize=128m,inode64,swalloc. > The partition is 2TB in size and 40% full to simulate production. > > Here's a test program that appends 512KB like MySQL does (write and > then fsync). To exacerbate the issue, it loops a bunch of times: > https://gist.github.com/keyurdg/961c19175b81c73fdaa3 > > When run, this creates ~9500 extents most of length 1024. 1024 of what? Most likely it is 1024 basic blocks, which is 512KB, the size of your writes. Could you post the output of the xfs_bmap commands you are using to get this information? > cat'ing the > file to /dev/null after dropping the caches reads at an average of 75 > MBps, way less than the hardware is capable of. What you are doing is "open-seekend-write-fsync-close". You haven't told the filesystem you are doing append writes (O_APPEND, or the append inode flag) so it can't optimise for them. You are also cleaning the file before closing it, so you are defeating the current heuristics that XFS uses to determine whether to remove speculative preallocation on close() - if the inode is dirty at close(), then it won't be removed. Hence speculative preallocation does nothing for your IO pattern (i.e. the allocsize mount option is completely useless). Remove the fsync and you'll see your fragmentation problem go away completely. > When I add a posix_fallocate before calling pwrite() as shown here > https://gist.github.com/keyurdg/eb504864d27ebfe7b40a the file > fragments an order of magnitude less (~30 extents), and cat'ing to > /dev/null proceeds at ~1GBps. That should make no difference on XFS as you are only preallocating the 512KB region beyond EOF that you are about to write into and hence both delayed allocation and preallocation have the same allocation target (the current EOF block). Hence in both cases the allocation patterns should be identical if the freespace extent they are being allocated out of are identical. Did you remove the previous test files and sync the filesystem between test runs so that the available freespace was identical for the different test runs? If you didn't then the filesystem allocated the files out of different free space extents and hence you'll get different allocation patterns... > The same behavior is seen even when the allocsize option is removed > and the partition remounted. See above. > This is somewhat unexpected and I'm working on a patch to add > fallocate to MySQL, wanted to check in here if I'm missing anything > obvious here. fallocate() of 512KB sized regions will not prevent fragmentation into 512KB sized extents with the write pattern you are using. If you use the inode APPEND attribute for your log files, this lets the filesystem optimise it's block management for append IO. In the case of XFS, it then will not remove preallocation beyond EOF when the fd is closed because the next write will be at EOF where the speculative preallocation already exists. Then allocsize=128M will actually work for your log files.... Alternatively, set an extent size hint on the log files to define the minimum sized allocation (e.g. 32MB) and this will limit fragmentation without you having to modify the MySQL code at all... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zwu.kernel@gmail.com Mon Apr 7 20:59:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0DD77802E for ; Mon, 7 Apr 2014 20:59:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D0E3C304059 for ; Mon, 7 Apr 2014 18:59:05 -0700 (PDT) X-ASG-Debug-ID: 1396922343-04bdf0743a1e0840001-NocioJ Received: from mail-yh0-f53.google.com (mail-yh0-f53.google.com [209.85.213.53]) by cuda.sgi.com with ESMTP id 80AVtV8HUvbuBOTK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Apr 2014 18:59:03 -0700 (PDT) X-Barracuda-Envelope-From: zwu.kernel@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.53] Received: by mail-yh0-f53.google.com with SMTP id v1so264935yhn.40 for ; Mon, 07 Apr 2014 18:59:03 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=f9YaLIOm8k0Yocrnjjh0lxr37QdCZ7DD/ugrmOIbiPU=; b=i3stcFmearBjv7bz+NfrTLkSfjtiIr17PfxnpKkJk97qkGEe9khEKqNwCswXvdOcIn +Hbd1TzHgCDJCtT86UCBAX7r3MXC6UGjbQu+0XIahwqzfkDMJlMsE4mbxZu8exIZJZD9 D2Q3R56AOAli0jJK2YOSReoHUwLaJ9w9z8Ydsd6V+RGNQYu5XhlhR8zBZYnFj7ugQcHY wxAShW4jTuNYvxLtqmmNaDxN2LJYANEj4jTKs3Dc67Y4KhB97wtLRTkMFD6p2B9Gjt98 TMI36bQh7L7ldgJiqH4MtzWIDyK1KBqvcPvDZmDjedUs6QisroxoVaTfxqQBENmlQwSg fIww== MIME-Version: 1.0 X-Received: by 10.236.39.72 with SMTP id c48mr1167866yhb.89.1396922343017; Mon, 07 Apr 2014 18:59:03 -0700 (PDT) Received: by 10.170.207.71 with HTTP; Mon, 7 Apr 2014 18:59:02 -0700 (PDT) In-Reply-To: References: Date: Tue, 8 Apr 2014 09:59:02 +0800 Message-ID: Subject: Re: [Bug] XFS: DIO random write + BufferIO read From: Zhi Yong Wu X-ASG-Orig-Subj: Re: [Bug] XFS: DIO random write + BufferIO read To: xfstests Cc: Dave Chinner , "linux-fsdevel@vger.kernel.org" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-yh0-f53.google.com[209.85.213.53] X-Barracuda-Start-Time: 1396922343 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature any comments? On Fri, Apr 4, 2014 at 11:09 PM, Zhi Yong Wu wrote: > HI > > When i try something on XFS filesytem, i hit one issue as below: > > One main task create multiple threads at first, Then it will dio > random write some files with random offset and length for each thread. > When those files get ready, those multiple threads will bufferio read > them and check if the data are same as their corresponding buffer. In > theory, they should be same, but the actual result isn't what we > expect > > By the way, i did the same try on ext3 filesystem, but didn't get any > such issue. > > Below is the test code: > > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > > using namespace std; > > #define AIO_BLKSIZE 4096 > #define AIO_MAXIO 64 > > static long gettid() > { > return static_cast(pthread_self()); > } > > static void* aioThreadWrapper(void* arg); > > class DioTest; > struct cbParam { > cbParam(DioTest* p, int fileseq) :p_(p), fileseq_(fileseq) {} > > DioTest* p_; > int fileseq_; > }; > > > class DioTest > { > public: > DioTest(const char* name) { > filename = name; > memset(&myctx, 0, sizeof(myctx)); > io_queue_init(AIO_MAXIO, &myctx); > pthread_t tid; > pthread_create(&tid, NULL, aioThreadWrapper, this); > } > > void wr_done(int fileseq, struct iocb *iocb, long res, long res2) { > close(iocb->aio_fildes); > > if (res2 != 0) { > printf("aio write error n"); > abort(); > } > if (res != iocb->u.c.nbytes) { > printf("write missed bytes expect %ld got %ld n", > iocb->u.c.nbytes, res); > abort(); > } > size_t length = iocb->u.c.nbytes; > size_t offset = iocb->u.c.offset; > char path[1024]; > snprintf(path, sizeof(path), "%s%d", filename, fileseq); > int fd = open(path, O_RDONLY); > assert(fd >= 0); > char* readbuf = (char*)malloc(length); > assert(readbuf); > > memset(readbuf, 0, length); > ssize_t ret = pread(fd, readbuf, length, offset); > assert (ret == length); > close(fd); > > int cmp = memcmp(readbuf, iocb->u.c.buf, length); > if (cmp != 0) > { > printf("tid=%ld data dismatch.cmp=%d file=%s > offset=%lu length=%lu!\n", > gettid(), cmp, path, offset, length); > abort(); > } > printf("tid=%ld check=success file=%s offset=%lu length=%lu\n", > gettid(), path, offset, length); > > free(iocb->u.c.buf); > free(iocb); > free(readbuf); > } > > bool writeRequest(int fileseq, size_t offset, size_t length) { > struct iocb *io = (struct iocb *)malloc(sizeof(struct iocb)); > assert (io); > char path[1024]; > snprintf(path, sizeof(path), "%s%d", filename, fileseq); > int fd = open(path, O_RDWR|O_DIRECT|O_CREAT, S_IWUSR | S_IRUSR); > assert (fd >= 0); > void* buf=NULL; > int ret = posix_memalign(&buf, getpagesize(), length); > assert(ret == 0); > memset(buf, 'a', length); > io_prep_pwrite(io, fd, buf, length, offset); > io->data = new cbParam(this, fileseq); > > int rc = io_submit(myctx, 1, &io); > if (rc < 0){ > printf("tid=%ld io_submit fail.file=%s offset=%lu > length=%lu ret=%d errno=%s\n", > gettid(), path, offset, length, ret, strerror(errno)); > close(fd); > free(buf); > delete (cbParam*)(io->data); > free(io); > return false; > } > assert (rc != 0); > printf("tid=%ld file=%s offset=%lu length=%lu\n",gettid(), > path, offset, length); > return true; > } > > void aioThread() { > while (true) > { > struct io_event events[AIO_MAXIO]; > io_callback_t cb; > int ret = io_getevents(myctx, 1, AIO_MAXIO, events, NULL); > printf("tid=%ld %d io_request completed \n", gettid(), ret); > > for (int i = 0; i < ret; i++) { > struct iocb *io = events[i].obj; > printf("tid=%ld events[%d]res = %ld, res2 = %ld\n", > gettid(), i, events[i].res, events[i].res2); > > cbParam* param = (cbParam*)io->data; > DioTest* p = param->p_; > p->wr_done(param->fileseq_, io, events[i].res, > events[i].res2); > delete param; > } > } > } > private: > io_context_t myctx; > const char* filename; > }; > > static void* aioThreadWrapper(void* arg) > { > DioTest* p = (DioTest*)arg; > p->aioThread(); > return NULL; > } > > int main(int args, char *argv[]) > { > if (args < 2) { > printf("./%s filename", argv[0]); > exit(1); > } > const char* filename = argv[1]; > srand(time(NULL)); > vector dioTests; > const int threadNumber = 9; > > for (int i = 0; i < threadNumber; ++i) { > dioTests.push_back(new DioTest(filename)); > } > > while (true) { > size_t offset = (rand() % (64*1024*1024/AIO_BLKSIZE)) * AIO_BLKSIZE; > size_t length = 0; > while (length == 0) { > length = abs(static_cast(rand()*1.0/RAND_MAX*16))*AIO_BLKSIZE; > } > > int seq = rand() % 100; > DioTest* p = dioTests[rand() % threadNumber]; > for (int i = 0; i < 4; ++i){ > p->writeRequest(seq, offset, length); > offset += (length + 4096); > } > usleep(rand() % 10000); > } > return 0; > } > > > -- > Regards, > > Zhi Yong Wu -- Regards, Zhi Yong Wu From safemail5.2@mailsupport.com Mon Apr 7 21:04:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=HTML_MESSAGE, MSGID_FROM_MTA_HEADER 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 344EA29E00 for ; Mon, 7 Apr 2014 21:04:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1FB7230405F for ; Mon, 7 Apr 2014 19:04:35 -0700 (PDT) X-ASG-Debug-ID: 1396922669-04cbb054b9bb1c60001-NocioJ Received: from mailrelay008.isp.belgacom.be (mailrelay008.isp.belgacom.be [195.238.6.174]) by cuda.sgi.com with ESMTP id CBGoyc3MFeRPI5lR for ; Mon, 07 Apr 2014 19:04:30 -0700 (PDT) X-Barracuda-Envelope-From: safemail5.2@mailsupport.com X-Barracuda-Apparent-Source-IP: 195.238.6.174 Message-Id: X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtINAPNXQ1Nbt3bX/2dsb2JhbAANSASDQUsBAa1pAQGNVxCIYgKBOYMQV1ABKQhuiBEIp3GFCJdolGAQAgEFCARPgnOBOwSBLId2hiaKR5JKgXOBaQ Received: from 215.118-183-91.adsl-static.isp.belgacom.be (HELO [10.0.2.247]) ([91.183.118.215]) by relay.skynet.be with ESMTP; 08 Apr 2014 04:04:29 +0200 Content-Type: multipart/alternative; boundary="===============0114254705==" MIME-Version: 1.0 Subject: Please upgrade to Webmail 5.2 (Important) To: Me X-ASG-Orig-Subj: Please upgrade to Webmail 5.2 (Important) From: "Mail Admin" Date: Tue, 08 Apr 2014 04:04:34 +0200 X-Barracuda-Connect: mailrelay008.isp.belgacom.be[195.238.6.174] X-Barracuda-Start-Time: 1396922670 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4674 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 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay You will not see this in a MIME-aware mail reader. --===============0114254705== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Important! = According to our records, this account has not been upgraded to the new We= b Mail 5.2 Please visit the member services area or Sign In here to upgrade immediate= ly. Failure to comply with upgrade will lead to loss of email access. = Mail Support =20 --===============0114254705== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Enter

Important!

According to our records, this account has not been upgraded to the new Web= Mail = 5.2
Please visit the 
member = services area or Sign = In here to upgrade immediately.

Failure to comply with = upgrade will lead = to loss of email access.

Mail Support

--===============0114254705==-- From sandeen@redhat.com Mon Apr 7 22:27:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A68157FE7 for ; Mon, 7 Apr 2014 22:27:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 37EEBAC017 for ; Mon, 7 Apr 2014 20:27:34 -0700 (PDT) X-ASG-Debug-ID: 1396927649-04bdf05daadd4e20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id N9h6HQ7qnyDsEU9a for ; Mon, 07 Apr 2014 20:27: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s383RTWj007772 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 7 Apr 2014 23:27:29 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s383RSio014984 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 7 Apr 2014 23:27:29 -0400 Message-ID: <53436CA0.1090106@redhat.com> Date: Mon, 07 Apr 2014 22:27:28 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs_repair: fix prefetch queue waiting X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs_repair: fix prefetch queue waiting Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396927650 X-Barracuda-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 fixes a regression caused by: 97b1fcf xfs_repair: fix array overrun in do_inode_prefetch The thread creation loop has 2 ways to exit; either via the loop counter based on thread_count, or the break statement if we've started enough workers to cover all AGs. Whether or not the loop counter "i" reflects the number of threads started depends on whether or not we exited via the break. The above commit prevented us from indexing off the end of the queues[] array if we actually advanced "i" all the way to thread_count, but in the case where we break, "i" is one *less* than the nr of threads started, so we don't wait for completion of all threads, and all hell breaks loose in phase 5. Just stop with the cleverness of re-using the loop counter - instead, explicitly count threads that we start, and then use that counter to wait for each worker to complete. Signed-off-by: Eric Sandeen --- I have one fs which demonstrates the problem, and have verified the regression & tested the fix against that. I'll run this over xfstests overnight, but it seems obvious from here (OTOH the other fix seemed obvious too) :( diff --git a/repair/prefetch.c b/repair/prefetch.c index e47a48e..4c32395 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -944,6 +944,7 @@ do_inode_prefetch( int i; struct work_queue queue; struct work_queue *queues; + int queues_started = 0; /* * If the previous phases of repair have not overflowed the buffer @@ -987,6 +988,7 @@ do_inode_prefetch( create_work_queue(&queues[i], mp, 1); queue_work(&queues[i], prefetch_ag_range_work, 0, wargs); + queues_started++; if (wargs->end_ag >= mp->m_sb.sb_agcount) break; @@ -995,7 +997,7 @@ do_inode_prefetch( /* * wait for workers to complete */ - while (i--) + for (i = 0; i < queues_started; i++) destroy_work_queue(&queues[i]); free(queues); } From keyurgovande@gmail.com Mon Apr 7 22:42:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 785707FEF for ; Mon, 7 Apr 2014 22:42:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44F5B8F8035 for ; Mon, 7 Apr 2014 20:42:06 -0700 (PDT) X-ASG-Debug-ID: 1396928523-04bdf05dabdd5a80001-NocioJ Received: from mail-wi0-f171.google.com (mail-wi0-f171.google.com [209.85.212.171]) by cuda.sgi.com with ESMTP id FPqVJFNP0bGOrr80 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Apr 2014 20:42:04 -0700 (PDT) X-Barracuda-Envelope-From: keyurgovande@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.171] Received: by mail-wi0-f171.google.com with SMTP id q5so6277464wiv.4 for ; Mon, 07 Apr 2014 20:42:02 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=U8jQEii0pt6soJDCcW/eRqetssgBSKFEeyxKoteaW1Q=; b=QRJKRqBPBaoo6TeDEUBF/tslcMd7IJpIY0gWxcvG97rbv01CthSbyq6Abmb8D6MrjI qvCqYk1oUMRFR8KfgeAxWIYWWFP9V3Op7xV/rIWrK+SedWYdgBxf2cGxsFYWSjpL91xM dWSA+PQI9R2fCebvMdo9+QZEUC48AlXi4su6JkwfevAiH9SN21Zk/Sue0S8NW6Op/c71 A3/y0+0gsBIgrFWL+gwMTMtffO6x5PDw36qpo7ro2JGpuO9cas/YG98A2ZSsuI9z/D2s X8ZmuWi1VmjhUGeLTbGkgHije9357K5xUrnrBqDG9rlhrwnEK9Ro4MXxXU0uQHntr8Nz PAXg== MIME-Version: 1.0 X-Received: by 10.180.126.38 with SMTP id mv6mr2140388wib.46.1396928522776; Mon, 07 Apr 2014 20:42:02 -0700 (PDT) Received: by 10.227.97.136 with HTTP; Mon, 7 Apr 2014 20:42:02 -0700 (PDT) In-Reply-To: <20140408015012.GB22917@dastard> References: <20140408015012.GB22917@dastard> Date: Mon, 7 Apr 2014 23:42:02 -0400 Message-ID: Subject: Re: XFS fragmentation on file append From: Keyur Govande X-ASG-Orig-Subj: Re: XFS fragmentation on file append To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wi0-f171.google.com[209.85.212.171] X-Barracuda-Start-Time: 1396928523 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4675 Rule breakdown below pts rule name 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 Mon, Apr 7, 2014 at 9:50 PM, Dave Chinner wrote: > [cc the XFS mailing list ] > > On Mon, Apr 07, 2014 at 06:53:46PM -0400, Keyur Govande wrote: >> Hello, >> >> I'm currently investigating a MySQL performance degradation on XFS due >> to file fragmentation. >> >> The box has a 16 drive RAID 10 array with a 1GB battery backed cache >> running on a 12 core box. >> >> xfs_info shows: >> meta-data=/dev/sda4 isize=256 agcount=24, agsize=24024992 blks >> = sectsz=512 attr=2, projid32bit=0 >> data = bsize=4096 blocks=576599552, imaxpct=5 >> = sunit=16 swidth=512 blks >> naming = version 2 bsize=4096 ascii-ci=0 >> log = internal bsize=4096 blocks=281552, version=2 >> = sectsz=512 sunit=16 blks, lazy-count=1 >> realtime = none extsz=4096 blocks=0, rtextents=0 >> >> The kernel version is: 3.14.0-1.el6.elrepo.x86_64 and the XFS >> partition is mounted with: rw,noatime,allocsize=128m,inode64,swalloc. >> The partition is 2TB in size and 40% full to simulate production. >> >> Here's a test program that appends 512KB like MySQL does (write and >> then fsync). To exacerbate the issue, it loops a bunch of times: >> https://gist.github.com/keyurdg/961c19175b81c73fdaa3 >> >> When run, this creates ~9500 extents most of length 1024. > > 1024 of what? Most likely it is 1024 basic blocks, which is 512KB, > the size of your writes. Yeah, 1024 basic blocks of 512 bytes each. > > Could you post the output of the xfs_bmap commands you are using to > get this information? I'm getting the extent information via xfs_bmap -v . Here's a sample: https://gist.github.com/keyurdg/291b2a429f03c9a649ad > >> cat'ing the >> file to /dev/null after dropping the caches reads at an average of 75 >> MBps, way less than the hardware is capable of. > > What you are doing is "open-seekend-write-fsync-close". You haven't > told the filesystem you are doing append writes (O_APPEND, or the > append inode flag) so it can't optimise for them. I tried this; adding O_APPEND the the open() in the pathological pwrite.c makes no difference to the extent allocation and hence the read performance. > > You are also cleaning the file before closing it, so you are > defeating the current heuristics that XFS uses to determine whether > to remove speculative preallocation on close() - if the inode is > dirty at close(), then it won't be removed. Hence speculative > preallocation does nothing for your IO pattern (i.e. the allocsize > mount option is completely useless). Remove the fsync and you'll > see your fragmentation problem go away completely. I agree, but the MySQL data files (*.ibd) on our production cluster are appended to in bursts and they have thousands of tiny (512KB) extents. Getting rid of fsync is not possible given the use case. Arguably, MySQL does not close the files, but it writes out infrequently enough that I couldn't make a good and small test case for it. But the output of xfs_bmap is exactly the same as that of pwrite.c > >> When I add a posix_fallocate before calling pwrite() as shown here >> https://gist.github.com/keyurdg/eb504864d27ebfe7b40a the file >> fragments an order of magnitude less (~30 extents), and cat'ing to >> /dev/null proceeds at ~1GBps. > > That should make no difference on XFS as you are only preallocating > the 512KB region beyond EOF that you are about to write into and > hence both delayed allocation and preallocation have the same > allocation target (the current EOF block). Hence in both cases the > allocation patterns should be identical if the freespace extent they > are being allocated out of are identical. > > Did you remove the previous test files and sync the filesystem > between test runs so that the available freespace was identical for > the different test runs? If you didn't then the filesystem allocated > the files out of different free space extents and hence you'll get > different allocation patterns... I do clear everything and sync the FS before every run, and this is reproducible across multiple machines in our cluster. I've re-run the programs at least a 1000 times now, and every time get the same results. For some reason even the tiny 512KB fallocate() seems to be triggering some form of extent "merging" and placement. I tried this on ext4 as well: with and without fallocate perform exactly the same (~450 MBps), but XFS with fallocate is 2X faster (~1 GBps). > >> The same behavior is seen even when the allocsize option is removed >> and the partition remounted. > > See above. > >> This is somewhat unexpected and I'm working on a patch to add >> fallocate to MySQL, wanted to check in here if I'm missing anything >> obvious here. > > fallocate() of 512KB sized regions will not prevent fragmentation > into 512KB sized extents with the write pattern you are using. > > If you use the inode APPEND attribute for your log files, this lets > the filesystem optimise it's block management for append IO. In the > case of XFS, it then will not remove preallocation beyond EOF when > the fd is closed because the next write will be at EOF where the > speculative preallocation already exists. Then allocsize=128M will > actually work for your log files.... > > Alternatively, set an extent size hint on the log files to define > the minimum sized allocation (e.g. 32MB) and this will limit > fragmentation without you having to modify the MySQL code at all... > I tried enabling extsize to 32MB, but it seems to make no difference. [kgovande@host]# xfs_io -c "extsize" /var/lib/mysql/xfs/plain_pwrite.werr [33554432] /var/lib/mysql/xfs/plain_pwrite.werr [kgovande@host]# xfs_bmap -v /var/lib/mysql/xfs/*.werr | wc -l 20001 [kgovande@host]# sync; echo 3 > /proc/sys/vm/drop_caches; pv plain_pwrite.werr > /dev/null 9.77GB 0:02:41 [61.7MB/s] [========================================>] 100% # With fallocate [kgovande@host]# xfs_bmap -v /var/lib/mysql/xfs/*.werr | wc -l [kgovande@host]# sync; echo 3 > /proc/sys/vm/drop_caches; pv falloc_pwrite.werr > /dev/null 9.77GB 0:00:09 [1.03GB/s] [========================================>] 100% > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From pocas.jamie@gmail.com Mon Apr 7 22:56:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9F6017FC2 for ; Mon, 7 Apr 2014 22:56:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4AA6D304053 for ; Mon, 7 Apr 2014 20:56:15 -0700 (PDT) X-ASG-Debug-ID: 1396929370-04bdf0743a1e7720001-NocioJ Received: from mail-la0-f43.google.com (mail-la0-f43.google.com [209.85.215.43]) by cuda.sgi.com with ESMTP id W3hR6ALqFlQpBFQH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 07 Apr 2014 20:56:12 -0700 (PDT) X-Barracuda-Envelope-From: pocas.jamie@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.43] Received: by mail-la0-f43.google.com with SMTP id e16so317936lan.30 for ; Mon, 07 Apr 2014 20:56:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=muXswuTIIHFMmIvgodip0sky8kQAL4IhrtMBTIfuA9E=; b=fu9uOJP4pMbkH6bdZh1wEGNCL49ddlIrnXMsx0TZae8XmPlxTfWsYyixwcj/FdTGAK smzXNFXm4V2Br/JgDLvMCALdwFQ/tmkx65rWc2b077sNcrdRbOO0AMHsLpItxLG8SWRx GDg8woyDp3Cy1ncfeNSEUhxUxmRBfsVFMNupF/n7AI2RcqsAOgp+4xxu4c8Y89puPa/l oPj8Ywm61jQN/rVtEDdzRIEcWpU6yp08UIBSx5kMdozgG+A7QyV2kh5cMY03+M2HqG9a azzNI4TY57GV8loWg1xCr0N4wqJh8JvV1MkLNn/arJRaRDlVo3CvIUEEBKCSmF8JPNpL 9LDQ== MIME-Version: 1.0 X-Received: by 10.112.135.106 with SMTP id pr10mr920553lbb.24.1396929370256; Mon, 07 Apr 2014 20:56:10 -0700 (PDT) Received: by 10.114.200.71 with HTTP; Mon, 7 Apr 2014 20:56:10 -0700 (PDT) Received: by 10.114.200.71 with HTTP; Mon, 7 Apr 2014 20:56:10 -0700 (PDT) In-Reply-To: References: <20140401204215.GG17603@dastard> <20140402044749.GK17603@dastard> Date: Mon, 7 Apr 2014 23:56:10 -0400 Message-ID: Subject: Re: xfs: invalid requests to request_fn from xfs_repair From: Jamie Pocas X-ASG-Orig-Subj: Re: xfs: invalid requests to request_fn from xfs_repair To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e012292f8e3f9dd04f67ff6d5 X-Barracuda-Connect: mail-la0-f43.google.com[209.85.215.43] X-Barracuda-Start-Time: 1396929371 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4676 Rule breakdown below pts rule name 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 --089e012292f8e3f9dd04f67ff6d5 Content-Type: text/plain; charset=ISO-8859-1 Hi Dave, Okay, I think I've found a workaround but I don't have the root cause yet. So just to recap there is a macro defined in include/linux/blkdev.h called rq_for_each_segment(bvec, rq, iter). The arguments are of type struct bio_vec*, struct request*, and struct req_iterator respectively. The macro expands to several other macro invocations, which eventually expand to approx. 40-50 lines of code. (NOTE: in newer kernels the first argument is a bio_vec, and not a bio_vec*. I think this is due to the immutable bio_vec changes, but I could be wrong. For more on that, see http://lwn.net/Articles/544713/ , but I digress.) It seems like in some instances when using O_DIRECT and iterating through the request using the above macro, I see that some fields of iter.bio are not updated to the correct value and macros like blk_rq_cur_sectors(), which ultimately rely on rq->bio, thus do not return the correct values. If I assume (<--- dangerous word) that the sectors are all adjacent, as they really are supposed to be in all my investigation, and use only the bio_vec fields to track progress then the problems go away. I have been running all sorts of data consistency tests since this discovery and I don't have any further problems so far. Also, xfs_repair is returning cleanly as expected now. So basically I am only using blk_rq_pos(rq) once before the loop to get the start sector, and then only relying on fields of bvec after that. For example if I need to count the number of sectors, I can accumulate (bvec->bv_len >> 9) through all the iterations. Summing up all of blk_req_curr_sectors(rq) only worked sometimes, and so was unreliable. Basically, the code to walk the request * looks something like this now, where it used to make use of iter.bio->bi_sector and blk_rq_cur_sectors. sector_t curr_sector = blk_rq_pos(req); unsigned curr_num_sectors = 0; unsigned total_sectors = 0; // Should not do the memory mapping on a discard request, payload is invalid BUG_ON(unlikely(req->cmd_flags & REQ_DISCARD)); /* Iterate through the request */ rq_for_each_segment(bvec, req, iter) { kern_buffer = kmap(bvec->bv_page) + bvec->bv_offset; curr_sector += curr_num_sectors; curr_num_sectors = (bvec->bv_len >> KERNEL_SECTOR_SHIFT); /* Do the transfer to the device. This part is not really relevant to the discussion here but you can just imagine it as a memcpy because that's effectively what's happening a failed copy would return -EFAULT and eventually the request would be ended with blk_end_request_all with an error code*/ kunmap(bvec->bv_page); /* FAIL */ if (ret) { return ret; } total_sectors += curr_num_sectors; // Just for accounting } I am going to run the compiler with -E and examine the rq_for_each_segment() macro expansion to see where the suspected problem happens. If it does look like a bug, I am going to write to LKML. Perhaps it's something I am supposed to implicitly understand that is not well documented (like the rest of O_DIRECT), and they can set me straight. As it stands this doesn't seem to be an xfs issue so I'm going to drop this discussion unless anyone else is interested in this issue or wants more info. Regards, Jamie On Wed, Apr 2, 2014 at 12:47 AM, Dave Chinner wrote: > > > > While iterating through segments in rq_for_each_segment(), for some > > > > requests I am seeing some odd behavior. > > > > > > > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 903 > // Ok, > > > > this looks normal > > > > segment 1: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 7 // > > > > Whoah... this doesn't look right to me > > > > > > Seems fine to me. There's absolutely no reason two separate IOs > > > can't be sub-page sector aligned or discontiguous given the above > > > configuration. If that's what the getblocks callback returned to the > > > DIO layer, then that's what you're going to see in the bios... > > > > > > > > I guess my assumption that sectors would be adjacent was invalid, but > this > > is what I have read in ldd3 and other books and seen in some driver > > examples. So I apologize for my folly and it's another lesson in not > > believing everything you see on the net. The back half of my driver is > > really optimized for transferring a single contiguous lba & transfer > length > > pair (ala SCSI WRITE 16 for example). However in desperation, I had > changed > > the driver to support requests like this (with disjoint sector ranges) > but > > it still seemed odd to me that occasionally some requests would even have > > multiple segments that would *write* the same sectors/lengths. For > example > > I also see requests like the following. > > > > Given: rq_data_dir(rq) == 1 (i.e. a write) > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // Ok > > segment 1: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > > Again? > > segment 2: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > Yet > > again? > > segment 3: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > > Really? > > ... > > segment 126: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 7 // > > What's going on? > > // Reminder: segment limit is 128 > > segment 127: iter.bio->bi_sector = 1023, blk_rq_cur_sectors(rq) = 1 // > > Haha, bet you though I was going to say sector = 0! > > That really looks to me like a bug in whatever is building that iter > structure. It looks like there's an off-by-one on each page (should > be 8 sectors not 7) and the bi_sector is not being set correctly to > the sector offset of the bio within the IO. i.e. for a contiguous > IO it should look something like: > > segment 0: iter.bio->bi_sector = 0, blk_rq_cur_sectors(rq) = 8 > segment 1: iter.bio->bi_sector = 8, blk_rq_cur_sectors(rq) = 8 > segment 2: iter.bio->bi_sector = 16, blk_rq_cur_sectors(rq) = 8 > .... > segment 127: iter.bio->bi_sector = 1016, blk_rq_cur_sectors(rq) = 8 > > I highly doubt the direct IO code is doing something wrong, because > a mapping bug like that would show up everywhere and not just in your > special driver.... > > I agree that the iterator *looks* wrong, Like I said earlier, I am just using the rq_for_each_segment() macro (defined in include/linux/blkdev.h and expands to a few dozen lines of code). This is the recommended way of iterating requests instead of using the lower level bio iterating functions or going it yourself which is why it's recommended to use that instead of going deeper and breaking compatibility when the kernel changes. I suspect it's the request itself which was constructed incorrectly, or contains bios that should not have been grouped into the same request, or contains bios that have their bi_sector set incorrectly. > > > The read syscall is for a byte offset (from the fd, set by lseek) > > > and a length, not a range of contiguous sectors on the device. That > > > off/len tuple gets mapped by the underlying filesystem or device > > > into an sector/len via a getblocks callback in the dio code and the > > > bios are then built according to the mappings that are returned. So > > > in many cases the IO that hits the block device looks nothing at all > > > like the IO that came from userspace. > > > > > > > > In general if I were reading a file I agree 100%, but this was the read > > call issued by xfs_repair to read the superblock directly from a block > > device. So I, perhaps wrongly, anticipated straightforward requests or > > maybe even a single 512k request coming down to the request_fn. I should > > have mentioned that this was observed while using xfs_repair earlier in > the > > email though, so no offense intended. There's more of the xfs_repair > strace > > in my response to your next comment below. It fails very early as you can > > imagine when xfs_repair can't read the superblock. > > I figured that this is what you were talking about, but remember > that the block device also does it's own offset->sector mapping in > the direct IO layer. So it's entirely possible that the mapping > function (i.e the getblocks callback) is broken and that is why you > are seeing weird mappings in the bios being built by the direct Io > code. > > This is the xfs_repair tool being run directly against a block device, so if I am reading the fs/direct-io.c code correctly this means that the mapping function (get_block_t) is using fs/block_dev.c:blkdev_get_block(). Is that correct? That function is very short and simple, so I can't imagine how there would be a bug in there. If it were a file on an xfs filesystem, the get_block_t callback would be xfs_get_blocks or xfs_get_blocks_direct (which both internally call __xfs_get_blocks). Is my understanding correct? --089e012292f8e3f9dd04f67ff6d5 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

Hi Dave,

Okay, I think I've found a workaround but I don't have the root = cause yet. So just to recap there is a macro defined in include/linux/blkde= v.h called=A0rq_for_each_segment(bvec, rq, iter). The arguments are of type= struct bio_vec*, struct request*, and struct req_iterator respectively. Th= e macro expands to several other macro invocations, which eventually expand= to approx. 40-50 lines of code.

(NOTE: in newer kernels the first argument is a bio_vec, and not a bio_v= ec*. I think this is due to the immutable bio_vec changes, but I could be w= rong. For more on that, see htt= p://lwn.net/Articles/544713/ , but I digress.)

It seems like in some instances when using O_DIRECT and iterating throug= h the request using the above macro, I see that some fields of iter.bio are= not updated to the correct value and macros like blk_rq_cur_sectors(), whi= ch ultimately rely on rq->bio, thus do not return the correct values. If= I assume (<--- dangerous word) that the sectors are all adjacent, as th= ey really are supposed to be in all my investigation, and use only the bio_= vec fields to track progress then the problems go away. I have been running= all sorts of data consistency tests since this discovery and I don't h= ave any further problems so far. Also, xfs_repair is returning cleanly as e= xpected now.

So basically I am only using blk_rq_pos(rq) once before the loop to get = the start sector, and then only relying on fields of bvec after that. For e= xample if I need to count the number of sectors, I can accumulate (bvec->= ;bv_len >> 9) through all the iterations. Summing up all of blk_req_c= urr_sectors(rq) only worked sometimes, and so was unreliable. Basically, th= e code to walk the request * looks something like this now, where it used t= o make use of iter.bio->bi_sector and blk_rq_cur_sectors.

=A0 =A0 sector_t curr_sector =3D blk_rq_pos(req);
=A0 =A0 unsigned curr_num_sectors =3D 0;
=A0 =A0 unsigned total_sectors =3D 0;

=A0 =A0 // Should not do the memory mapping on a discard request, payloa= d is invalid
=A0 =A0 BUG_ON(unlikely(req->cmd_flags & REQ_DISCARD));

=A0 =A0 /* Iterate through the request */
=A0 =A0 rq_for_each_segment(bvec, req, iter) {
=A0 =A0 =A0 =A0 kern_buffer =3D kmap(bvec->bv_page) + bvec->bv_offset= ;
=A0 =A0 =A0 =A0 curr_sector +=3D curr_num_sectors;
=A0 =A0 =A0 =A0 curr_num_sectors =3D (bvec->bv_len >> KERNEL_SECTO= R_SHIFT);

=A0 =A0 =A0 =A0 /* Do the transfer to the device. This part is not reall= y relevant to the discussion here
=A0 =A0 =A0 =A0 =A0 =A0but you can just imagine it as a memcpy because that= 's effectively what's happening
=A0 =A0 =A0 =A0 =A0 =A0a failed copy would return -EFAULT and eventually th= e request would be ended with
=A0 =A0 =A0 =A0 =A0 =A0blk_end_request_all with an error code*/

=A0 =A0 =A0 =A0 kunmap(bvec->bv_page);

=A0 =A0 =A0 =A0 /* FAIL */
=A0 =A0 =A0 =A0 if (ret) {
=A0 =A0 =A0 =A0 =A0 =A0 return ret;
=A0 =A0 =A0 =A0 }

=A0 =A0 =A0 =A0 total_sectors +=3D curr_num_sectors; // Just for account= ing
=A0 =A0 }

I am going to run the compiler with -E and examine the rq_for_each_segme= nt() macro expansion to see where the suspected problem happens. If it does= look like a bug, I am going to write to LKML. Perhaps it's something I= am supposed to implicitly understand that is not well documented (like the= rest of O_DIRECT), and they can set me straight.

As it stands this doesn't seem to be an xfs issue so I'm going t= o drop this discussion unless anyone else is interested in this issue or wa= nts more info.

Regards,
Jamie



On Wed, Apr 2, 2014 at = 12:47 AM, Dave Chinner <david@fromorbit.com> wrote:
> > > While iterating through segments = in rq_for_each_segment(), for some
> > > requests I am seeing some odd behavior.
> > >
> > > segment 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(= rq) =3D 903 =A0 // Ok,
> > > this looks normal
> > > segment 1: iter.bio->bi_sector =3D 1023, blk_rq_cur_secto= rs(rq) =3D 7 //
> > > Whoah... this doesn't look right to me
> >
> > Seems fine to me. There's absolutely no reason two separate I= Os
> > can't be sub-page sector aligned or discontiguous given the a= bove
> > configuration. If that's what the getblocks callback returned= to the
> > DIO layer, then that's what you're going to see in the bi= os...
> >
> >
> I guess my assumption that sectors would be adjacent was invalid, but = this
> is what I have read in ldd3 and other books and seen in some driver > examples. So I apologize for my folly and it's another lesson in n= ot
> believing everything you see on the net. The back half of my driver is=
> really optimized for transferring a single contiguous lba & transf= er length
> pair (ala SCSI WRITE 16 for example). However in desperation, I had ch= anged
> the driver to support requests like this (with disjoint sector ranges)= but
> it still seemed odd to me that occasionally some requests would even h= ave
> multiple segments that would *write* the same sectors/lengths. For exa= mple
> I also see requests like the following.
>
> Given: rq_data_dir(rq) =3D=3D 1 (i.e. a write)
> segment =A0 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0// Ok
> segment =A0 1: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0//
> Again?
> segment =A0 2: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0// Yet
> again?
> segment =A0 3: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) = =3D 7 =A0 =A0//
> Really?
> ...
> segment 126: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D = 7 =A0 =A0//
> What's going on?
> // Reminder: segment limit is 128
> segment 127: iter.bio->bi_sector =3D 1023, blk_rq_cur_sectors(rq) = =3D 1 //
> Haha, bet you though I was going to say sector =3D 0!

That really looks to me like a bug in whatever is building that= iter
structure. It looks like there's an off-by-one on each page (should
be 8 sectors not 7) and the bi_sector is not being set correctly to
the sector offset of the bio within the IO. i.e. for a contiguous
IO it should look something like:

segment =A0 0: iter.bio->bi_sector =3D 0, blk_rq_cur_sectors(rq) =3D 8 segment =A0 1: iter.bio->bi_sector =3D 8, blk_rq_cur_sectors(rq) =3D 8 segment =A0 2: iter.bio->bi_sector =3D 16, blk_rq_cur_sectors(rq) =3D 8<= br> ....
segment 127: iter.bio->bi_sector =3D 1016, blk_rq_cur_sectors(rq) =3D 8<= br>
I highly doubt the direct IO code is doing something wrong, because
a mapping bug like that would show up everywhere and not just in your
special driver....


I agree that the iterator *= looks* wrong, Like I said earlier, I am just using the rq_for_each_segment(= ) macro (defined in include/linux/blkdev.h and expands to a few dozen lines= of code). This is the recommended way of iterating requests instead of usi= ng the lower level bio iterating functions or going it yourself which is wh= y it's recommended to use that instead of going deeper and breaking com= patibility when the kernel changes. I suspect it's the request itself w= hich was constructed incorrectly, or contains bios that should not have bee= n grouped into the same request, or contains bios that have their bi_sector= set incorrectly.
=A0
> > The read syscall is for a byte offset (from the fd, set by lseek)=
> > and a length, not a range of contiguous sectors on the device. Th= at
> > off/len tuple gets mapped by the underlying filesystem or device<= br> > > into an sector/len via a getblocks callback in the dio code and t= he
> > bios are then built according to the mappings that are returned. = So
> > in many cases the IO that hits the block device looks nothing at = all
> > like the IO that came from userspace.
> >
> >
> In general if I were reading a file I agree 100%, but this was the rea= d
> call issued by xfs_repair to read the superblock directly from a block=
> device. So I, perhaps wrongly, anticipated straightforward requests or=
> maybe even a single 512k request coming down to the request_fn. I shou= ld
> have mentioned that this was observed while using xfs_repair earlier i= n the
> email though, so no offense intended. There's more of the xfs_repa= ir strace
> in my response to your next comment below. It fails very early as you = can
> imagine when xfs_repair can't read the superblock.

I figured that this is what you were talking about, but remember
that the block device also does it's own offset->sector mapping in the direct IO layer. So it's entirely possible that the mapping
function (i.e the getblocks callback) is broken and that is why you
are seeing weird mappings in the bios being built by the direct Io
code.


This is the xfs_repair tool= being run directly against a block device, so if I am reading the fs/direc= t-io.c code correctly this means that the mapping function (get_block_t) is= using fs/block_dev.c:blkdev_get_block(). Is that correct? That function is= very short and simple, so I can't imagine how there would be a bug in = there. If it were a file on an xfs filesystem, the get_block_t callback wou= ld be xfs_get_blocks or xfs_get_blocks_direct (which both internally call _= _xfs_get_blocks). Is my understanding correct?

--089e012292f8e3f9dd04f67ff6d5-- From gaowanlong@cn.fujitsu.com Mon Apr 7 23:52:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4C6297FF5 for ; Mon, 7 Apr 2014 23:52:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C9DA1AC016 for ; Mon, 7 Apr 2014 21:52:55 -0700 (PDT) X-ASG-Debug-ID: 1396932767-04cbb054b9bbbd70001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id QsA4UxRw1uKA4E2X for ; Mon, 07 Apr 2014 21:52:49 -0700 (PDT) X-Barracuda-Envelope-From: gaowanlong@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.97,814,1389715200"; d="scan'208";a="28981898" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 08 Apr 2014 12:50:19 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s384qgL4009121; Tue, 8 Apr 2014 12:52:42 +0800 Received: from G08FNSTD121251.fnst.cn.fujitsu.com (10.167.226.36) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.146.2; Tue, 8 Apr 2014 12:52:46 +0800 From: Wanlong Gao To: CC: , , , Wanlong Gao Subject: [PATCH] xfstests: fix wallclock possibly wrapped problem Date: Tue, 8 Apr 2014 12:52:18 +0800 X-ASG-Orig-Subj: [PATCH] xfstests: fix wallclock possibly wrapped problem Message-ID: <1396932738-13638-1-git-send-email-gaowanlong@cn.fujitsu.com> X-Mailer: git-send-email 1.9.1.475.ge4eef26 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.167.226.36] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1396932768 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- If a test cross two days, the time may be negative, let's use the UTC seconds instead, for example: 2014-04-03 23:43:42 ./check generic/074 generic/075 generic/112 generic/113 generic/132 generic/133 generic/231 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 vpx-2 3.14.0-00001-g462fa88 MKFS_OPTIONS -- -f -bsize=4096 /dev/vdd MOUNT_OPTIONS -- /dev/vdd /fs/scratch generic/074 100s generic/075 220s generic/112 226s generic/113 188s generic/132 18s generic/133 37s generic/231 -85401s Ran: generic/074 generic/075 generic/112 generic/113 generic/132 generic/133 generic/231 Passed all 7 tests Reported-by: Yuanhan Liu Signed-off-by: Wanlong Gao --- check | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check b/check index 8f1a6e1..a7e33ea 100755 --- a/check +++ b/check @@ -146,7 +146,7 @@ trim_test_list() _wallclock() { - date "+%H %M %S" | $AWK_PROG '{ print $1*3600 + $2*60 + $3 }' + date "+%s" } _timestamp() -- 1.9.1.475.ge4eef26 From david@fromorbit.com Tue Apr 8 00:31:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C69A029E00 for ; Tue, 8 Apr 2014 00:31:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72EDBAC016 for ; Mon, 7 Apr 2014 22:31:35 -0700 (PDT) X-ASG-Debug-ID: 1396935092-04bdf05dacddb620001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PIIgEBsUntbP1zIT for ; Mon, 07 Apr 2014 22:31: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: AmUGACyJQ1N5LEcv/2dsb2JhbABWA4MGO8R+gR4XdIIlAQEBAwEnExwYCwULCAMYCQwZDwUlAyETh3EHDspoEwQWjWwRRxAHCgeEJwSUcINrkkGDQiuBLQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 08 Apr 2014 15:01:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXOcw-0006T6-2W; Tue, 08 Apr 2014 15:31:18 +1000 Date: Tue, 8 Apr 2014 15:31:18 +1000 From: Dave Chinner To: Keyur Govande Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS fragmentation on file append Message-ID: <20140408053117.GJ27017@dastard> X-ASG-Orig-Subj: Re: XFS fragmentation on file append References: <20140408015012.GB22917@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: 1396935092 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 11:42:02PM -0400, Keyur Govande wrote: > On Mon, Apr 7, 2014 at 9:50 PM, Dave Chinner wrote: > > [cc the XFS mailing list ] > > > > On Mon, Apr 07, 2014 at 06:53:46PM -0400, Keyur Govande wrote: > >> Hello, > >> > >> I'm currently investigating a MySQL performance degradation on XFS due > >> to file fragmentation. > >> > >> The box has a 16 drive RAID 10 array with a 1GB battery backed cache > >> running on a 12 core box. > >> > >> xfs_info shows: > >> meta-data=/dev/sda4 isize=256 agcount=24, agsize=24024992 blks > >> = sectsz=512 attr=2, projid32bit=0 > >> data = bsize=4096 blocks=576599552, imaxpct=5 > >> = sunit=16 swidth=512 blks > >> naming = version 2 bsize=4096 ascii-ci=0 > >> log = internal bsize=4096 blocks=281552, version=2 > >> = sectsz=512 sunit=16 blks, lazy-count=1 > >> realtime = none extsz=4096 blocks=0, rtextents=0 > >> > >> The kernel version is: 3.14.0-1.el6.elrepo.x86_64 and the XFS > >> partition is mounted with: rw,noatime,allocsize=128m,inode64,swalloc. > >> The partition is 2TB in size and 40% full to simulate production. > >> > >> Here's a test program that appends 512KB like MySQL does (write and > >> then fsync). To exacerbate the issue, it loops a bunch of times: > >> https://gist.github.com/keyurdg/961c19175b81c73fdaa3 > >> > >> When run, this creates ~9500 extents most of length 1024. > > > > 1024 of what? Most likely it is 1024 basic blocks, which is 512KB, > > the size of your writes. > > Yeah, 1024 basic blocks of 512 bytes each. > > > > > Could you post the output of the xfs_bmap commands you are using to > > get this information? > > I'm getting the extent information via xfs_bmap -v . Here's > a sample: https://gist.github.com/keyurdg/291b2a429f03c9a649ad Yup, looks like fragmented free space so it's only finding islands of 512kb of freespace near to the inode to allocate out of. Can you post the output of /proc/mounts so I can check what the allocator behaviour is being used? > >> cat'ing the > >> file to /dev/null after dropping the caches reads at an average of 75 > >> MBps, way less than the hardware is capable of. > > > > What you are doing is "open-seekend-write-fsync-close". You haven't > > told the filesystem you are doing append writes (O_APPEND, or the > > append inode flag) so it can't optimise for them. > > I tried this; adding O_APPEND the the open() in the pathological > pwrite.c makes no difference to the extent allocation and hence the > read performance. Yeah, I had a look at what XFS does and in the close path it doesn't know that the FD was O_APPEND because that state is available to the ->release path. > > You are also cleaning the file before closing it, so you are > > defeating the current heuristics that XFS uses to determine whether > > to remove speculative preallocation on close() - if the inode is > > dirty at close(), then it won't be removed. Hence speculative > > preallocation does nothing for your IO pattern (i.e. the allocsize > > mount option is completely useless). Remove the fsync and you'll > > see your fragmentation problem go away completely. > > I agree, but the MySQL data files (*.ibd) on our production cluster > are appended to in bursts and they have thousands of tiny (512KB) > extents. Getting rid of fsync is not possible given the use case. Sure - just demonstrating that it's the fsync that is causing the problems. i.e. it's application driven behaviour that the filesystem can't easily detect and optimise... > Arguably, MySQL does not close the files, but it writes out > infrequently enough that I couldn't make a good and small test case > for it. But the output of xfs_bmap is exactly the same as that of > pwrite.c Once you've fragmented free space, the only way to defrag it is to remove whatever is using the space between the small freespace extents. Usually the condition occurs when you intermix long lived files with short lived files - removing the short lived files results in fragmented free space that cannot be made contiguous until both the short lived and long lived data has been removed. If you want an idea of whether you've fragmented free space, use the xfs_db freespace command. To see what each ag looks like (change it to iterate all the ags in your fs): $ for i in 0 1 2 3; do echo "*** AG $i:" ; sudo xfs_db -c "freesp -a $i -s" /dev/vda; done *** AG 0: from to extents blocks pct 1 1 129 129 0.02 2 3 119 283 0.05 4 7 125 641 0.11 8 15 93 944 0.16 16 31 64 1368 0.23 32 63 53 2300 0.39 64 127 21 1942 0.33 128 255 16 3145 0.53 256 511 6 1678 0.28 512 1023 1 680 0.11 16384 32767 1 23032 3.87 524288 1048576 1 558825 93.93 total free extents 629 total free blocks 594967 average free extent size 945.893 *** AG 1: from to extents blocks pct 1 1 123 123 0.01 2 3 125 305 0.04 4 7 79 418 0.05 ...... And that will tell us what state your filesystem is in w.r.t. freespace fragmentation... > >> When I add a posix_fallocate before calling pwrite() as shown here > >> https://gist.github.com/keyurdg/eb504864d27ebfe7b40a the file > >> fragments an order of magnitude less (~30 extents), and cat'ing to > >> /dev/null proceeds at ~1GBps. > > > > That should make no difference on XFS as you are only preallocating > > the 512KB region beyond EOF that you are about to write into and > > hence both delayed allocation and preallocation have the same > > allocation target (the current EOF block). Hence in both cases the > > allocation patterns should be identical if the freespace extent they > > are being allocated out of are identical. > > > > Did you remove the previous test files and sync the filesystem > > between test runs so that the available freespace was identical for > > the different test runs? If you didn't then the filesystem allocated > > the files out of different free space extents and hence you'll get > > different allocation patterns... > > I do clear everything and sync the FS before every run, and this is > reproducible across multiple machines in our cluster. Which indicates that you've probably already completely fragmented free space in the filesystems. > I've re-run the > programs at least a 1000 times now, and every time get the same > results. For some reason even the tiny 512KB fallocate() seems to be > triggering some form of extent "merging" and placement. Both methods of allocation shoul dbe doing the same thing - they use exactly the same algorithm to select the next extent to allocate. Can you tell me the: a) inode number of each of the target files that show different output b) the xfs_bmap output of the different files. > > Alternatively, set an extent size hint on the log files to define > > the minimum sized allocation (e.g. 32MB) and this will limit > > fragmentation without you having to modify the MySQL code at all... > > > > I tried enabling extsize to 32MB, but it seems to make no difference. > [kgovande@host]# xfs_io -c "extsize" /var/lib/mysql/xfs/plain_pwrite.werr > [33554432] /var/lib/mysql/xfs/plain_pwrite.werr > [kgovande@host]# xfs_bmap -v /var/lib/mysql/xfs/*.werr | wc -l > 20001 > [kgovande@host]# sync; echo 3 > /proc/sys/vm/drop_caches; pv > plain_pwrite.werr > /dev/null > 9.77GB 0:02:41 [61.7MB/s] [========================================>] 100% Ah, extent size hints are not being considered in xfs_can_free_eofblocks(). I suspect they should be, and that would fix the problem. Can you add this to xfs_can_free_eofblocks() in your kernel and see what happens? /* prealloc/delalloc exists only on regular files */ if (!S_ISREG(ip->i_d.di_mode)) return false; + if (xfs_get_extsz_hint(ip)) + return false; + /* * Zero sized files with no cached pages and delalloc blocks will not * have speculative prealloc/delalloc blocks to remove. */ If that solves the problem, then I suspect that we might need to modify this code to take into account the allocsize mount option as well... Cheers, Dave. -- Dave Chinner david@fromorbit.com From a.m.k.yassin@g.pl Tue Apr 8 01:37:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=URG_BIZ 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 0B1F4801B for ; Tue, 8 Apr 2014 01:37:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E58C304053 for ; Mon, 7 Apr 2014 23:37:55 -0700 (PDT) X-ASG-Debug-ID: 1396939072-04bdf05dacddfb30001-NocioJ Received: from mail.vps.com ([168.61.8.176]) by cuda.sgi.com with ESMTP id EtzTGstbZWzZ94hu for ; Mon, 07 Apr 2014 23:37:52 -0700 (PDT) X-Barracuda-Envelope-From: a.m.k.yassin@g.pl X-Barracuda-Apparent-Source-IP: 168.61.8.176 Received: from [168.61.8.176] (localhost [IPv6:::1]) by mail.vps.com (Postfix) with ESMTP id 33C1341196; Mon, 7 Apr 2014 07:12:24 -0400 (EDT) Received: from 94.202.194.54 (SquirrelMail authenticated user admin) by 168.61.8.176 with HTTP; Mon, 7 Apr 2014 15:12:24 +0400 Message-ID: <67db95a54d8b9d3e450c931aabd4200f.squirrel@168.61.8.176> Date: Mon, 7 Apr 2014 15:12:24 +0400 Subject: Interesting deal From: "A.M.Yassin" X-ASG-Orig-Subj: Interesting deal Reply-To: a.m.k.yasin@g.pl User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20140407151224_29796" X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[168.61.8.176] X-Barracuda-Start-Time: 1396939072 X-Barracuda-URL: http://192.48.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.27 X-Barracuda-Spam-Status: No, SCORE=2.27 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC2_MV0291, RDNS_NONE, URG_BIZ X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4678 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.67 URG_BIZ BODY: Contains urgent matter 1.50 BSF_SC2_MV0291 Custom rule MV0291 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS ------=_20140407151224_29796 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Greeting, My name is Mr. A. M. Yassin, I live and work in Abu Dhabi UAE. I have an urgent business which I believe will interest you. Find the enclose for details. For any reason you cannot open that attachment, please let me know so that I can resend it in the body of the mail, thank you. I wait for your response, Thank you. Regards A. M. Yassin ------=_20140407151224_29796 Content-Type: application/pdf; name="For your interest.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="For your interest.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDExIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+ Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDEvS2lkc1sgMyAwIFJdID4+ DQplbmRvYmoNCjMgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvUmVzb3VyY2VzPDwv Rm9udDw8L0YxIDUgMCBSL0YyIDggMCBSPj4vUHJvY1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdl Qy9JbWFnZUldID4+L0Fubm90c1sgNyAwIFJdIC9NZWRpYUJveFsgMCAwIDYxMiA3OTJdIC9Db250 ZW50cyA0IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdC Pj4vVGFicy9TL1N0cnVjdFBhcmVudHMgMD4+DQplbmRvYmoNCjQgMCBvYmoNCjw8L0ZpbHRlci9G bGF0ZURlY29kZS9MZW5ndGggNTU2Mj4+DQpzdHJlYW0NCnicrVxtj9s4kv4eIP+BH+5w9qFbEfWu u8Xikkk20zNJZjBJcFhk74O6rbYb6UiOWk7P/vtlVZEUaZcpNXAYTNJx2xRZVXzqqTeLF7+Lv/zl xfufrl6L+K9/Fa9e/ySk2D5/VsZRXmWijKsoq0Sm/lnnQsooT8TQPn92+5/Pn4k3738SwllA6gVe fXr+7MXfpKijuhCfbp8/kyJW/0lRJlGcqEVlHJXqN9+eP4sjmabwPPrh7fNnX1Zv15fZalhfpqu2 XWer8W5drLr1Zb3aPsCLF+v/E59+ef7szSdmC4mzBfNUKatIug/9shKhNVJGDkVdRHXmyiHLzgsi Y3ahz17UdZQk/tln9pNz+6lytQVnP4HdFIHdVGVUHm/mSjRK7N/Wl4lciUaon1+p/5tO/fF1fSnL lfgN9HB7Czq5W+erm/VlvmoHsWuHVsALnVhfVquX6gPXB/WH+peMV693Dbx6fbcuVxcCPrsD9ZKi 8QPTRz93+BF4YWw368tSr/HSfKC5tuu+sZuFt9NvR1j5AbYVhSRbMpJJyzJKUkcyM9qp2DWU6dfe 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 RvrpaKAO8ebs3MBMLpKdVoP++Cp39z+rQQ53oUO+kP4yFI/h1CeMKOE4Ok7w/fQHQtcbG7Op8C0p Vv+r3gmCwAuF0Gmjlq0zF03T6QPKBmcKMcRtR9s56yQHnbidEsJDO/0TxPojHOsqVlkvriuxU2jG PuIqSk7YoGe6KJPDsG07SkeHdMCOqskEWkLcR82pkh3lUtFqlPqrkAtDO6UUCtW1qKPp96kaCdZs B/oUjWn37rSo/h40J4Clyue9yduwLLAlRtnY7M5/hY/Etr0lRRTXs5L5uG86ZyW29U35S7gurjrj QkUecZQqrcZRJYYt8+If+EWJTUSHieArJwjNognDCAjsl6/9z3ad61/vg+Pgkh1Kg4iorFnDc766 0ZUCexJ74AICoxK+VDFTvyyDF4H7opWkzo5Cq+ASAaxN6iIqTioEM5bOfdVKUqXLIyt2RMzsSDGV 08jq5+YHjr5ib5z+rhvtpU2Ze9M45UMTVb/tMe7aCNvG5Yz8ReKl4ZzIPm/sGOp+aiV1WqpPXeQB b/N2aq7DxJp/xU3fAb4hzAvYobe0qCBJ6MhlTkEF1wuclPIJEQs7/2U0VKZMxDKzJe57RcFfLifM oeEpcJnHhJlaDXQbn1p3q0PCDU4rBb9IVfLzUynkMNxnzZ6avbxZ9QSixE4emVPnMUOUZrbEXt60 eIJvDs0FJWnN+GYob0TvcWrn75ZO20igm78Y7OwQONcscR85d/jS/5LeBI4aZ9y39CbKy2UaFxHm TyEel/8X9tW9Wg0KZW5kc3RyZWFtDQplbmRvYmoNCjUgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0 eXBlL1RydWVUeXBlL05hbWUvRjEvQmFzZUZvbnQvQXJpYWwvRW5jb2RpbmcvV2luQW5zaUVuY29k aW5nL0ZvbnREZXNjcmlwdG9yIDYgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMjEvV2lkdGhz IDU5IDAgUj4+DQplbmRvYmoNCjYgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5h bWUvQXJpYWwvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgOTA1L0Rlc2NlbnQgLTIxMC9D YXBIZWlnaHQgNzI4L0F2Z1dpZHRoIDQ0MS9NYXhXaWR0aCAyNjY1L0ZvbnRXZWlnaHQgNDAwL1hI ZWlnaHQgMjUwL0xlYWRpbmcgMzMvU3RlbVYgNDQvRm9udEJCb3hbIC02NjUgLTIxMCAyMDAwIDcy OF0gPj4NCmVuZG9iag0KNyAwIG9iag0KPDwvU3VidHlwZS9MaW5rL1JlY3RbIDMyNi41NiAzMDYu MDQgNDA3LjkgMzE3LjUzXSAvQlM8PC9XIDA+Pi9GIDQvQTw8L1R5cGUvQWN0aW9uL1MvVVJJL1VS SShtYWlsdG86YS5tLmsueWFzaW5AZy5wbCkgPj4vU3RydWN0UGFyZW50IDE+Pg0KZW5kb2JqDQo4 IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YyL0Jhc2VGb250L0FC Q0RFRStDYWxpYnJpL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciA5IDAg Ui9GaXJzdENoYXIgMzIvTGFzdENoYXIgMzIvV2lkdGhzIDYwIDAgUj4+DQplbmRvYmoNCjkgMCBv YmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQUJDREVFK0NhbGlicmkvRmxhZ3Mg MzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgNzUwL0Rlc2NlbnQgLTI1MC9DYXBIZWlnaHQgNzUwL0F2 Z1dpZHRoIDUyMS9NYXhXaWR0aCAxNzQzL0ZvbnRXZWlnaHQgNDAwL1hIZWlnaHQgMjUwL1N0ZW1W IDUyL0ZvbnRCQm94WyAtNTAzIC0yNTAgMTI0MCA3NTBdIC9Gb250RmlsZTIgNjEgMCBSPj4NCmVu ZG9iag0KMTAgMCBvYmoNCjw8L0F1dGhvcih1c2VyKSAvQ3JlYXRvcij+/wBNAGkAYwByAG8AcwBv AGYAdACuACAAVwBvAHIAZAAgADIAMAAxADApIC9DcmVhdGlvbkRhdGUoRDoyMDEzMTIxODEwMDg1 MS0wOCcwMCcpIC9Nb2REYXRlKEQ6MjAxMzEyMTgxMDA4NTEtMDgnMDAnKSAvUHJvZHVjZXIo/v8A TQBpAGMAcgBvAHMAbwBmAHQArgAgAFcAbwByAGQAIAAyADAAMQAwKSA+Pg0KZW5kb2JqDQoxNyAw IG9iag0KPDwvVHlwZS9PYmpTdG0vTiA0Ny9GaXJzdCAzNjEvRmlsdGVyL0ZsYXRlRGVjb2RlL0xl bmd0aCAxMDU4Pj4NCnN0cmVhbQ0KeJztl99v20YMx98L9H/gf6Dj/T6gKLCtLbZlTYM4wB6KPSiJ lnhxpEBVgPa/35ei3dqohsW3DdhDH2xaEkmRvA95Zw5kiDOFQFyITSaL61TIMtnoyVpyeGAduQzh KSRDNlDEx0bKATczFY5kC5VYyMHczFaQKZCzxAwV5yAzk/PEFl8OL7Q5kYvEzhtyCbLIa4i9j+QQ jS+F8IhDsOThL5pAHv5iyOThLzGTh7+EQD38ZU4EU86I0cNfQdgefkqKFBC2EX3JEPoB+TGCtQky O8IrrMvQc8gSzgNyD8ZLYWyITAEZRuQVoB9RH4RgkwQHvVQkOVQgIjikbuCEkYpFyVAZ51DMFy+a M1E2dN6smrPm4tND16ym8fFqer3p7puT97IQZH+j5uyGnOi9fPn82RPMkOPxRlhBSoSVwypJ7Aib 3fFu8JSD5IjKgyIhxczoSDUFFxuOdwqubKowy8IglhTogToA5yoKAy6BJGgEiG7GD+QBOiDhZ8oA GNgCRiALUIEjoBNmYMAKMAEhgAONEQ0BHDARHYG4iJpHioliJjQKGE1MyVJylDyhVUBpSpTy8UGD x2yON0M7ZkuAP3t0MoF+NGTOBGyLQVNTsQS0i6cS0NxUEhUgI8xIl0uHAxsD2NEojOZkE6Xr5znC BnozXCwTAB9pEugJMEKMICPMyNyRoWOFQmkg6FmZEjIhoIcOlQHCWFxpWHZcwamMIbcIONyr4eqh 7b+y3ak3JzKmaoxCjVGsMUo1RrnGqFQYeVNjxDVGtsbI1RjVEOFriPA1RPgaInwNEb6GiFBDRKgh ItQQEXZEzErvvv/5vHl3+Qep/VdjBBvCU/0uQPPLur9bmlvYY6Ag+wzEP5teITx9H5V3Wn21MypY hVXhVHgVQUVUkVSoF6devHrx6sWrF69evHrx6sWrF69etKqyyf5F/n8z9rEdc6g4SzB2cA5yeqvY VjnKWbXiJMc4KDBOCjjg1hgj11iTK84jjAMJp5pc0/JuzDujdpyWCzwvLOv6slJilRKrlFilxCol VimxameVEqVfDmCzUM2gmkE1g2qGrWZWkPY7WwO7GLvufBim5nzYdG/bBzkRz43ejl0/P5Uj/dxL 77c1kcQ/Pz3tPk4n3SfaTZo38NUPU9ecytfr/vrLxQVUL4ePzaq7mpofu/a6G/W32Ox+/9Rv1n23 um0lQrnxXQ8P7bQe+u31OK1/b/Fjvvp1GO8uh+GueTVcPd4jpvnOh9uum3QN3rZX47B3/cMtvveu X63bzXCzd2O1WV93e7r6HqjdjO1982Z98zh221xPH+8/zH9ftNa8bVst85e1PhR5AYBasQPnXxW8 BOPThfsmjhZ+qdW/if9SxAPxP9r69cyz3fo/j/jDSX8o/IEISyIeiLQktqPr+bM/AYWbcXwNCmVu ZHN0cmVhbQ0KZW5kb2JqDQo1OSAwIG9iag0KWyAyNzggMCAwIDAgNTU2IDg4OSAwIDE5MSAzMzMg MzMzIDAgMCAyNzggMzMzIDI3OCAyNzggNTU2IDU1NiA1NTYgMCAwIDU1NiA1NTYgNTU2IDAgMCAy NzggMjc4IDAgMCAwIDAgMTAxNSA2NjcgNjY3IDcyMiA3MjIgNjY3IDYxMSA3NzggNzIyIDI3OCA1 MDAgNjY3IDU1NiA4MzMgNzIyIDc3OCA2NjcgMCA3MjIgNjY3IDYxMSA3MjIgMCA5NDQgMCA2Njcg MCAwIDAgMCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAwIDUwMCAy MjIgODMzIDU1NiA1NTYgNTU2IDU1NiAzMzMgNTAwIDI3OCA1NTYgNTAwIDcyMiA1MDAgNTAwXSAN CmVuZG9iag0KNjAgMCBvYmoNClsgMjI2XSANCmVuZG9iag0KNjEgMCBvYmoNCjw8L0ZpbHRlci9G bGF0ZURlY29kZS9MZW5ndGggNzcwOTAvTGVuZ3RoMSAxNjg4Njg+Pg0Kc3RyZWFtDQp4nOx9CXyU 1bn+Od/sW2YSMlkYYL4wJCyBhJ2wCANZ2NcwmABCJskkGcnmZAIEQSOg0oiKu6hV1KpVXIbBJe64 VK0b1tpq3YqtbbWK1VZtXSD/53zvnBCo+vP/u73X9t45H888z3nPe97v7DlpR2CcMebGh54tKSmf O/vgplEnM6VjNGP9o6WzSpYXjnDextiuXYzxp0pnLSi+qqHMwdgFVYwpo2eXlJb96YlPIdv9jOk+ mr1kcXm4dupWxi6uYPwa++zywCydbvgXTCmoZazs9cXlhWO/eLN7I2K9hrdW1TQFW9Nv6/cBY0O7 EeTumvVRNXb1ky8zdvKVjBkG1LXWN33++UI7YyMaGbP0rw+2tbIBzIf3L0F9V31jR93I331+CWOr 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 l7WtD2MlzPrmJf+LyP8i8r+I/C8i/yvI/wryXyP/Nda/ZNa/ZPI/TM4XkfMaOR9mDfSy/nlZ/7ys f14j32UDWjewP3tKPoQDNzCfVzCfL8GJG3Dij9x9gmy/VjnITqpI/qAExWzTvRBPl/FUKSvmU3IV Z7Ope5C6X3F1PHWfou4X1J1E3SLq/VrY4+PoVzwZ5Mkinpxk7q+MnHnLbOkO7o/j/n7uF3N/NC09 yt33aOlqWiqgpUvM578294mHzU9dJFrOEz0ts+BeuA9+D/NhASyExfAYK30HS67w8CsP0nom7ew2 90avi67Kx+Iy5VP8rxS9WbVvZpeYzMrdjV1ib6WameE4PYhy7RtxGev5QvkpNbqwp+xlrOnUv1dM ZAWbRc7fIiYqt5q7r4kiiZ51p2fd6Vl3etadnnWnZ93pWXd61p2edadn3anZiZrzqNmJmvPMmh5q eqjpoaaHmh5qeqjpoaaHmh5qeqjZj5qXUrMfNS81a7qp6aamm5puarqp6aamm5puarqp6Y7XHBGv OYJIbhED+TbQ1Nhv7hGaUCtk/JttuAmmwc3wS5HI3i2RvVsie7dE9m6JCcZ/p7WhcEfqpMd3Gnmm RxWiyNJfVloGwEAYBIPhYhgCQ+ESuBSGwXAYAZfB5TASroBfwCgYDVfCGBgL42A8XAVXwzUwAa6F 6+B6uAEmwiSYDFPgRkiDqfASvAyvwKvwGrwOb8AmeBM2wx9hC7wFW+FPsA3ehnfgz7Ad3oX34C+w A/zwV3if3Voux09lmWUnfAZ58Dns4voXMmjJh91QAHtgrzxm2Qf74Ut2ELN4W7lVFto+ZyexC76A fNgNBbAH9sI+GbTthy9lsF0HWdmuE3SGLtAVUiBVVtrXwYuABvZX5TH7FnnC/hZshT/BNvgr1z/j yG7T/jnfC2XQ/hXPl/Jdl5WO8+EC6AkXgleecPSC3tAH+kI/GXRcBP1lmWMAkAsOcsGB745hnA/n 3mh5zHElx2nyhNMqK50K2KAd2MEBTkiARHCBGzyQBOdBeyBeZzJ0BOJ2EreTuJ3E7SRuJ3E7u0F3 6AH030n/nfTfSf+dXugFvaEP9IV+9GmYPOYcDr+QQecoGM218XAdXA+38dxsjndy7y6euxt8MBeW cC8LVsFqyIZ1XH+T59/i+a2yzPknzrdBA9c0WZlgAWJN6CiDCcSR0FkeS7iQHFppQR0L6lhQx4I6 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 zEfjABoHyPRqnsxH6yq0rrKu4DxLHqdWA5mvkvkqma+S+So+fI8PAXwI4EO99Sn5BSOghBFQwggo YQSUMJb2MjfswqMgHgXxKIBHATwK4FEAjwJ4FMCjAB4F8CiARwE8CuBRAI8CeBTAowAeBfAogEcB PArgUQCPAngUwKMAHgXwKIBHATwK4FEAjwJ4FMCjAB5V4VEVHlXhURUeVeFRFR5V4VEVI0RlhKiM EJURojJCVEaIyghRGSEqI0RlhKiMEJURojJCVEaIyghRGSEqHgfwOIDHATwO4HEAjwN4HMDjAB4H 8TiIx0E8DuJxEI+DeBzE4yAeB/E4iMdBPA7icRCPg3gcxOMgHgfxOIjHQTwO4nEQj4N4HBQ+HAzj YBgHT+L3Tlw8gXNlOPcNztXiXC3O1eJcLf678X8H7qm4p1of59qTOL1O/hkHq3GwGgercbAaB2tw sJ48+QculuNiOS6quKjiooqLKi6quKjiYhgXw7gYxsUwLoZxMYyLYVwM42IYF8O4GMbFMC6GcTGM i2FcDONiGBfDuBjGxTAuhnExjIthXAzjYhiXanGpFpdqcakWl2pxqRaXanGpFpdqcakWl2pxqRaX anGpFpdqcakWl1RcUnFJxSUVl1RcUnFJxSUVl8pxqRyXynGpHJfKcakcl8pxqRyXynGpHJfKcakc l8pxqRyXynGpHJfKcakcl8pxqRyXynGpHJfKxSW4pOOSbo7GFhcacaEeF+pxQMcB472pHnXrUbce detRtx5161FXR10ddXXU1VFXR10ddXXU1VFXR10ddXXU1VFXR10ddXXU1VFXR10ddXXU1VFXR10d dXXU1VFXR5161KlHnXrUqUedetSpR5161KkXA5kZTjEznGL0q6znidbHieIJojB7z/cNsJH1/kXW 7e7s6nrA+XAB9IQLwQu9YA7P3AF3wl1wN7CDROsmtG5C6ya0bkLrJrRuQusmtG5C6ya0bkLrJrRu QusmtG5C6ya0bkLrJnE3WlejdTU9VumxyiiIMgqijIIooyBq6n96BKD7jzKfHbzV+MvGv8/2avyo xo9q/KjGj2r8qMaPavyoxo9q/KjGj2r8qMaPavyoxo9q/KjGj2r8qMaPavyoxo9q/KjGj2r8qMaP ahRUUVBFQRUFVRRUUVBFQRUFVUZDlNEQZTREGQ1RRkOU0RBlNEQZDVFGQ5TREGU0RBkNUUZDlNEQ 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 ymBP25tb7M0tMthS+/NR+3OL/fmo/fmo/fmoDLY0+0vv/QrX44awXFRfLqovtze3yGZLZbOlIvxy EX65vfmobPa0vfmovfQEv3+Cnz/Bp1vkk5x8kuO3LXJKjq+28NPX+eUsfjmLX87iiy18bQ1fW8PX 1vCtFr7Vwq/W8Ks1/Op1uSjHp16X4Z7mU4/KcEtljuX8Yxb/aOEfayjIRfzgRbxCob0ZnmPpdbJD PV/4gmjeJJo38Yd3WLWZVetYtY5PPCtyr2bZt0TqJpZ9i2Xf4hub+cYG0bhBNG4QjRv4yEf5yE5R tiDKFvjKSn6yXmStFVlrRdZaPrNMNF0piuZFzgYRsV5ErGf1day+jrXXiYD1ImC9CFgvAtaLgPUs u07Uqxf16kW6ehEtL4oVRLGCKJYXxWpFsVoRLC+CrRTBVopWK0WrguhUEJ0KolNBdKoVnWpFp1rR aaWoVBCVCt1RqVY0KohGedGoweq8JbI0iSxNVuktK/SW6LJadFktgqwWLZpEiyaRoUlkaBIZmqxU nZWqs1J1osJqEaDJStVZqTo7v8lKvWXn19vx9XZ8vR1fb8fX2/H1dnyt3V5rtxfs9oLdXrDba+32 gt3eZBXr7PImu7zJLm+yy5vUxJuo46KuPjHsiz5llxXrrB/bUdPtqOl21KvWeapds9u6zrau863r fLul1bquta5PWtMnremTdsQuu2CXtZhqLabaAbusx1Qev4uXT+fl03n5dGsxlZfv4uW7ePl0Xj6d N+9mryfZ6UnevJutnmSrtWy1llfvZq+1PHk3+8xnn/nsM5991vLm3bx5NxvNZ6P57PMk793Fe6fz 3N3mPN8cXws38tidZrDI2TZj3x4e45uro/5mts3ZejNrMbMWM9tqVrXiQKuZ1ZpZrdFtM7pao6s1 um1GV2tU24xomxG1GFGLEbUYzTaj2WY0LUbTYjS1RlGsZVuiw/S0XU8r9bReT+v1tIkNizVqnd46 9Vantzq9bddbnd7q9LZdb3Vs8R5bvKfX7Wzxnp6363m9ntfreT1bvKf37Xrfrvf1el+v9zq9F+vD 9WqE1eLltrDErJfouVOPTWLZ8yLuChG3WB88W4q4KU91dtdQrd3/h+kTiXOjE0qWa3anyZ3m0lmx tttbsmNF91vvOWvT/nLtd1DDeZq2jYX3mGeGJSJU0KQppDHA+RDMDFu1sbq0MvWebpRFimPsjIZo 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 6/Q4tLQ2S8PMUm+5sNye663K2dPtIycktZ3sQoiOrOgVfTl9Hs7HiOjI9N2YhWbn72INjDPd7lqn 4w5jK/7+Y7uR7Tbn3UZ2jHnvNrJjzLu/eRcjRqX5Zsx1Y2JFtF/J6xZ641VvrPNGf2+s80Z/b3zG 0/sZ84aS5y0Ne417lzfXld7Klf4uwXn6O58nj3D8nuN4UXFNdISI1y7GZETGfiLj/uLdwtJf1Cmu X8FTCVfarcM5Pp1b2hvFX8Prk7icV10p320w7k16bAlxyd+avbfOexmtV2q53J1C1C+6OHREP8SP cLnVP8d6nmdcIzCeZxafXstLNrD0RmNqUV+2amWzPHlq1Ldiv9BR0YYtoSM1GmPwE/wU43GFdnt0 /02gvJYLWi4kLjer8WL+Guu4lhets4NKsxWHN7FRS/hLqRbva3x7jW+v8e3tnn3xO+XVWlmtlXKt HGOM+2llp1a6tFL8pflKLbxb/HtExrfX+PYa317j22t8e41vr/HtjT4WXRydEf0QP8LEaHg0CVdh Mq6Ohuuxpx4/KmZVsPDZYlYFK58tZj3C0k+x9CJ++iY//Qo/PSPxWLjVnN6RIYZ8MBp5qziaTdTE ydFQPjo0eWrIJ++PhicfwIPR8Ir9ojMqmh3bHLdgazQ8dTROwujojNQY/AQ/RXF8lUa1o9tvyrv9 pry0VkULtoSNpW8jnjTu2d1P9el+qo9xx548ofQNREto4Bmju15TC25R+zWr9bao7ZqTR3Wt52uj u2JX211pTx4VPqfV0V2rEzvYea+394kN74fFyYqwU124K1kdOj252JOnld59xd16V+pdyZTejRN7 9LeXVd4Py9SYXcmqKOXdLk8tU0t2eXKYuDS6a4NeulSpnUbWltjtuFev+3jmB2/u02uX6rTTiNuS lY4Zo6h2/YOW9pnBdl43Wl27MyrTSrtWurQStLCp1HcqKvN2u7e7vB28ual7DEcX7dR1izGs8fZA bzd6e0dijx1bHP0+fvw+j+uiE0J431jWaG2g1hq1tiNZFXKlWVVb52y0n0q5VcvvG9MTxSwayrW4 yzhWJbqicm/t0veqZI3PR4UBxSe6lnhio/6Klip4YqM2i1YqaGMr6/7Deln97nXy9n+yPqVnS+vi 2f9kPczxf7gO4ul/0f6izP+y3c3xP7B36c6/a+eoR7J3VJU80PgOijLJ/lo72DuH0Awf8flQ9w5z 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 zaw48/FBjoZBTdGrUU8p1mVy5Buoo0xczSTXwLpGLse6Vq5JGNQN2Y+8FbHDURWO8TYJ4+wIMpZM JNPJXLKIlJINZAfGsaPkLLmKmf8THNuf7+ehJxmhr9uiLwngAV7oTR0gABEyDPWOQy2WY2/NwR5a QWUfKKUyAlZS2RdWUdkPVlMZBWuojIa1VEbCOipjYD2VsbCByji5uShRRwtRopb1qSyTW1K5U25F ZbXcmsoauQ2VtXJbUaLGDahsBfOp/RZQyxVSyxVRyxVTyy2kNltEbVZCrbiYWm4JtdxSarlloj3k +rTHDWiPG9Ier0d73Ij2uDHtcRPa46a0x81ojwORahO6qltCsYLQkQ7a4k80xCf5BtA19Y2JC8bi zzNRYEh9rR71ESPx3OJRwPhrq7/oSSL2Ip7MpL5Ca/EOGeggQhEwwJwGKBIxFF/EmGZEJkAPCIVe 0BNCoD/XE6NP2Kd5YWYI8yMznpkhmSNZJlnHf+Sr+Rq+FvF1HjefW8AVckVcMbeQW4RYu4fby+3j 9nMHuF+537iDfCXP8BJeyrO8jNfg5dx7ror7wH3kqrkarlaBsKf4RTFVMU0xXTFDMVMxS5GvmK3Y pNis2KLYqtim2K7YoShT7FRcVlxVXFPcUNxS3FHcUzxQPFI8UVQoniteKjWUcqWmklMqlEqllpJX aiubKB2UjkonpbNSUKqVLkpXpZvSXemhbKr0VDZTNle2UHopvZUtla2UrZVtlD5KX2VbpR+v5LV4 ntfjVbw+/45/z1fxprwZL96DbEizPkIzPRaZgz/GtEQmCaN2OmZ0SiYLMzotuvqZp/mbNs3KdOjc q65krWQt0ZOtlq0hKtlm2WZiIKuUVSJvw1yF1BNzFeQ317i7xE7MWJDNjMfY3Rxz9o3EF7PtS6Qz ZtxXSBcauwNo7A6ksbsrjd3daOzuTmN3EI3dwTR296CxO4TG7lAau3sqajBq91LqYKSOopE6i0bq UbwBRuoxqOc2EvZXLPqvWfDfYqcvFuJobxLam5q0H/VoP5rSfrSlmjtSzT2o5t2o5sGUo4R+yvxY +qY/bHci4ryuD7Go6/9/9OI/98dPvoNH0KWeQqinSKiFZdSePLWnNrWnDrWnLrWnHrWnitpTn9rT gNrTkNqzHrWnEbWnMbWnCdqtHjH9fPUKlq9z9Tzyzc8jVhzz1E8J9VOgfspQP5V8/l8lq13nf42Q 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 s3bZFrRRcXD9qtOTD/rvsEmdX75Q0mHNOQvfEZb3LhvM3NZRXp4ZZ28adO9Op/jB4/KPL94V1W/9 5ZZ3Na+uqkmfK9FaOu2HDPad/51Vby+9uTGzdsijVzM3FJbZ9oXbqw4PP5F5bPWv+bW2ecdslhHB X8h/cih9l1+706EmGiFNTB939876SdFs4eCSwI7L8gZe9MnJEhw/TvV9kshHGW97M7FHw0OXmqVd qXBVT9HWiIm4MPgIIf8Dw7dbig0KZW5kc3RyZWFtDQplbmRvYmoNCjYyIDAgb2JqDQo8PC9UeXBl L1hSZWYvU2l6ZSA2Mi9XWyAxIDQgMl0gL1Jvb3QgMSAwIFIvSW5mbyAxMCAwIFIvSURbPEQ3Nzgw RTRDNkYzQUQ1NDE4NUUxNTJGRjFEMTI3MjQ3PjxENzc4MEU0QzZGM0FENTQxODVFMTUyRkYxRDEy NzI0Nz5dIC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE1Nj4+DQpzdHJlYW0NCnicNdC5DcJg DIZhJ9w34coJCeE+OyR6lmAFVkBiKyjYgY6Bwo9fcOFHlmwXn4ipLLNMd0S+3OChWHfFfSreWfGP 8FaCqxJeRGz9soEt7GANv5W9OYhO/8kCG3KQhwIUoQRlqEAKVahBHRrQhBa0wYEOdKEHfRiACx74 EEAIEQwhgRHEMIYJTGEGc1jAElYmpeSl6aYBHEQ+lYARLg0KZW5kc3RyZWFtDQplbmRvYmoNCnhy ZWYNCjAgNjMNCjAwMDAwMDAwMTEgNjU1MzUgZg0KMDAwMDAwMDAxNyAwMDAwMCBuDQowMDAwMDAw MTI1IDAwMDAwIG4NCjAwMDAwMDAxODEgMDAwMDAgbg0KMDAwMDAwMDQzNiAwMDAwMCBuDQowMDAw MDA2MDczIDAwMDAwIG4NCjAwMDAwMDYyMzIgMDAwMDAgbg0KMDAwMDAwNjQ1NiAwMDAwMCBuDQow MDAwMDA2NjExIDAwMDAwIG4NCjAwMDAwMDY3NzggMDAwMDAgbg0KMDAwMDAwNzAxNyAwMDAwMCBu DQowMDAwMDAwMDEyIDY1NTM1IGYNCjAwMDAwMDAwMTMgNjU1MzUgZg0KMDAwMDAwMDAxNCA2NTUz NSBmDQowMDAwMDAwMDE1IDY1NTM1IGYNCjAwMDAwMDAwMTYgNjU1MzUgZg0KMDAwMDAwMDAxNyA2 NTUzNSBmDQowMDAwMDAwMDE4IDY1NTM1IGYNCjAwMDAwMDAwMTkgNjU1MzUgZg0KMDAwMDAwMDAy MCA2NTUzNSBmDQowMDAwMDAwMDIxIDY1NTM1IGYNCjAwMDAwMDAwMjIgNjU1MzUgZg0KMDAwMDAw MDAyMyA2NTUzNSBmDQowMDAwMDAwMDI0IDY1NTM1IGYNCjAwMDAwMDAwMjUgNjU1MzUgZg0KMDAw MDAwMDAyNiA2NTUzNSBmDQowMDAwMDAwMDI3IDY1NTM1IGYNCjAwMDAwMDAwMjggNjU1MzUgZg0K MDAwMDAwMDAyOSA2NTUzNSBmDQowMDAwMDAwMDMwIDY1NTM1IGYNCjAwMDAwMDAwMzEgNjU1MzUg Zg0KMDAwMDAwMDAzMiA2NTUzNSBmDQowMDAwMDAwMDMzIDY1NTM1IGYNCjAwMDAwMDAwMzQgNjU1 MzUgZg0KMDAwMDAwMDAzNSA2NTUzNSBmDQowMDAwMDAwMDM2IDY1NTM1IGYNCjAwMDAwMDAwMzcg NjU1MzUgZg0KMDAwMDAwMDAzOCA2NTUzNSBmDQowMDAwMDAwMDM5IDY1NTM1IGYNCjAwMDAwMDAw NDAgNjU1MzUgZg0KMDAwMDAwMDA0MSA2NTUzNSBmDQowMDAwMDAwMDQyIDY1NTM1IGYNCjAwMDAw MDAwNDMgNjU1MzUgZg0KMDAwMDAwMDA0NCA2NTUzNSBmDQowMDAwMDAwMDQ1IDY1NTM1IGYNCjAw MDAwMDAwNDYgNjU1MzUgZg0KMDAwMDAwMDA0NyA2NTUzNSBmDQowMDAwMDAwMDQ4IDY1NTM1IGYN CjAwMDAwMDAwNDkgNjU1MzUgZg0KMDAwMDAwMDA1MCA2NTUzNSBmDQowMDAwMDAwMDUxIDY1NTM1 IGYNCjAwMDAwMDAwNTIgNjU1MzUgZg0KMDAwMDAwMDA1MyA2NTUzNSBmDQowMDAwMDAwMDU0IDY1 NTM1IGYNCjAwMDAwMDAwNTUgNjU1MzUgZg0KMDAwMDAwMDA1NiA2NTUzNSBmDQowMDAwMDAwMDU3 IDY1NTM1IGYNCjAwMDAwMDAwNTggNjU1MzUgZg0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMDA4 Mzk2IDAwMDAwIG4NCjAwMDAwMDg3MzAgMDAwMDAgbg0KMDAwMDAwODc1NyAwMDAwMCBuDQowMDAw MDg1OTM5IDAwMDAwIG4NCnRyYWlsZXINCjw8L1NpemUgNjMvUm9vdCAxIDAgUi9JbmZvIDEwIDAg Ui9JRFs8RDc3ODBFNEM2RjNBRDU0MTg1RTE1MkZGMUQxMjcyNDc+PEQ3NzgwRTRDNkYzQUQ1NDE4 NUUxNTJGRjFEMTI3MjQ3Pl0gPj4NCnN0YXJ0eHJlZg0KODYyOTYNCiUlRU9GDQp4cmVmDQowIDAN CnRyYWlsZXINCjw8L1NpemUgNjMvUm9vdCAxIDAgUi9JbmZvIDEwIDAgUi9JRFs8RDc3ODBFNEM2 RjNBRDU0MTg1RTE1MkZGMUQxMjcyNDc+PEQ3NzgwRTRDNkYzQUQ1NDE4NUUxNTJGRjFEMTI3MjQ3 Pl0gL1ByZXYgODYyOTYvWFJlZlN0bSA4NTkzOT4+DQpzdGFydHhyZWYNCjg3NzEzDQolJUVPRg== ------=_20140407151224_29796-- From david@fromorbit.com Tue Apr 8 03:56:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6CC7A8060 for ; Tue, 8 Apr 2014 03:56:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E10EDAC013 for ; Tue, 8 Apr 2014 01:56:45 -0700 (PDT) X-ASG-Debug-ID: 1396947402-04cb6c5676dbbc20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id I2sRXIHqXRRFViEt for ; Tue, 08 Apr 2014 01:56:43 -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: Ak1YAHK5Q1N5LEcvPGdsb2JhbABZgwaDSoULtwGFX4EcFwMBAQEBODWCJQEBAQQnExwjEAgDGAklDwUlAwcaE4d4yjoXFo1wZAeEOASMf4tch1COMyuBLA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Apr 2014 18:26:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXRpF-0006tp-2W; Tue, 08 Apr 2014 18:56:13 +1000 Date: Tue, 8 Apr 2014 18:56:13 +1000 From: Dave Chinner To: Mark Tinguely Cc: XFS Mailing List Subject: Re: [PATCH] xfsprogs: fix directory hash ordering bug Message-ID: <20140408085612.GK27017@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix directory hash ordering bug References: <20140328173430.622616177@sgi.com> <20140407190101.292316075@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140407190101.292316075@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: 1396947402 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4681 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 07, 2014 at 02:00:34PM -0500, Mark Tinguely wrote: > Commit f5ea1100 ("xfs: add CRCs to dir2/da node blocks") introduced > in 3.10 incorrectly converted the btree hash index array pointer in > xfs_da3_fixhashpath(). It resulted in the the current hash always > being compared against the first entry in the btree rather than the > current block index into the btree block's hash entry array. As a > result, it was comparing the wrong hashes, and so could misorder the > entries in the btree. > > For most cases, this doesn't cause any problems as it requires hash > collisions to expose the ordering problem. However, when there are > hash collisions within a directory there is a very good probability > that the entries will be ordered incorrectly and that actually > matters when duplicate hashes are placed into or removed from the > btree block hash entry array. > > This bug results in an on-disk directory corruption and that results > in directory verifier functions throwing corruption warnings into > the logs. While no data or directory entries are lost, access to > them may be compromised, and attempts to remove entries from a > directory that has suffered from this corruption may result in a > filesystem shutdown. xfs_repair will fix the directory hash > ordering without data loss occuring. > > [dchinner: wrote useful a commit message] > > Ported from equivalent kernel commit c88547a8. > > Signed-off-by: Mark Tinguely > --- > libxfs/xfs_da_btree.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/libxfs/xfs_da_btree.c > =================================================================== > --- a/libxfs/xfs_da_btree.c > +++ b/libxfs/xfs_da_btree.c > @@ -1313,7 +1313,7 @@ xfs_da3_fixhashpath( > node = blk->bp->b_addr; > xfs_da3_node_hdr_from_disk(&nodehdr, node); > btree = xfs_da3_node_tree_p(node); > - if (be32_to_cpu(btree->hashval) == lasthash) > + if (be32_to_cpu(btree[blk->index]->hashval) == lasthash) ^^ xfs_da_btree.c: In function 'xfs_da3_fixhashpath': xfs_da_btree.c:1316:7: error: invalid type argument of '->' (have 'struct xfs_da_node_entry') xfs_da_btree.c:1316:7: error: invalid type argument of '->' (have 'struct xfs_da_node_entry') xfs_da_btree.c:1316:7: error: invalid type argument of '->' (have 'struct xfs_da_node_entry') xfs_da_btree.c:1316:7: error: invalid type argument of '->' (have 'struct xfs_da_node_entry') xfs_da_btree.c:1316:7: error: invalid type argument of '->' (have 'struct xfs_da_node_entry') xfs_da_btree.c:1316:7: error: invalid type argument of '->' (have 'struct xfs_da_node_entry') I've fixed the copy I've got in my testing tree, but please be more careful to test patches before you send them for review in future. Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Tue Apr 8 05:07:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2DE2D801C for ; Tue, 8 Apr 2014 05:07:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0633E304043 for ; Tue, 8 Apr 2014 03:07:52 -0700 (PDT) X-ASG-Debug-ID: 1396951671-04cb6c5678dc30a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3ZQmD2bPGYWtZmvv for ; Tue, 08 Apr 2014 03:07:52 -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-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 s38A7geB026597 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 06:07:42 -0400 Received: from dhcp-1-245.brq.redhat.com (dhcp-1-245.brq.redhat.com [10.34.1.245]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38A7dkK029979 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 8 Apr 2014 06:07:41 -0400 Date: Tue, 8 Apr 2014 12:07:39 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner cc: Filipe David Manana , "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , linux-ext4@vger.kernel.org Subject: Re: [ANNOUNCE] xfstests: updated to cf1ed54 In-Reply-To: <20140404211224.GX17603@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: updated to cf1ed54 Message-ID: References: <20140404090357.GW17603@dastard> <20140404211224.GX17603@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396951671 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, 5 Apr 2014, Dave Chinner wrote: > Date: Sat, 5 Apr 2014 08:12:25 +1100 > From: Dave Chinner > To: Filipe David Manana > Cc: "xfs@oss.sgi.com" , > "linux-btrfs@vger.kernel.org" , > linux-ext4@vger.kernel.org, lczerner@redhat.com > Subject: Re: [ANNOUNCE] xfstests: updated to cf1ed54 > > On Fri, Apr 04, 2014 at 02:07:16PM +0100, Filipe David Manana wrote: > > On Fri, Apr 4, 2014 at 10:03 AM, Dave Chinner wrote: > > > Hi folks, > > > > > > The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has > > > just been updated. Patches often get missed, so please check if your > > > outstanding patches were in this update. If they have not been in > > > this update, please resubmit them to xfs@oss.sgi.com so they can be > > > picked up in the next update. > > > > > > The new head of the master branch is commit: > > > > > > cf1ed54 check: fix RESULT_BASE typo in check script > > > > > > The major new functionality worth mentioning in this update is the > > > new config file format from Lukas. The existing format config files > > > should continue to work without change, but the new format is much > > > richer and allows specification of multiple different configurations > > > to run test under. Hence testing multiple mount an dmkfs > > > configurations becomes as simple as iterating the configurations > > > in the config file. > > > > Hi, > > > > I might be missing something, but after checking out these changes, I > > am no longer able to run btrfs tests. Example: > > > > $ ./check btrfs/041 > > common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set > > Passed all 0 tests > > > > $ cat local.config > > export TEST_DEV=/dev/sdb > > export TEST_DIR=/home/fdmanana/btrfs-tests/dev > > export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" > > export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" > > OK, that'll be a bug in the new config file parsing code. Lukas, > can you have a look at this? Oh, yes. I'll take a look at this. Honestly I was not aware of SCRATCH_DEV_POOL. Thanks! -Lukas > > Cheers, > > Dave. > From bfoster@redhat.com Tue Apr 8 07:04:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA671806C for ; Tue, 8 Apr 2014 07:04:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB478304064 for ; Tue, 8 Apr 2014 05:04:08 -0700 (PDT) X-ASG-Debug-ID: 1396958647-04bdf05dacdfe090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Hx0npvhx2VSBMZ0v; Tue, 08 Apr 2014 05:04:07 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s38C46dU012858 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 08:04:07 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38C4694031373; Tue, 8 Apr 2014 08:04:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9A7421256CC; Tue, 8 Apr 2014 08:04:05 -0400 (EDT) Date: Tue, 8 Apr 2014 08:04:05 -0400 From: Brian Foster To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140408120405.GA19662@bfoster.bfoster> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> <53430375.3060203@sgi.com> <20140407214527.GA43531@bfoster.bfoster> <534324D0.3080701@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534324D0.3080701@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1396958647 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 07, 2014 at 05:21:04PM -0500, Mark Tinguely wrote: > On 04/07/14 16:45, Brian Foster wrote: > >On Mon, Apr 07, 2014 at 02:58:45PM -0500, Mark Tinguely wrote: > >>On 04/07/14 10:39, Brian Foster wrote: > >>>Hi all, > >>> > >>>This is v2 of the speculative preallocation FAQ bits. The initial > >>>proposal was here: > >>> > >>>http://oss.sgi.com/archives/xfs/2014-03/msg00316.html > >>> > >>>This version includes some updates based on review from arekm and > >>>dchinner. Most notably, the content has been broken down into a few more > >>>questions. Unless there are further major changes required, I'll plan to > >>>post something along these lines to the wiki when my account is > >>>approved. Thanks for the feedback! > >>> > >>>Brian > >>> > >>>--- > >>> > >>>Q: Why do files on XFS use more data blocks than expected? > >>> > >>>A: > >>> > >>>The XFS speculative preallocation algorithm allocates extra blocks > >>>beyond end of file (EOF) to minimise file fragmentation during buffered > >> ^^^ beyond here and then later adopt post-EOF phrasing. > >> > > > >I think you're suggesting a broader terminology change, but I'm not > >quite following. Could you be specific about what "later" bits should > >change? What phrasing in particular..? > > You use "blocks beyond end of file (EOF)" here and then later use > the terminology of "post-EOF" through the rest of the document. Just > pointing out the change in terminology. > > Ok. I was just trying to be more descriptive here, this being the initial question so to speak (i.e., spelling out "end of file"). The remainder uses the abbreviation introduced here. Brian > >>... > >> > >>>See the FAQ entry on speculative preallocation for details. > >>> > >>>Q: What is speculative preallocation? > >>> > >>>A: > >>> > >>>XFS speculatively preallocates post-EOF blocks on file extending writes > >>>in anticipation of future extending writes. The size of a preallocation > >>>is dynamic and depends on the runtime state of the file and fs. > >>>Generally speaking, preallocation is disabled for very small files and > >> vague what is very small? ^^^ > >>... > > > >I originally pointed out 64k, but that and other heuristic details that > >are subject to change were purged in v2. I'm personally not against > >including something that indicates the default and the notion that it's > >subject to change. I don't feel too strongly about it either way. > >Thoughts appreciated. > > > I think the details are good since everyone has a different idea on > "very small". The FAQ can be changed with the code. You can expect > the TOT FAQ to represent Linux 3.0-stable. > > >> > >> > >>>Q: Is speculative preallocation permanent? > >>> > >>>A: > >>> > >>>Although speculative preallocation can lead to reports of excess space > >>>usage, the preallocated space is not permanent unless explicitly made so > >>>via fallocate or a similar interface. Preallocated space can also be > >>>encoded permanently in situations where file size is extended beyond a > >>>range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > >>>blocks are reclaimed on file close, inode reclaim, unmount or in the > >>>background once file write activity subsides. > >> > >>Switch order? > >> > >>Normally, preallocated > >>blocks are reclaimed on file close, inode reclaim, unmount or in the > >>background once file write activity subsides. They can be explictly > >>made permanent . > >> > > > >Thoughts on the following? > > > >"Preallocated blocks are normally reclaimed on file close, inode > >reclaim, unmount or in the background once file write activity subsides. > >They can be explicitly made permanent via fallocate or a similar > >interface. They can be implicitly made permanent in situations where > >file size is extended beyond a range of post-EOF blocks (i.e., via an > >extending truncate)." > > > > Looks good to me. > > >>> > >>>Q: My workload has known characteristics - can I tune speculative > >>>preallocation to an optimal fixed size? > >>> > >>>A: > >>> > >>>The 'allocsize=' mount option configures the XFS block allocation > >>>algorithm to use a fixed allocation size. Speculative preallocation is > >>>not dynamically resized when the allocsize mount option is set and thus > >>>the potential for fragmentation is increased. XFS historically set > >> > >>sets the > >> > >>>allocsize to 64k by default. > >>> > >> > >> > >>Q: Can I disable S-P-A ? > >> > > > >A: No..? ;) > > > >Are you proposing this with the similar intent to the previous Q (i.e., > >"what's the alternative to the default behavior?"), or with the notion > >that Dave pointed out how technically preallocation is not really "off?" > >Or something else? If the former, we could modify the question: > > > >"My workload has known characteristics - can I disable speculative > >preallocation or tune it to an optimal fixed size?" > > > >Or something along those lines. Would anybody object to also pointing > >out that 'allocsize=4k' (or allocsize=?) could be considered > >"speculative preallocation == off" from the user's perspective? > > > > That sounds good to me. If they know it is there, eventually someone > will ask "can I turn it off?". I would be happy with the answer of > "no, but it can be tuned" and don't tell them how to effectively > turn it off. > > >Thanks for the feedback. > > > >Brian > > > > Thanks for the FAQ. > > --Mark. > From rjohnston@sgi.com Tue Apr 8 07:38:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 CFB6E803F for ; Tue, 8 Apr 2014 07:38:38 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6AA1330404E; Tue, 8 Apr 2014 05:38:38 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.123.3; Tue, 8 Apr 2014 07:38:37 -0500 Message-ID: <5343EDCD.5060409@sgi.com> Date: Tue, 8 Apr 2014 07:38:37 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner CC: =?UTF-8?B?QXJrYWRpdXN6IE1pxZtraWV3aWN6?= , Subject: Re: xfsprogs 3.1.12 and 3.2.0 releases? References: <201401201822.48520.arekm@maven.pl> <5342EC72.8060007@sgi.com> <20140407233045.GF27017@dastard> In-Reply-To: <20140407233045.GF27017@dastard> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [128.162.233.55] On 04/07/2014 06:30 PM, Dave Chinner wrote: > On Mon, Apr 07, 2014 at 01:20:34PM -0500, Rich Johnston wrote: >> On 01/20/2014 11:22 AM, Arkadiusz Miśkiewicz wrote: >>> >>> Hello. >>> >>> What's needed for both 3.1.12 and 3.2.0 releases to happen? >>> >>> If 3.2.0 is to be released soon then nice. Dave, AFAIK it is waiting for you >>> and xfs_db crc work only? >>> >>> If 3.2.0 is far away then it would be nice to see 3.1.12 with bugfixes only >>> (for those paranoid about new stuff) but 3.1.13 very soon after that with >>> backported features like project quota support, parallelism, performance >>> improvements. >>> >>> Obviously I hope 3.2.0 is soon and there is no need to waste effort on 3.1.x. >>> >> Is there any interest in a 3.1.12 release or will a 3.2.x release >> happen soon? > > 3.2.x should happen soon. I've got a few patches to integrate and > test and then we can move to a 3.2-rc1 release and go from there. Awesome, thanks Dave. > > Cheers, > > Dave. > From bfoster@redhat.com Tue Apr 8 07:58:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E102805A for ; Tue, 8 Apr 2014 07:58:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3144AC013 for ; Tue, 8 Apr 2014 05:58:39 -0700 (PDT) X-ASG-Debug-ID: 1396961914-04cb6c5676dd3240001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id j8PboRsnEBEuViM6 for ; Tue, 08 Apr 2014 05:58:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s38CwYeE031898 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 8 Apr 2014 08:58:34 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s38CwYvI014987; Tue, 8 Apr 2014 08:58:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 219351256CC; Tue, 8 Apr 2014 08:58:33 -0400 (EDT) Date: Tue, 8 Apr 2014 08:58:33 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_repair: fix prefetch queue waiting Message-ID: <20140408125832.GA23051@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: fix prefetch queue waiting References: <53436CA0.1090106@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53436CA0.1090106@redhat.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: 1396961914 X-Barracuda-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 07, 2014 at 10:27:28PM -0500, Eric Sandeen wrote: > This fixes a regression caused by: > > 97b1fcf xfs_repair: fix array overrun in do_inode_prefetch > > The thread creation loop has 2 ways to exit; either via > the loop counter based on thread_count, or the break statement > if we've started enough workers to cover all AGs. > > Whether or not the loop counter "i" reflects the number of > threads started depends on whether or not we exited via the > break. > > The above commit prevented us from indexing off the end > of the queues[] array if we actually advanced "i" all the > way to thread_count, but in the case where we break, "i" > is one *less* than the nr of threads started, so we don't > wait for completion of all threads, and all hell breaks > loose in phase 5. > > Just stop with the cleverness of re-using the loop counter - > instead, explicitly count threads that we start, and then use > that counter to wait for each worker to complete. > > Signed-off-by: Eric Sandeen > --- > > I have one fs which demonstrates the problem, and have verified > the regression & tested the fix against that. > > I'll run this over xfstests overnight, but it seems obvious > from here (OTOH the other fix seemed obvious too) :( > > diff --git a/repair/prefetch.c b/repair/prefetch.c > index e47a48e..4c32395 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -944,6 +944,7 @@ do_inode_prefetch( > int i; > struct work_queue queue; > struct work_queue *queues; > + int queues_started = 0; > > /* > * If the previous phases of repair have not overflowed the buffer > @@ -987,6 +988,7 @@ do_inode_prefetch( > > create_work_queue(&queues[i], mp, 1); > queue_work(&queues[i], prefetch_ag_range_work, 0, wargs); > + queues_started++; > > if (wargs->end_ag >= mp->m_sb.sb_agcount) > break; > @@ -995,7 +997,7 @@ do_inode_prefetch( > /* > * wait for workers to complete > */ > - while (i--) > + for (i = 0; i < queues_started; i++) > destroy_work_queue(&queues[i]); Fix looks good, but any reason to reverse the order of the destroy loop? Brian > free(queues); > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From kmcmarti@redhat.com Tue Apr 8 08:36:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FA528068 for ; Tue, 8 Apr 2014 08:36:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFC28AC016 for ; Tue, 8 Apr 2014 06:36:01 -0700 (PDT) X-ASG-Debug-ID: 1396964160-04cbb054b9be92d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZdliGNddhqtZAYHp for ; Tue, 08 Apr 2014 06:36:00 -0700 (PDT) X-Barracuda-Envelope-From: kmcmarti@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s38DZvRs015847 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 09:35:57 -0400 Received: from redacted.bos.redhat.com ([10.18.17.143]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38DZs7q023017 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Tue, 8 Apr 2014 09:35:56 -0400 Date: Tue, 8 Apr 2014 09:35:54 -0400 From: Kyle McMartin To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents Message-ID: <20140408133554.GD12397@redacted.bos.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents References: <20140324181907.GF23291@redacted.bos.redhat.com> <20140408003311.GH27017@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140408003311.GH27017@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396964160 X-Barracuda-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 08, 2014 at 10:33:11AM +1000, Dave Chinner wrote: > On Mon, Mar 24, 2014 at 02:19:07PM -0400, Kyle McMartin wrote: > > Remove the ifdef-hell imported from glibc around getdents64. Everything > > since 2.4.1 supports things properly and this seems like a sensible > > clean up, so lets just assume it exists and handle it by falling back > > if not. > > > > Additionally, if the old getdents syscall doesn't exist, just stub out > > the actual syscall and return ENOSYS. > > > > --- > > Kyle, these two patches are missing your SOB. I'm going to assume > you wrote this yourself (given the history, it's a fair bet :) > and add them in - let me know if then assumption is wrong so I can > correct it. That's correct, my apologies for not including it on the submission. Thanks very much Dave. --Kyle From sandeen@sandeen.net Tue Apr 8 08:36:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D345229E12 for ; Tue, 8 Apr 2014 08:36:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FCAAAC016 for ; Tue, 8 Apr 2014 06:36:20 -0700 (PDT) X-ASG-Debug-ID: 1396964179-04cbb054b9be9360001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BFlFYWoQakvXBBHh for ; Tue, 08 Apr 2014 06:36: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 44A8663C3B03; Tue, 8 Apr 2014 08:36:19 -0500 (CDT) Message-ID: <5343FB53.6030902@sandeen.net> Date: Tue, 08 Apr 2014 08:36:19 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Brian Foster , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs_repair: fix prefetch queue waiting References: <53436CA0.1090106@redhat.com> <20140408125832.GA23051@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: fix prefetch queue waiting In-Reply-To: <20140408125832.GA23051@bfoster.bfoster> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396964179 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/8/14, 7:58 AM, Brian Foster wrote: > On Mon, Apr 07, 2014 at 10:27:28PM -0500, Eric Sandeen wrote: >> This fixes a regression caused by: >> >> 97b1fcf xfs_repair: fix array overrun in do_inode_prefetch >> >> The thread creation loop has 2 ways to exit; either via >> the loop counter based on thread_count, or the break statement >> if we've started enough workers to cover all AGs. >> >> Whether or not the loop counter "i" reflects the number of >> threads started depends on whether or not we exited via the >> break. >> >> The above commit prevented us from indexing off the end >> of the queues[] array if we actually advanced "i" all the >> way to thread_count, but in the case where we break, "i" >> is one *less* than the nr of threads started, so we don't >> wait for completion of all threads, and all hell breaks >> loose in phase 5. >> >> Just stop with the cleverness of re-using the loop counter - >> instead, explicitly count threads that we start, and then use >> that counter to wait for each worker to complete. >> >> Signed-off-by: Eric Sandeen >> --- >> >> I have one fs which demonstrates the problem, and have verified >> the regression & tested the fix against that. >> >> I'll run this over xfstests overnight, but it seems obvious >> from here (OTOH the other fix seemed obvious too) :( >> >> diff --git a/repair/prefetch.c b/repair/prefetch.c >> index e47a48e..4c32395 100644 >> --- a/repair/prefetch.c >> +++ b/repair/prefetch.c >> @@ -944,6 +944,7 @@ do_inode_prefetch( >> int i; >> struct work_queue queue; >> struct work_queue *queues; >> + int queues_started = 0; >> >> /* >> * If the previous phases of repair have not overflowed the buffer >> @@ -987,6 +988,7 @@ do_inode_prefetch( >> >> create_work_queue(&queues[i], mp, 1); >> queue_work(&queues[i], prefetch_ag_range_work, 0, wargs); >> + queues_started++; >> >> if (wargs->end_ag >= mp->m_sb.sb_agcount) >> break; >> @@ -995,7 +997,7 @@ do_inode_prefetch( >> /* >> * wait for workers to complete >> */ >> - while (i--) >> + for (i = 0; i < queues_started; i++) >> destroy_work_queue(&queues[i]); > > Fix looks good, but any reason to reverse the order of the destroy loop? simplicity? :) I don't think it matters operationally... -Eric From bfoster@redhat.com Tue Apr 8 08:52:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6FA8B804C for ; Tue, 8 Apr 2014 08:52:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16D9FAC016 for ; Tue, 8 Apr 2014 06:52:43 -0700 (PDT) X-ASG-Debug-ID: 1396965162-04bdf05dabe08c40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RttmmqGUfronutAg for ; Tue, 08 Apr 2014 06:52: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 s38DqfTu020072 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 09:52:42 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38Dqflq001887; Tue, 8 Apr 2014 09:52:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4948B1256CC; Tue, 8 Apr 2014 09:52:40 -0400 (EDT) Date: Tue, 8 Apr 2014 09:52:40 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs_repair: fix prefetch queue waiting Message-ID: <20140408135239.GB23051@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: fix prefetch queue waiting References: <53436CA0.1090106@redhat.com> <20140408125832.GA23051@bfoster.bfoster> <5343FB53.6030902@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5343FB53.6030902@sandeen.net> 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: 1396965162 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 08, 2014 at 08:36:19AM -0500, Eric Sandeen wrote: > On 4/8/14, 7:58 AM, Brian Foster wrote: > > On Mon, Apr 07, 2014 at 10:27:28PM -0500, Eric Sandeen wrote: > >> This fixes a regression caused by: > >> > >> 97b1fcf xfs_repair: fix array overrun in do_inode_prefetch > >> > >> The thread creation loop has 2 ways to exit; either via > >> the loop counter based on thread_count, or the break statement > >> if we've started enough workers to cover all AGs. > >> > >> Whether or not the loop counter "i" reflects the number of > >> threads started depends on whether or not we exited via the > >> break. > >> > >> The above commit prevented us from indexing off the end > >> of the queues[] array if we actually advanced "i" all the > >> way to thread_count, but in the case where we break, "i" > >> is one *less* than the nr of threads started, so we don't > >> wait for completion of all threads, and all hell breaks > >> loose in phase 5. > >> > >> Just stop with the cleverness of re-using the loop counter - > >> instead, explicitly count threads that we start, and then use > >> that counter to wait for each worker to complete. > >> > >> Signed-off-by: Eric Sandeen > >> --- > >> > >> I have one fs which demonstrates the problem, and have verified > >> the regression & tested the fix against that. > >> > >> I'll run this over xfstests overnight, but it seems obvious > >> from here (OTOH the other fix seemed obvious too) :( > >> > >> diff --git a/repair/prefetch.c b/repair/prefetch.c > >> index e47a48e..4c32395 100644 > >> --- a/repair/prefetch.c > >> +++ b/repair/prefetch.c > >> @@ -944,6 +944,7 @@ do_inode_prefetch( > >> int i; > >> struct work_queue queue; > >> struct work_queue *queues; > >> + int queues_started = 0; > >> > >> /* > >> * If the previous phases of repair have not overflowed the buffer > >> @@ -987,6 +988,7 @@ do_inode_prefetch( > >> > >> create_work_queue(&queues[i], mp, 1); > >> queue_work(&queues[i], prefetch_ag_range_work, 0, wargs); > >> + queues_started++; > >> > >> if (wargs->end_ag >= mp->m_sb.sb_agcount) > >> break; > >> @@ -995,7 +997,7 @@ do_inode_prefetch( > >> /* > >> * wait for workers to complete > >> */ > >> - while (i--) > >> + for (i = 0; i < queues_started; i++) > >> destroy_work_queue(&queues[i]); > > > > Fix looks good, but any reason to reverse the order of the destroy loop? > > simplicity? :) > Fine by me. :) Reviewed-by: Brian Foster > I don't think it matters operationally... > > -Eric > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jmoyer@redhat.com Tue Apr 8 09:28:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 260D5808E for ; Tue, 8 Apr 2014 09:28:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0DD0F8F8052 for ; Tue, 8 Apr 2014 07:28:18 -0700 (PDT) X-ASG-Debug-ID: 1396967297-04cb6c5677ddb5c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Mv2LOo6AwxSWUqaG for ; Tue, 08 Apr 2014 07:28:17 -0700 (PDT) X-Barracuda-Envelope-From: jmoyer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s38ESCg6004999 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 10:28:13 -0400 Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.19.60.26]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38ESAn2021624; Tue, 8 Apr 2014 10:28:11 -0400 From: Jeff Moyer To: Zhi Yong Wu Cc: xfstests , Dave Chinner , jack@suse.cz, "linux-fsdevel\@vger.kernel.org" , "Theodore Ts'o" Subject: Re: [Bug] XFS: DIO random write + BufferIO read References: X-ASG-Orig-Subj: Re: [Bug] XFS: DIO random write + BufferIO read X-PGP-KeyID: 1F78E1B4 X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4 X-PCLoadLetter: What the f**k does that mean? Date: Tue, 08 Apr 2014 10:28:10 -0400 In-Reply-To: (Zhi Yong Wu's message of "Fri, 4 Apr 2014 23:09:10 +0800") Message-ID: User-Agent: Gnus/5.110011 (No Gnus v0.11) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 1396967297 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Zhi Yong Wu writes: > HI > > When i try something on XFS filesytem, i hit one issue as below: > > One main task create multiple threads at first, Then it will dio > random write some files with random offset and length for each thread. > When those files get ready, those multiple threads will bufferio read > them and check if the data are same as their corresponding buffer. In > theory, they should be same, but the actual result isn't what we > expect > > By the way, i did the same try on ext3 filesystem, but didn't get any > such issue. What kernel version? Cheers, Jeff From linkinjeon@gmail.com Tue Apr 8 09:42:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D82967F69 for ; Tue, 8 Apr 2014 09:42:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B9B778F8054 for ; Tue, 8 Apr 2014 07:42:49 -0700 (PDT) X-ASG-Debug-ID: 1396968168-04cbb054b9bf01d0001-NocioJ Received: from mail-qa0-f46.google.com (mail-qa0-f46.google.com [209.85.216.46]) by cuda.sgi.com with ESMTP id zdC10qFUNDOAGiyJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 07:42:48 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] Received: by mail-qa0-f46.google.com with SMTP id i13so937310qae.19 for ; Tue, 08 Apr 2014 07:42:48 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=4z5g4HfsDf77kpEnMLB1CtD2Yvg3mPZHYlOPZZviByQ=; b=FLRWZAcNIa+QT+6I/BN6YMveUZbbKA9KbWcjmSp+WfBqvnzghHK8hKYAEqadWzDjJw +5WgcTVIayAN7dUOV4JxW0V+k+VaePc0RYnBtAthdBEKILGBSFL0c3h7aVIWkZEaZddC E9CHW8T83PB+75vB4bvJBHXU3tKtP2JEku9RSym7TfHz9Eb+uEyNU4KU/KgAMyP2IH5f /Ax3xsV8xeiDn1OlVIlI51e21cyIMwkGXfdnp/aoDj1QXvLMcwxq5yyNFU6NTLw7XPD3 nDj1otPfMYXQnlitbTH4QMu5zhH6J/WA3xilG0cG4jQhUS1LGTd3EChZ8eikZPgOlM1A SaXQ== MIME-Version: 1.0 X-Received: by 10.224.79.72 with SMTP id o8mr5101896qak.20.1396968167938; Tue, 08 Apr 2014 07:42:47 -0700 (PDT) Received: by 10.96.18.167 with HTTP; Tue, 8 Apr 2014 07:42:47 -0700 (PDT) In-Reply-To: <20140408005417.GI27017@dastard> References: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> <20140408005417.GI27017@dastard> Date: Tue, 8 Apr 2014 23:42:47 +0900 Message-ID: Subject: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate From: Namjae Jeon X-ASG-Orig-Subj: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate To: Dave Chinner Cc: viro@zeniv.linux.org.uk, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f46.google.com[209.85.216.46] X-Barracuda-Start-Time: 1396968168 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 2014-04-08 9:54 GMT+09:00, Dave Chinner : > On Mon, Mar 31, 2014 at 11:53:31PM +0900, Namjae Jeon wrote: >> From: Namjae Jeon >> >> FALLOC_FL_INSERT_RANGE was mentioned as the opposite command of collapse >> range from discussion between Hugh Dickins and Dave Chinner. >> >> In continuation of the work of making the process of non linear editing >> of >> media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE >> for fallocate. >> >> This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE >> flag. >> As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out >> space >> in between the file within the range specified by offset and len. User >> can >> write new data in this space. e.g. ads. >> Like collapse range, currently we have the limitation that offset and len >> should be block size aligned for both XFS and Ext4. >> >> The semantics of the flag are : >> 1) It allocates new zeroed out on disk space of len bytes starting >> at offset byte without overwriting any existing data. All the data >> blocks >> from offset to EOF are shifted towards right to make space for >> inserting >> new blocks >> 2) It should be used exclusively. No other fallocate flag in combination. >> 3) Offset and length supplied to fallocate should be fs block size >> aligned >> in case of xfs and ext4. >> 4) Insert range does not work for the case when offset is >> overlapping/beyond >> i_size. If the user wants to allocate space at the end of file they >> are >> advised to use either ftruncate(2) or fallocate(2) with mode 0. >> 5) It increses the size of file by len bytes. >> >> Namjae Jeon (3): >> fs: Add FALLOC_FL_INSERT_RANGE flags for fallocate >> xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate >> ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate >> TODO : xfsprog: xfsio: Add support FALLOC_FL_INSERT_RANGE for fallocate >> TODO : xfstests: Add insert range testcase > > Namjae, what's your proposed timeframe on getting the xfs_io and tes > cases sorted out? I'm just trying to plan ahead for the next couple > of months (i.e. the 3.16 merge cycle), so some indication of whether > I can expect this to be complete and ready for merge within that > timeframe would be helpful to me. Hi. Dave. I will post the next version's patch-set with xfs_io and xfstests next week. Yes, I think that it can be complete before opening 3.6 merge window. And sorry for late response and work... Currently I can not do it full time. But will do the best for the aim that insert range would be merged in 3.6. > > FWIW, it would be really nice if you could add support for fsx and > fsstress for this as well as adding corner case tests. :) I can, I will include these jobs on next version. :) Thanks! > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > From fdmanana@gmail.com Tue Apr 8 10:16:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1DEEB8085 for ; Tue, 8 Apr 2014 10:16:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 03C1F8F8052 for ; Tue, 8 Apr 2014 08:16:22 -0700 (PDT) X-ASG-Debug-ID: 1396970178-04cb6c5677ddfba0001-NocioJ Received: from mail-bk0-f41.google.com (mail-bk0-f41.google.com [209.85.214.41]) by cuda.sgi.com with ESMTP id JAp5CoYgYvLqucx5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 08:16:19 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.41 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] Received: by mail-bk0-f41.google.com with SMTP id d7so560129bkh.0 for ; Tue, 08 Apr 2014 08:16:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=z7s7dGbDDcQV0w+FmFcckZEreK3zLCikTtN0rw3lmgs=; b=kYF+pgnwHCpM3gsyg6EpidW/J2DXK0NyRVBGgn3wQwo3sO7vRhCfP7ReshM1okFPPp zxetebhCoos8pN2Lh7n54ExeaEF2tXoDAq8dM5mrEdXkjY65Ol5qPBP5kDIwxhkt57N3 3EI+TRtS9ZKLZGk/4IYebcIToWbqBVnbyCRGQICQOfPHRpL9Nflwus1Ap290bNyjR3DI gYirQ0xCGxaEWlNtLkxPvFx8HzNcUSo6zXbyFBe5cWbua2bo52qVFFAAPi1JWBc4o+/t zm/R9ZJK2wRLU8cfDi8quCsGAf+32FWRPwDdRykAa5KDlwWbhe1V4a5Dh4tHMG2FFm4c s/2g== MIME-Version: 1.0 X-Received: by 10.152.3.72 with SMTP id a8mr3238136laa.33.1396970178480; Tue, 08 Apr 2014 08:16:18 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Tue, 8 Apr 2014 08:16:18 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <20140408001443.GG27017@dastard> References: <20140404090357.GW17603@dastard> <20140408001443.GG27017@dastard> Date: Tue, 8 Apr 2014 16:16:18 +0100 Message-ID: Subject: Re: [ANNOUNCE] xfstests: updated to cf1ed54 From: Filipe David Manana X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: updated to cf1ed54 To: Dave Chinner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , linux-ext4@vger.kernel.org, lczerner@redhat.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-bk0-f41.google.com[209.85.214.41] X-Barracuda-Start-Time: 1396970179 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: friendpaste.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=DKIM_SIGNED, DKIM_VERIFIED, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4687 Rule breakdown below pts rule name 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.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) On Tue, Apr 8, 2014 at 1:14 AM, Dave Chinner wrote: > On Fri, Apr 04, 2014 at 02:07:16PM +0100, Filipe David Manana wrote: >> On Fri, Apr 4, 2014 at 10:03 AM, Dave Chinner wrote: >> > Hi folks, >> > >> > The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has >> > just been updated. Patches often get missed, so please check if your >> > outstanding patches were in this update. If they have not been in >> > this update, please resubmit them to xfs@oss.sgi.com so they can be >> > picked up in the next update. >> > >> > The new head of the master branch is commit: >> > >> > cf1ed54 check: fix RESULT_BASE typo in check script >> > >> > The major new functionality worth mentioning in this update is the >> > new config file format from Lukas. The existing format config files >> > should continue to work without change, but the new format is much >> > richer and allows specification of multiple different configurations >> > to run test under. Hence testing multiple mount an dmkfs >> > configurations becomes as simple as iterating the configurations >> > in the config file. >> >> Hi, >> >> I might be missing something, but after checking out these changes, I >> am no longer able to run btrfs tests. Example: >> >> $ ./check btrfs/041 >> common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set >> Passed all 0 tests >> >> $ cat local.config >> export TEST_DEV=/dev/sdb >> export TEST_DIR=/home/fdmanana/btrfs-tests/dev >> export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" >> export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" > > Are you sure that's the config file that is being picked up? I can't > test btrfs at the moment because it appears to be completely screwed > in a TOT kernel right now - it doesn't even show up in > /proc/filesystems and doesn't emit anything on dmesg to indicate > that initialisation of the built in btrfs code has failed or even > been attempted. It's simply MIA.... > > However, using that same SCRATCH_DEV_POOL config for xfs or ext4 > works just fine on my test machines with the current TOT xfstests > and kernel code. > > $ cat configs/test2.config > TEST_DIR=/mnt/test > SCRATCH_MNT=/mnt/scratch > TEST_DEV=/dev/vda > SCRATCH_DEV_POOL="/dev/vdc /dev/vdd" > $ sudo MKFS_OPTIONS="-m crc=1" ./check generic/001 > FSTYP -- xfs (debug) > PLATFORM -- Linux/x86_64 test2 3.14.0-rc1-dgc+ > MKFS_OPTIONS -- -f -m crc=1 /dev/vdc > MOUNT_OPTIONS -- /dev/vdc /mnt/scratch > > generic/001 4s ... 3s > Ran: generic/001 > Passed all 1 tests > $ > > So, as you can see I can't reproduce your problem myself right now. > Could you add a "set -x" line to the start of check and post the > output? Ok, here's some more tests: # On origin/master: root 16:56:42 /home/fdmanana/git/hub/xfstests ((cf1ed54...))> cat local.config export TEST_DEV=/dev/sdb export TEST_DIR=/home/fdmanana/btrfs-tests/dev export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" export FSTYP=btrfs root 16:56:49 /home/fdmanana/git/hub/xfstests ((cf1ed54...))> ./check generic/001 common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set Passed all 0 tests # Now going back to an older revision, it works as I showed before: root 16:56:56 /home/fdmanana/git/hub/xfstests ((cf1ed54...))> git checkout 3948694eb12e9699f558fab5e8169a8b090780d1 Previous HEAD position was cf1ed54... check: fix RESULT_BASE typo in check script HEAD is now at 3948694... xfs/300: fix golden output root 16:57:11 /home/fdmanana/git/hub/xfstests ((3948694...))> ./check generic/001 FSTYP -- btrfs PLATFORM -- Linux/x86_64 debian-vm3 3.13.0-fdm-btrfs-next-24+ MKFS_OPTIONS -- /dev/sdc MOUNT_OPTIONS -- /dev/sdc /home/fdmanana/btrfs-tests/scratch_1 generic/001 23s ... 23s Ran: generic/001 Passed all 1 tests # Now if I change my config and remove the definition of FSTYP, it still works with the old revision: root 16:59:19 /home/fdmanana/git/hub/xfstests ((3948694...))> cat local.config # Ideally define at least these 4 to match your environment # The first 2 are required. # See README for other variables which can be set. # # Note: SCRATCH_DEV >will< get overwritten! export TEST_DEV=/dev/sdb export TEST_DIR=/home/fdmanana/btrfs-tests/dev export SCRATCH_MNT="/home/fdmanana/btrfs-tests/scratch_1" export SCRATCH_DEV_POOL="/dev/sdc /dev/sdd" # export FSTYP=btrfs root 16:59:22 /home/fdmanana/git/hub/xfstests ((3948694...))> ./check generic/001 FSTYP -- btrfs PLATFORM -- Linux/x86_64 debian-vm3 3.13.0-fdm-btrfs-next-24+ MKFS_OPTIONS -- /dev/sdc MOUNT_OPTIONS -- /dev/sdc /home/fdmanana/btrfs-tests/scratch_1 generic/001 23s ... 23s Ran: generic/001 Passed all 1 tests # Now going back to master, without FSTYP set, it doesn't work too: root 16:59:50 /home/fdmanana/git/hub/xfstests ((3948694...))> git checkout origin/master Previous HEAD position was 3948694... xfs/300: fix golden output HEAD is now at cf1ed54... check: fix RESULT_BASE typo in check script root 16:59:57 /home/fdmanana/git/hub/xfstests ((cf1ed54...))> ./check generic/001 common/rc: Error: $TEST_DEV (/dev/sdb) is not a MOUNTED xfs filesystem Filesystem Type 1024-blocks Used Available Capacity Mounted on /dev/sdb btrfs 20971520 768 18845184 1% /home/fdmanana/btrfs-tests/dev root 17:00:00 /home/fdmanana/git/hub/xfstests ((cf1ed54...))> After adding set -x to the top of the 'check' script, here's the output when running current master: https://friendpaste.com/6x8Hzq3wJxe2KXZypomCiY And for the revision that works: https://friendpaste.com/6x8Hzq3wJxe2KXZyppKkwB Hope it helps. Thanks > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From lczerner@redhat.com Tue Apr 8 10:43:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 545DB7FEE for ; Tue, 8 Apr 2014 10:43:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 351448F8052 for ; Tue, 8 Apr 2014 08:43:00 -0700 (PDT) X-ASG-Debug-ID: 1396971779-04cbb054b8bf6000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Jdtmk3Ce46dTsqgw for ; Tue, 08 Apr 2014 08:43:00 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s38FgtoZ009542 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 11:42:56 -0400 Received: from localhost.localdomain.com (dhcp-1-245.brq.redhat.com [10.34.1.245]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38FgrQ6022692; Tue, 8 Apr 2014 11:42:54 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, fdmanana@gmail.com, david@fromorbit.com, Lukas Czerner Subject: [PATCH 1/3] xfstests: Fix SCRATCH_DEV_POOL handling Date: Tue, 8 Apr 2014 17:42:48 +0200 X-ASG-Orig-Subj: [PATCH 1/3] xfstests: Fix SCRATCH_DEV_POOL handling Message-Id: <1396971770-23553-1-git-send-email-lczerner@redhat.com> In-Reply-To: <20140404211224.GX17603@dastard> References: <20140404211224.GX17603@dastard> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396971779 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 With changes introduced in 667308dd97bf41382d4ab299fa5b56c235cfeb27 it is no longer possible to use SCRATCH_DEV_POOL variable because of error: common/config: Error: $SCRATCH_DEV should be unset when $SCRATCH_DEV_POOL is set This was because get_next_config() would get called twice and hence it would complain on the second run that SCRATCH_DEV is already set. Fix it by making sure that we call get_next_config() only once if there are no sections in the config file. Also make sure that we export SCRATCH_DEV in the case we're deducing it from SCRATCH_DEV_POOL. Signed-off-by: Lukas Czerner Reported-by: Filipe David Manana --- common/config | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/common/config b/common/config index 4178c27..6fa18e2 100644 --- a/common/config +++ b/common/config @@ -360,6 +360,10 @@ parse_config_section() { } get_next_config() { + if [ ! -z "$CONFIG_INCLUDED" ] && ! $OPTIONS_HAVE_SECTIONS; then + return 0 + fi + local OLD_FSTYP=$FSTYP local OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS local OLD_MKFS_OPTIONS=$MKFS_OPTIONS @@ -414,10 +418,11 @@ get_next_config() { # to SCRATCH_DEV and rest to SCRATCH_DEV_POOL to maintain the backward compatibility if [ ! -z "$SCRATCH_DEV_POOL" ]; then if [ ! -z "$SCRATCH_DEV" ]; then - echo "common/config: Error: \$SCRATCH_DEV should be unset when \$SCRATCH_DEV_POOL is set" + echo "common/config: Error: \$SCRATCH_DEV ($SCRATCH_DEV) should be unset when \$SCRATCH_DEV_POOL ($SCRATCH_DEV_POOL) is set" exit 1 fi SCRATCH_DEV=`echo $SCRATCH_DEV_POOL | awk '{print $1}'` + export SCRATCH_DEV fi echo $SCRATCH_DEV | grep -q ":" > /dev/null 2>&1 -- 1.8.3.1 From lczerner@redhat.com Tue Apr 8 10:43:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D27E809D for ; Tue, 8 Apr 2014 10:43:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6740AC012 for ; Tue, 8 Apr 2014 08:43:02 -0700 (PDT) X-ASG-Debug-ID: 1396971781-04cbb054b7bf6010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EyyfBvnoUMUqQQkS for ; Tue, 08 Apr 2014 08:43:01 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s38Fgxu0017302 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 11:42:59 -0400 Received: from localhost.localdomain.com (dhcp-1-245.brq.redhat.com [10.34.1.245]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38FgrQ8022692; Tue, 8 Apr 2014 11:42:57 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, fdmanana@gmail.com, david@fromorbit.com, Lukas Czerner Subject: [PATCH 3/3] xfstests: Fix setting FSTYP automatically Date: Tue, 8 Apr 2014 17:42:50 +0200 X-ASG-Orig-Subj: [PATCH 3/3] xfstests: Fix setting FSTYP automatically Message-Id: <1396971770-23553-3-git-send-email-lczerner@redhat.com> In-Reply-To: <1396971770-23553-1-git-send-email-lczerner@redhat.com> References: <20140404211224.GX17603@dastard> <1396971770-23553-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396971781 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently if the FSTYP is not set, the code to get FSTYP using blikd would not work. This is because we're using HOSTOS environment variable which might not be set (at least not on my system) and because it's already late in the code path. Fix this by using OSTYP environment variable as a fallback in the case that HOSTOS does not work and move the check to common/config. Signed-off-by: Lukas Czerner --- check | 8 -------- common/config | 18 +++++++++++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/check b/check index 8f1a6e1..ed1834d 100755 --- a/check +++ b/check @@ -58,14 +58,6 @@ then exit 1 fi -# Autodetect fs type based on what's on $TEST_DEV unless it's been set -# externally -if [ -z "$FSTYP" -a "$HOSTOS" == "Linux" ]; then - FSTYP=`blkid -c /dev/null -s TYPE -o value $TEST_DEV` -fi -FSTYP=${FSTYP:=xfs} -export FSTYP - SUPPORTED_TESTS="[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]" SRC_GROUPS="generic shared" export SRC_DIR="tests" diff --git a/common/config b/common/config index 3163801..00249e6 100644 --- a/common/config +++ b/common/config @@ -297,11 +297,6 @@ _fsck_opts() esac } -[ -z "$FSTYP" ] && export FSTYP=xfs -[ -z "$MOUNT_OPTIONS" ] && _mount_opts -[ -z "$MKFS_OPTIONS" ] && _mkfs_opts -[ -z "$FSCK_OPTIONS" ] && _fsck_opts - known_hosts() { [ "$HOST_CONFIG_DIR" ] || HOST_CONFIG_DIR=`pwd`/configs @@ -446,6 +441,19 @@ get_next_config() { if [ -z "$CONFIG_INCLUDED" ]; then get_next_config `echo $HOST_OPTIONS_SECTIONS | cut -f1 -d" "` export CONFIG_INCLUDED=true + + # Autodetect fs type based on what's on $TEST_DEV unless it's been set + # externally + if [ -z "$FSTYP" ] && \ + [ "$HOSTOS" == "Linux" -o "$OSTYPE" == "linux-gnu" ] && \ + [ ! -z "$TEST_DEV" ]; then + FSTYP=`blkid -c /dev/null -s TYPE -o value $TEST_DEV` + fi + FSTYP=${FSTYP:=xfs} + export FSTYP + [ -z "$MOUNT_OPTIONS" ] && _mount_opts + [ -z "$MKFS_OPTIONS" ] && _mkfs_opts + [ -z "$FSCK_OPTIONS" ] && _fsck_opts fi # make sure this script returns success -- 1.8.3.1 From lczerner@redhat.com Tue Apr 8 10:43:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D67B8809D for ; Tue, 8 Apr 2014 10:43:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5EC29AC014 for ; Tue, 8 Apr 2014 08:43:03 -0700 (PDT) X-ASG-Debug-ID: 1396971781-04cb6c5678de2380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vQtC1UPI0hUfnkAI for ; Tue, 08 Apr 2014 08:43:02 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s38FgvTE013327 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 11:42:58 -0400 Received: from localhost.localdomain.com (dhcp-1-245.brq.redhat.com [10.34.1.245]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38FgrQ7022692; Tue, 8 Apr 2014 11:42:56 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, fdmanana@gmail.com, david@fromorbit.com, Lukas Czerner Subject: [PATCH 2/3] xfstests: Unset SCRATCH_DEV when deduced from SCRATCH_DEV_POOL Date: Tue, 8 Apr 2014 17:42:49 +0200 X-ASG-Orig-Subj: [PATCH 2/3] xfstests: Unset SCRATCH_DEV when deduced from SCRATCH_DEV_POOL Message-Id: <1396971770-23553-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1396971770-23553-1-git-send-email-lczerner@redhat.com> References: <20140404211224.GX17603@dastard> <1396971770-23553-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396971781 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 In the case that we already have sections in the config file we have to make sure that we unset SCRATCH_DEV if it has been deduced from the SCRATCH_DEV_POOL so that it does not complain about SCRATCH_DEV in this case. Signed-off-by: Lukas Czerner --- common/config | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/common/config b/common/config index 6fa18e2..3163801 100644 --- a/common/config +++ b/common/config @@ -372,10 +372,15 @@ get_next_config() { unset MOUNT_OPTIONS unset MKFS_OPTIONS unset FSCK_OPTIONS + # We might have deduced SCRATCH_DEV from the SCRATCH_DEV_POOL in the previous + # run, so we have to unset it now. + if [ "$SCRATCH_DEV_NOT_SET" == "true" ]; then + unset SCRATCH_DEV + fi parse_config_section $1 - if [ -n "$OLD_FSTYP" ] && [ $OLD_FSTYP != $FSTYP ]; then + if [ ! -z "$OLD_FSTYP" ] && [ $OLD_FSTYP != $FSTYP ]; then [ -z "$MOUNT_OPTIONS" ] && _mount_opts [ -z "$MKFS_OPTIONS" ] && _mkfs_opts [ -z "$FSCK_OPTIONS" ] && _fsck_opts @@ -423,6 +428,7 @@ get_next_config() { fi SCRATCH_DEV=`echo $SCRATCH_DEV_POOL | awk '{print $1}'` export SCRATCH_DEV + export SCRATCH_DEV_NOT_SET=true fi echo $SCRATCH_DEV | grep -q ":" > /dev/null 2>&1 -- 1.8.3.1 From zwu.kernel@gmail.com Tue Apr 8 10:52:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C79758055 for ; Tue, 8 Apr 2014 10:52:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1AC4304043 for ; Tue, 8 Apr 2014 08:51:59 -0700 (PDT) X-ASG-Debug-ID: 1396972318-04cbb054b8bf6d00001-NocioJ Received: from mail-yh0-f45.google.com (mail-yh0-f45.google.com [209.85.213.45]) by cuda.sgi.com with ESMTP id 9O0Ba5wFZZSTUjT8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 08:51:58 -0700 (PDT) X-Barracuda-Envelope-From: zwu.kernel@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 a41so1044283yho.4 for ; Tue, 08 Apr 2014 08:51:58 -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=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=82Slf/CqIt4ejy+49j9uyCyo0tq06831Mdjj9EsCzuU=; b=wPVnoUkcRF7DDfhgZqo6RMz8JWPo1KW82yN3sM0YIYQPBaHo1PTMv2fpH2j/83SN1c yf3k/xb4gyrTwKuhm5fj1FB7OOxfyIMS4c+RUIoKr7C4dnDSLm2R1+G9AUP9pDzkK2Rr HBFnDEQ6l8P4hlZHbxVaNslfw9yh1tepG1Y+DbDh+uySBQLvH1CfCGvbDfjbh8Y2b1dk 7LEZrKZxjSByp1bkgm3ai27Quj6pDmX/9KbvSzkFSH7KxnT6Aj+8ToIRyqgcWKa8qABo nnLfu29wzkqXXVSaGdY9Kbqf6B2Vuijx+b2LYQkTQTJTK6tDCdPU0aeTcMpa2VZypx8T npDw== MIME-Version: 1.0 X-Received: by 10.236.121.244 with SMTP id r80mr6502814yhh.67.1396972318058; Tue, 08 Apr 2014 08:51:58 -0700 (PDT) Received: by 10.170.207.71 with HTTP; Tue, 8 Apr 2014 08:51:58 -0700 (PDT) In-Reply-To: References: Date: Tue, 8 Apr 2014 23:51:58 +0800 Message-ID: Subject: Re: [Bug] XFS: DIO random write + BufferIO read From: Zhi Yong Wu X-ASG-Orig-Subj: Re: [Bug] XFS: DIO random write + BufferIO read To: Jeff Moyer Cc: xfstests , Dave Chinner , jack@suse.cz, "linux-fsdevel@vger.kernel.org" , "Theodore Ts'o" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-yh0-f45.google.com[209.85.213.45] X-Barracuda-Start-Time: 1396972318 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4691 Rule breakdown below pts rule name 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 can try the latest upstream. On 4/8/14, Jeff Moyer wrote: > Zhi Yong Wu writes: > >> HI >> >> When i try something on XFS filesytem, i hit one issue as below: >> >> One main task create multiple threads at first, Then it will dio >> random write some files with random offset and length for each thread. >> When those files get ready, those multiple threads will bufferio read >> them and check if the data are same as their corresponding buffer. In >> theory, they should be same, but the actual result isn't what we >> expect >> >> By the way, i did the same try on ext3 filesystem, but didn't get any >> such issue. > > What kernel version? > > Cheers, > Jeff > -- Regards, Zhi Yong Wu From fdmanana@gmail.com Tue Apr 8 11:51:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 AEE047FC5 for ; Tue, 8 Apr 2014 11:51:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22500AC012 for ; Tue, 8 Apr 2014 09:51:42 -0700 (PDT) X-ASG-Debug-ID: 1396975899-04cb6c5678de8ff0001-NocioJ Received: from mail-bk0-f41.google.com (mail-bk0-f41.google.com [209.85.214.41]) by cuda.sgi.com with ESMTP id 6OvpdJP2Z8YOvKXo (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 09:51:39 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.41 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] Received: by mail-bk0-f41.google.com with SMTP id d7so803566bkh.0 for ; Tue, 08 Apr 2014 09:51:38 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.41] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Fk26XB9LxVbnzy9eb8sYQ3UKZGUBJ35SG5b90NKAKBI=; b=kJ6LEd3OYlpzs1EFSZ3Ve3BC+1vPUNjwdmQ8SQgU9zU35vu1RQa3u3CWHtKB9dhhEc cIub6IuIyWYDY7PfCmFx0Pod5j/80h72CzWp4L43PV+QhJSQlcoiLBkqzysRhITHs24w Y39ZAvEazJcUENhAYO3l/GQ98MelIWYPHPqF9PuF+AfAnIveaoAq/Jz1GkX7yypv7snX Ppfejm34aBBIUYjBw1rskdlr8TWTZDzwmAXoORyNilzLBjTh8lEiD1MyZa4fkfEEa6AU mYKp4cQ8Zk6Bn1IkFaKugFFV1/r1hn4L644PyL0bJ1gFo7wcMjEK+lYsnrV4et0SEbkL IpvA== MIME-Version: 1.0 X-Received: by 10.152.42.164 with SMTP id p4mr3592638lal.5.1396975898695; Tue, 08 Apr 2014 09:51:38 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Tue, 8 Apr 2014 09:51:38 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <1396971770-23553-1-git-send-email-lczerner@redhat.com> References: <20140404211224.GX17603@dastard> <1396971770-23553-1-git-send-email-lczerner@redhat.com> Date: Tue, 8 Apr 2014 17:51:38 +0100 Message-ID: Subject: Re: [PATCH 1/3] xfstests: Fix SCRATCH_DEV_POOL handling From: Filipe David Manana X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: Fix SCRATCH_DEV_POOL handling To: Lukas Czerner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-bk0-f41.google.com[209.85.214.41] X-Barracuda-Start-Time: 1396975899 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 8, 2014 at 4:42 PM, Lukas Czerner wrote: > With changes introduced in 667308dd97bf41382d4ab299fa5b56c235cfeb27 > it is no longer possible to use SCRATCH_DEV_POOL variable because of > error: > > common/config: Error: $SCRATCH_DEV should be unset when > $SCRATCH_DEV_POOL is set > > This was because get_next_config() would get called twice and hence it > would complain on the second run that SCRATCH_DEV is already set. Fix > it by making sure that we call get_next_config() only once if there > are no sections in the config file. > > Also make sure that we export SCRATCH_DEV in the case we're deducing it > from SCRATCH_DEV_POOL. > > Signed-off-by: Lukas Czerner > Reported-by: Filipe David Manana Tested-by: Filipe David Manana Tests working for btrfs now. Thanks Lukas. > --- > common/config | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/common/config b/common/config > index 4178c27..6fa18e2 100644 > --- a/common/config > +++ b/common/config > @@ -360,6 +360,10 @@ parse_config_section() { > } > > get_next_config() { > + if [ ! -z "$CONFIG_INCLUDED" ] && ! $OPTIONS_HAVE_SECTIONS; then > + return 0 > + fi > + > local OLD_FSTYP=$FSTYP > local OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS > local OLD_MKFS_OPTIONS=$MKFS_OPTIONS > @@ -414,10 +418,11 @@ get_next_config() { > # to SCRATCH_DEV and rest to SCRATCH_DEV_POOL to maintain the backward compatibility > if [ ! -z "$SCRATCH_DEV_POOL" ]; then > if [ ! -z "$SCRATCH_DEV" ]; then > - echo "common/config: Error: \$SCRATCH_DEV should be unset when \$SCRATCH_DEV_POOL is set" > + echo "common/config: Error: \$SCRATCH_DEV ($SCRATCH_DEV) should be unset when \$SCRATCH_DEV_POOL ($SCRATCH_DEV_POOL) is set" > exit 1 > fi > SCRATCH_DEV=`echo $SCRATCH_DEV_POOL | awk '{print $1}'` > + export SCRATCH_DEV > fi > > echo $SCRATCH_DEV | grep -q ":" > /dev/null 2>&1 > -- > 1.8.3.1 > -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From fdmanana@gmail.com Tue Apr 8 11:52:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A111A7FD1 for ; Tue, 8 Apr 2014 11:52:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D1F830406B for ; Tue, 8 Apr 2014 09:52:04 -0700 (PDT) X-ASG-Debug-ID: 1396975922-04cb6c5675de9090001-NocioJ Received: from mail-bk0-f53.google.com (mail-bk0-f53.google.com [209.85.214.53]) by cuda.sgi.com with ESMTP id u2LYoL4IboLUbMqX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 09:52:03 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.53] Received: by mail-bk0-f53.google.com with SMTP id r7so776557bkg.26 for ; Tue, 08 Apr 2014 09:52:01 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=eIdVLU5eXWfl6Uf/zbPScLTn0F2Zun7DRdPQcjKKBxM=; b=k9QNMrEQSKsxtmfpoFTXUTwUB3oS+Do7f8Del3hBi3K0fAkZ7g/Lb7KaAq2OED8lSb +wSmDZhZ2wNxKg+OtAS11zcunFi15A9Yt92AoUmpE1CAq6qHtU66yQyrTzbO6ADX0ztc 9wRrBs8f/8sEMYa//IST81zu2eGwOWBledCp7rXdICRPIihF+dWyv0DuuqMvvAQwj+gw hKJEpcQ4DHV+2WEctpQapgUxkpjTdh6nEKP8bDyOB+0PRaoDq8bFlxOgXe+CMYHdqBc7 3tEoiSWAYgFuY/w6Y6rp8SWHH/U/SUPs9aOLZ1kNtXOinn11JZNshc6A773pm5odP0uu 4Y4g== MIME-Version: 1.0 X-Received: by 10.152.3.72 with SMTP id a8mr3568272laa.33.1396975921771; Tue, 08 Apr 2014 09:52:01 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Tue, 8 Apr 2014 09:52:01 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <1396971770-23553-2-git-send-email-lczerner@redhat.com> References: <20140404211224.GX17603@dastard> <1396971770-23553-1-git-send-email-lczerner@redhat.com> <1396971770-23553-2-git-send-email-lczerner@redhat.com> Date: Tue, 8 Apr 2014 17:52:01 +0100 Message-ID: Subject: Re: [PATCH 2/3] xfstests: Unset SCRATCH_DEV when deduced from SCRATCH_DEV_POOL From: Filipe David Manana X-ASG-Orig-Subj: Re: [PATCH 2/3] xfstests: Unset SCRATCH_DEV when deduced from SCRATCH_DEV_POOL To: Lukas Czerner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-bk0-f53.google.com[209.85.214.53] X-Barracuda-Start-Time: 1396975922 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 8, 2014 at 4:42 PM, Lukas Czerner wrote: > In the case that we already have sections in the config file we > have to make sure that we unset SCRATCH_DEV if it has been deduced from > the SCRATCH_DEV_POOL so that it does not complain about SCRATCH_DEV in > this case. > > Signed-off-by: Lukas Czerner Tested-by: Filipe David Manana Tests working for btrfs now. Thanks Lukas. > --- > common/config | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/common/config b/common/config > index 6fa18e2..3163801 100644 > --- a/common/config > +++ b/common/config > @@ -372,10 +372,15 @@ get_next_config() { > unset MOUNT_OPTIONS > unset MKFS_OPTIONS > unset FSCK_OPTIONS > + # We might have deduced SCRATCH_DEV from the SCRATCH_DEV_POOL in the previous > + # run, so we have to unset it now. > + if [ "$SCRATCH_DEV_NOT_SET" == "true" ]; then > + unset SCRATCH_DEV > + fi > > parse_config_section $1 > > - if [ -n "$OLD_FSTYP" ] && [ $OLD_FSTYP != $FSTYP ]; then > + if [ ! -z "$OLD_FSTYP" ] && [ $OLD_FSTYP != $FSTYP ]; then > [ -z "$MOUNT_OPTIONS" ] && _mount_opts > [ -z "$MKFS_OPTIONS" ] && _mkfs_opts > [ -z "$FSCK_OPTIONS" ] && _fsck_opts > @@ -423,6 +428,7 @@ get_next_config() { > fi > SCRATCH_DEV=`echo $SCRATCH_DEV_POOL | awk '{print $1}'` > export SCRATCH_DEV > + export SCRATCH_DEV_NOT_SET=true > fi > > echo $SCRATCH_DEV | grep -q ":" > /dev/null 2>&1 > -- > 1.8.3.1 > -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From fdmanana@gmail.com Tue Apr 8 11:52:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9126229E23 for ; Tue, 8 Apr 2014 11:52:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19031AC012 for ; Tue, 8 Apr 2014 09:52:26 -0700 (PDT) X-ASG-Debug-ID: 1396975942-04bdf05dace1b260001-NocioJ Received: from mail-bk0-f45.google.com (mail-bk0-f45.google.com [209.85.214.45]) by cuda.sgi.com with ESMTP id F3Cfy2W3bv7Wzxhs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 09:52:23 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.45] Received: by mail-bk0-f45.google.com with SMTP id na10so782804bkb.18 for ; Tue, 08 Apr 2014 09:52:21 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=spzN4ADGYWAMve8q+0UUO67CqChSGptSNOV3uS9Fm1M=; b=XzdkXVBwI0aDEIHE+Az8/NsP8cX6oxoDrfqLlcrixVaSgsHDpJfUUvk1K6YCPKcN3f jSszLh1K66VnvushCs0QQYqTynJeH3PhvqS7ZZ/SRT3fTjgX2OS0eyHfnS80uaVCNgu7 2IWQl/xQaaHOck38AtHXUSRLU8UqYRKpi6XsXYPLIp3fr13lyL2zVttOI0F2fuSwLrwM s8yRSgZRzXUHcZsZC19Z2widm6OtzdImoLOO+nQDQtu5HQapzsULm+Oa0p2S1ce6xUEB khnxnavow9HZTAgm9043CZhcoxNT0lTN/T6JlA1qgy7OlAFZyqEszz0QIaJpq2htekLD W1hw== MIME-Version: 1.0 X-Received: by 10.153.11.163 with SMTP id ej3mr3591138lad.17.1396975941708; Tue, 08 Apr 2014 09:52:21 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Tue, 8 Apr 2014 09:52:21 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <1396971770-23553-3-git-send-email-lczerner@redhat.com> References: <20140404211224.GX17603@dastard> <1396971770-23553-1-git-send-email-lczerner@redhat.com> <1396971770-23553-3-git-send-email-lczerner@redhat.com> Date: Tue, 8 Apr 2014 17:52:21 +0100 Message-ID: Subject: Re: [PATCH 3/3] xfstests: Fix setting FSTYP automatically From: Filipe David Manana X-ASG-Orig-Subj: Re: [PATCH 3/3] xfstests: Fix setting FSTYP automatically To: Lukas Czerner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-bk0-f45.google.com[209.85.214.45] X-Barracuda-Start-Time: 1396975942 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 8, 2014 at 4:42 PM, Lukas Czerner wrote: > Currently if the FSTYP is not set, the code to get FSTYP using blikd > would not work. This is because we're using HOSTOS environment variable > which might not be set (at least not on my system) and because it's > already late in the code path. > > Fix this by using OSTYP environment variable as a fallback in the case > that HOSTOS does not work and move the check to common/config. > > Signed-off-by: Lukas Czerner Tested-by: Filipe David Manana Tests working for btrfs now. Thanks Lukas. > --- > check | 8 -------- > common/config | 18 +++++++++++++----- > 2 files changed, 13 insertions(+), 13 deletions(-) > > diff --git a/check b/check > index 8f1a6e1..ed1834d 100755 > --- a/check > +++ b/check > @@ -58,14 +58,6 @@ then > exit 1 > fi > > -# Autodetect fs type based on what's on $TEST_DEV unless it's been set > -# externally > -if [ -z "$FSTYP" -a "$HOSTOS" == "Linux" ]; then > - FSTYP=`blkid -c /dev/null -s TYPE -o value $TEST_DEV` > -fi > -FSTYP=${FSTYP:=xfs} > -export FSTYP > - > SUPPORTED_TESTS="[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]" > SRC_GROUPS="generic shared" > export SRC_DIR="tests" > diff --git a/common/config b/common/config > index 3163801..00249e6 100644 > --- a/common/config > +++ b/common/config > @@ -297,11 +297,6 @@ _fsck_opts() > esac > } > > -[ -z "$FSTYP" ] && export FSTYP=xfs > -[ -z "$MOUNT_OPTIONS" ] && _mount_opts > -[ -z "$MKFS_OPTIONS" ] && _mkfs_opts > -[ -z "$FSCK_OPTIONS" ] && _fsck_opts > - > known_hosts() > { > [ "$HOST_CONFIG_DIR" ] || HOST_CONFIG_DIR=`pwd`/configs > @@ -446,6 +441,19 @@ get_next_config() { > if [ -z "$CONFIG_INCLUDED" ]; then > get_next_config `echo $HOST_OPTIONS_SECTIONS | cut -f1 -d" "` > export CONFIG_INCLUDED=true > + > + # Autodetect fs type based on what's on $TEST_DEV unless it's been set > + # externally > + if [ -z "$FSTYP" ] && \ > + [ "$HOSTOS" == "Linux" -o "$OSTYPE" == "linux-gnu" ] && \ > + [ ! -z "$TEST_DEV" ]; then > + FSTYP=`blkid -c /dev/null -s TYPE -o value $TEST_DEV` > + fi > + FSTYP=${FSTYP:=xfs} > + export FSTYP > + [ -z "$MOUNT_OPTIONS" ] && _mount_opts > + [ -z "$MKFS_OPTIONS" ] && _mkfs_opts > + [ -z "$FSCK_OPTIONS" ] && _fsck_opts > fi > > # make sure this script returns success > -- > 1.8.3.1 > -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From bfoster@redhat.com Tue Apr 8 12:25:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D881F8094 for ; Tue, 8 Apr 2014 12:25:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C4AA58F8052 for ; Tue, 8 Apr 2014 10:25:19 -0700 (PDT) X-ASG-Debug-ID: 1396977918-04cbb054b8c012b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 32YIFpWyMmwoGZA4 for ; Tue, 08 Apr 2014 10:25:18 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s38HPGSE031267 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 8 Apr 2014 13:25:17 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s38HPGnf004097 for ; Tue, 8 Apr 2014 13:25:16 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 279421256CC; Tue, 8 Apr 2014 13:25:15 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix tmpfile/selinux deadlock and initialize security Date: Tue, 8 Apr 2014 13:25:15 -0400 X-ASG-Orig-Subj: [PATCH] xfs: fix tmpfile/selinux deadlock and initialize security Message-Id: <1396977915-35768-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396977918 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfstests generic/004 reproduces an ilock deadlock using the tmpfile interface when selinux is enabled. This occurs because xfs_create_tmpfile() takes the ilock and then calls d_tmpfile(). The latter eventually calls into xfs_xattr_get() which attempts to get the lock again. E.g.: xfs_io D ffffffff81c134c0 4096 3561 3560 0x00000080 ffff8801176a1a68 0000000000000046 ffff8800b401b540 ffff8801176a1fd8 00000000001d5800 00000000001d5800 ffff8800b401b540 ffff8800b401b540 ffff8800b73a6bd0 fffffffeffffffff ffff8800b73a6bd8 ffff8800b5ddb480 Call Trace: [] schedule+0x29/0x70 [] rwsem_down_read_failed+0xc5/0x120 [] ? xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] call_rwsem_down_read_failed+0x14/0x30 [] ? down_read_nested+0x89/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] xfs_attr_get+0x90/0xe0 [xfs] [] xfs_xattr_get+0x37/0x50 [xfs] [] generic_getxattr+0x4f/0x70 [] inode_doinit_with_dentry+0x1ae/0x650 [] selinux_d_instantiate+0x1c/0x20 [] security_d_instantiate+0x1b/0x30 [] d_instantiate+0x50/0x70 [] d_tmpfile+0xb5/0xc0 [] xfs_create_tmpfile+0x362/0x410 [xfs] [] xfs_vn_tmpfile+0x18/0x20 [xfs] [] path_openat+0x228/0x6a0 [] ? sched_clock+0x9/0x10 [] ? kvm_clock_read+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_filp_open+0x3a/0x90 [] ? _raw_spin_unlock+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_sys_open+0x12e/0x210 [] SyS_open+0x1e/0x20 [] system_call_fastpath+0x16/0x1b xfs_vn_tmpfile() also fails to initialize security on the newly created inode. Pull the d_tmpfile() call up into xfs_vn_tmpfile() after the transaction has been committed and the inode unlocked. Also, initialize security on the inode based on the parent directory provided via the tmpfile call. Signed-off-by: Brian Foster --- Hi all, I thought this looked safe given that d_tmpfile() looks generally like a d_instantiate() call with some extra magic for handling the tmpfile, but I could be missing something wrt to locking. ext4 looks like it defers the unlock_new_inode() call until after d_tmpfile() but I'm not quite sure why that is. We call it from xfs_setup_inode() further down in the inode allocation path. This has only seen some targeted testing so far. generic/004 passes with selinux enabled and I've verified (via xfs_repair) that the inode is pulled off the unlinked list if the security initialization fails. Brian fs/xfs/xfs_inode.c | 5 +++-- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 20 +++++++++++++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5e7a38f..768087b 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1334,7 +1334,8 @@ int xfs_create_tmpfile( struct xfs_inode *dp, struct dentry *dentry, - umode_t mode) + umode_t mode, + struct xfs_inode **ipp) { struct xfs_mount *mp = dp->i_mount; struct xfs_inode *ip = NULL; @@ -1402,7 +1403,6 @@ xfs_create_tmpfile( xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); ip->i_d.di_nlink--; - d_tmpfile(dentry, VFS_I(ip)); error = xfs_iunlink(tp, ip); if (error) goto out_trans_abort; @@ -1415,6 +1415,7 @@ xfs_create_tmpfile( xfs_qm_dqrele(gdqp); xfs_qm_dqrele(pdqp); + *ipp = ip; return 0; out_trans_abort: diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 396cc1f..f2fcde5 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -334,7 +334,7 @@ int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, int xfs_create(struct xfs_inode *dp, struct xfs_name *name, umode_t mode, xfs_dev_t rdev, struct xfs_inode **ipp); int xfs_create_tmpfile(struct xfs_inode *dp, struct dentry *dentry, - umode_t mode); + umode_t mode, struct xfs_inode **ipp); int xfs_remove(struct xfs_inode *dp, struct xfs_name *name, struct xfs_inode *ip); int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 89b07e4..ef1ca01 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1053,11 +1053,25 @@ xfs_vn_tmpfile( struct dentry *dentry, umode_t mode) { - int error; + int error; + struct xfs_inode *ip; + struct inode *inode; - error = xfs_create_tmpfile(XFS_I(dir), dentry, mode); + error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip); + if (unlikely(error)) + return -error; - return -error; + inode = VFS_I(ip); + + error = xfs_init_security(inode, dir, &dentry->d_name); + if (unlikely(error)) { + iput(inode); + return -error; + } + + d_tmpfile(dentry, inode); + + return 0; } static const struct inode_operations xfs_inode_operations = { -- 1.8.3.1 From sasha.levin@oracle.com Tue Apr 8 15:40:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A0F9529E25 for ; Tue, 8 Apr 2014 15:40:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB423AC014 for ; Tue, 8 Apr 2014 13:40:45 -0700 (PDT) X-ASG-Debug-ID: 1396989643-04cb6c77b50dfd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Z2Wl7PiwL51ubY81 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 08 Apr 2014 13:40:43 -0700 (PDT) X-Barracuda-Envelope-From: sasha.levin@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s38KeZcC028469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Apr 2014 20:40:36 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 s38KeYVh014385 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 8 Apr 2014 20:40:35 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s38KeYHX019359; Tue, 8 Apr 2014 20:40:34 GMT Received: from [10.154.155.132] (/10.154.155.132) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 08 Apr 2014 13:40:34 -0700 Message-ID: <53445EC0.9060707@oracle.com> Date: Tue, 08 Apr 2014 16:40:32 -0400 From: Sasha Levin User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Al Viro CC: Dave Jones , Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. References: <20140329223109.GA24098@redhat.com> <20140330234335.GB16336@dastard> <20140330235717.GO18016@ZenIV.linux.org.uk> <20140331004053.GA17603@dastard> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. In-Reply-To: <20140331004053.GA17603@dastard> X-Enigmail-Version: 1.6 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: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1396989643 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 03/30/2014 08:40 PM, Dave Chinner wrote: > On Mon, Mar 31, 2014 at 12:57:17AM +0100, Al Viro wrote: >> > On Mon, Mar 31, 2014 at 10:43:35AM +1100, Dave Chinner wrote: >>> > > filldir on a directory inode vs page fault on regular file. Known >>> > > issue, definitely a false positive. We have to change locking >>> > > algorithms to avoid such deficiencies of lockdep (a case of "lockdep >>> > > considered harmful", perhaps?) so it's not something I'm about to >>> > > rush... >> > >> > Give i_lock on directories a separate class, as it's been done for i_mutex... > Already done that. Commit: > > 93a8614 xfs: fix directory inode iolock lockdep false positive Hi Dave, The commit above introduces a new lockdep issue for me: [ 3162.917171] ====================================================== [ 3162.920402] [ INFO: RECLAIM_FS-READ-safe -> RECLAIM_FS-READ-unsafe lock order detected ] [ 3162.934790] 3.14.0-next-20140408-sasha-00023-g06962b5 #384 Not tainted [ 3162.934790] ------------------------------------------------------ [ 3162.934790] trinity-main/17183 [HC0[0]:SC0[0]:HE1:SE1] is trying to acquire: [ 3162.934790] (&xfs_dir_ilock_class){++++..}, at: xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] [ 3162.934790] and this task is already holding: [ 3162.934790] (sb_internal){.+.+.?}, at: xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] which would create a new lock dependency: [ 3162.934790] (sb_internal){.+.+.?} -> (&xfs_dir_ilock_class){++++..} [ 3162.934790] [ 3162.934790] but this new dependency connects a RECLAIM_FS-READ-irq-safe lock: [ 3162.934790] (sb_internal){.+.+.?} ... which became RECLAIM_FS-READ-irq-safe at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2821 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] __sb_start_write (fs/super.c:1187) [ 3162.934790] xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] xfs_iomap_write_allocate (fs/xfs/xfs_iomap.c:689) [ 3162.934790] xfs_map_blocks (fs/xfs/xfs_aops.c:340) [ 3162.934790] xfs_vm_writepage (fs/xfs/xfs_aops.c:1081) [ 3162.934790] shrink_page_list (mm/vmscan.c:503 mm/vmscan.c:1015) [ 3162.934790] shrink_inactive_list (include/linux/spinlock.h:328 mm/vmscan.c:1503) [ 3162.934790] shrink_lruvec (mm/vmscan.c:1830 mm/vmscan.c:2054) [ 3162.934790] shrink_zone (mm/vmscan.c:2235) [ 3162.934790] kswapd_shrink_zone (include/linux/nodemask.h:131 include/linux/nodemask.h:131 mm/vmscan.c:2894) [ 3162.934790] kswapd (mm/vmscan.c:3080 mm/vmscan.c:3286) [ 3162.934790] kthread (kernel/kthread.c:210) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] [ 3162.934790] to a RECLAIM_FS-READ-irq-unsafe lock: [ 3162.934790] (&mm->mmap_sem){++++++} ... which became RECLAIM_FS-READ-irq-unsafe at: [ 3162.934790] ... mark_held_locks (kernel/locking/lockdep.c:2523) [ 3162.934790] lockdep_trace_alloc (kernel/locking/lockdep.c:2745 kernel/locking/lockdep.c:2760) [ 3162.934790] __alloc_pages_nodemask (mm/page_alloc.c:2721) [ 3162.934790] alloc_pages_current (mm/mempolicy.c:2131) [ 3162.934790] pte_alloc_one (arch/x86/mm/pgtable.c:28) [ 3162.934790] __pte_alloc (mm/memory.c:557) [ 3162.934790] move_page_tables (mm/mremap.c:209 (discriminator 1)) [ 3162.934790] shift_arg_pages (fs/exec.c:607) [ 3162.934790] setup_arg_pages (fs/exec.c:715) [ 3162.934790] load_elf_binary (fs/binfmt_elf.c:745) [ 3162.934790] search_binary_handler (fs/exec.c:1392) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:1429 fs/exec.c:1525) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] [ 3162.934790] other info that might help us debug this: [ 3162.934790] [ 3162.934790] Chain exists of: sb_internal --> &xfs_dir_ilock_class --> &mm->mmap_sem [ 3162.934790] Possible interrupt unsafe locking scenario: [ 3162.934790] [ 3162.934790] CPU0 CPU1 [ 3162.934790] ---- ---- [ 3162.934790] lock(&mm->mmap_sem); [ 3162.934790] local_irq_disable(); [ 3162.934790] lock(sb_internal); [ 3162.934790] lock(&xfs_dir_ilock_class); [ 3162.934790] [ 3162.934790] lock(sb_internal); [ 3162.934790] [ 3162.934790] *** DEADLOCK *** [ 3162.934790] [ 3162.934790] 3 locks held by trinity-main/17183: [ 3162.934790] #0: (&type->i_mutex_dir_key#12){+.+.+.}, at: iterate_dir (fs/readdir.c:35) [ 3162.934790] #1: (sb_writers#34){.+.+.+}, at: touch_atime (fs/inode.c:1550) [ 3162.934790] #2: (sb_internal){.+.+.?}, at: xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] the dependencies between RECLAIM_FS-READ-irq-safe lock and the holding lock: [ 3162.934790] -> (sb_internal){.+.+.?} ops: 1021 { [ 3162.934790] HARDIRQ-ON-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2792 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] __sb_start_write (fs/super.c:1187) [ 3162.934790] xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] xfs_create (fs/xfs/xfs_inode.c:1191) [ 3162.934790] xfs_vn_mknod (fs/xfs/xfs_iops.c:161) [ 3162.934790] xfs_vn_create (fs/xfs/xfs_iops.c:204) [ 3162.934790] vfs_create (fs/namei.c:2505) [ 3162.934790] do_last (fs/namei.c:2844 fs/namei.c:2929) [ 3162.934790] path_openat (fs/namei.c:3181) [ 3162.934790] do_filp_open (fs/namei.c:3230) [ 3162.934790] do_sys_open (fs/open.c:1014) [ 3162.934790] SyS_open (fs/open.c:1026) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] SOFTIRQ-ON-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2804 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] __sb_start_write (fs/super.c:1187) [ 3162.934790] xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] xfs_create (fs/xfs/xfs_inode.c:1191) [ 3162.934790] xfs_vn_mknod (fs/xfs/xfs_iops.c:161) [ 3162.934790] xfs_vn_create (fs/xfs/xfs_iops.c:204) [ 3162.934790] vfs_create (fs/namei.c:2505) [ 3162.934790] do_last (fs/namei.c:2844 fs/namei.c:2929) [ 3162.934790] path_openat (fs/namei.c:3181) [ 3162.934790] do_filp_open (fs/namei.c:3230) [ 3162.934790] do_sys_open (fs/open.c:1014) [ 3162.934790] SyS_open (fs/open.c:1026) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] IN-RECLAIM_FS-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2821 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] __sb_start_write (fs/super.c:1187) [ 3162.934790] xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] xfs_iomap_write_allocate (fs/xfs/xfs_iomap.c:689) [ 3162.934790] xfs_map_blocks (fs/xfs/xfs_aops.c:340) [ 3162.934790] xfs_vm_writepage (fs/xfs/xfs_aops.c:1081) [ 3162.934790] shrink_page_list (mm/vmscan.c:503 mm/vmscan.c:1015) [ 3162.934790] shrink_inactive_list (include/linux/spinlock.h:328 mm/vmscan.c:1503) [ 3162.934790] shrink_lruvec (mm/vmscan.c:1830 mm/vmscan.c:2054) [ 3162.934790] shrink_zone (mm/vmscan.c:2235) [ 3162.934790] kswapd_shrink_zone (include/linux/nodemask.h:131 include/linux/nodemask.h:131 mm/vmscan.c:2894) [ 3162.934790] kswapd (mm/vmscan.c:3080 mm/vmscan.c:3286) [ 3162.934790] kthread (kernel/kthread.c:210) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] RECLAIM_FS-ON-R at: [ 3162.934790] mark_held_locks (kernel/locking/lockdep.c:2523) [ 3162.934790] lockdep_trace_alloc (kernel/locking/lockdep.c:2745 kernel/locking/lockdep.c:2760) [ 3162.934790] kmem_cache_alloc (mm/slub.c:965 mm/slub.c:2403 mm/slub.c:2476 mm/slub.c:2481) [ 3162.934790] kmem_zone_alloc (fs/xfs/kmem.c:130) [ 3162.934790] _xfs_trans_alloc (fs/xfs/xfs_trans.c:87 (discriminator 2)) [ 3162.934790] xfs_trans_alloc (fs/xfs/xfs_trans.c:68) [ 3162.934790] xfs_create (fs/xfs/xfs_inode.c:1191) [ 3162.934790] xfs_vn_mknod (fs/xfs/xfs_iops.c:161) [ 3162.934790] xfs_vn_create (fs/xfs/xfs_iops.c:204) [ 3162.934790] vfs_create (fs/namei.c:2505) [ 3162.934790] do_last (fs/namei.c:2844 fs/namei.c:2929) [ 3162.934790] path_openat (fs/namei.c:3181) [ 3162.934790] do_filp_open (fs/namei.c:3230) [ 3162.934790] do_sys_open (fs/open.c:1014) [ 3162.934790] SyS_open (fs/open.c:1026) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] INITIAL USE at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:3142) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] __sb_start_write (fs/super.c:1187) [ 3162.934790] xfs_trans_alloc (fs/xfs/xfs_trans.c:67) [ 3162.934790] xfs_create (fs/xfs/xfs_inode.c:1191) [ 3162.934790] xfs_vn_mknod (fs/xfs/xfs_iops.c:161) [ 3162.934790] xfs_vn_create (fs/xfs/xfs_iops.c:204) [ 3162.934790] vfs_create (fs/namei.c:2505) [ 3162.934790] do_last (fs/namei.c:2844 fs/namei.c:2929) [ 3162.934790] path_openat (fs/namei.c:3181) [ 3162.934790] do_filp_open (fs/namei.c:3230) [ 3162.934790] do_sys_open (fs/open.c:1014) [ 3162.934790] SyS_open (fs/open.c:1026) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] } [ 3162.934790] ... key at: xfs_fs_type (??:?) [ 3162.934790] ... acquired at: [ 3162.934790] check_irq_usage (kernel/locking/lockdep.c:1638) [ 3162.934790] __lock_acquire (kernel/locking/lockdep_states.h:9 kernel/locking/lockdep.c:1844 kernel/locking/lockdep.c:1945 kernel/locking/lockdep.c:2131 kernel/locking/lockdep.c:3182) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write_nested (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:143) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] xfs_vn_update_time (fs/xfs/xfs_iops.c:944) [ 3162.934790] update_time (fs/inode.c:1502) [ 3162.934790] touch_atime (fs/inode.c:1565) [ 3162.934790] iterate_dir (include/linux/fs.h:1815 fs/readdir.c:43) [ 3162.934790] SyS_getdents (fs/readdir.c:214 fs/readdir.c:193) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] [ 3162.934790] the dependencies between the lock to be acquired and RECLAIM_FS-READ-irq-unsafe lock: [ 3162.934790] -> (&mm->mmap_sem){++++++} ops: 217938150 { [ 3162.934790] HARDIRQ-ON-W at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2800 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:50) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:259 fs/exec.c:374 fs/exec.c:1496) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] HARDIRQ-ON-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2792 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] might_fault (mm/memory.c:4214) [ 3162.934790] __clear_user (arch/x86/lib/usercopy_64.c:18 arch/x86/lib/usercopy_64.c:21) [ 3162.934790] clear_user (arch/x86/lib/usercopy_64.c:54) [ 3162.934790] padzero (fs/binfmt_elf.c:122) [ 3162.934790] load_elf_binary (fs/binfmt_elf.c:894 (discriminator 1)) [ 3162.934790] search_binary_handler (fs/exec.c:1392) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:1429 fs/exec.c:1525) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] SOFTIRQ-ON-W at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2804 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:50) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:259 fs/exec.c:374 fs/exec.c:1496) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] SOFTIRQ-ON-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2804 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] might_fault (mm/memory.c:4214) [ 3162.934790] __clear_user (arch/x86/lib/usercopy_64.c:18 arch/x86/lib/usercopy_64.c:21) [ 3162.934790] clear_user (arch/x86/lib/usercopy_64.c:54) [ 3162.934790] padzero (fs/binfmt_elf.c:122) [ 3162.934790] load_elf_binary (fs/binfmt_elf.c:894 (discriminator 1)) [ 3162.934790] search_binary_handler (fs/exec.c:1392) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:1429 fs/exec.c:1525) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] RECLAIM_FS-ON-W at: [ 3162.934790] mark_held_locks (kernel/locking/lockdep.c:2523) [ 3162.934790] lockdep_trace_alloc (kernel/locking/lockdep.c:2745 kernel/locking/lockdep.c:2760) [ 3162.934790] __alloc_pages_nodemask (mm/page_alloc.c:2721) [ 3162.934790] alloc_pages_current (mm/mempolicy.c:2131) [ 3162.934790] pte_alloc_one (arch/x86/mm/pgtable.c:28) [ 3162.934790] __pte_alloc (mm/memory.c:557) [ 3162.934790] move_page_tables (mm/mremap.c:209 (discriminator 1)) [ 3162.934790] shift_arg_pages (fs/exec.c:607) [ 3162.934790] setup_arg_pages (fs/exec.c:715) [ 3162.934790] load_elf_binary (fs/binfmt_elf.c:745) [ 3162.934790] search_binary_handler (fs/exec.c:1392) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:1429 fs/exec.c:1525) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] RECLAIM_FS-ON-R at: [ 3162.934790] mark_held_locks (kernel/locking/lockdep.c:2523) [ 3162.934790] lockdep_trace_alloc (kernel/locking/lockdep.c:2745 kernel/locking/lockdep.c:2760) [ 3162.934790] __alloc_pages_nodemask (mm/page_alloc.c:2721) [ 3162.934790] alloc_pages_current (mm/mempolicy.c:2131) [ 3162.934790] __get_free_pages (mm/page_alloc.c:2803) [ 3162.934790] get_zeroed_page (mm/page_alloc.c:2812) [ 3162.934790] __pud_alloc (mm/memory.c:3844) [ 3162.934790] __handle_mm_fault (include/linux/mm.h:1368 mm/memory.c:3728) [ 3162.934790] handle_mm_fault (mm/memory.c:3819) [ 3162.934790] __do_page_fault (arch/x86/mm/fault.c:1220) [ 3162.934790] do_page_fault (arch/x86/mm/fault.c:1272 include/linux/jump_label.h:105 include/linux/context_tracking_state.h:27 include/linux/context_tracking.h:45 arch/x86/mm/fault.c:1273) [ 3162.934790] do_async_page_fault (arch/x86/kernel/kvm.c:263) [ 3162.934790] async_page_fault (arch/x86/kernel/entry_64.S:1496) [ 3162.934790] clear_user (arch/x86/lib/usercopy_64.c:54) [ 3162.934790] padzero (fs/binfmt_elf.c:122) [ 3162.934790] load_elf_binary (fs/binfmt_elf.c:894 (discriminator 1)) [ 3162.934790] search_binary_handler (fs/exec.c:1392) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:1429 fs/exec.c:1525) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] INITIAL USE at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:3142) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:50) [ 3162.934790] do_execve_common.isra.19 (fs/exec.c:259 fs/exec.c:374 fs/exec.c:1496) [ 3162.934790] do_execve (fs/exec.c:1568) [ 3162.934790] run_init_process (init/main.c:818) [ 3162.934790] kernel_init (init/main.c:866) [ 3162.934790] ret_from_fork (arch/x86/kernel/entry_64.S:555) [ 3162.934790] } [ 3162.934790] ... key at: __key.50836 (??:?) [ 3162.934790] ... acquired at: [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] might_fault (mm/memory.c:4214) [ 3162.934790] filldir (arch/x86/include/asm/uaccess.h:731 fs/readdir.c:176) [ 3162.934790] xfs_dir2_sf_getdents (fs/xfs/xfs_dir2_readdir.c:131) [ 3162.934790] xfs_readdir (fs/xfs/xfs_dir2_readdir.c:689) [ 3162.934790] xfs_file_readdir (fs/xfs/xfs_file.c:977) [ 3162.934790] iterate_dir (fs/readdir.c:42) [ 3162.934790] SyS_getdents (fs/readdir.c:214 fs/readdir.c:193) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] [ 3162.934790] -> (&xfs_dir_ilock_class){++++..} ops: 6 { [ 3162.934790] HARDIRQ-ON-W at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2800 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write_nested (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:143) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] xfs_vn_update_time (fs/xfs/xfs_iops.c:944) [ 3162.934790] update_time (fs/inode.c:1502) [ 3162.934790] touch_atime (fs/inode.c:1565) [ 3162.934790] iterate_dir (include/linux/fs.h:1815 fs/readdir.c:43) [ 3162.934790] SyS_getdents (fs/readdir.c:214 fs/readdir.c:193) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] HARDIRQ-ON-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2792 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_read_nested (arch/x86/include/asm/rwsem.h:83 kernel/locking/rwsem.c:114) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:43 fs/xfs/xfs_inode.c:167) [ 3162.934790] xfs_ilock_data_map_shared (fs/xfs/xfs_inode.c:106) [ 3162.934790] xfs_lookup (fs/xfs/xfs_inode.c:589) [ 3162.934790] xfs_vn_lookup (fs/xfs/xfs_iops.c:230) [ 3162.934790] lookup_real (fs/namei.c:1325) [ 3162.934790] __lookup_hash (fs/namei.c:1343) [ 3162.934790] lookup_slow (fs/namei.c:1454) [ 3162.934790] path_lookupat (fs/namei.c:1534 fs/namei.c:1904 fs/namei.c:1938) [ 3162.934790] filename_lookup (fs/namei.c:1978) [ 3162.934790] user_path_at_empty (fs/namei.c:2126) [ 3162.934790] user_path_at (fs/namei.c:2137) [ 3162.934790] vfs_fstatat (fs/stat.c:107) [ 3162.934790] vfs_stat (fs/stat.c:124) [ 3162.934790] SYSC_newstat (fs/stat.c:272) [ 3162.934790] SyS_newstat (fs/stat.c:267) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] SOFTIRQ-ON-W at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2804 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write_nested (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:143) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] xfs_vn_update_time (fs/xfs/xfs_iops.c:944) [ 3162.934790] update_time (fs/inode.c:1502) [ 3162.934790] touch_atime (fs/inode.c:1565) [ 3162.934790] iterate_dir (include/linux/fs.h:1815 fs/readdir.c:43) [ 3162.934790] SyS_getdents (fs/readdir.c:214 fs/readdir.c:193) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] SOFTIRQ-ON-R at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:2804 kernel/locking/lockdep.c:3138) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_read_nested (arch/x86/include/asm/rwsem.h:83 kernel/locking/rwsem.c:114) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:43 fs/xfs/xfs_inode.c:167) [ 3162.934790] xfs_ilock_data_map_shared (fs/xfs/xfs_inode.c:106) [ 3162.934790] xfs_lookup (fs/xfs/xfs_inode.c:589) [ 3162.934790] xfs_vn_lookup (fs/xfs/xfs_iops.c:230) [ 3162.934790] lookup_real (fs/namei.c:1325) [ 3162.934790] __lookup_hash (fs/namei.c:1343) [ 3162.934790] lookup_slow (fs/namei.c:1454) [ 3162.934790] path_lookupat (fs/namei.c:1534 fs/namei.c:1904 fs/namei.c:1938) [ 3162.934790] filename_lookup (fs/namei.c:1978) [ 3162.934790] user_path_at_empty (fs/namei.c:2126) [ 3162.934790] user_path_at (fs/namei.c:2137) [ 3162.934790] vfs_fstatat (fs/stat.c:107) [ 3162.934790] vfs_stat (fs/stat.c:124) [ 3162.934790] SYSC_newstat (fs/stat.c:272) [ 3162.934790] SyS_newstat (fs/stat.c:267) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] INITIAL USE at: [ 3162.934790] __lock_acquire (kernel/locking/lockdep.c:3142) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_read_nested (arch/x86/include/asm/rwsem.h:83 kernel/locking/rwsem.c:114) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:43 fs/xfs/xfs_inode.c:167) [ 3162.934790] xfs_ilock_data_map_shared (fs/xfs/xfs_inode.c:106) [ 3162.934790] xfs_lookup (fs/xfs/xfs_inode.c:589) [ 3162.934790] xfs_vn_lookup (fs/xfs/xfs_iops.c:230) [ 3162.934790] lookup_real (fs/namei.c:1325) [ 3162.934790] __lookup_hash (fs/namei.c:1343) [ 3162.934790] lookup_slow (fs/namei.c:1454) [ 3162.934790] path_lookupat (fs/namei.c:1534 fs/namei.c:1904 fs/namei.c:1938) [ 3162.934790] filename_lookup (fs/namei.c:1978) [ 3162.934790] user_path_at_empty (fs/namei.c:2126) [ 3162.934790] user_path_at (fs/namei.c:2137) [ 3162.934790] vfs_fstatat (fs/stat.c:107) [ 3162.934790] vfs_stat (fs/stat.c:124) [ 3162.934790] SYSC_newstat (fs/stat.c:272) [ 3162.934790] SyS_newstat (fs/stat.c:267) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] } [ 3162.934790] ... key at: xfs_dir_ilock_class (??:?) [ 3162.934790] ... acquired at: [ 3162.934790] check_irq_usage (kernel/locking/lockdep.c:1638) [ 3162.934790] __lock_acquire (kernel/locking/lockdep_states.h:9 kernel/locking/lockdep.c:1844 kernel/locking/lockdep.c:1945 kernel/locking/lockdep.c:2131 kernel/locking/lockdep.c:3182) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] down_write_nested (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:143) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] xfs_vn_update_time (fs/xfs/xfs_iops.c:944) [ 3162.934790] update_time (fs/inode.c:1502) [ 3162.934790] touch_atime (fs/inode.c:1565) [ 3162.934790] iterate_dir (include/linux/fs.h:1815 fs/readdir.c:43) [ 3162.934790] SyS_getdents (fs/readdir.c:214 fs/readdir.c:193) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) [ 3162.934790] [ 3162.934790] [ 3162.934790] stack backtrace: [ 3162.934790] CPU: 0 PID: 17183 Comm: trinity-main Not tainted 3.14.0-next-20140408-sasha-00023-g06962b5 #384 [ 3162.934790] ffffffff93a57840 ffff8804c55b5ad8 ffffffff9051ac81 0000000000000000 [ 3162.934790] ffff8804c6b10d38 ffff8804c55b5be8 ffffffff8d1c0eb5 0000000000000000 [ 3162.934790] ffff880400000001 0000000000000001 ffff8804c6b10000 ffffffff916c5d62 [ 3162.934790] Call Trace: [ 3162.934790] dump_stack (lib/dump_stack.c:52) [ 3162.934790] check_usage (kernel/locking/lockdep.c:1549 kernel/locking/lockdep.c:1580) [ 3162.934790] ? save_stack_trace (arch/x86/kernel/stacktrace.c:64) [ 3162.934790] ? check_usage_forwards (kernel/locking/lockdep.c:2371) [ 3162.934790] check_irq_usage (kernel/locking/lockdep.c:1638) [ 3162.934790] __lock_acquire (kernel/locking/lockdep_states.h:9 kernel/locking/lockdep.c:1844 kernel/locking/lockdep.c:1945 kernel/locking/lockdep.c:2131 kernel/locking/lockdep.c:3182) [ 3162.934790] ? get_parent_ip (kernel/sched/core.c:2471) [ 3162.934790] ? kmem_cache_alloc (include/linux/kmemleak.h:43 mm/slub.c:975 mm/slub.c:2468 mm/slub.c:2476 mm/slub.c:2481) [ 3162.934790] ? get_parent_ip (kernel/sched/core.c:2471) [ 3162.934790] ? preempt_count_sub (kernel/sched/core.c:2526) [ 3162.934790] lock_acquire (arch/x86/include/asm/current.h:14 kernel/locking/lockdep.c:3602) [ 3162.934790] ? xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] ? xfs_vn_update_time (fs/xfs/xfs_iops.c:944) [ 3162.934790] down_write_nested (arch/x86/include/asm/rwsem.h:130 kernel/locking/rwsem.c:143) [ 3162.934790] ? xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] ? xfs_trans_reserve (fs/xfs/xfs_trans.c:221) [ 3162.934790] xfs_ilock (fs/xfs/mrlock.h:50 fs/xfs/xfs_inode.c:165) [ 3162.934790] xfs_vn_update_time (fs/xfs/xfs_iops.c:944) [ 3162.934790] update_time (fs/inode.c:1502) [ 3162.934790] ? __mnt_want_write (arch/x86/include/asm/preempt.h:98 fs/namespace.c:358) [ 3162.934790] touch_atime (fs/inode.c:1565) [ 3162.934790] iterate_dir (include/linux/fs.h:1815 fs/readdir.c:43) [ 3162.934790] SyS_getdents (fs/readdir.c:214 fs/readdir.c:193) [ 3162.934790] ? iterate_dir (fs/readdir.c:151) [ 3162.934790] tracesys (arch/x86/kernel/entry_64.S:749) Thanks, Sasha From sandeen@sandeen.net Tue Apr 8 18:25:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D3F5580CF for ; Tue, 8 Apr 2014 18:25:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8DE730408D for ; Tue, 8 Apr 2014 16:25:19 -0700 (PDT) X-ASG-Debug-ID: 1396999507-04cbb00dc417140001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VFGA3PmoqjQdynvb for ; Tue, 08 Apr 2014 16:25:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 78F2563BE57C; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 01/14] xfsprogs: fix various fd leaks Date: Tue, 8 Apr 2014 18:24:51 -0500 X-ASG-Orig-Subj: [PATCH 01/14] xfsprogs: fix various fd leaks Message-Id: <1396999504-13769-2-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999507 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Coverity spotted these; several paths where we don't close fds when we return. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 10 +++++++++- io/readdir.c | 1 + libhandle/handle.c | 1 + mkfs/proto.c | 12 +++++++++--- quota/quot.c | 1 + rtcp/xfs_rtcp.c | 2 ++ 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 6f00b41..6b5d260 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -706,6 +706,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) if (xfs_getgeom(fsfd, &fsgeom) < 0 ) { fsrprintf(_("Skipping %s: could not get XFS geometry\n"), mntdir); + close(fsfd); return -1; } @@ -1346,6 +1347,8 @@ packfile(char *fname, char *tname, int fd, if (lseek64(tfd, 0, SEEK_SET)) { fsrprintf(_("Couldn't rewind on temporary file\n")); close(tfd); + if (ffd != -1) + close(ffd); free(fbuf); return -1; } @@ -1359,6 +1362,8 @@ packfile(char *fname, char *tname, int fd, fsrprintf(_("No improvement will be made (skipping): %s\n"), fname); free(fbuf); close(tfd); + if (ffd != -1) + close(ffd); return 1; /* no change/no error */ } @@ -1432,6 +1437,8 @@ packfile(char *fname, char *tname, int fd, } free(fbuf); close(tfd); + if (ffd != -1) + close(ffd); return -1; } if (nfrags) { @@ -1446,7 +1453,8 @@ packfile(char *fname, char *tname, int fd, } } ftruncate64(tfd, statp->bs_size); - if (ffd > 0) close(ffd); + if (ffd != -1) + close(ffd); fsync(tfd); free(fbuf); diff --git a/io/readdir.c b/io/readdir.c index 822818a..7133204 100644 --- a/io/readdir.c +++ b/io/readdir.c @@ -171,6 +171,7 @@ readdir_f( gettimeofday(&t2, NULL); closedir(dir); + close(dfd); t2 = tsub(t2, t1); timestr(&t2, ts, sizeof(ts), 0); diff --git a/libhandle/handle.c b/libhandle/handle.c index 9a232fa..9f81483 100644 --- a/libhandle/handle.c +++ b/libhandle/handle.c @@ -97,6 +97,7 @@ path_to_fshandle( /* new filesystem. add it to the cache */ fdhp = malloc(sizeof(struct fdhash)); if (fdhp == NULL) { + close(fd); errno = ENOMEM; return -1; } diff --git a/mkfs/proto.c b/mkfs/proto.c index 4d3680d..b7e0761 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -59,18 +59,19 @@ setup_proto( if ((fd = open(fname, O_RDONLY)) < 0 || (size = filesize(fd)) < 0) { fprintf(stderr, _("%s: failed to open %s: %s\n"), progname, fname, strerror(errno)); - exit(1); + goto out_fail; } + buf = malloc(size + 1); if (read(fd, buf, size) < size) { fprintf(stderr, _("%s: read failed on %s: %s\n"), progname, fname, strerror(errno)); - exit(1); + goto out_fail; } if (buf[size - 1] != '\n') { fprintf(stderr, _("%s: proto file %s premature EOF\n"), progname, fname); - exit(1); + goto out_fail; } buf[size] = '\0'; /* @@ -79,7 +80,12 @@ setup_proto( (void)getstr(&buf); /* boot image name */ (void)getnum(&buf); /* block count */ (void)getnum(&buf); /* inode count */ + close(fd); return buf; + +out_fail: + close(fd); + exit(1); } static long diff --git a/quota/quot.c b/quota/quot.c index a7782b4..96d449e 100644 --- a/quota/quot.c +++ b/quota/quot.c @@ -165,6 +165,7 @@ quot_bulkstat_mount( buf = (xfs_bstat_t *)calloc(NBSTAT, sizeof(xfs_bstat_t)); if (!buf) { perror("calloc"); + close(fsfd); return; } diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index f0b5936..b81b1e1 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -224,6 +224,7 @@ rtcp( char *source, char *target, int fextsize) if ( !(fsxattr.fsx_xflags & XFS_XFLAG_REALTIME) ) { fprintf(stderr, _("%s: %s is not a realtime file.\n"), progname, tbuf); + close( tofd ); return( -1 ); } @@ -234,6 +235,7 @@ rtcp( char *source, char *target, int fextsize) fprintf(stderr, _("%s: %s file extent size is %d, " "instead of %d.\n"), progname, tbuf, fsxattr.fsx_extsize, fextsize); + close( tofd ); return( -1 ); } } -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:25:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5216280D3 for ; Tue, 8 Apr 2014 18:25:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A55530408E for ; Tue, 8 Apr 2014 16:25:25 -0700 (PDT) X-ASG-Debug-ID: 1396999516-04cb6c77b614ff0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qYCtFwYbupvjs5un for ; Tue, 08 Apr 2014 16:25:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id E32CA63BE834; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 07/14] xfs_logprint: fix leak in error path of xlog_print_record() Date: Tue, 8 Apr 2014 18:24:57 -0500 X-ASG-Orig-Subj: [PATCH 07/14] xfs_logprint: fix leak in error path of xlog_print_record() Message-Id: <1396999504-13769-8-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999516 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In 2 error paths we returned without freeing the allocated buf. Collapse them into a compound test & free buf on the way out. Signed-off-by: Eric Sandeen --- logprint/log_misc.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 52f1e85..a022df4 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -942,11 +942,12 @@ xlog_print_record( */ if (be32_to_cpu(rhead->h_cycle) != be32_to_cpu(*(__be32 *)ptr)) { - if (*read_type == FULL_READ) - return -1; - else if (be32_to_cpu(rhead->h_cycle) + 1 != - be32_to_cpu(*(__be32 *)ptr)) - return -1; + if ((*read_type == FULL_READ) || + (be32_to_cpu(rhead->h_cycle) + 1 != + be32_to_cpu(*(__be32 *)ptr))) { + free(buf); + return -1; + } } } -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:25:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 236D580D3 for ; Tue, 8 Apr 2014 18:25:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B30830408D for ; Tue, 8 Apr 2014 16:25:26 -0700 (PDT) X-ASG-Debug-ID: 1396999507-04cbb00dc617150001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id b53TkDcXtNTjcqeY for ; Tue, 08 Apr 2014 16:25:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id A120D63C3B1D; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 03/14] xfsprogs: trivial buffer frees on error paths Date: Tue, 8 Apr 2014 18:24:53 -0500 X-ASG-Orig-Subj: [PATCH 03/14] xfsprogs: trivial buffer frees on error paths Message-Id: <1396999504-13769-4-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999507 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Lots of memory leaks on error paths etc, spotted by coverity. This patch rolls up the super-straightforward fixes across xfsprogs. Signed-off-by: Eric Sandeen --- db/addr.c | 15 +++++++-------- db/check.c | 4 +++- db/write.c | 2 ++ io/parent.c | 2 ++ mkfs/proto.c | 3 ++- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/db/addr.c b/db/addr.c index f74dd62..f9f760d 100644 --- a/db/addr.c +++ b/db/addr.c @@ -85,16 +85,14 @@ addr_f( fl = flist_scan(argv[1]); if (fl == NULL) return 0; - if (!flist_parse(fld, fl, iocur_top->data, 0)) { - flist_free(fl); - return 0; - } + if (!flist_parse(fld, fl, iocur_top->data, 0)) + goto out; + flist_print(fl); for (tfl = fl; tfl->child != NULL; tfl = tfl->child) { if ((tfl->flags & FL_OKLOW) && tfl->low < tfl->high) { dbprintf(_("array not allowed for addr command\n")); - flist_free(fl); - return 0; + goto out; } } fld = tfl->fld; @@ -103,7 +101,7 @@ addr_f( next = inode_next_type(); if (next == TYP_NONE) { dbprintf(_("no next type for field %s\n"), fld->name); - return 0; + goto out; } fa = &ftattrtab[fld->ftyp]; ASSERT(fa->ftyp == fld->ftyp); @@ -111,9 +109,10 @@ addr_f( if (adf == NULL) { dbprintf(_("no addr function for field %s (type %s)\n"), fld->name, fa->name); - return 0; + goto out; } (*adf)(iocur_top->data, tfl->offset, next); +out: flist_free(fl); return 0; } diff --git a/db/check.c b/db/check.c index 4867698..baf7f9f 100644 --- a/db/check.c +++ b/db/check.c @@ -1136,7 +1136,7 @@ blocktrash_f( } if (blocks == 0) { dbprintf(_("blocktrash: no matching blocks\n")); - return 0; + goto out; } if (!sopt) dbprintf(_("blocktrash: seed %u\n"), seed); @@ -1161,6 +1161,7 @@ blocktrash_f( } } } +out: xfree(lentab); return 0; } @@ -1907,6 +1908,7 @@ ncheck_f( break; default: dbprintf(_("bad option -%c for ncheck command\n"), c); + xfree(ilist); return 0; } } diff --git a/db/write.c b/db/write.c index 7b34fc0..ca8bd0f 100644 --- a/db/write.c +++ b/db/write.c @@ -233,6 +233,7 @@ bwrite_lrot( memcpy(hold_region, base, shift); memcpy(base, base+shift, len-shift); memcpy(base+(len-shift), hold_region, shift); + free(hold_region); } /* ARGSUSED */ @@ -265,6 +266,7 @@ bwrite_rrot( memcpy(hold_region, base+(len-shift), shift); memmove(base+shift, base, len-shift); memcpy(base, hold_region, shift); + free(hold_region); } /* ARGSUSED */ diff --git a/io/parent.c b/io/parent.c index 47faaa0..ca989e9 100644 --- a/io/parent.c +++ b/io/parent.c @@ -258,6 +258,8 @@ parent_check(void) if (!bstatbuf || !parentbuf) { fprintf(stderr, _("unable to allocate buffers: %s\n"), strerror(errno)); + free(bstatbuf); + free(parentbuf); return 1; } diff --git a/mkfs/proto.c b/mkfs/proto.c index b7e0761..95583c9 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -49,7 +49,7 @@ char * setup_proto( char *fname) { - char *buf; + char *buf = NULL; static char dflt[] = "d--755 0 0 $"; int fd; long size; @@ -85,6 +85,7 @@ setup_proto( out_fail: close(fd); + free(buf); exit(1); } -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:25:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8848F80D3 for ; Tue, 8 Apr 2014 18:25:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 810AF30408C for ; Tue, 8 Apr 2014 16:25:27 -0700 (PDT) X-ASG-Debug-ID: 1396999519-04cbb00dc317160001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id M0R1qt3CbEsE84dB for ; Tue, 08 Apr 2014 16:25:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 1630C63BEED7; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 09/14] xfsprogs: annotate a case fallthrough in libxfs_ialloc Date: Tue, 8 Apr 2014 18:24:59 -0500 X-ASG-Orig-Subj: [PATCH 09/14] xfsprogs: annotate a case fallthrough in libxfs_ialloc Message-Id: <1396999504-13769-10-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999519 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is all working as intended, but add a comment to make it more obvious to readers and static code checkers. Signed-off-by: Eric Sandeen --- libxfs/util.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/libxfs/util.c b/libxfs/util.c index f1aa4c6..1e48079 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -265,6 +265,7 @@ libxfs_ialloc( case S_IFSOCK: /* doesn't make sense to set an rdev for these */ rdev = 0; + /* FALLTHROUGH */ case S_IFCHR: case S_IFBLK: ip->i_d.di_format = XFS_DINODE_FMT_DEV; -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:25:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C8F7180DB for ; Tue, 8 Apr 2014 18:25:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A5DE68F8065 for ; Tue, 8 Apr 2014 16:25:24 -0700 (PDT) X-ASG-Debug-ID: 1396999507-04cb6c77b614fc0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HajT6nIvdNqDCRBa for ; Tue, 08 Apr 2014 16:25:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 6196E63C59A4; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 00/14] xfsprogs: varius & sundry fixes for coverity defects Date: Tue, 8 Apr 2014 18:24:50 -0500 X-ASG-Orig-Subj: [PATCH 00/14] xfsprogs: varius & sundry fixes for coverity defects Message-Id: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999510 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This series knocks out 30 or so coverity defects. From sandeen@sandeen.net Tue Apr 8 18:25:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E098A80DD for ; Tue, 8 Apr 2014 18:25:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA8458F8092 for ; Tue, 8 Apr 2014 16:25:24 -0700 (PDT) X-ASG-Debug-ID: 1396999515-04cb6c77b714ff0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UUKtBEO9VouAvUQ9 for ; Tue, 08 Apr 2014 16:25:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id D1C2763BE57F; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 06/14] xfs_quota: fix memory leak in quota_group_type() error path Date: Tue, 8 Apr 2014 18:24:56 -0500 X-ASG-Orig-Subj: [PATCH 06/14] xfs_quota: fix memory leak in quota_group_type() error path Message-Id: <1396999504-13769-7-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999515 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- quota_group_type has some rather contorted logic that's been around since 2005. In the (!name) case, if any of the 3 calls setting up ngroups fails, we fall back to using just one group. However, if it's the getgroups() call that fails, we overwrite the allocated gid ptr with &gid, thus leaking that allocated memory. Worse, we set "dofree" to 1, so will free non-allocated local var gid. And that last else case is redundant; if we get there, gids is guaranteed to be non-null. Refactor it a bit to be more clear (I hope) and correct. Signed-off-by: Eric Sandeen --- quota/quota.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) diff --git a/quota/quota.c b/quota/quota.c index 7e52ad2..367da8c 100644 --- a/quota/quota.c +++ b/quota/quota.c @@ -289,15 +289,19 @@ quota_group_type( } gids = &gid; ngroups = 1; - } else if ( ((ngroups = sysconf(_SC_NGROUPS_MAX)) < 0) || - ((gids = malloc(ngroups * sizeof(gid_t))) == NULL) || - ((ngroups = getgroups(ngroups, gids)) < 0)) { - dofree = (gids != NULL); - gid = getgid(); - gids = &gid; - ngroups = 1; } else { - dofree = (gids != NULL); + if ( ((ngroups = sysconf(_SC_NGROUPS_MAX)) < 0) || + ((gids = malloc(ngroups * sizeof(gid_t))) == NULL) || + ((ngroups = getgroups(ngroups, gids)) < 0)) { + /* something failed. Fall back to 1 group */ + free(gids); + gid = getgid(); + gids = &gid; + ngroups = 1; + } else { + /* It all worked, and we allocated memory */ + dofree = 1; + } } for (i = 0; i < ngroups; i++, name = NULL) { -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:25:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D1BF480E7 for ; Tue, 8 Apr 2014 18:25:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA155304089 for ; Tue, 8 Apr 2014 16:25:37 -0700 (PDT) X-ASG-Debug-ID: 1396999507-04cbb00dc317140001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Ld11IcOboN44jPE9 for ; Tue, 08 Apr 2014 16:25:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id AFDB063C3A3D; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 04/14] xfsprogs: fix memory leak in xlog_recover_add_to_trans Date: Tue, 8 Apr 2014 18:24:54 -0500 X-ASG-Orig-Subj: [PATCH 04/14] xfsprogs: fix memory leak in xlog_recover_add_to_trans Message-Id: <1396999504-13769-5-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999509 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Free the memory in error path of xlog_recover_add_to_trans(). Normally this memory is freed in recovery pass2, but is leaked in the error path. Userspace version of kernel commits 519ccb8 & aaaae98 Signed-off-by: Eric Sandeen --- libxlog/xfs_log_recover.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index 3f22921..d1fa535 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -1131,6 +1131,7 @@ xlog_recover_add_to_trans( "bad number of regions (%d) in inode log format", in_f->ilf_size); ASSERT(0); + kmem_free(ptr); return XFS_ERROR(EIO); } -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:25:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FA4280EE for ; Tue, 8 Apr 2014 18:25:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 491D28F8087 for ; Tue, 8 Apr 2014 16:25:49 -0700 (PDT) X-ASG-Debug-ID: 1396999515-04cb6c77b714ff0002-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id af072kPwL2yXZ68g for ; Tue, 08 Apr 2014 16:25:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 635C763BEBE7; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 13/14] mkfs: catch unknown format in protofile parsing Date: Tue, 8 Apr 2014 18:25:03 -0500 X-ASG-Orig-Subj: [PATCH 13/14] mkfs: catch unknown format in protofile parsing Message-Id: <1396999504-13769-14-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999521 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- As the code stands today we can't get an unknown format in the last case statement, but Coverity warns that if we ever do, we'll use an uninitialized "ip" in the call to libxfs_trans_log_inode(). Adding a default: case to catch unknown formats is defensive and makes the checker happy. Signed-off-by: Eric Sandeen --- mkfs/proto.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/mkfs/proto.c b/mkfs/proto.c index 95583c9..308325b 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -591,6 +591,9 @@ parseproto( } libxfs_iput(ip, 0); return; + default: + ASSERT(0); + fail(_("Unknown format"), EINVAL); } libxfs_trans_log_inode(tp, ip, flags); error = libxfs_bmap_finish(&tp, &flist, &committed); -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:26:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CC1A8110 for ; Tue, 8 Apr 2014 18:26:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 964508F8065 for ; Tue, 8 Apr 2014 16:26:43 -0700 (PDT) X-ASG-Debug-ID: 1396999596-04cbb00dc617270001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id zCLgijN3R4LMr12E for ; Tue, 08 Apr 2014 16:26:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 5207863BECC5; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 12/14] xfs_repair: address never-true tests in repair/bmap.c on 64 bit Date: Tue, 8 Apr 2014 18:25:02 -0500 X-ASG-Orig-Subj: [PATCH 12/14] xfs_repair: address never-true tests in repair/bmap.c on 64 bit Message-Id: <1396999504-13769-13-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999596 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The test "if (new_naexts > BLKMAP_NEXTS_MAX)" is never true on a 64-bit platform; new_naexts is an int, and BLKMAP_NEXTS_MAX is INT_MAX. So just wrap the whole thing in the #ifdef. Signed-off-by: Eric Sandeen --- repair/bmap.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/repair/bmap.c b/repair/bmap.c index 85d66dc..b81efb9 100644 --- a/repair/bmap.c +++ b/repair/bmap.c @@ -47,16 +47,16 @@ blkmap_alloc( if (nex < 1) nex = 1; +#if (BITS_PER_LONG == 32) /* on 64-bit platformsethis is never true */ if (nex > BLKMAP_NEXTS_MAX) { -#if (BITS_PER_LONG == 32) do_warn( _("Number of extents requested in blkmap_alloc (%d) overflows 32 bits.\n" "If this is not a corruption, then you will need a 64 bit system\n" "to repair this filesystem.\n"), nex); -#endif return NULL; } +#endif key = whichfork ? ablkmap_key : dblkmap_key; blkmap = pthread_getspecific(key); @@ -267,15 +267,15 @@ blkmap_grow( ASSERT(pthread_getspecific(key) == blkmap); } +#if (BITS_PER_LONG == 32) /* on 64-bit platforms this is never true */ if (new_naexts > BLKMAP_NEXTS_MAX) { -#if (BITS_PER_LONG == 32) do_error( _("Number of extents requested in blkmap_grow (%d) overflows 32 bits.\n" "You need a 64 bit system to repair this filesystem.\n"), new_naexts); -#endif return NULL; } +#endif if (new_naexts <= 0) { do_error( _("Number of extents requested in blkmap_grow (%d) overflowed the\n" -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:26:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 56E4D8118 for ; Tue, 8 Apr 2014 18:26:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4E64A8F8089 for ; Tue, 8 Apr 2014 16:26:47 -0700 (PDT) X-ASG-Debug-ID: 1396999597-04cb6c77b415080001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UBMlr7aiEZenmB1l for ; Tue, 08 Apr 2014 16:26:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 7456263BEA5D; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 14/14] xfs_db: don't use invalid index in ring_f Date: Tue, 8 Apr 2014 18:25:04 -0500 X-ASG-Orig-Subj: [PATCH 14/14] xfs_db: don't use invalid index in ring_f Message-Id: <1396999504-13769-15-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999597 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ring_f() tests for an invalid index which would overrun the iocur_ring[] array and warns, but then uses it anyway. Return immediately if it's out of bounds. Signed-off-by: Eric Sandeen --- db/io.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/db/io.c b/db/io.c index 9a787c8..6aba54e 100644 --- a/db/io.c +++ b/db/io.c @@ -358,8 +358,10 @@ ring_f( } index = (int)strtoul(argv[1], NULL, 0); - if (index < 0 || index >= RING_ENTRIES) + if (index < 0 || index >= RING_ENTRIES) { dbprintf(_("invalid entry: %d\n"), index); + return 0; + } ring_current = index; -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:26:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A91288118 for ; Tue, 8 Apr 2014 18:26:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A16A58F808E for ; Tue, 8 Apr 2014 16:26:47 -0700 (PDT) X-ASG-Debug-ID: 1396999596-04cbb00dc317260001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GKPddzkov9B30Exu for ; Tue, 08 Apr 2014 16:26:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 402B463BECB9; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 11/14] xfs_quota: remove impossible tests in printpath Date: Tue, 8 Apr 2014 18:25:01 -0500 X-ASG-Orig-Subj: [PATCH 11/14] xfs_quota: remove impossible tests in printpath Message-Id: <1396999504-13769-12-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999596 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- printpath() had some cut & paste tests of "c" - but nothing had set it yet other than c=0, so testing it is pointless. Just remove tests for non-zero "c" until we might have set it to something interesting. Signed-off-by: Eric Sandeen --- quota/path.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quota/path.c b/quota/path.c index e9a6834..47fdd93 100644 --- a/quota/path.c +++ b/quota/path.c @@ -54,9 +54,9 @@ printpath( c = 0; printf(" ("); if (qstat.qs_flags & XFS_QUOTA_UDQ_ENFD) - c = printf("%suquota", c ? ", " : ""); + c = printf("uquota"); else if (qstat.qs_flags & XFS_QUOTA_UDQ_ACCT) - c = printf("%suqnoenforce", c ? ", " : ""); + c = printf("uqnoenforce"); if (qstat.qs_flags & XFS_QUOTA_GDQ_ENFD) c = printf("%sgquota", c ? ", " : ""); else if (qstat.qs_flags & XFS_QUOTA_GDQ_ACCT) -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:26:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C6F448128 for ; Tue, 8 Apr 2014 18:26:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF0AF30408D for ; Tue, 8 Apr 2014 16:26:48 -0700 (PDT) X-ASG-Debug-ID: 1396999599-04cbb00dc517280001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 3AcCcrB0TI4wfZUH for ; Tue, 08 Apr 2014 16:26:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 0335D63BE835; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space error paths Date: Tue, 8 Apr 2014 18:24:58 -0500 X-ASG-Orig-Subj: [PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space error paths Message-Id: <1396999504-13769-9-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999599 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 The bmap freelist & transaction pointer weren't being freed in libxfs_alloc_file_space error paths; more or less copy the error handling that exists in kernelspace to resolve this. Signed-off-by: Eric Sandeen --- libxfs/util.c | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libxfs/util.c b/libxfs/util.c index 1b05540..f1aa4c6 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -582,8 +582,17 @@ libxfs_alloc_file_space( resblks = (uint)XFS_DIOSTRAT_SPACE_RES(mp, datablocks); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, resblks, 0); - if (error) + /* + * Check for running out of space + */ + if (error) { + /* + * Free the transaction structure. + */ + ASSERT(error == ENOSPC); /* XXX ERS? */ + xfs_trans_cancel(tp, 0); break; + } xfs_trans_ijoin(tp, ip, 0); xfs_trans_ihold(tp, ip); @@ -593,12 +602,12 @@ libxfs_alloc_file_space( &reccount, &free_list); if (error) - break; + goto error0; /* complete the transaction */ error = xfs_bmap_finish(&tp, &free_list, &committed); if (error) - break; + goto error0; error = xfs_trans_commit(tp, 0); if (error) @@ -612,6 +621,11 @@ libxfs_alloc_file_space( allocatesize_fsb -= allocated_fsb; } return error; + +error0: /* Cancel bmap, unlock inode, cancel trans */ + xfs_bmap_cancel(&free_list); + xfs_trans_cancel(tp, 0); + return error; } unsigned int -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:27:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 207BA8131 for ; Tue, 8 Apr 2014 18:27:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 19D0F8F8081 for ; Tue, 8 Apr 2014 16:26:54 -0700 (PDT) X-ASG-Debug-ID: 1396999597-04cbb00dc417270001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id siocwZOc8k1r0l9k for ; Tue, 08 Apr 2014 16:26:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 296E663BEED8; Tue, 8 Apr 2014 18:25:07 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 10/14] xfsprogs: fix too-large memset value in xfs_db's attr code Date: Tue, 8 Apr 2014 18:25:00 -0500 X-ASG-Orig-Subj: [PATCH 10/14] xfsprogs: fix too-large memset value in xfs_db's attr code Message-Id: <1396999504-13769-11-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999597 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- memset(value, 0xfeedface, valuelen); seemed to be trying to fill a new attr with some recognizeable magic, but of course memset can only set a single byte; switch this to use 'v' Signed-off-by: Eric Sandeen --- db/attrset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/db/attrset.c b/db/attrset.c index 75be72e..762b3bf 100644 --- a/db/attrset.c +++ b/db/attrset.c @@ -146,7 +146,7 @@ attr_set_f( dbprintf(_("cannot allocate buffer (%d)\n"), valuelen); goto out; } - memset(value, 0xfeedface, valuelen); + memset(value, 'v', valuelen); } else { value = NULL; } -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:27:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 685EE8131 for ; Tue, 8 Apr 2014 18:27:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 60B8530407B for ; Tue, 8 Apr 2014 16:26:55 -0700 (PDT) X-ASG-Debug-ID: 1396999594-04cbb00dc417260001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dnSEe1D284nDHupR for ; Tue, 08 Apr 2014 16:26:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 9166263C3B03; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 02/14] xfsprogs: refactor fsrall_cleanup in xfs_fsr Date: Tue, 8 Apr 2014 18:24:52 -0500 X-ASG-Orig-Subj: [PATCH 02/14] xfsprogs: refactor fsrall_cleanup in xfs_fsr Message-Id: <1396999504-13769-3-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999594 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- fsrall_cleanup leaked an fd in the non-timeout case - but the logic was weird and tortured, refactor it to make more sense and fix the fd leak as well. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 6b5d260..3818f02 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -647,14 +647,19 @@ fsrall_cleanup(int timeout) int ret; char buf[SMBUFSZ]; - /* record where we left off */ unlink(leftofffile); - fd = open(leftofffile, O_WRONLY|O_CREAT|O_EXCL, 0644); - if (fd == -1) - fsrprintf(_("open(%s) failed: %s\n"), - leftofffile, strerror(errno)); - else { - if (timeout) { + + if (timeout) { + fsrprintf(_("%s startpass %d, endpass %d, time %d seconds\n"), + progname, startpass, fs->npass, + time(0) - endtime + howlong); + + /* record where we left off */ + fd = open(leftofffile, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd == -1) { + fsrprintf(_("open(%s) failed: %s\n"), + leftofffile, strerror(errno)); + } else { ret = sprintf(buf, "%s %d %llu\n", fs->dev, fs->npass, (unsigned long long)leftoffino); if (write(fd, buf, ret) < strlen(buf)) @@ -663,11 +668,6 @@ fsrall_cleanup(int timeout) close(fd); } } - - if (timeout) - fsrprintf(_("%s startpass %d, endpass %d, time %d seconds\n"), - progname, startpass, fs->npass, - time(0) - endtime + howlong); } /* -- 1.7.1 From sandeen@sandeen.net Tue Apr 8 18:27:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 704E08141 for ; Tue, 8 Apr 2014 18:27:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 63E5230408C for ; Tue, 8 Apr 2014 16:27:00 -0700 (PDT) X-ASG-Debug-ID: 1396999590-04cb6c77b715070001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id CdnrK5JkLlG8gwtq for ; Tue, 08 Apr 2014 16:26:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id BFC9263BE57E; Tue, 8 Apr 2014 18:25:06 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 05/14] libxfs: fix memory leak in xfs_dir2_node_removename Date: Tue, 8 Apr 2014 18:24:55 -0500 X-ASG-Orig-Subj: [PATCH 05/14] libxfs: fix memory leak in xfs_dir2_node_removename Message-Id: <1396999504-13769-6-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396999590 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix the leak of kernel memory in xfs_dir2_node_removename() when xfs_dir2_leafn_remove() returns an error code. Cross-port of kernel commit 3a8c9208 Signed-off-by: Eric Sandeen --- libxfs/xfs_dir2_node.c | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 3256756..3737e4e 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -2088,12 +2088,12 @@ xfs_dir2_node_lookup( */ int /* error */ xfs_dir2_node_removename( - xfs_da_args_t *args) /* operation arguments */ + struct xfs_da_args *args) /* operation arguments */ { - xfs_da_state_blk_t *blk; /* leaf block */ + struct xfs_da_state_blk *blk; /* leaf block */ int error; /* error return value */ int rval; /* operation return value */ - xfs_da_state_t *state; /* btree cursor */ + struct xfs_da_state *state; /* btree cursor */ trace_xfs_dir2_node_removename(args); @@ -2105,19 +2105,18 @@ xfs_dir2_node_removename( state->mp = args->dp->i_mount; state->blocksize = state->mp->m_dirblksize; state->node_ents = state->mp->m_dir_node_ents; - /* - * Look up the entry we're deleting, set up the cursor. - */ + + /* Look up the entry we're deleting, set up the cursor. */ error = xfs_da3_node_lookup_int(state, &rval); if (error) - rval = error; - /* - * Didn't find it, upper layer screwed up. - */ + goto out_free; + + /* Didn't find it, upper layer screwed up. */ if (rval != EEXIST) { - xfs_da_state_free(state); - return rval; + error = rval; + goto out_free; } + blk = &state->path.blk[state->path.active - 1]; ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); ASSERT(state->extravalid); @@ -2128,7 +2127,7 @@ xfs_dir2_node_removename( error = xfs_dir2_leafn_remove(args, blk->bp, blk->index, &state->extrablk, &rval); if (error) - return error; + goto out_free; /* * Fix the hash values up the btree. */ @@ -2143,6 +2142,7 @@ xfs_dir2_node_removename( */ if (!error) error = xfs_dir2_node_to_leaf(state); +out_free: xfs_da_state_free(state); return error; } -- 1.7.1 From david@fromorbit.com Tue Apr 8 18:35:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 900888108 for ; Tue, 8 Apr 2014 18:35:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 82B038F8092 for ; Tue, 8 Apr 2014 16:35:06 -0700 (PDT) X-ASG-Debug-ID: 1397000095-04cb6c77b515700001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id cr5X08Mu6lTndm7i for ; Tue, 08 Apr 2014 16:34: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: AkBqAIyGRFN5LEcvPGdsb2JhbABZgwY7gxCFC6NEAgeTUoZ3FwMBAQEBODWCZhw7JDQFJQMHLYd7mWmxJhaOc4QiBJhclgMr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2014 09:04:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXfXW-0000WZ-70 for xfs@oss.sgi.com; Wed, 09 Apr 2014 09:34:50 +1000 Date: Wed, 9 Apr 2014 09:34:50 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to f994d14 Message-ID: <20140408233450.GL27017@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to f994d14 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397000098 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: f994d14 xfs_repair: fix prefetch queue waiting New Commits: Dave Chinner (1): [419d647] repair: ensure that unused superblock fields are zeroed David Sterba (1): [1b3c0d6] xfsprogs: add a missing QA header file to install-qa target Eric Sandeen (2): [857592d] xfs_db: hide debug bbmap output [f994d14] xfs_repair: fix prefetch queue waiting Mark Tinguely (1): [0a3717c] xfsprogs: fix directory hash ordering bug Code Diffstat: db/io.c | 2 +- include/Makefile | 1 + libxfs/xfs_da_btree.c | 2 +- repair/prefetch.c | 4 +++- repair/sb.c | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 8 19:05:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B4E18149 for ; Tue, 8 Apr 2014 19:05:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8C9AE8F8092 for ; Tue, 8 Apr 2014 17:04:57 -0700 (PDT) X-ASG-Debug-ID: 1397001881-04cb6c77b516d50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ZVYDjWsM5GFHSAFV for ; Tue, 08 Apr 2014 17:04:42 -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: AjxcAN+IRFN5LEcvPGdsb2JhbABZgwaDS4ULtx+FXYEaFwMBAQEBODWCJQEBAQQ6HCMQCAMOCgklDwUNGAMHGhOHaAMQxCENhksXFow9ghkHhDgElm+BbYxyiREr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2014 09:13:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXfgI-0000Y2-W6; Wed, 09 Apr 2014 09:43:55 +1000 Date: Wed, 9 Apr 2014 09:43:54 +1000 From: Dave Chinner To: Ming Chen Cc: xfs@oss.sgi.com, Erez Zadok Subject: Re: [PATCH] xfstest: log operations properly to generic/001.full Message-ID: <20140408234354.GM27017@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstest: log operations properly to generic/001.full References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397001881 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4703 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Sat, Apr 05, 2014 at 01:52:43AM -0400, Ming Chen wrote: > Part of the operations were written to 001.full from the awk script, while the > rest were piped to 001.full using tee. The resultant 001.full did not reflect > what are really performed. This makes debugging difficult. > > Signed-off-by: Ming Chen > --- > tests/generic/001 | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/tests/generic/001 b/tests/generic/001 > index 6e5f3dd..e1142ed 100755 > --- a/tests/generic/001 > +++ b/tests/generic/001 > @@ -190,7 +190,7 @@ _mark_iteration() > # > _chain() > { > - $AWK_PROG -v full_file=$seqres.full -v verify=$verify <$tmp.config ' > + $AWK_PROG -v verify=$verify <$tmp.config ' > BEGIN { nfile = 0 } > /^\#/ { next } > { file[nfile] = $1 > @@ -210,7 +210,7 @@ END { srand('$iter') > printf "if [ ! -f %s ]; then echo \"%s missing!\"; > exit; fi\n",file[j],file[j] > printf "if [ -f %s.0 ]; then echo \"%s.0 already > present!\"; exit; fi\n",file[j],file[j] Your mailer program has line wrapped the patch and converted all the tabs to spaces. I've fixed it up this time, but please read the Documentation/SubmittingPatches file in the kernel tree to learn how to prevent this from happening in future. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 8 19:28:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E96318152 for ; Tue, 8 Apr 2014 19:28:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D18763040EB for ; Tue, 8 Apr 2014 17:27:58 -0700 (PDT) X-ASG-Debug-ID: 1397002418-04cb6c77b417620001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iSSFLgZO51IAwZv8 for ; Tue, 08 Apr 2014 17:13:39 -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: Ak5qAOyPRFN5LEcvPGdsb2JhbABZgwY7gxCFC6NEAgeTUoVdgRsXAwEBAQE4NYJmHCMYJDQFJQMHLYd7ywkWjlYdhCIEmFyWAys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2014 09:42:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXg7e-0000eU-Gt; Wed, 09 Apr 2014 10:12:10 +1000 Date: Wed, 9 Apr 2014 10:12:10 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to 610e44c Message-ID: <20140409001210.GO27017@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 610e44c MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397002418 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4703 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. This update fixes the SCRATCH_DEV_POOL config file regression. The new head of the master branch is commit: 610e44c check: fix wallclock wrapping problem New Commits: Lukas Czerner (3): [f00a444] config: Fix SCRATCH_DEV_POOL handling [7407717] config: Unset SCRATCH_DEV when deduced from SCRATCH_DEV_POOL [e0f5daf] config: Fix setting FSTYP automatically Wanlong Gao (1): [610e44c] check: fix wallclock wrapping problem Code Diffstat: check | 10 +--------- common/config | 33 ++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 16 deletions(-) -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 8 19:43:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 107D729E28 for ; Tue, 8 Apr 2014 19:43:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2AAC304110 for ; Tue, 8 Apr 2014 17:43:30 -0700 (PDT) X-ASG-Debug-ID: 1397004194-04cb6c77b418970001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id YitgFc7cwQTFTq19 for ; Tue, 08 Apr 2014 17:43:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjxcALiORFN5LEcvPGdsb2JhbABZgwaDS4ULtx+FXYEbFwMBAQEBODWCJQEBAQQ6HCMQCAMOCgklDwUNGAMHGhOHaAMQxBgNhksXFow9ghkHhDgElm+BbYxyiREr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Apr 2014 09:38:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WXg3l-0000cj-V2; Wed, 09 Apr 2014 10:08:09 +1000 Date: Wed, 9 Apr 2014 10:08:09 +1000 From: Dave Chinner To: Ming Chen Cc: xfs@oss.sgi.com, Erez Zadok Subject: Re: [PATCH] xfstest: log operations properly to generic/001.full Message-ID: <20140409000809.GN27017@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstest: log operations properly to generic/001.full References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397004194 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Sat, Apr 05, 2014 at 01:52:43AM -0400, Ming Chen wrote: > Part of the operations were written to 001.full from the awk script, while the > rest were piped to 001.full using tee. The resultant 001.full did not reflect > what are really performed. This makes debugging difficult. > > Signed-off-by: Ming Chen This patch causes generic/001 to fail because it pushes all the debug into the output file as well as the generic/001.full file. diff -u tests/generic/001.out /home/dave/src/xfstests-dev/results//generic/001.out.bad --- tests/generic/001.out 2014-01-20 16:57:33.000000000 +1100 +++ /home/dave/src/xfstests-dev/results//generic/001.out.bad 2014-04-09 09:58:34.000000000 +1000 @@ -1,9 +1,1189 @@ QA output created by 001 cleanup setup .................................... -iter 1 chain ... check .................................... -iter 2 chain ... check .................................... -iter 3 chain ... check .................................... -iter 4 chain ... check .................................... -iter 5 chain ... check .................................... +iter 1 chain ... 2320100 sub/e.0 +2320101 sub/g.0 +2320102 sub/m00.0 +2320103 sub/b.0 +2320104 sub/d00.0 +2320105 sub/c.0 +2320106 sub/l00.0 +2320107 sub/c.1 ..... I'm going to drop this patch because it breaks a previously working test.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From v.mingchen@gmail.com Tue Apr 8 20:04:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4812D29E30 for ; Tue, 8 Apr 2014 20:04:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 392D03040E9 for ; Tue, 8 Apr 2014 18:04:04 -0700 (PDT) X-ASG-Debug-ID: 1397005418-04cb6c77b619610001-NocioJ Received: from mail-ie0-f173.google.com (mail-ie0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id VmnvFQqDv1LyL9Wo (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 18:03:38 -0700 (PDT) X-Barracuda-Envelope-From: v.mingchen@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 rl12so1794914iec.32 for ; Tue, 08 Apr 2014 18:03:38 -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:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=D0DXjTjGc1ryiHuerXLs9nW9c/blpCUezHRKZjUUkzI=; b=Tn1V/f0/hZcLMCeXlvBf3xRRLTUtm+hEcUpWrc5+dJouYw+7uM/VgHblWxWBDSN8Dy +EbvD/qfjy9+uqUTFZ1oSIXcI+BYe0ndznb6c8yOYDYX9uon8mV3TqA1BGRVmf1G8uJm t+phHO9fT9NPbKXn9zQE3+TyYzrjO3qvQXWSykA+prpRwkz3h8LOes1RjhTEYziRRAXN o0uUg+7s1jt9Q5QaGc3ODwoP5+z7alPsW2WyKF51fasI/uXgwBAuM3yF73UKYA3CI8tX Ngpv/jFpvezEoFyuVu27CW02KjjgVExRbxbadbWEKC4otqK9LD/uBpLknBHi6b4lqfki lgyQ== MIME-Version: 1.0 X-Received: by 10.42.131.197 with SMTP id a5mr5563002ict.8.1397002165542; Tue, 08 Apr 2014 17:09:25 -0700 (PDT) Received: by 10.64.159.5 with HTTP; Tue, 8 Apr 2014 17:09:25 -0700 (PDT) In-Reply-To: <20140408234354.GM27017@dastard> References: <20140408234354.GM27017@dastard> Date: Tue, 8 Apr 2014 20:09:25 -0400 Message-ID: Subject: Re: [PATCH] xfstest: log operations properly to generic/001.full From: Ming Chen X-ASG-Orig-Subj: Re: [PATCH] xfstest: log operations properly to generic/001.full To: Dave Chinner Cc: Erez Zadok , xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ie0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1397005418 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4705 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 Tue, Apr 8, 2014 at 7:43 PM, Dave Chinner wrote: > > Your mailer program has line wrapped the patch and converted all the > tabs to spaces. I've fixed it up this time, but please read the > Documentation/SubmittingPatches file in the kernel tree to learn how > to prevent this from happening in future. > Sorry, I did not notice. Thanks for the fix and the reference. Best, Ming From v.mingchen@gmail.com Tue Apr 8 20:32:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=DATE_IN_PAST_03_06, 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 A37C37F3F for ; Tue, 8 Apr 2014 20:32:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96F898F80E3 for ; Tue, 8 Apr 2014 18:32:27 -0700 (PDT) X-ASG-Debug-ID: 1397007134-04cbb00dc61cad0001-NocioJ Received: from mail-qc0-f179.google.com (mail-qc0-f179.google.com [209.85.216.179]) by cuda.sgi.com with ESMTP id iNcrFf6MFPEJ3W1x (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 08 Apr 2014 18:32:16 -0700 (PDT) X-Barracuda-Envelope-From: v.mingchen@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.179] Received: by mail-qc0-f179.google.com with SMTP id m20so2090295qcx.10 for ; Tue, 08 Apr 2014 18:32:14 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=3VZper/pDOfnQ/YRKkKAFKNL/Y+3Nhxd/2HV4vXNPPE=; b=gxseG6+9gXJH1p2eAPPnvVpuE8LaMbS7R3OjWcCDK4oQvLgCEOzbHX5xun6CV49FgT bd4gUj2Xd9yH+Kuhg+uBc0pmaciQWSrssaSe/yffynny4MJzexeEWiCDe9yv8fv9rSF7 7qwdtm7C2gEHsIY/+XLVAKdg8vhcl/qXyndb3xDsqgtMjbWKEdn3PbAPPnYHBg3Yb8x5 z3gSp36hxKyHgrPgDYxQgrkQJKCEiceIkAU7fuBPvaGTNkmp9v0HAXCLrMwlNbY9tdOy 1Q3T5uoWjs/o+fPDdwwIvNwR4zSTHpq0MB9vdEFGV635eV5LAk8bi2Hm2ci4jHHLD/wB I4YA== X-Received: by 10.140.91.105 with SMTP id y96mr8560564qgd.3.1397007134342; Tue, 08 Apr 2014 18:32:14 -0700 (PDT) Received: from nfs4sec.fsl.cs.sunysb.edu (dhcp201.fsl.cs.sunysb.edu. [130.245.126.201]) by mx.google.com with ESMTPSA id r5sm7373400qaj.24.2014.04.08.18.32.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 Apr 2014 18:32:13 -0700 (PDT) From: Ming Chen To: xfs@oss.sgi.com, david@fromorbit.com Cc: ezk@fsl.cs.sunysb.edu, Ming Chen Subject: [PATCH v2] xfstest: log operations properly to generic/001.full Date: Tue, 8 Apr 2014 17:31:21 -0400 X-ASG-Orig-Subj: [PATCH v2] xfstest: log operations properly to generic/001.full Message-Id: <1396992681-9757-1-git-send-email-v.mingchen@gmail.com> X-Mailer: git-send-email 1.8.4.2 X-Barracuda-Connect: mail-qc0-f179.google.com[209.85.216.179] X-Barracuda-Start-Time: 1397007136 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.69 X-Barracuda-Spam-Status: No, SCORE=1.69 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_03_06, DATE_IN_PAST_03_06_2, DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4705 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2 Part of the operations were written to 001.full from the awk script, while the rest were piped to 001.full using tee. The resultant 001.full did not reflect what are really performed. This makes debugging difficult. The output of executing 001.full is discarded. Tested-by: Ming Chen Signed-off-by: Ming Chen --- tests/generic/001 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/generic/001 b/tests/generic/001 index 6e5f3dd..6a10810 100755 --- a/tests/generic/001 +++ b/tests/generic/001 @@ -190,7 +190,7 @@ _mark_iteration() # _chain() { - $AWK_PROG -v full_file=$seqres.full -v verify=$verify <$tmp.config ' + $AWK_PROG -v verify=$verify <$tmp.config ' BEGIN { nfile = 0 } /^\#/ { next } { file[nfile] = $1 @@ -210,7 +210,7 @@ END { srand('$iter') printf "if [ ! -f %s ]; then echo \"%s missing!\"; exit; fi\n",file[j],file[j] printf "if [ -f %s.0 ]; then echo \"%s.0 already present!\"; exit; fi\n",file[j],file[j] printf "cp %s %s.0 || exit 1\n",file[j],file[j] - printf "ls -i %s.0\n", file[j] >full_file; + printf "ls -i %s.0 > /dev/null\n", file[j]; total_size += size[j] printf "# total size = %d\n", total_size } @@ -219,7 +219,7 @@ END { srand('$iter') printf "if [ ! -f %s.%d ]; then echo \"%s.%d missing!\"; exit; fi\n",file[j],link[j]-1,file[j],link[j]-1 printf "if [ -f %s.%d ]; then echo \"%s.%d already present!\"; exit; fi\n",file[j],link[j],file[j],link[j] printf "cp %s.%d %s.%d || exit 1\n",file[j],link[j]-1,file[j],link[j] - printf "ls -i %s.%d\n", file[j], link[j] >full_file; + printf "ls -i %s.%d > /dev/null\n", file[j], link[j]; total_size += size[j] printf "# total size = %d\n", total_size } @@ -231,7 +231,7 @@ END { srand('$iter') for (j=0; j 0) { printf "mv %s.%d %s.last\n",file[j],link[j]-1,file[j] - printf "ls -i %s.last\n", file[j] >full_file; + printf "ls -i %s.last > /dev/null\n", file[j]; } for (i=0; i X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.3 required=5.0 tests=HTML_COMMENT_SAVED_URL, HTML_IMAGE_RATIO_04,HTML_MESSAGE,RCVD_NUMERIC_HELO,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 10B418140 for ; Wed, 9 Apr 2014 03:45:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AFC55AC019 for ; Wed, 9 Apr 2014 01:45:44 -0700 (PDT) X-ASG-Debug-ID: 1397033138-04bdf07dcc2ac20001-NocioJ Received: from server.livemailz.com (server.livemailz.com [115.124.106.32]) by cuda.sgi.com with ESMTP id FU7FRPg6qnuW9zxl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 09 Apr 2014 01:45:40 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@getit18.livemailz.com X-Barracuda-Apparent-Source-IP: 115.124.106.32 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=getit18.livemailz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=pAgMZWukul2PSmc7a/qhJbykS+nI/7qe98Jk6x59uNE=; b=T02rh09E89imH3563Aq+ev5j8ue1UM13RLjGP4uQilVA62EnNbETmL3QtZQf2kxoCtkGT1JbUfVthZ0asoK3aRFCezh6CLGll2JEjxYxcm5MpsHOCcr7JklNkLTIdykHPXfRvVc/J0rOV8tYUAvDQmM1RAhc1UNHiqjdlPVRp+E=; Received: from getit18l by server.livemailz.com with local (Exim 4.82) (envelope-from ) id 1WXo8W-0001Ld-19 for xfs@oss.sgi.com; Wed, 09 Apr 2014 14:15:36 +0530 To: xfs@oss.sgi.com Subject: Corporate Visting Card for Your Business at 75 paise X-PHP-Script: getit18.livemailz.com/mailz/admin/index.php for 123.236.196.43 X-ASG-Orig-Subj: Corporate Visting Card for Your Business at 75 paise Received: from 123.236.196.43 [123.236.196.43] by getit18.livemailz.com with HTTP; Wed, 09 Apr 2014 07:52:40 +0000 Date: Wed, 9 Apr 2014 08:45:36 +0000 From: Vistaprint Reply-To: Vistaprint Message-ID: <0535aefc6074e625ece9eb409c9923bd@getit18.livemailz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.5 X-MessageID: 6 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@getit18.livemailz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_0535aefc6074e625ece9eb409c9923bd" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.livemailz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [526 32007] / [47 12] X-AntiAbuse: Sender Address Domain - getit18.livemailz.com X-Get-Message-Sender-Via: server.livemailz.com: authenticated_id: getit18l/from_h X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/getit18l/public_html/mailz/admin/index.php X-Source-Dir: getit18.livemailz.com:/public_html/mailz/admin X-Barracuda-Connect: server.livemailz.com[115.124.106.32] X-Barracuda-Start-Time: 1397033139 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.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=DKIM_SIGNED, DKIM_VERIFIED, HTML_COMMENT_SAVED_URL, HTML_IMAGE_RATIO_04, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.36 HTML_COMMENT_SAVED_URL BODY: HTML message is a saved web page 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.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO --b1_0535aefc6074e625ece9eb409c9923bd Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Visiitng Cards Get the Finest Quality & Full Colour Printed Visiting Card at 75 paise! Please don't reply to this email as it's an unmonitored address. Discounts may vary by quantity and apply to select designs. Additional charges may apply for shipping/processing,=20 upgrades and uploads, unless otherwise specified. Discounts valid only on lowest quantity of each product. Discounts not valid on previous purchases=20 or in combination with any other offers. See website for details. The products and services in this e-mail are provided by Vistaprint. 10 million people per year trust Vistaprint for affordable online and print solutions.India customers may contact us in care of=20 our India subsidiary: Vistaprint India Marketing Solutions Private Limited 2nd Floor, "Piramal Tower",=20 Peninsula Corporate Park,=20 Ganpatrao Kadam Marg,=20 Off Senapati Bapat Marg, Lower Parel,=20 Mumbai India - 400 013=20 -- This message was sent to xfs@oss.sgi.com by mira@getit18.livemailz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 -- powered by mailsMagic, www.mailsmagic.com -- --b1_0535aefc6074e625ece9eb409c9923bd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A=0A=0A=0AVisiitng Cards=0A
Hello Dear=2C

my=0A= name is Renae i see your mail today while i was browsing because i am =0A= looking for an honest partner for friendship i hope you don't mind=2C if = =0A= you don't mind please write me back so that i can tell you more about =0A= myself and my picture's as well Renae
= --_7719c9ae-282e-4e5b-9015-8329fbd850d6_-- From guochao3@staff.sina.com.cn Wed Apr 9 20:43:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 943547F99 for ; Wed, 9 Apr 2014 20:43:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 15E2DAC001 for ; Wed, 9 Apr 2014 18:43:08 -0700 (PDT) X-ASG-Debug-ID: 1397094178-04bdf07dca723e0001-NocioJ Received: from SINA-HUB03.staff.sina.com.cn (sina152-212.staff.weibo.com [61.135.152.212]) by cuda.sgi.com with ESMTP id UshLdCx3YiZWrlsd (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 09 Apr 2014 18:43:00 -0700 (PDT) X-Barracuda-Envelope-From: guochao3@staff.sina.com.cn X-Barracuda-Apparent-Source-IP: 61.135.152.212 Received: from SINA-MBX03.staff.sina.com.cn ([fe80::f9a3:e6cd:ff26:d042]) by SINA-HUB03.staff.sina.com.cn ([fe80::f5c8:67f3:65aa:8d94%14]) with mapi id 14.02.0247.003; Thu, 10 Apr 2014 09:41:39 +0800 From: =?utf-8?B?5oi05Zu96LaF?= To: "stan@hardwarefreak.com" CC: "xfs@oss.sgi.com" Subject: =?utf-8?B?562U5aSNOiBSZTogMTBHQiBtZW1vcnlzIG9jY3VwaWVkIGJ5IFhGUw==?= Thread-Topic: Re: 10GB memorys occupied by XFS X-ASG-Orig-Subj: =?utf-8?B?562U5aSNOiBSZTogMTBHQiBtZW1vcnlzIG9jY3VwaWVkIGJ5IFhGUw==?= Thread-Index: AQEpP5CHAA2OAZlN0hpbo9hH3sU+DwGUulZYAVD0NdCcPw61kA== Date: Thu, 10 Apr 2014 01:41:38 +0000 Message-ID: <576327D93AC0994283A4E732247BBEA349552C@sina-mbx03.staff.sina.com.cn> References: <1396596386220-35015.post@n7.nabble.com> <533F14EC.6040705@hardwarefreak.com> <76016fc7.13c84.14546bad411.Coremail.dx-wl@163.com> In-Reply-To: <76016fc7.13c84.14546bad411.Coremail.dx-wl@163.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.209.67.58] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: sina152-212.staff.weibo.com[61.135.152.212] X-Barracuda-Start-Time: 1397094179 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.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, BSF_SC0_MV0113c, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header RGVhciBTdGFuLA0KVGhhbmsgeW91IGZvciB5b3VyIGtpbmQgYXNzaXN0YW5jZS4NCg0KSW4gYWNj b3JkYW5jZSB3aXRoIHlvdXIgc3VnZ2VzdGlvbiwgd2UgZXhlY3V0ZWQgImVjaG8gMyA+IC9wcm9j L3N5c20vZHJvcF9jYWNoZXMiIGZvciB0cnlpbmcgdG8gcmVsZWFzZSB2ZnMgZGVudHJpZXMgYW5k IGlub2Rlcy4gUmVhbGx5LCBvdXIgbG9zdCBtZW1vcnkgY2FtZSBiYWNrLiBCdXQgd2UgbGVhcm5l ZCB0aGF0IHRoZSBtZW1vcnkgb2YgdmZzIGRlbnRyaWVzIGFuZCBpbm9kZXMgaXMgZGlzdHJpYnV0 ZWQgZnJvbSBzbGFiLiBQbGVhc2UgY2hlY2sgb3VyIHN5c3RlbSAiU2xhYjogwqA1MDk3MDgga0Ii IGZyb20gL3Byb2MvbWVtaW5mbywgYW5kIGl0IHNlZW1zIG9ubHkgYmUgdG9vayB1cCA1MDBNQiBh bmQgeGZzX2J1ZiB0YWtlIHVwIDQ1ME1CIGFtb25nLiBBbmQgL3Byb2MvbWVtaW5mbyBpbmRpY2F0 ZWQgdGhhdCBvdXIgc3lzdGVtIG1lbW9yeSBpcyBhbm9tYWxvdXMsIHRoZXJlIGlzIGFib3V0IDEw R0Igb3V0IG9mIHRoZSBzdGF0aXN0aWNzLiBXZSB3YW50IHRvIGtub3cgaG93IHRoZSBzeXN0ZW0g Y291bGQgb2JzZXJ2ZSB0aGUgdXNhZ2UgYW1vdW50IG9mIHZmcyBkZW50cmllcyBhbmQgaW9kZXMg dGhyb3VnaCB0aGUgc3lzdGVtIGludGVyZmFjZS4gSWYgdGhlIG1lbW9yeSB1c2FnZSBvZiBzeXN0 ZW0gaXMgbm90IHJlZmxlY3RlZCBpbiAvcHJvYy9tZW1pbmZvIGFzIHdlIGNhbiBub3QgZmluZCB0 aGUgc3RhdGlzdGljcywgYW5kIHdlIHRob3VnaHQgaXQgYXMgYSBidWcgb2YgeGZzLg0KDQpNeSDC oHZtLnZmc19jYWNoZV9wcmVzc3VyZSBvZiBsaW51eCBzeXN0ZW0gaXMgMTAwLiBXZSB0aGluayB0 aGF0IHRoZSBzeXN0ZW0gd2lsbCBwcm9hY3RpdmVseSB0YWtlIHRoZSBtZW1vcnkgYmFjayB3aGVu IHRoZSBtZW1vcnkgaXMgbm90IGVub3VnaCwgcmF0aGVyIHRoYW4gb29tLWtpbGxlciBraWxscyBv dXIgd29yayBwcm9jZXNzLiBPdXIgZGF0YXMgb2YgL3Byb2MvbWVtaW5mbyBvY2N1cnJlZCBkdXJp bmcgdGhlIHN5c3RlbSBwcm9ibGVtIGFzIGJlbG93Og0KMTMwPiBjYXQgL3Byb2MvbWVtaW5mbw0K TWVtVG90YWw6IMKgIMKgIMKgIDEyMTczMjY4IGtCDQpNZW1GcmVlOiDCoCDCoCDCoCDCoCDCoDIy MzA0NCBrQg0KQnVmZmVyczogwqAgwqAgwqAgwqAgwqAgwqAgMjQ0IGtCDQpDYWNoZWQ6IMKgIMKg IMKgIMKgIMKgIMKgIDQ1NDAga0INClN3YXBDYWNoZWQ6IMKgIMKgIMKgIMKgIMKgIMKgMCBrQg0K QWN0aXZlOiDCoCDCoCDCoCDCoCDCoCDCoCAxNzAwIGtCDQpJbmFjdGl2ZTogwqAgwqAgwqAgwqAg wqAgNTMxMiBrQg0KQWN0aXZlKGFub24pOiDCoCDCoCDCoCAxNjE2IGtCDQpJbmFjdGl2ZShhbm9u KTogwqAgwqAgMTEyOCBrQg0KQWN0aXZlKGZpbGUpOiDCoCDCoCDCoCDCoCA4NCBrQg0KSW5hY3Rp dmUoZmlsZSk6IMKgIMKgIDQxODQga0INClVuZXZpY3RhYmxlOiDCoCDCoCDCoCDCoCDCoCAwIGtC DQpNbG9ja2VkOiDCoCDCoCDCoCDCoCDCoCDCoCDCoCAwIGtCDQpTd2FwVG90YWw6IMKgIMKgIMKg IMKgIMKgIMKgIDAga0INClN3YXBGcmVlOiDCoCDCoCDCoCDCoCDCoCDCoCDCoDAga0INCkRpcnR5 OiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAwIGtCDQpXcml0ZWJhY2s6IMKgIMKgIMKgIMKgIMKg IMKgIDAga0INCkFub25QYWdlczogwqAgwqAgwqAgwqAgwqAyNTU2IGtCDQpNYXBwZWQ6IMKgIMKg IMKgIMKgIMKgIMKgIDEwODgga0INClNobWVtOiDCoCDCoCDCoCDCoCDCoCDCoCDCoCAxOTYga0IN ClNsYWI6IMKgIMKgIMKgIMKgIMKgIMKgIDUwOTcwOCBrQg0KU1JlY2xhaW1hYmxlOiDCoCDCoCDC oCA3NTk2IGtCDQpTVW5yZWNsYWltOiDCoCDCoCDCoCA1MDIxMTIga0INCktlcm5lbFN0YWNrOiDC oCDCoCDCoCDCoDEwOTYga0INClBhZ2VUYWJsZXM6IMKgIMKgIMKgIMKgIMKgNzQ4IGtCDQpORlNf VW5zdGFibGU6IMKgIMKgIMKgIMKgIMKgMCBrQg0KQm91bmNlOiDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoDAga0INCldyaXRlYmFja1RtcDogwqAgwqAgwqAgwqAgwqAwIGtCDQpDb21taXRMaW1pdDog wqAgwqAgNjA4NjYzMiBrQg0KQ29tbWl0dGVkX0FTOiDCoCDCoCDCoCA5NDQwIGtCDQpWbWFsbG9j VG90YWw6IMKgIDM0MzU5NzM4MzY3IGtCDQpWbWFsbG9jVXNlZDogwqAgwqAgwqAzMDM0ODgga0IN ClZtYWxsb2NDaHVuazogwqAgMzQzNTk0MjYxMzIga0INCkhhcmR3YXJlQ29ycnVwdGVkOiDCoCDC oCAwIGtCDQpBbm9uSHVnZVBhZ2VzOiDCoCDCoCDCoCDCoCAwIGtCDQpIdWdlUGFnZXNfVG90YWw6 IMKgIMKgIMKgIDANCkh1Z2VQYWdlc19GcmVlOiDCoCDCoCDCoCDCoDANCkh1Z2VQYWdlc19Sc3Zk OiDCoCDCoCDCoCDCoDANCkh1Z2VQYWdlc19TdXJwOiDCoCDCoCDCoCDCoDANCkh1Z2VwYWdlc2l6 ZTogwqAgwqAgwqAgMjA0OCBrQg0KRGlyZWN0TWFwNGs6IMKgIMKgIMKgIMKgNjE1MiBrQg0KRGly ZWN0TWFwMk06IMKgIMKgIDIwNzA1Mjgga0INCkRpcmVjdE1hcDFHOiDCoCDCoDEwNDg1NzYwIGtC wqANCg0KSSBsb29rIGZvcndhcmQgdG8gaGVhcmluZyBmcm9tIHlvdSBhbmQgdGhhbmsgeW91IHZl cnkgbXVjaCBmb3IgeW91ciBraW5kIGFzc2lzdGFuY2UuDQoNCkJlc3QgUmVnYXJkcywNCg0KR3Vv Y2hhbw0KDQoNCkF0wqAyMDE0LTA0LTA1wqAwNDoyNDoxMiwiU3RhbsKgSG9lcHBuZXIiwqA8c3Rh bkBoYXJkd2FyZWZyZWFrLmNvbT7CoHdyb3RlOg0KPk9uwqA0LzQvMjAxNMKgMjoyNsKgQU0swqBk YWlndW9jaGFvwqB3cm90ZToNCj4+wqBIZWxsb8KgZm9sa3MsDQo+DQo+SGVsbG8sDQo+DQo+Tm90 ZcKgdGhhdMKgeW91csKgcHJvYmxlbXPCoGFyZcKgbm90wqBYRlPCoHNwZWNpZmljLMKgYnV0wqBj YW7CoG9jY3VywqB3aXRowqBhbnkgDQo+TGludXjCoGZpbGVzeXN0ZW0uDQo+DQo+PsKgScKgdXNl ZMKgeGZzwqBmaWxlwqBzeXN0ZW3CoGluwqBrZXJuZWwtMi42LjMyLTIyMC4xMy4xLmVsNi54ODZf NjTCoGZvcsKgc3RvcmUNCj4+wqBwaWN0dXJlcy7CoEFib3V0wqAxMDDCoGRheXPCoHN5c3RlbcKg bWVtb3J5c8KgaXPCoGxvc3TCoGFuZMKgc29tZcKgbmdpbnjCoA0KPj5wcm9jZXNzwqBpcw0KPj7C oGtpbGxlZMKgYnnCoG9vbS1raWxsZXIuU28sScKgbG9va2VkwqAvcHJvYy9tZW1pbmZvwqBhbmTC oGZpbmTCoG1lbW9yeXPCoGlzDQo+PsKgbG9zdC5GaW5hbGx5LMKgScKgdHJ5wqB0b8KgdW1vdW50 wqB4ZnPCoHN5c3RlbcKgYW5kwqAxMEdCwqBtZW1vcnlzwqBpc8KgY29taW5nwqANCj4+YmFjay7C oGwNCj4+wqBsb29rwqB4ZnPCoGJ1Z3ppbGxhwqBub8Kgc3VjaMKgQlVHLknCoGhhdmXCoG5vwqBp ZGVhwqBmb3LCoGl0Lg0KPj7CoA0KPj7CoENoZWVycywNCj4+wqANCj4+wqBHdW9jaGFvLg0KPj7C oA0KPj7CoHNvbWXCoG1lbW9yeXPCoGluZm86DQo+PsKgDQo+PsKgMD7CoGZyZWXCoC1tDQo+PsKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0b3RhbMKgwqDCoMKgwqDCoMKgdXNlZMKgwqDCoMKg wqDCoMKgZnJlZcKgwqDCoMKgwqBzaGFyZWTCoMKgwqDCoGJ1ZmZlcnPCoMKgwqDCoMKgDQo+PmNh Y2hlZA0KPj7CoE1lbTrCoMKgwqDCoMKgwqDCoMKgwqAxMTg4N8KgwqDCoMKgwqDCoDExNjY4wqDC oMKgwqDCoMKgwqDCoDIxOcKgwqDCoMKgwqDCoMKgwqDCoMKgMMKgwqDCoMKgwqDCoMKgwqDCoMKg MMKgwqDCoMKgwqDCoMKgwqDCoMKgDQo+PjINCj4+wqAtLyvCoGJ1ZmZlcnMvY2FjaGU6wqDCoMKg wqDCoMKgMTE2NjXCoMKgwqDCoMKgwqDCoMKgMjIyDQo+PsKgU3dhcDrCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAwwqDCoMKgwqDCoMKgwqDCoMKgwqAwwqDCoMKgwqDCoMKgwqDCoMKgwqAwDQo+DQo+ DQo+Rmlyc3TCoHByb2JsZW06wqDCoG5vwqBzd2FwDQo+U2Vjb25kwqBwcm9ibGVtOsKgY2FjaGXC oGlzwqBub3TCoGJlaW5nwqByZWNsYWltZWQNCj4NCj5SZWFkwqB2ZnNfY2FjaGVfcHJlc3N1cmXC oGF0Og0KPmh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vc3lzY3RsL3Zt LnR4dA0KPg0KPllvdSd2ZcKgbGlrZWx5wqBzZXTCoHRoaXPCoHZhbHVlwqB0b8KgemVyby7CoMKg Q2hhbmdpbmfCoGl0wqB0b8KgMjAwwqBzaG91bGTCoHByb21wdCANCj50aGXCoGtlcm5lbMKgdG/C oHJlY2xhaW3CoGRlbnRyaWVzwqBhbmTCoGlub2Rlc8KgYWdncmVzc2l2ZWx5LMKgcHJldmVudGlu Z8KgdGhlIA0KPm9vbS1raWxsZXLCoGZyb23CoGtpY2tpbmfCoGluLg0KPg0KPkNoZWVycywNCj4N Cj5TdGFuDQo= From dave@fromorbit.com Wed Apr 9 23:42:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B899B7F5F for ; Wed, 9 Apr 2014 23:42:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 808C58F8040 for ; Wed, 9 Apr 2014 21:42:52 -0700 (PDT) X-ASG-Debug-ID: 1397104969-04bdf07dc7785f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vTwq2IKA5HLEa43n for ; Wed, 09 Apr 2014 21:42:49 -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: AkANADkgRlN5LEcv/2dsb2JhbABRCIMGhCDBAAOBHRd0giUBKQQLASMjGAEXBQImAjsDNId7jHKcGaMngSmMbYNMgUkEqyCDQis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:12:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY6ot-0004a7-EU; Thu, 10 Apr 2014 14:42:35 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY6ot-0001tU-DN; Thu, 10 Apr 2014 14:42:35 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: snitzer@redhat.com, bob.mastors@solidfire.com Subject: [PATCH] xfs: unmount does not wait for shutdown during unmount Date: Thu, 10 Apr 2014 14:42:35 +1000 X-ASG-Orig-Subj: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-Id: <1397104955-7247-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397104969 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner And interesting situation can occur if a log IO error occurs during the unmount of a filesystem. The cases reported have the same signature - the update of the superblock counters fails due to a log write IO error: XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 XFS (dm-16): Log I/O Error Detected. Shutting down filesystem XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. XFS (dm-16): xfs_log_force: error 5 returned. XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) It can be seen that the last line of output contains a corrupt device name - this is because the log and xfs_mount structures have already been freed by the time this message is printed. A kernel oops closely follows. The issue is that the shutdown is occurring in a separate IO completion thread to the unmount. Once the shutdown processing has started and all the iclogs are marked with XLOG_STATE_IOERROR, the log shutdown code wakes anyone waiting on a log force so they can process the shutdown error. This wakes up the unmount code that is doing a synchronous transaction to update the superblock counters. The unmount path now sees all the iclogs are marked with XLOG_STATE_IOERROR and so never waits on them again, knowing that if it does, there will not be a wakeup trigger for it and we will hang the unmount if we do. Hence the unmount runs through all the remaining code and frees all the filesystem structures while the xlog_iodone() is still processing the shutdown. When the log shutdown processing completes, xfs_do_force_shutdown() emits the "Please umount the filesystem and rectify the problem(s)" message, and xlog_iodone() then aborts all the objects attached to the iclog. An iclog that has already been freed.... The real issue here is that there is no serialisation point between the log IO and the unmount. We have serialisations points for log writes, log forces, reservations, etc, but we don't actually have any code that wakes for log IO to fully complete. We do that for all other types of object, so why not iclogbufs? Well, it turns out that we can easily do this. We've got xfs_buf handles, and that's what everyone else uses for IO serialisation. i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only release the lock in xlog_iodone() when we are finished with the buffer. That way before we tear down the iclog, we can lock and unlock the buffer to ensure IO completion has finished completely before we tear it down. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 8497a00..08624dc 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1181,11 +1181,14 @@ xlog_iodone(xfs_buf_t *bp) /* log I/O is always issued ASYNC */ ASSERT(XFS_BUF_ISASYNC(bp)); xlog_state_done_syncing(iclog, aborted); + /* - * do not reference the buffer (bp) here as we could race - * with it being freed after writing the unmount record to the - * log. + * drop the buffer lock now that we are done. Nothing references + * the buffer after this, so an unmount waiting on this lock can now + * tear it down safely. As such, it is unsafe to reference the buffer + * (bp) after the unlock as we could race with it being freed. */ + xfs_buf_unlock(bp); } /* @@ -1368,8 +1371,16 @@ xlog_alloc_log( bp = xfs_buf_alloc(mp->m_logdev_targp, 0, BTOBB(log->l_iclog_size), 0); if (!bp) goto out_free_log; - bp->b_iodone = xlog_iodone; + + /* + * The iclogbuf buffer locks are held over IO but we are not going to do + * IO yet. Hence unlock the buffer so that the log IO path can grab it + * when appropriately. + */ ASSERT(xfs_buf_islocked(bp)); + xfs_buf_unlock(bp); + + bp->b_iodone = xlog_iodone; log->l_xbuf = bp; spin_lock_init(&log->l_icloglock); @@ -1398,6 +1409,9 @@ xlog_alloc_log( if (!bp) goto out_free_iclog; + ASSERT(xfs_buf_islocked(bp)); + xfs_buf_unlock(bp); + bp->b_iodone = xlog_iodone; iclog->ic_bp = bp; iclog->ic_data = bp->b_addr; @@ -1422,7 +1436,6 @@ xlog_alloc_log( iclog->ic_callback_tail = &(iclog->ic_callback); iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize; - ASSERT(xfs_buf_islocked(iclog->ic_bp)); init_waitqueue_head(&iclog->ic_force_wait); init_waitqueue_head(&iclog->ic_write_wait); @@ -1631,6 +1644,12 @@ xlog_cksum( * we transition the iclogs to IOERROR state *after* flushing all existing * iclogs to disk. This is because we don't want anymore new transactions to be * started or completed afterwards. + * + * We lock the iclogbufs here so that we can serialise against IO completion + * during unmount. We might be processing a shutdown triggered during unmount, + * and that can occur asynchronously to the unmount thread, and hence we need to + * ensure that completes before tearing down the iclogbufs. Hence we need to + * hold the buffer lock across the log IO to acheive that. */ STATIC int xlog_bdstrat( @@ -1638,6 +1657,7 @@ xlog_bdstrat( { struct xlog_in_core *iclog = bp->b_fspriv; + xfs_buf_lock(bp); if (iclog->ic_state & XLOG_STATE_IOERROR) { xfs_buf_ioerror(bp, EIO); xfs_buf_stale(bp); @@ -1645,7 +1665,8 @@ xlog_bdstrat( /* * It would seem logical to return EIO here, but we rely on * the log state machine to propagate I/O errors instead of - * doing it here. + * doing it here. Similarly, IO completion will unlock the + * buffer, so we don't do it here. */ return 0; } @@ -1847,14 +1868,28 @@ xlog_dealloc_log( xlog_cil_destroy(log); /* - * always need to ensure that the extra buffer does not point to memory - * owned by another log buffer before we free it. + * Cycle all the iclogbuf locks to make sure all log IO completion + * is done before we tear down these buffers. */ + iclog = log->l_iclog; + for (i = 0; i < log->l_iclog_bufs; i++) { + xfs_buf_lock(iclog->ic_bp); + xfs_buf_unlock(iclog->ic_bp); + iclog = iclog->ic_next; + } + + /* + * Always need to ensure that the extra buffer does not point to memory + * owned by another log buffer before we free it. Also, cycle the lock + * first to ensure we've completed IO on it. + */ + xfs_buf_lock(log->l_xbuf); + xfs_buf_unlock(log->l_xbuf); xfs_buf_set_empty(log->l_xbuf, BTOBB(log->l_iclog_size)); xfs_buf_free(log->l_xbuf); iclog = log->l_iclog; - for (i=0; il_iclog_bufs; i++) { + for (i = 0; i < log->l_iclog_bufs; i++) { xfs_buf_free(iclog->ic_bp); next_iclog = iclog->ic_next; kmem_free(iclog); -- 1.9.0 From dave@fromorbit.com Thu Apr 10 00:01:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E7D317F9D for ; Thu, 10 Apr 2014 00:01:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D858AC006 for ; Wed, 9 Apr 2014 22:01:17 -0700 (PDT) X-ASG-Debug-ID: 1397106075-04cb6c77b674430001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9N1lSXjEMqiOlyWh for ; Wed, 09 Apr 2014 22:01:16 -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: Ap4GABklRlN5LEcv/2dsb2JhbABZgwbGQRd0giUBAQUnLzMIGDE5AxsZh3vMNI8JhCIEqyCDQis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004c8-Mj for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002CC-M3 for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: kill buffers over failed write ranges properly Date: Thu, 10 Apr 2014 15:00:48 +1000 X-ASG-Orig-Subj: [PATCH 1/6] xfs: kill buffers over failed write ranges properly Message-Id: <1397106053-7489-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> References: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106075 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When a write fails, if we don't clear the delalloc flags from the buffers over the failed range, they can persist beyond EOF and cause problems. writeback will see the pages int eh page cache, see they are dirty and continually retry the write, assuming that the page beyond EOF is just racing with a truncate. The page will eventually be released due to some other operation (e.g. direct IO), and it will not pass through invalidation because it is dirty. Hence it will be released with buffer_delay set on it, and trigger warnings in xfs_vm_releasepage() and assert fail in xfs_file_aio_write_direct because invalidation failed and we didn't write the corect amount. This causes failures on block size < page size filesystems in fsx and fsstress workloads run by xfstests. Fix it by completely trashing any state on the buffer that could be used to imply that it contains valid data when the delalloc range over the buffer is punched out during the failed write handling. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 75df77d..282c726 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1566,6 +1566,16 @@ xfs_vm_write_failed( xfs_vm_kill_delalloc_range(inode, block_offset, block_offset + bh->b_size); + + /* + * This buffer does not contain data anymore. make sure anyone + * who finds it knows that for certain. + */ + clear_buffer_delay(bh); + clear_buffer_uptodate(bh); + clear_buffer_mapped(bh); + clear_buffer_new(bh); + clear_buffer_dirty(bh); } } -- 1.9.0 From dave@fromorbit.com Thu Apr 10 00:01:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 898447F9D for ; Thu, 10 Apr 2014 00:01:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 804DB8F8054 for ; Wed, 9 Apr 2014 22:01:18 -0700 (PDT) X-ASG-Debug-ID: 1397106070-04cb6c77b574420003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id hXNOmXAqdmsdalh7 for ; Wed, 09 Apr 2014 22:01:16 -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: Ap4GABklRlN5LEcv/2dsb2JhbABZgwbGQRd0giUBAQUnLzMIGBgZOQMbGYd7qVqiWo59hC4EqyCDQis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004cD-PC for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002Cb-OV for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: collapse range is delalloc challenged. Date: Thu, 10 Apr 2014 15:00:53 +1000 X-ASG-Orig-Subj: [PATCH 6/6] xfs: collapse range is delalloc challenged. Message-Id: <1397106053-7489-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> References: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106076 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner FSX has been detecting data corruption after to collapse range calls. The key observation is that the offset of the last extent in the file was not being shifted, and hence when the file size was adjusted it was truncating away data because the extents handled been correctly shifted. Tracing indicated that before the collapse, the extent list looked like: .... ino 0x5788 state idx 6 offset 26 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 39 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 and after the shift of 2 blocks: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 Note that the last extent did not change offset. After the changing of the file size: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 30 flag 0 You can see that the last extent had it's length truncated, indicating that we've lost data. The reason for this is that the xfs_bmap_shift_extents() loop uses XFS_IFORK_NEXTENTS() to determine how many extents are in the inode. This, unfortunately, doesn't take into account delayed allocation extents - it's a count of physically allocated extents - and hence when the file being collapsed has a delalloc extent like this one does prior to the range being collapsed: .... ino 0x5788 state idx 4 offset 11 block 4503599627239429 count 1 flag 0 .... it gets the count wrong and terminates the shift loop early. Fix it by using the in-memory extent array size that includes delayed allocation extents to determine the number of extents on the inode. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b6092e..f0efc7e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5413,6 +5413,7 @@ xfs_bmap_shift_extents( int whichfork = XFS_DATA_FORK; int logflags; xfs_filblks_t blockcount = 0; + int total_extents; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5429,7 +5430,6 @@ xfs_bmap_shift_extents( ASSERT(current_ext != NULL); ifp = XFS_IFORK_PTR(ip, whichfork); - if (!(ifp->if_flags & XFS_IFEXTENTS)) { /* Read in all the extents */ error = xfs_iread_extents(tp, ip, whichfork); @@ -5456,7 +5456,6 @@ xfs_bmap_shift_extents( /* We are going to change core inode */ logflags = XFS_ILOG_CORE; - if (ifp->if_flags & XFS_IFBROOT) { cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); cur->bc_private.b.firstblock = *firstblock; @@ -5467,8 +5466,14 @@ xfs_bmap_shift_extents( logflags |= XFS_ILOG_DEXT; } - while (nexts++ < num_exts && - *current_ext < XFS_IFORK_NEXTENTS(ip, whichfork)) { + /* + * There may be delalloc extents in the data fork before the range we + * are collapsing out, so we cannot + * use the count of real extents here. Instead we have to calculate it + * from the incore fork. + */ + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + while (nexts++ < num_exts && *current_ext < total_extents) { gotp = xfs_iext_get_ext(ifp, *current_ext); xfs_bmbt_get_all(gotp, &got); @@ -5556,10 +5561,11 @@ xfs_bmap_shift_extents( } (*current_ext)++; + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); } /* Check if we are done */ - if (*current_ext == XFS_IFORK_NEXTENTS(ip, whichfork)) + if (*current_ext == total_extents) *done = 1; del_cursor: @@ -5568,6 +5574,5 @@ del_cursor: error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); xfs_trans_log_inode(tp, ip, logflags); - return error; } -- 1.9.0 From dave@fromorbit.com Thu Apr 10 00:01:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 50D0B7F9D for ; Thu, 10 Apr 2014 00:01:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 306CA30405F for ; Wed, 9 Apr 2014 22:01:15 -0700 (PDT) X-ASG-Debug-ID: 1397106070-04cb6c77b574420001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id bUH9roQLo2J3pabs for ; Wed, 09 Apr 2014 22:01:11 -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: AjoHABklRlN5LEcv/2dsb2JhbABZgwY7qzGaVRd0gwI7gQIDiC8OmWOyQ4xvghqEIgSrIIE/ggMr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004c7-MG for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002C9-LH for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6 v2] xfs: delalloc, dio and corruption... Date: Thu, 10 Apr 2014 15:00:47 +1000 X-ASG-Orig-Subj: [PATCH 0/6 v2] xfs: delalloc, dio and corruption... Message-Id: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106070 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is version 2 of the DIO vs delalloc patchset I posted here: http://oss.sgi.com/archives/xfs/2014-03/msg00313.html The changes to this version are: - the bug fix to patch 2 that Brain noticed, - I dropped the delalloc extent splittting patch because with the fix to patch 2 I can't trigger that bug anymore, and that patch was causing transaction overruns in xfs/297. Hence without an existing reproducer, I won't try to fix that problem. - the last patch is new, and is a bug in the collapse range code where it fails to shift the last N extents correctly if there are N delalloc extents before the shifted range. With these 6 patches, all of the xfstests fsx/fsstress tests pass on 1k, 2k and 4k block size filesystems, with and without CRCs enabled, on 1, 2 and 16p test VMs. I'm much happier with these patches now - I don't think that there are more problems lurking, but only time will tell. I'd like to get these fixes to Linus for 3.15 (probably for -rc2), so eyeballs and testing would be appreciated. Cheers, Dave. From dave@fromorbit.com Thu Apr 10 00:01:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 858387F9D for ; Thu, 10 Apr 2014 00:01:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F148AAC006 for ; Wed, 9 Apr 2014 22:01:18 -0700 (PDT) X-ASG-Debug-ID: 1397106076-04cbb00dc57ab80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id AxDYd6G6rcUT5Rss for ; Wed, 09 Apr 2014 22:01:17 -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: Ap8GABklRlN5LEcv/2dsb2JhbABZgwbFJYEcF3SCJQEBBScvMwgYMTkDGxmHe8w0jghZKIQiBKsgg0IrgSw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004cB-O0 for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002CR-NI for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Date: Thu, 10 Apr 2014 15:00:51 +1000 X-ASG-Orig-Subj: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-Id: <1397106053-7489-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> References: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106076 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we are zeroing space andit is covered by a delalloc range, we need to punch the delalloc range out before we truncate the page cache. Failing to do so leaves and inconsistency between the page cache and the extent tree, which we later trip over when doing direct IO over the same range. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 13 ++++++++++++- fs/xfs/xfs_trace.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 01f6a64..3235b74 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1418,6 +1418,8 @@ xfs_zero_file_space( xfs_off_t end_boundary; int error; + trace_xfs_zero_file_space(ip); + granularity = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); /* @@ -1432,9 +1434,18 @@ xfs_zero_file_space( ASSERT(end_boundary <= offset + len); if (start_boundary < end_boundary - 1) { - /* punch out the page cache over the conversion range */ + /* + * punch out delayed allocation blocks and the page cache over + * the conversion range + */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_bmap_punch_delalloc_range(ip, + XFS_B_TO_FSB(mp, start_boundary), + XFS_B_TO_FSB(mp, end_boundary - start_boundary)); + xfs_iunlock(ip, XFS_ILOCK_EXCL); truncate_pagecache_range(VFS_I(ip), start_boundary, end_boundary - 1); + /* convert the blocks */ error = xfs_alloc_file_space(ip, start_boundary, end_boundary - start_boundary - 1, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index a4ae41c..65d8c79 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -603,6 +603,7 @@ DEFINE_INODE_EVENT(xfs_readlink); DEFINE_INODE_EVENT(xfs_inactive_symlink); DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); +DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL -- 1.9.0 From dave@fromorbit.com Thu Apr 10 00:01:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9521F7FA6 for ; Thu, 10 Apr 2014 00:01:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26624AC007 for ; Wed, 9 Apr 2014 22:01:19 -0700 (PDT) X-ASG-Debug-ID: 1397106075-04cb6c77b674430002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id EL0hAAPgFYIZqB24 for ; Wed, 09 Apr 2014 22:01:17 -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: Ap4GABklRlN5LEcv/2dsb2JhbABZgwbGQRd0giUBAQUnLzMIGBgZOQMbGYd7zDSOfQyEIgSrIINCKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004c9-N6 for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002CH-MS for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Date: Thu, 10 Apr 2014 15:00:49 +1000 X-ASG-Orig-Subj: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Message-Id: <1397106053-7489-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> References: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106076 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If we fail a write beyond EOF and have to handle it in xfs_vm_write_begin(), we truncate the inode back to the current inode size. This doesn't take into account the fact that we may have already made successful writes to the same page (in the case of block size < page size) and hence we can truncate the page cache away from blocks with valid data in them. If these blocks are delayed allocation blocks, we now have a mismatch between the page cache and the extent tree, and this will trigger - at minimum - a delayed block count mismatch assert when the inode is evicted from the cache. We can also trip over it when block mapping for direct IO - this is the most common symptom seen from fsx and fsstress when run from xfstests. Fix it by only truncating away the exact range we are updating state for in this write_begin call. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 282c726..5f29693 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1609,12 +1609,21 @@ xfs_vm_write_begin( status = __block_write_begin(page, pos, len, xfs_get_blocks); if (unlikely(status)) { struct inode *inode = mapping->host; + size_t isize = i_size_read(inode); xfs_vm_write_failed(inode, page, pos, len); unlock_page(page); - if (pos + len > i_size_read(inode)) - truncate_pagecache(inode, i_size_read(inode)); + /* + * If the write is beyond EOF, we only want to kill blocks + * allocated in this write, not blocks that were previously + * written successfully. + */ + if (pos + len > isize) { + ssize_t start = max_t(ssize_t, pos, isize); + + truncate_pagecache_range(inode, start, pos + len); + } page_cache_release(page); page = NULL; -- 1.9.0 From dave@fromorbit.com Thu Apr 10 00:01:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD1537FC1 for ; Thu, 10 Apr 2014 00:01:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BCE17304043 for ; Wed, 9 Apr 2014 22:01:19 -0700 (PDT) X-ASG-Debug-ID: 1397106070-04cb6c77b574420004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Q2Z52ETXyBRCreiA for ; Wed, 09 Apr 2014 22:01:18 -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: Ap4GABklRlN5LEcv/2dsb2JhbABZgwbGQRd0giUBAQUnLzMIGDE5AxsZh3vMNI4VdIQiBKsgg0IrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004cC-Ol for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002CW-Nl for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: don't map ranges that span EOF for direct IO Date: Thu, 10 Apr 2014 15:00:52 +1000 X-ASG-Orig-Subj: [PATCH 5/6] xfs: don't map ranges that span EOF for direct IO Message-Id: <1397106053-7489-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> References: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106077 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Al Viro tracked down the problem that has caused generic/263 to fail on XFS since the test was introduced. If is caused by xfs_get_blocks() mapping a single extent that spans EOF without marking it as buffer-new() so that the direct Io code does not zero the tail of the block at the new EOF. This is a long standing bug that has been around for many, many years. Because xfs_get_blocks() starts the map before EOF, it can't set buffer_new(), because that causes he direct Io code to also zero unaligned sectors at the head of the IO. This would overwrite valid data with zeros, and hence we cannot validly return a single extent that spans EOF to direct IO. Fix this by detecting a mapping that spans EOF and truncate it down to EOF. This results in the the direct IO code doing the right thing for unaligned data blocks before EOF, and then returning to get another mapping for the region beyond EOF which XFS treats correctly by setting buffer_new() on it. This makes direct Io behave correctly w.r.t. tail block zeroing beyond EOF, and fsx is happy about that. Again, thanks to Al Viro for finding what I couldn't. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e0a7931..2c13967 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1344,6 +1344,14 @@ __xfs_get_blocks( /* * If this is O_DIRECT or the mpage code calling tell them how large * the mapping is, so that we can avoid repeated get_blocks calls. + * + * If the mapping spans EOF, then we have to break the mapping up as the + * mapping for blocks beyond EOF must be marked new so that sub block + * regions can be correctly zeroed. We can't do this for mappings within + * EOF unless the mapping was just allocated or is unwritten, otherwise + * the callers would overwrite existing data with zeros. Hence we have + * to split the mapping into a range up to and including EOF, and a + * second mapping for beyond EOF. */ if (direct || size > (1 << inode->i_blkbits)) { xfs_off_t mapping_size; @@ -1354,6 +1362,12 @@ __xfs_get_blocks( ASSERT(mapping_size > 0); if (mapping_size > size) mapping_size = size; + if (offset < i_size_read(inode) && + offset + mapping_size >= i_size_read(inode)) { + /* limit mapping to block that spans EOF */ + mapping_size = roundup(i_size_read(inode) - offset, + 1 << inode->i_blkbits); + } if (mapping_size > LONG_MAX) mapping_size = LONG_MAX; -- 1.9.0 From dave@fromorbit.com Thu Apr 10 00:01:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 77BCD7F9D for ; Thu, 10 Apr 2014 00:01:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A2AAAC006 for ; Wed, 9 Apr 2014 22:01:16 -0700 (PDT) X-ASG-Debug-ID: 1397106070-04cb6c77b574420002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vFrGsUhAgsFtGTjA for ; Wed, 09 Apr 2014 22:01:15 -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: Ap4GABklRlN5LEcv/2dsb2JhbABZgwbGQRd0giUBAQVWMwgYMTkDGxmHe8wdF48JhCIEo0GHX4NCKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Apr 2014 14:31:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WY76e-0004cA-NY for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WY76e-0002CM-Ms for xfs@oss.sgi.com; Thu, 10 Apr 2014 15:00:56 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure Date: Thu, 10 Apr 2014 15:00:50 +1000 X-ASG-Orig-Subj: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure Message-Id: <1397106053-7489-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> References: <1397106053-7489-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397106075 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Similar to the write_begin problem, xfs-vm_write_end will truncate back to the old EOF, potentially removing page cache from over the top of delalloc blocks with valid data in them. Fix this by truncating back to just the start of the failed write. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 5f29693..e0a7931 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1634,9 +1634,12 @@ xfs_vm_write_begin( } /* - * On failure, we only need to kill delalloc blocks beyond EOF because they - * will never be written. For blocks within EOF, generic_write_end() zeros them - * so they are safe to leave alone and be written with all the other valid data. + * On failure, we only need to kill delalloc blocks beyond EOF in the range of + * this specific write because they will never be written. Previous writes + * beyond EOF where block allocation succeeded do not need to be trashed, so + * only new blocks from this write should be trashed. For blocks within + * EOF, generic_write_end() zeros them so they are safe to leave alone and be + * written with all the other valid data. */ STATIC int xfs_vm_write_end( @@ -1659,8 +1662,11 @@ xfs_vm_write_end( loff_t to = pos + len; if (to > isize) { - truncate_pagecache(inode, isize); + /* only kill blocks in this write beyond EOF */ + if (pos > isize) + isize = pos; xfs_vm_kill_delalloc_range(inode, isize, to); + truncate_pagecache_range(inode, isize, to); } } return ret; -- 1.9.0 From alexander.tsvetkov@oracle.com Thu Apr 10 04:26:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A95CB29DF8 for ; Thu, 10 Apr 2014 04:26:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3BA23AC001 for ; Thu, 10 Apr 2014 02:26:47 -0700 (PDT) X-ASG-Debug-ID: 1397122005-04cbb00dc6872e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id PPruGBCN1ljYdaqm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 02:26:45 -0700 (PDT) X-Barracuda-Envelope-From: alexander.tsvetkov@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.2/Sentrion-MTA-4.3.2) with ESMTP id s3A9Qi8Y018199 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 09:26:45 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3A9QhJb027741 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 09:26:44 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3A9QhC5024527 for ; Thu, 10 Apr 2014 09:26:43 GMT Received: from [10.162.81.48] (/10.162.81.48) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Apr 2014 02:26:43 -0700 Message-ID: <53467259.1080604@oracle.com> Date: Thu, 10 Apr 2014 14:28:41 +0400 From: alexander.tsvetkov@oracle.com Organization: Oracle Corporation User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: generic/204: correct log size for XFS Content-Type: multipart/alternative; boundary="------------010405090604020909000207" X-ASG-Orig-Subj: generic/204: correct log size for XFS X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1397122005 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.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=HTML_MESSAGE, MARKETING_SUBJECT, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4751 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------010405090604020909000207 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit generic/204 fails on device with Advanced Format of 4096 bytes per physical sector and when partition starts at the 4K boundary/./In this case filesystem sector/block size will be of 4096 bytes size and _scratch_mkfs_sized fails because mkfs reports that 5Mb log size is not enough to create a filesystem, for example attempt to make filesystem on such partition: mkfs.xfs -f -bsize=4096 -l size=5m -d size=109051904 /dev/sdb2" results to: "log size 1280 blocks too small, minimum size is 1605 blocks" and generic/204fails with ENOSPC before it has finished creating the necessary files: "QA output created by 204 ./tests/generic/204: line 86: echo: write error: No space left on device ..." Log size of 7Mbis enough to make filesytem and pass this test. diff --git a/tests/generic/204 b/tests/generic/204 index 13a762a..4ebab26 100755 --- a/tests/generic/204 +++ b/tests/generic/204 @@ -53,9 +53,9 @@ _scratch_mkfs 2> /dev/null | _filter_mkfs 2> $tmp.mkfs > /dev/null # For xfs, we need to handle the different default log sizes that different # versions of mkfs create. All should be valid with a 5MB log, so use that. -[ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=5m" +[ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=7m" -SIZE=`expr 104 \* 1024 \* 1024` +SIZE=`expr 106 \* 1024 \* 1024` _scratch_mkfs_sized $SIZE $dbsize 2> /dev/null \ | _filter_mkfs 2> $tmp.mkfs > /dev/null _scratch_mount --------------010405090604020909000207 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit generic/204 fails on device with Advanced Format of 4096 bytes per
physical sector and when partition
starts at the 4K boundary.In this case
filesystem
sector/block size will be of 4096 bytes size and _scratch_mkfs_sized
fails because mkfs reports that 5Mb log size is not enough to create a filesystem,
for example attempt to make filesystem on such partition: 

mkfs.xfs -f -bsize=4096 -l size=5m -d size=109051904 /dev/sdb2"

results to:

"log size 1280 blocks too small, minimum size is 1605 blocks"

and generic/204
fails with ENOSPC before it has finished creating the necessary files:

"QA output created by 204
./tests/generic/204: line 86: echo: write error: No space left on device
..."

Log size of 7Mb
is enough to make filesytem and pass this test.

diff --git a/tests/generic/204 b/tests/generic/204
index 13a762a..4ebab26 100755
--- a/tests/generic/204
+++ b/tests/generic/204
@@ -53,9 +53,9 @@ _scratch_mkfs 2> /dev/null | _filter_mkfs 2> $tmp.mkfs > /dev/null

 # For xfs, we need to handle the different default log sizes that different
 # versions of mkfs create. All should be valid with a 5MB log, so use that.
-[ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=5m"
+[ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=7m"

-SIZE=`expr 104 \* 1024 \* 1024`
+SIZE=`expr 106 \* 1024 \* 1024`
 _scratch_mkfs_sized $SIZE $dbsize 2> /dev/null \
                | _filter_mkfs 2> $tmp.mkfs > /dev/null
 _scratch_mount
--------------010405090604020909000207-- From lczerner@redhat.com Thu Apr 10 04:55:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AB18A7F87 for ; Thu, 10 Apr 2014 04:55:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8F0C48F8052 for ; Thu, 10 Apr 2014 02:55:43 -0700 (PDT) X-ASG-Debug-ID: 1397123742-04bdf07dcc87540001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ByMsY2J06ZpDFrJS for ; Thu, 10 Apr 2014 02:55:42 -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-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 s3A9tgdb011928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 05:55:42 -0400 Received: from localhost.localdomain.com (dhcp-1-245.brq.redhat.com [10.34.1.245]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3A9te3H021449; Thu, 10 Apr 2014 05:55:41 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH] xfstests: fix specifying configuration value with equality sign Date: Thu, 10 Apr 2014 11:55:37 +0200 X-ASG-Orig-Subj: [PATCH] xfstests: fix specifying configuration value with equality sign Message-Id: <1397123737-3478-1-git-send-email-lczerner@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: 1397123742 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently there is a problem with parse_config_section() when the configuration value contains equality sign like this for example: MOUNT_OPTIONS="-o data=journal" the result will be export MOUNT_OPTIONS="-o data="journal" which is not going to work. The reason is that the expression used to parse the configuration options uses greedy matching '.*'. Fix this by using non greedy expression to match the first equality sign '[^=]'. Signed-off-by: Lukas Czerner --- common/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/config b/common/config index 00249e6..49f34cf 100644 --- a/common/config +++ b/common/config @@ -349,7 +349,7 @@ parse_config_section() { -e 's/#.*$//' \ -e 's/[[:space:]]*$//' \ -e 's/^[[:space:]]*//' \ - -e "s/^\(.*\)=\"\?'\?\([^\"']*\)\"\?'\?$/export \1=\"\2\"/" \ + -e "s/^\([^=]*\)=\"\?'\?\([^\"']*\)\"\?'\?$/export \1=\"\2\"/" \ < $HOST_OPTIONS \ | sed -n -e "/^\[$SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"` } -- 1.8.3.1 From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:24:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E269E7F9A for ; Thu, 10 Apr 2014 05:24:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9D49304043 for ; Thu, 10 Apr 2014 03:24:23 -0700 (PDT) X-ASG-Debug-ID: 1397125461-04bdf07dcc892f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wonmCe7pYtNkd9Bv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:24:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYC9d-0005qC-JN; Thu, 10 Apr 2014 10:24:21 +0000 Date: Thu, 10 Apr 2014 03:24:21 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140410102421.GA17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397071311-28371-2-git-send-email-bfoster@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397125461 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 09, 2014 at 03:21:50PM -0400, Brian Foster wrote: > xfs_vn_tmpfile() also fails to initialize security or default acls on > the newly created inode. Which it doesn't have to, as it is never available in the filesystem namespace. > The d_tmpfile() call is removed from xfs_create_tmpfile() and pulled up > into the new handler to address the deadlock. E.g., xfs_create_tmpfile() > has committed the create transaction and unlocked the inode prior to > mapping the inode to the dentry. This part of the patch looks sane, although the window where the XFS inode and VFS inode i_nlink are out of sync worries me a little. I don't think the other refactoring belongs into the same patch. If we decide that we want it please avoid the useless ACL inheritance for tmpfiles. From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:29:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9705A7F9A for ; Thu, 10 Apr 2014 05:29:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 872EB304043 for ; Thu, 10 Apr 2014 03:29:03 -0700 (PDT) X-ASG-Debug-ID: 1397125741-04cb6c77b485050001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id a9KLwX6FAEM0Bebz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:29:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCE9-0006uU-I1; Thu, 10 Apr 2014 10:29:01 +0000 Date: Thu, 10 Apr 2014 03:29:01 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/2] xfs: fold xfs_create_tmpfile() into xfs_create() Message-ID: <20140410102901.GB17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 2/2] xfs: fold xfs_create_tmpfile() into xfs_create() References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397071311-28371-3-git-send-email-bfoster@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397125742 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > - struct xfs_trans_res tres; > + struct xfs_trans_res *tres; > uint resblks; > > trace_xfs_create(dp, name); > @@ -1181,14 +1181,21 @@ xfs_create( > if (is_dir) { > rdev = 0; > resblks = XFS_MKDIR_SPACE_RES(mp, name->len); > - tres.tr_logres = M_RES(mp)->tr_mkdir.tr_logres; > - tres.tr_logcount = XFS_MKDIR_LOG_COUNT; > + tres = &M_RES(mp)->tr_mkdir; The (nice) reservation cleanup should be a patch of it's own. > + } else { > + /* > + * If we don't have a name, we're in the ->tmpfile() path. We > + * have a unique transaction here since we modify the unlinked > + * list rather than create a directory entry. > + */ How is that transaction more "uniqueue" than the others? Seems like this comment generally doesn't add a whole lot of value. > + if (name) { > + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); > + unlock_dp_on_error = true; > + > + error = xfs_dir_canenter(tp, dp, name, resblks); > + if (error) > + goto out_trans_cancel; > + } So we get another special case in this function. Can't say I like that too much, on the other hand I don't really like the duplicate code either. So I'm not excited about this, but also not strongly against it. From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:30:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D92D67F9A for ; Thu, 10 Apr 2014 05:30:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 70D5AAC006 for ; Thu, 10 Apr 2014 03:30:37 -0700 (PDT) X-ASG-Debug-ID: 1397125835-04cb6c77b585190001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id NanrGitAerjDBfvE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:30:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCFe-0007z0-Vx; Thu, 10 Apr 2014 10:30:34 +0000 Date: Thu, 10 Apr 2014 03:30:34 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: remove unused calculation in xfs_dir2_sf_addname() Message-ID: <20140410103034.GC17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove unused calculation in xfs_dir2_sf_addname() References: <5345C47B.40308@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5345C47B.40308@sandeen.net> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397125835 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.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:32:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F128F7F9A for ; Thu, 10 Apr 2014 05:32:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 866C6AC001 for ; Thu, 10 Apr 2014 03:32:19 -0700 (PDT) X-ASG-Debug-ID: 1397125938-04cb6c77b485320001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id I4UzvEe5uYyXxCQ6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:32:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCHJ-0007zp-OF; Thu, 10 Apr 2014 10:32:17 +0000 Date: Thu, 10 Apr 2014 03:32:17 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: kill buffers over failed write ranges properly Message-ID: <20140410103217.GD17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: kill buffers over failed write ranges properly References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-2-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397125938 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.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:35:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCD067FB4 for ; Thu, 10 Apr 2014 05:35:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4C08AAC002 for ; Thu, 10 Apr 2014 03:35:23 -0700 (PDT) X-ASG-Debug-ID: 1397126121-04cb6c77b6855a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id RTFwUhAzZHAKAFJU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:35:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCKH-0000da-BC; Thu, 10 Apr 2014 10:35:21 +0000 Date: Thu, 10 Apr 2014 03:35:21 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Message-ID: <20140410103521.GE17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-3-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397126121 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.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:35:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C4D2F7FB4 for ; Thu, 10 Apr 2014 05:35:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8424304043 for ; Thu, 10 Apr 2014 03:35:56 -0700 (PDT) X-ASG-Debug-ID: 1397126155-04cbb00dc58aee0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YbZfsXr9mUFORn6V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:35:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCKp-0000eG-9K; Thu, 10 Apr 2014 10:35:55 +0000 Date: Thu, 10 Apr 2014 03:35:55 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure Message-ID: <20140410103555.GF17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-4-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397126155 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Apr 10, 2014 at 03:00:50PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Similar to the write_begin problem, xfs-vm_write_end will truncate > back to the old EOF, potentially removing page cache from over the > top of delalloc blocks with valid data in them. Fix this by > truncating back to just the start of the failed write. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig Any reason you used max_t in the previous one, and opencode it here? From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:40:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C41127FB4 for ; Thu, 10 Apr 2014 05:40:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B7A6D8F8052 for ; Thu, 10 Apr 2014 03:40:02 -0700 (PDT) X-ASG-Debug-ID: 1397126401-04cb6c77b485a20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AuBHuHrBwVpyI2it (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:40:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCOn-0000z3-56; Thu, 10 Apr 2014 10:40:01 +0000 Date: Thu, 10 Apr 2014 03:40:01 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-ID: <20140410104001.GG17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-5-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397126401 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Apr 10, 2014 at 03:00:51PM +1000, Dave Chinner wrote: > From: Dave Chinner > > When we are zeroing space andit is covered by a delalloc range, we > need to punch the delalloc range out before we truncate the page > cache. Failing to do so leaves and inconsistency between the page > cache and the extent tree, which we later trip over when doing > direct IO over the same range. Looks good. Which test found this? > @@ -1432,9 +1434,18 @@ xfs_zero_file_space( > ASSERT(end_boundary <= offset + len); > > if (start_boundary < end_boundary - 1) { > - /* punch out the page cache over the conversion range */ > + /* > + * punch out delayed allocation blocks and the page cache over > + * the conversion range > + */ > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_bmap_punch_delalloc_range(ip, > + XFS_B_TO_FSB(mp, start_boundary), Shouldn't this be XFS_B_TO_FSBT? From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:40:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 072EE7FB4 for ; Thu, 10 Apr 2014 05:40:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD7118F8052 for ; Thu, 10 Apr 2014 03:40:41 -0700 (PDT) X-ASG-Debug-ID: 1397126441-04cb6c77b585ab0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DP4KflhO2h6ipDGg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:40:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCPQ-00020w-QT; Thu, 10 Apr 2014 10:40:40 +0000 Date: Thu, 10 Apr 2014 03:40:40 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: don't map ranges that span EOF for direct IO Message-ID: <20140410104040.GH17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: don't map ranges that span EOF for direct IO References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-6-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397126441 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.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 05:44:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA9067FB4 for ; Thu, 10 Apr 2014 05:44:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBB5C304039 for ; Thu, 10 Apr 2014 03:44:19 -0700 (PDT) X-ASG-Debug-ID: 1397126658-04cb6c77b585d90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FOKQPgylcO13zeKp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 03:44:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYCSw-000261-E4; Thu, 10 Apr 2014 10:44:18 +0000 Date: Thu, 10 Apr 2014 03:44:18 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: collapse range is delalloc challenged. Message-ID: <20140410104418.GI17641@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: collapse range is delalloc challenged. References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-7-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397126658 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > - *current_ext < XFS_IFORK_NEXTENTS(ip, whichfork)) { > + /* > + * There may be delalloc extents in the data fork before the range we > + * are collapsing out, so we cannot > + * use the count of real extents here. Instead we have to calculate it > + * from the incore fork. > + */ > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); Between the amount of times we have this calculation opencoded, and the confusing nature of XFS_IFORK_NEXTENTS it might be time to introduce a macro to get the proper number of incore extents. But no need to do this now, so: Reviewed-by: Christoph Hellwig From bfoster@redhat.com Thu Apr 10 07:20:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 491FD7FB4 for ; Thu, 10 Apr 2014 07:20:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32022304039 for ; Thu, 10 Apr 2014 05:20:30 -0700 (PDT) X-ASG-Debug-ID: 1397132424-04cb6c77b48c3a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cgLr0aSDSuRJ81nA for ; Thu, 10 Apr 2014 05:20:30 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3ACJw57029076 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 10 Apr 2014 08:19:58 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3ACJvCL003230; Thu, 10 Apr 2014 08:19:58 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 05BAF1256CC; Thu, 10 Apr 2014 08:19:56 -0400 (EDT) Date: Thu, 10 Apr 2014 08:19:56 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/2] xfs: fold xfs_create_tmpfile() into xfs_create() Message-ID: <20140410121956.GB14124@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 2/2] xfs: fold xfs_create_tmpfile() into xfs_create() References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-3-git-send-email-bfoster@redhat.com> <20140410102901.GB17641@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410102901.GB17641@infradead.org> 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: 1397132424 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 10, 2014 at 03:29:01AM -0700, Christoph Hellwig wrote: > > - struct xfs_trans_res tres; > > + struct xfs_trans_res *tres; > > uint resblks; > > > > trace_xfs_create(dp, name); > > @@ -1181,14 +1181,21 @@ xfs_create( > > if (is_dir) { > > rdev = 0; > > resblks = XFS_MKDIR_SPACE_RES(mp, name->len); > > - tres.tr_logres = M_RES(mp)->tr_mkdir.tr_logres; > > - tres.tr_logcount = XFS_MKDIR_LOG_COUNT; > > + tres = &M_RES(mp)->tr_mkdir; > > The (nice) reservation cleanup should be a patch of it's own. > Ok. > > + } else { > > + /* > > + * If we don't have a name, we're in the ->tmpfile() path. We > > + * have a unique transaction here since we modify the unlinked > > + * list rather than create a directory entry. > > + */ > > How is that transaction more "uniqueue" than the others? Seems like > this comment generally doesn't add a whole lot of value. > It's just as unique as the others. ;) I wasn't intending to call out this transaction as special in any way. Rather, I was just trying to document why there is a separate transaction depending on the existence of the name. I can drop the comment. > > + if (name) { > > + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); > > + unlock_dp_on_error = true; > > + > > + error = xfs_dir_canenter(tp, dp, name, resblks); > > + if (error) > > + goto out_trans_cancel; > > + } > > So we get another special case in this function. Can't say I like that > too much, on the other hand I don't really like the duplicate code > either. So I'm not excited about this, but also not strongly against it. > Indeed. I debated whether it would be reasonable to make this function slightly longer and more complex on its own. When I realized xfs_create_tmpfile() was 90% duplicate, it seemed worth the tradeoff for a 100+ line function. Brian From david@fromorbit.com Thu Apr 10 07:23:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2962F7F63 for ; Thu, 10 Apr 2014 07:23:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B2028F804B for ; Thu, 10 Apr 2014 05:23:05 -0700 (PDT) X-ASG-Debug-ID: 1397132583-04bdf07dcc90e00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id feElkgSRN94tdeOy for ; Thu, 10 Apr 2014 05:23:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArhlALeMRlN5LEcvPGdsb2JhbABagwaIWbcEhV2BIhcDAQEBATg1giUBAQEEOhwjEAgDDgcDCSUPBSUDBxoTh3vNJBcWjlYHgySBFASYXZYFKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 10 Apr 2014 21:53:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYE0R-0005au-M6; Thu, 10 Apr 2014 22:22:59 +1000 Date: Thu, 10 Apr 2014 22:22:59 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-ID: <20140410122259.GC27519@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-5-git-send-email-david@fromorbit.com> <20140410104001.GG17641@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410104001.GG17641@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397132583 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 03:40:01AM -0700, Christoph Hellwig wrote: > On Thu, Apr 10, 2014 at 03:00:51PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > When we are zeroing space andit is covered by a delalloc range, we > > need to punch the delalloc range out before we truncate the page > > cache. Failing to do so leaves and inconsistency between the page > > cache and the extent tree, which we later trip over when doing > > direct IO over the same range. > > Looks good. > > Which test found this? The fsstress tests - any of them will do. It showed after I merged Lukas' FALLOC_FL_ZERO_RANGE support patches for fsstress and fsx into xfstests, but it wasn't reliably triggering until I fixed the __xfs_get_blocks DIO bug that Al found... > > @@ -1432,9 +1434,18 @@ xfs_zero_file_space( > > ASSERT(end_boundary <= offset + len); > > > > if (start_boundary < end_boundary - 1) { > > - /* punch out the page cache over the conversion range */ > > + /* > > + * punch out delayed allocation blocks and the page cache over > > + * the conversion range > > + */ > > + xfs_ilock(ip, XFS_ILOCK_EXCL); > > + error = xfs_bmap_punch_delalloc_range(ip, > > + XFS_B_TO_FSB(mp, start_boundary), > > Shouldn't this be XFS_B_TO_FSBT? XFS_B_TO_FSB gives the same result given that we've already rounded start_boundary to block granularity.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 07:29:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18F947F81 for ; Thu, 10 Apr 2014 07:29:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3ADAAC001 for ; Thu, 10 Apr 2014 05:29:47 -0700 (PDT) X-ASG-Debug-ID: 1397132985-04cb6c77b78cf20001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id hHcTHAWMzyrcoXEg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 05:29:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYE6y-0002ol-4V; Thu, 10 Apr 2014 12:29:44 +0000 Date: Thu, 10 Apr 2014 05:29:44 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-man@vger.kernel.org, linux-security-module@vger.kernel.org, Al Viro , Andreas Gruenbacher Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140410122944.GA6579@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> <20140410121947.GA14124@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410121947.GA14124@bfoster.bfoster> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397132985 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 08:19:48AM -0400, Brian Foster wrote: > Are you saying it doesn't have to initialize security or the default > acl, or both? The ACLs for sure. LSM do run-time access decisions, so they will probably rely on the security data being initialized. Given that O_TMPFILE files aren't publicly available I'm not sure there's a point in them doing that, though. LSMs are also affected by the lack of a proper parent I'll discuss for ACLs below. > The intent here was to have the case covered where the inode happens to > be linked back into the namespace since we don't do this work in the > link path. That's an interesting one. O_TMFILE files don't have a real parent to inherit ACLs from, the pathname passed in just needs to point to a directory to find the filesystem to create the tmpfile in. On the other hand it seem like the extN implementations do inherity the ACL in this case. The link into the namespace is irrelavant here as ACL inheritance only happens on initial create, not at link time. I also think we'll absolutely need a test case for ACLs+tmpfile to make sure all filesystems handle it the same way. > The bulk of the refactoring was with the idea that the inode setup for > the tmpfile case is generally equivalent for the traditional create > case. The original version was posted here: > > http://oss.sgi.com/archives/xfs/2014-04/msg00149.html > > ... and it just fixes the deadlock and adds the security initialization. > I suppose I could still break that out into multiple patches, but that > aside, is that behavior preferred? I think just fixing the deadlock and initializing the security is enough for the first pass. If you want to do the refactoring on top send it as a second series on top of the actual fixes. From bfoster@redhat.com Thu Apr 10 07:31:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6C3257F87 for ; Thu, 10 Apr 2014 07:31:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5E551304053 for ; Thu, 10 Apr 2014 05:31:05 -0700 (PDT) X-ASG-Debug-ID: 1397133064-04cb6c77b78d0b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Fn6ib3aBgmt8HN5m for ; Thu, 10 Apr 2014 05:31:04 -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 s3ACJoNT027696 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 10 Apr 2014 08:19:50 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3ACJnuf024432; Thu, 10 Apr 2014 08:19:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BAB521256CC; Thu, 10 Apr 2014 08:19:48 -0400 (EDT) Date: Thu, 10 Apr 2014 08:19:48 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140410121947.GA14124@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410102421.GA17641@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397133064 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 10, 2014 at 03:24:21AM -0700, Christoph Hellwig wrote: > On Wed, Apr 09, 2014 at 03:21:50PM -0400, Brian Foster wrote: > > xfs_vn_tmpfile() also fails to initialize security or default acls on > > the newly created inode. > > Which it doesn't have to, as it is never available in the filesystem > namespace. > Are you saying it doesn't have to initialize security or the default acl, or both? The intent here was to have the case covered where the inode happens to be linked back into the namespace since we don't do this work in the link path. > > The d_tmpfile() call is removed from xfs_create_tmpfile() and pulled up > > into the new handler to address the deadlock. E.g., xfs_create_tmpfile() > > has committed the create transaction and unlocked the inode prior to > > mapping the inode to the dentry. > > This part of the patch looks sane, although the window where the XFS > inode and VFS inode i_nlink are out of sync worries me a little. > > I don't think the other refactoring belongs into the same patch. > > If we decide that we want it please avoid the useless ACL inheritance > for tmpfiles. The bulk of the refactoring was with the idea that the inode setup for the tmpfile case is generally equivalent for the traditional create case. The original version was posted here: http://oss.sgi.com/archives/xfs/2014-04/msg00149.html ... and it just fixes the deadlock and adds the security initialization. I suppose I could still break that out into multiple patches, but that aside, is that behavior preferred? Brian From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 07:33:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B1DBE7F87 for ; Thu, 10 Apr 2014 07:33:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73F6AAC001 for ; Thu, 10 Apr 2014 05:33:34 -0700 (PDT) X-ASG-Debug-ID: 1397133213-04bdf07dca91ab0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id yhYpO5eQD0VDjvAD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 05:33:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYEAe-00044u-Ui; Thu, 10 Apr 2014 12:33:32 +0000 Date: Thu, 10 Apr 2014 05:33:32 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-ID: <20140410123332.GA15577@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-5-git-send-email-david@fromorbit.com> <20140410104001.GG17641@infradead.org> <20140410122259.GC27519@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410122259.GC27519@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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397133213 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 10:22:59PM +1000, Dave Chinner wrote: > XFS_B_TO_FSB gives the same result given that we've already rounded > start_boundary to block granularity.... It does, but XFS_B_TO_FSBT is one less operation, and it's the better example for a start offset when people start copy & pasting it. From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 08:23:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F7F87F8C for ; Thu, 10 Apr 2014 08:23:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8DE208F8039 for ; Thu, 10 Apr 2014 06:23:47 -0700 (PDT) X-ASG-Debug-ID: 1397136226-04cb6c77b7913c0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id XOuNd0STvTbXtpNL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 06:23:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYExG-0007m7-2q; Thu, 10 Apr 2014 13:23:46 +0000 Date: Thu, 10 Apr 2014 06:23:46 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix tmpfile/selinux deadlock and initialize security Message-ID: <20140410132346.GA29876@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix tmpfile/selinux deadlock and initialize security References: <1396977915-35768-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396977915-35768-1-git-send-email-bfoster@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397136226 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4755 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- As discussed previously I prefer this version for now: Reviewed-by: Christoph Hellwig From BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 10 08:24:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC8367F8C for ; Thu, 10 Apr 2014 08:24:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89ECDAC002 for ; Thu, 10 Apr 2014 06:24:13 -0700 (PDT) X-ASG-Debug-ID: 1397136251-04cbb00dc595950001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 4TDqCB3prZKS185S (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 06:24:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+69a9cef294f7b3336073+3882+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYExf-0007mH-8N; Thu, 10 Apr 2014 13:24:11 +0000 Date: Thu, 10 Apr 2014 06:24:11 -0700 From: Christoph Hellwig To: Wanlong Gao Cc: xfs@oss.sgi.com, yuanhan.liu@linux.intel.com, fengguang.wu@intel.com Subject: Re: [PATCH] xfstests: fix wallclock possibly wrapped problem Message-ID: <20140410132411.GB29876@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix wallclock possibly wrapped problem References: <1396932738-13638-1-git-send-email-gaowanlong@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396932738-13638-1-git-send-email-gaowanlong@cn.fujitsu.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397136252 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4755 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From tinguely@sgi.com Thu Apr 10 08:29:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8399E7F8C for ; Thu, 10 Apr 2014 08:29:02 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3246A304053; Thu, 10 Apr 2014 06:28:58 -0700 (PDT) Message-ID: <53469C9C.8010604@sgi.com> Date: Thu, 10 Apr 2014 08:29:00 -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, bob.mastors@solidfire.com, snitzer@redhat.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> In-Reply-To: <1397104955-7247-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 04/09/14 23:42, Dave Chinner wrote: > From: Dave Chinner > > And interesting situation can occur if a log IO error occurs during > the unmount of a filesystem. The cases reported have the same > signature - the update of the superblock counters fails due to a log > write IO error: > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > XFS (dm-16): xfs_log_force: error 5 returned. > XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > It can be seen that the last line of output contains a corrupt > device name - this is because the log and xfs_mount structures have > already been freed by the time this message is printed. A kernel > oops closely follows. > > The issue is that the shutdown is occurring in a separate IO > completion thread to the unmount. Once the shutdown processing has > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > log shutdown code wakes anyone waiting on a log force so they can > process the shutdown error. This wakes up the unmount code that > is doing a synchronous transaction to update the superblock > counters. > > The unmount path now sees all the iclogs are marked with > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > it does, there will not be a wakeup trigger for it and we will hang > the unmount if we do. Hence the unmount runs through all the > remaining code and frees all the filesystem structures while the > xlog_iodone() is still processing the shutdown. When the log > shutdown processing completes, xfs_do_force_shutdown() emits the > "Please umount the filesystem and rectify the problem(s)" message, > and xlog_iodone() then aborts all the objects attached to the iclog. > An iclog that has already been freed.... > > The real issue here is that there is no serialisation point between > the log IO and the unmount. We have serialisations points for log > writes, log forces, reservations, etc, but we don't actually have > any code that wakes for log IO to fully complete. We do that for all > other types of object, so why not iclogbufs? > > Well, it turns out that we can easily do this. We've got xfs_buf > handles, and that's what everyone else uses for IO serialisation. > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > release the lock in xlog_iodone() when we are finished with the > buffer. That way before we tear down the iclog, we can lock and > unlock the buffer to ensure IO completion has finished completely > before we tear it down. > > Signed-off-by: Dave Chinner The wait queue "xc_commit_wait" is used for two purposes, first to start the next ic_log buffer completion and also to wake those waiting for a syncronous event. Shutdown does syncronous cil pushes but it does not wait for the IO to happen. Why not wait for the IO to happen or fail before waking out the sync waiters? If you want to keep the speedier completion of the next cil push add another wait queue. There only a few (typically 8) per filesystem. --Mark. From tinguely@sgi.com Thu Apr 10 08:38:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1129E7F8E for ; Thu, 10 Apr 2014 08:38:56 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE7FC8F8039; Thu, 10 Apr 2014 06:38:55 -0700 (PDT) Message-ID: <53469EF0.3030407@sgi.com> Date: Thu, 10 Apr 2014 08:38:56 -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: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH 15/14] xfs_io: free memory on error path exit from bmap_f() References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> <5345C751.8040803@sandeen.net> In-Reply-To: <5345C751.8040803@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/09/14 17:18, Eric Sandeen wrote: > If realloc() fails, the memory it was trying to realloc remains; > free it on the error path. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/io/bmap.c b/io/bmap.c > index a78cbb1..8e5d75e 100644 > --- a/io/bmap.c > +++ b/io/bmap.c > @@ -227,6 +227,7 @@ bmap_f( > fprintf(stderr, > _("%s: cannot realloc %d bytes\n"), > progname, (int)(map_size*sizeof(*map))); > + free(map); > exitcode = 1; > return 0; > } Didn't it get into this block by comparing map to NULL? --Mark. From sandeen@sandeen.net Thu Apr 10 09:15:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 79A8F7FA1 for ; Thu, 10 Apr 2014 09:15:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5A96A304053 for ; Thu, 10 Apr 2014 07:15:57 -0700 (PDT) X-ASG-Debug-ID: 1397139353-04cbb00dc3996e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0rQyNoRitFPyKLOl for ; Thu, 10 Apr 2014 07:15: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0451E60F22FB; Thu, 10 Apr 2014 09:15:52 -0500 (CDT) Message-ID: <5346A797.4030508@sandeen.net> Date: Thu, 10 Apr 2014 09:15:51 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely CC: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH 15/14] xfs_io: free memory on error path exit from bmap_f() References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> <5345C751.8040803@sandeen.net> <53469EF0.3030407@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 15/14] xfs_io: free memory on error path exit from bmap_f() In-Reply-To: <53469EF0.3030407@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397139353 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4756 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/10/14, 8:38 AM, Mark Tinguely wrote: > On 04/09/14 17:18, Eric Sandeen wrote: >> If realloc() fails, the memory it was trying to realloc remains; >> free it on the error path. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/io/bmap.c b/io/bmap.c >> index a78cbb1..8e5d75e 100644 >> --- a/io/bmap.c >> +++ b/io/bmap.c >> @@ -227,6 +227,7 @@ bmap_f( >> fprintf(stderr, >> _("%s: cannot realloc %d bytes\n"), >> progname, (int)(map_size*sizeof(*map))); >> + free(map); >> exitcode = 1; >> return 0; >> } > > > Didn't it get into this block by comparing map to NULL? Uh yes, yes we did. Sorry, was getting a bit slap-happy by then. I guess p = realloc(p) will always lose the memory if it fails, w/o a temporary var. Sorry about that! -Eric > --Mark. > From lczerner@redhat.com Thu Apr 10 09:23:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 50F787FA1 for ; Thu, 10 Apr 2014 09:23:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3BC23304053 for ; Thu, 10 Apr 2014 07:23:24 -0700 (PDT) X-ASG-Debug-ID: 1397139802-04cbb00dc49a000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BHR5Sf1Wai5t87p1 for ; Thu, 10 Apr 2014 07:23:23 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AENM6x023759 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 10:23:22 -0400 Received: from localhost.localdomain.com (dhcp-1-245.brq.redhat.com [10.34.1.245]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AENLgX029187; Thu, 10 Apr 2014 10:23:21 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH] xfstests: Fix generic/022 output file Date: Thu, 10 Apr 2014 16:23:17 +0200 X-ASG-Orig-Subj: [PATCH] xfstests: Fix generic/022 output file Message-Id: <1397139797-9650-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397139803 X-Barracuda-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 commit 21723cdb I've accidentally changed header in the output file to a wrong number. It should be 022, fix it. Signed-off-by: Lukas Czerner --- tests/generic/022.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generic/022.out b/tests/generic/022.out index 96c2d33..fbffa59 100644 --- a/tests/generic/022.out +++ b/tests/generic/022.out @@ -1,4 +1,4 @@ -QA output created by 009 +QA output created by 022 1. into a hole f4f35d60b3cc18aaa6d8d92f0cd3708a 2. into allocated space -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 10FB27F84 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5B3830405F for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-ASG-Debug-ID: 1397146119-04bdf07dcca3d20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g3S4ckOydINII48i for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8df1008810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dOQ022368 for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 15B211256D8; Thu, 10 Apr 2014 12:08:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 09/11] xfs: add finobt support to growfs Date: Thu, 10 Apr 2014 12:08:34 -0400 X-ASG-Orig-Subj: [PATCH v5 09/11] xfs: add finobt support to growfs Message-Id: <1397146116-42546-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146119 X-Barracuda-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 finobt support to growfs. Initialize the agi root/level fields and the root finobt block. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 02fb943..96e4eb0 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -316,6 +316,10 @@ xfs_growfs_data_private( 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); + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); + agi->agi_free_level = cpu_to_be32(1); + } for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++) agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO); @@ -407,6 +411,34 @@ xfs_growfs_data_private( xfs_buf_relse(bp); if (error) goto error0; + + /* + * FINO btree root block + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + bp = xfs_growfs_get_hdr_buf(mp, + XFS_AGB_TO_DADDR(mp, agno, XFS_FIBT_BLOCK(mp)), + BTOBB(mp->m_sb.sb_blocksize), 0, + &xfs_inobt_buf_ops); + if (!bp) { + error = ENOMEM; + goto error0; + } + + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, bp, XFS_FIBT_CRC_MAGIC, + 0, 0, agno, + XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, bp, XFS_FIBT_MAGIC, 0, + 0, agno, 0); + + error = xfs_bwrite(bp); + xfs_buf_relse(bp); + if (error) + goto error0; + } + } xfs_trans_agblocks_delta(tp, nfree); /* -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3CF697F87 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B00A8F8040 for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397146120-04cb6c77b79ee50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5jP7tCK44tfoQyHO for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8d9L002901 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8d5g013378 for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8CF531256D2; Thu, 10 Apr 2014 12:08:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 05/11] xfs: insert newly allocated inode chunks into the finobt Date: Thu, 10 Apr 2014 12:08:30 -0400 X-ASG-Orig-Subj: [PATCH v5 05/11] xfs: insert newly allocated inode chunks into the finobt Message-Id: <1397146116-42546-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-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: 1397146120 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A newly allocated inode chunk, by definition, has at least one free inode, so a record is always inserted into the finobt. Create the xfs_inobt_insert() helper from existing code to insert a record in an inobt based on the provided BTNUM. Update xfs_ialloc_ag_alloc() to invoke the helper for the existing XFS_BTNUM_INO tree and XFS_BTNUM_FINO tree, if enabled. Reviewed-by: Dave Chinner Signed-off-by: Brian Foster --- fs/xfs/xfs_ialloc.c | 93 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index a0aead5..203db98 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -112,6 +112,66 @@ xfs_inobt_get_rec( } /* + * Insert a single inobt record. Cursor must already point to desired location. + */ +STATIC int +xfs_inobt_insert_rec( + struct xfs_btree_cur *cur, + __int32_t freecount, + xfs_inofree_t free, + int *stat) +{ + cur->bc_rec.i.ir_freecount = freecount; + cur->bc_rec.i.ir_free = free; + return xfs_btree_insert(cur, stat); +} + +/* + * Insert records describing a newly allocated inode chunk into the inobt. + */ +STATIC int +xfs_inobt_insert( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t newino, + xfs_agino_t newlen, + xfs_btnum_t btnum) +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agino_t thisino; + int i; + int error; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + for (thisino = newino; + thisino < newino + newlen; + thisino += XFS_INODES_PER_CHUNK) { + error = xfs_inobt_lookup(cur, thisino, XFS_LOOKUP_EQ, &i); + if (error) { + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; + } + ASSERT(i == 0); + + error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + XFS_INOBT_ALL_FREE, &i); + if (error) { + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; + } + ASSERT(i == 1); + } + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + + return 0; +} + +/* * Verify that the number of free inodes in the AGI is correct. */ #ifdef DEBUG @@ -303,13 +363,10 @@ xfs_ialloc_ag_alloc( { xfs_agi_t *agi; /* allocation group header */ xfs_alloc_arg_t args; /* allocation argument structure */ - xfs_btree_cur_t *cur; /* inode btree cursor */ xfs_agnumber_t agno; int error; - int i; xfs_agino_t newino; /* new first inode's number */ xfs_agino_t newlen; /* new number of inodes */ - xfs_agino_t thisino; /* current inode number, for loop */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ struct xfs_perag *pag; @@ -459,29 +516,19 @@ xfs_ialloc_ag_alloc( agi->agi_newino = cpu_to_be32(newino); /* - * Insert records describing the new inode chunk into the btree. + * Insert records describing the new inode chunk into the btrees. */ - cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO); - for (thisino = newino; - thisino < newino + newlen; - thisino += XFS_INODES_PER_CHUNK) { - cur->bc_rec.i.ir_startino = thisino; - cur->bc_rec.i.ir_freecount = XFS_INODES_PER_CHUNK; - cur->bc_rec.i.ir_free = XFS_INOBT_ALL_FREE; - error = xfs_btree_lookup(cur, XFS_LOOKUP_EQ, &i); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; - } - ASSERT(i == 0); - error = xfs_btree_insert(cur, &i); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_FINO); + if (error) return error; - } - ASSERT(i == 1); } - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); /* * Log allocation group header fields */ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 678E67F92 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5288F8F8040 for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397146120-04cb6c77b59ee50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id D1DPVIwSxpyUI3e6 for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dCr004149 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8d5i013378 for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 438E41256CC; Thu, 10 Apr 2014 12:08:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 08/11] xfs: update the finobt on inode free Date: Thu, 10 Apr 2014 12:08:33 -0400 X-ASG-Orig-Subj: [PATCH v5 08/11] xfs: update the finobt on inode free Message-Id: <1397146116-42546-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-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: 1397146120 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An inode free operation can have several effects on the finobt. If all inodes have been freed and the chunk deallocated, we remove the finobt record. If the inode chunk was previously full, we must insert a new record based on the existing inobt record. Otherwise, we modify the record in place. Create the xfs_difree_finobt() function to identify the potential scenarios and update the finobt appropriately. Signed-off-by: Brian Foster --- fs/xfs/xfs_ialloc.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e165c33..0629fd6 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1559,6 +1559,99 @@ error0: } /* + * Free an inode in the free inode btree. + */ +STATIC int +xfs_difree_finobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t agino, + struct xfs_inobt_rec_incore *ibtrec) /* inobt record */ +{ + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + struct xfs_btree_cur *cur; + struct xfs_inobt_rec_incore rec; + int offset = agino - ibtrec->ir_startino; + int error; + int i; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + + error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + if (i == 0) { + /* + * If the record does not exist in the finobt, we must have just + * freed an inode in a previously fully allocated chunk. If not, + * something is out of sync. + */ + XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); + + error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + ibtrec->ir_free, &i); + if (error) + goto error; + ASSERT(i == 1); + + goto out; + } + + /* + * Read and update the existing record. We could just copy the ibtrec + * across here, but that would defeat the purpose of having redundant + * metadata. By making the modifications independently, we can catch + * corruptions that we wouldn't see if we just copied from one record + * to another. + */ + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + rec.ir_free |= XFS_INOBT_MASK(offset); + rec.ir_freecount++; + + XFS_WANT_CORRUPTED_GOTO((rec.ir_free == ibtrec->ir_free) && + (rec.ir_freecount == ibtrec->ir_freecount), + error); + + /* + * The content of inobt records should always match between the inobt + * and finobt. The lifecycle of records in the finobt is different from + * the inobt in that the finobt only tracks records with at least one + * free inode. Hence, if all of the inodes are free and we aren't + * keeping inode chunks permanently on disk, remove the record. + * Otherwise, update the record with the new information. + */ + if (rec.ir_freecount == mp->m_ialloc_inos && + !(mp->m_flags & XFS_MOUNT_IKEEP)) { + error = xfs_btree_delete(cur, &i); + if (error) + goto error; + ASSERT(i == 1); + } else { + error = xfs_inobt_update(cur, &rec); + if (error) + goto error; + } + +out: + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error; + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; + +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Free disk inode. Carefully avoids touching the incore inode, all * manipulations incore are the caller's responsibility. * The on-disk inode is not changed by this operation, only the @@ -1626,6 +1719,15 @@ xfs_difree( if (error) goto error0; + /* + * Fix up the free inode btree. + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + error = xfs_difree_finobt(mp, tp, agbp, agino, &rec); + if (error) + goto error0; + } + return 0; error0: -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7CBE47F9B for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C12730405F for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397146120-04cb6c77b49ee50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lzsHSX4epK9i4TLL for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AG8dsl002837 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:40 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dOS022368 for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 98DFC125602; Thu, 10 Apr 2014 12:08:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 11/11] xfs: enable the finobt feature on v5 superblocks Date: Thu, 10 Apr 2014 12:08:36 -0400 X-ASG-Orig-Subj: [PATCH v5 11/11] xfs: enable the finobt feature on v5 superblocks Message-Id: <1397146116-42546-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146120 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add the finobt feature bit to the list of known features. As of this point, the kernel code knows how to mount and manage both finobt and non-finobt formatted filesystems. Reviewed-by: Dave Chinner Signed-off-by: Brian Foster --- fs/xfs/xfs_sb.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 7f53a85..950d1ea 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -588,7 +588,8 @@ xfs_sb_has_compat_feature( } #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ -#define XFS_SB_FEAT_RO_COMPAT_ALL 0 +#define XFS_SB_FEAT_RO_COMPAT_ALL \ + (XFS_SB_FEAT_RO_COMPAT_FINOBT) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool xfs_sb_has_ro_compat_feature( -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5EADB7F91 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6951AC00B for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-ASG-Debug-ID: 1397146119-04cbb00dc6a27e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2iGHQS18Uk8tp4nT for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AG8cs2007093 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AG8cr1010788 for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2D5FC1256D0; Thu, 10 Apr 2014 12:08:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 04/11] xfs: update inode allocation/free transaction reservations for finobt Date: Thu, 10 Apr 2014 12:08:29 -0400 X-ASG-Orig-Subj: [PATCH v5 04/11] xfs: update inode allocation/free transaction reservations for finobt Message-Id: <1397146116-42546-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@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: 1397146119 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Create the xfs_calc_finobt_res() helper to calculate the finobt log reservation for inode allocation and free. Update XFS_IALLOC_SPACE_RES() to reserve blocks for the additional finobt insertion on inode allocation. Create XFS_IFREE_SPACE_RES() to reserve blocks for the potential finobt record insertion on inode free (i.e., if an inode chunk was previously fully allocated). Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 25 ++++++++++++++++++++++- fs/xfs/xfs_trans_resv.c | 53 +++++++++++++++++++++++++++++++++++++++++++++--- fs/xfs/xfs_trans_space.h | 7 ++++++- 3 files changed, 80 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5e7a38f..8576892 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1837,8 +1837,31 @@ xfs_inactive_ifree( int error; tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + + /* + * The ifree transaction might need to allocate blocks for record + * insertion to the finobt. We don't want to fail here at ENOSPC, so + * allow ifree to dip into the reserved block pool if necessary. + * + * Freeing large sets of inodes generally means freeing inode chunks, + * directory and file data blocks, so this should be relatively safe. + * Only under severe circumstances should it be possible to free enough + * inodes to exhaust the reserve block pool via finobt expansion while + * at the same time not creating free space in the filesystem. + * + * Send a warning if the reservation does happen to fail, as the inode + * now remains allocated and sits on the unlinked list until the fs is + * repaired. + */ + tp->t_flags |= XFS_TRANS_RESERVE; + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, + XFS_IFREE_SPACE_RES(mp), 0); if (error) { + if (error == ENOSPC) + xfs_warn_ratelimited(mp, + "Failed to remove inode(s) from unlinked list. " + "Please free space, unmount and run xfs_repair."); + ASSERT(XFS_FORCED_SHUTDOWN(mp)); xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); return error; diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index ae36816..52b6c3e 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -106,6 +106,47 @@ xfs_calc_inode_res( } /* + * The free inode btree is a conditional feature and the log reservation + * requirements differ slightly from that of the traditional inode allocation + * btree. The finobt tracks records for inode chunks with at least one free + * inode. A record can be removed from the tree for an inode allocation + * or free and thus the finobt reservation is unconditional across: + * + * - inode allocation + * - inode free + * - inode chunk allocation + * + * The 'modify' param indicates to include the record modification scenario. The + * 'alloc' param indicates to include the reservation for free space btree + * modifications on behalf of finobt modifications. This is required only for + * transactions that do not already account for free space btree modifications. + * + * the free inode btree: max depth * block size + * the allocation btrees: 2 trees * (max depth - 1) * block size + * the free inode btree entry: block size + */ +STATIC uint +xfs_calc_finobt_res( + struct xfs_mount *mp, + int alloc, + int modify) +{ + uint res; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return 0; + + res = xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)); + if (alloc) + res += xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); + if (modify) + res += (uint)XFS_FSB_TO_B(mp, 1); + + return res; +} + +/* * Various log reservation values. * * These are based on the size of the file system block because that is what @@ -302,6 +343,7 @@ xfs_calc_remove_reservation( * the superblock for the nlink flag: sector size * the directory btree: (max depth + v2) * dir block size * the directory inode's bmap btree: (max depth + v2) * block size + * the finobt (record modification and allocation btrees) */ STATIC uint xfs_calc_create_resv_modify( @@ -310,7 +352,8 @@ xfs_calc_create_resv_modify( return xfs_calc_inode_res(mp, 2) + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + (uint)XFS_FSB_TO_B(mp, 1) + - xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)); + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 1, 1); } /* @@ -348,6 +391,7 @@ __xfs_calc_create_reservation( * the superblock for the nlink flag: sector size * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt (record insertion) */ STATIC uint xfs_calc_icreate_resv_alloc( @@ -357,7 +401,8 @@ xfs_calc_icreate_resv_alloc( mp->m_sb.sb_sectsize + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 0, 0); } STATIC uint @@ -425,6 +470,7 @@ xfs_calc_symlink_reservation( * the on disk inode before ours in the agi hash list: inode cluster size * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt (record insertion, removal or modification) */ STATIC uint xfs_calc_ifree_reservation( @@ -439,7 +485,8 @@ xfs_calc_ifree_reservation( xfs_calc_buf_res(2 + mp->m_ialloc_blks + mp->m_in_maxlevels, 0) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 0, 1); } /* diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index af5dbe0..df4c1f8 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -47,7 +47,9 @@ #define XFS_DIRREMOVE_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) #define XFS_IALLOC_SPACE_RES(mp) \ - ((mp)->m_ialloc_blks + (mp)->m_in_maxlevels - 1) + ((mp)->m_ialloc_blks + \ + (xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1 * \ + ((mp)->m_in_maxlevels - 1))) /* * Space reservation values for various transactions. @@ -82,5 +84,8 @@ (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) #define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) +#define XFS_IFREE_SPACE_RES(mp) \ + (xfs_sb_version_hasfinobt(&mp->m_sb) ? (mp)->m_in_maxlevels : 0) + #endif /* __XFS_TRANS_SPACE_H__ */ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28A967F85 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13B948F8040 for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397146118-04cbb00dc4a27d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id shHKPnsXpafUTR8g for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8c5x008803 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8cBY022358 for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 165C61256CC; Thu, 10 Apr 2014 12:08:36 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 02/11] xfs: reserve v5 superblock read-only compat. feature bit for finobt Date: Thu, 10 Apr 2014 12:08:27 -0400 X-ASG-Orig-Subj: [PATCH v5 02/11] xfs: reserve v5 superblock read-only compat. feature bit for finobt Message-Id: <1397146116-42546-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146119 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Reserve a v5 read-only compatibility feature bit for the finobt and create the xfs_sb_version_hasfinobt() helper to determine whether an fs has the feature enabled. The finobt does not change existing on-disk structures, but must remain consistent with the ialloc btree. Modifications from older kernels would violate that constrant. Therefore, we restrict older kernels to read-only mounts of finobt-enabled filesystems. Note that this does not yet enable the ability to rw mount a finobt fs (by setting the feature bit in the XFS_SB_FEAT_RO_COMPAT_ALL mask). Reviewed-by: Dave Chinner Signed-off-by: Brian Foster --- fs/xfs/xfs_sb.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index f7b2fe7..7f53a85 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -587,6 +587,7 @@ xfs_sb_has_compat_feature( return (sbp->sb_features_compat & feature) != 0; } +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ #define XFS_SB_FEAT_RO_COMPAT_ALL 0 #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool @@ -641,6 +642,12 @@ static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } +static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); +} + /* * end of superblock version macros */ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 92DAD7F84 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 725A38F8040 for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397146120-04cbb00dc5a27f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YkHat2Zcy494Y6go for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dad004151 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:40 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dpH013380 for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 865CE1256D4; Thu, 10 Apr 2014 12:08:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 07/11] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Date: Thu, 10 Apr 2014 12:08:32 -0400 X-ASG-Orig-Subj: [PATCH v5 07/11] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Message-Id: <1397146116-42546-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-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: 1397146120 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Refactor xfs_difree() in preparation for the finobt. xfs_difree() performs the validity checks against the ag and reads the agi header. The work of physically updating the inode allocation btree is pushed down into the new xfs_difree_inobt() helper. Reviewed-by: Dave Chinner Signed-off-by: Brian Foster --- fs/xfs/xfs_ialloc.c | 161 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 96 insertions(+), 65 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 8982c88..e165c33 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1430,74 +1430,30 @@ out_error: return XFS_ERROR(error); } -/* - * Free disk inode. Carefully avoids touching the incore inode, all - * manipulations incore are the caller's responsibility. - * The on-disk inode is not changed by this operation, only the - * btree (free inode mask) is changed. - */ -int -xfs_difree( - xfs_trans_t *tp, /* transaction pointer */ - xfs_ino_t inode, /* inode to be freed */ - xfs_bmap_free_t *flist, /* extents to free */ - int *delete, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino) /* first inode in deleted cluster */ +STATIC int +xfs_difree_inobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t agino, + struct xfs_bmap_free *flist, + int *delete, + xfs_ino_t *first_ino, + struct xfs_inobt_rec_incore *orec) { - /* REFERENCED */ - xfs_agblock_t agbno; /* block number containing inode */ - xfs_buf_t *agbp; /* buffer containing allocation group header */ - xfs_agino_t agino; /* inode number relative to allocation group */ - xfs_agnumber_t agno; /* allocation group number */ - xfs_agi_t *agi; /* allocation group header */ - xfs_btree_cur_t *cur; /* inode btree cursor */ - int error; /* error return value */ - int i; /* result code */ - int ilen; /* inodes in an inode cluster */ - xfs_mount_t *mp; /* mount structure for filesystem */ - int off; /* offset of inode in inode chunk */ - xfs_inobt_rec_incore_t rec; /* btree record */ - struct xfs_perag *pag; - - mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + struct xfs_perag *pag; + struct xfs_btree_cur *cur; + struct xfs_inobt_rec_incore rec; + int ilen; + int error; + int i; + int off; - /* - * Break up inode number into its components. - */ - agno = XFS_INO_TO_AGNO(mp, inode); - if (agno >= mp->m_sb.sb_agcount) { - xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", - __func__, agno, mp->m_sb.sb_agcount); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - agino = XFS_INO_TO_AGINO(mp, inode); - if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { - xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", - __func__, (unsigned long long)inode, - (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - agbno = XFS_AGINO_TO_AGBNO(mp, agino); - if (agbno >= mp->m_sb.sb_agblocks) { - xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", - __func__, agbno, mp->m_sb.sb_agblocks); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - /* - * Get the allocation group header. - */ - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - if (error) { - xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", - __func__, error); - return error; - } - agi = XFS_BUF_TO_AGI(agbp); ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); - ASSERT(agbno < be32_to_cpu(agi->agi_length)); + ASSERT(XFS_AGINO_TO_AGBNO(mp, agino) < be32_to_cpu(agi->agi_length)); + /* * Initialize the cursor. */ @@ -1593,6 +1549,7 @@ xfs_difree( if (error) goto error0; + *orec = rec; xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; @@ -1601,6 +1558,80 @@ error0: return error; } +/* + * Free disk inode. Carefully avoids touching the incore inode, all + * manipulations incore are the caller's responsibility. + * The on-disk inode is not changed by this operation, only the + * btree (free inode mask) is changed. + */ +int +xfs_difree( + struct xfs_trans *tp, /* transaction pointer */ + xfs_ino_t inode, /* inode to be freed */ + struct xfs_bmap_free *flist, /* extents to free */ + int *delete,/* set if inode cluster was deleted */ + xfs_ino_t *first_ino)/* first inode in deleted cluster */ +{ + /* REFERENCED */ + xfs_agblock_t agbno; /* block number containing inode */ + struct xfs_buf *agbp; /* buffer for allocation group header */ + xfs_agino_t agino; /* allocation group inode number */ + xfs_agnumber_t agno; /* allocation group number */ + int error; /* error return value */ + struct xfs_mount *mp; /* mount structure for filesystem */ + struct xfs_inobt_rec_incore rec;/* btree record */ + + mp = tp->t_mountp; + + /* + * Break up inode number into its components. + */ + agno = XFS_INO_TO_AGNO(mp, inode); + if (agno >= mp->m_sb.sb_agcount) { + xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", + __func__, agno, mp->m_sb.sb_agcount); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + agino = XFS_INO_TO_AGINO(mp, inode); + if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { + xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", + __func__, (unsigned long long)inode, + (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + agbno = XFS_AGINO_TO_AGBNO(mp, agino); + if (agbno >= mp->m_sb.sb_agblocks) { + xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", + __func__, agbno, mp->m_sb.sb_agblocks); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + /* + * Get the allocation group header. + */ + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", + __func__, error); + return error; + } + + /* + * Fix up the inode allocation btree. + */ + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, delete, first_ino, + &rec); + if (error) + goto error0; + + return 0; + +error0: + return error; +} + STATIC int xfs_imap_lookup( struct xfs_mount *mp, -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 916CD7F92 for ; Thu, 10 Apr 2014 11:08:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42B56AC00E for ; Thu, 10 Apr 2014 09:08:43 -0700 (PDT) X-ASG-Debug-ID: 1397146118-04bdf07dc8a3d10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XLsGmH3NxHiIc5Cc for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8cPq004140 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8c3o019894 for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DF6E1125602; Thu, 10 Apr 2014 12:08:36 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 01/11] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Date: Thu, 10 Apr 2014 12:08:26 -0400 X-ASG-Orig-Subj: [PATCH v5 01/11] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Message-Id: <1397146116-42546-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146118 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The introduction of the free inode btree (finobt) requires that xfs_ialloc_btree.c handle multiple trees. Refactor xfs_ialloc_btree.c so the caller specifies the btree type on cursor initialization to prepare for addition of the finobt. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_ialloc.c | 8 ++++---- fs/xfs/xfs_ialloc_btree.c | 8 +++++--- fs/xfs/xfs_ialloc_btree.h | 3 ++- fs/xfs/xfs_itable.c | 6 ++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 8f711db..e676572 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -461,7 +461,7 @@ xfs_ialloc_ag_alloc( /* * Insert records describing the new inode chunk into the btree. */ - cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO); for (thisino = newino; thisino < newino + newlen; thisino += XFS_INODES_PER_CHUNK) { @@ -707,7 +707,7 @@ xfs_dialloc_ag( ASSERT(pag->pagi_freecount > 0); restart_pagno: - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); /* * If pagino is 0 (this is the root inode allocation) use newino. * This must work because we've just allocated some. @@ -1169,7 +1169,7 @@ xfs_difree( /* * Initialize the cursor. */ - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); error = xfs_check_agi_freecount(cur, agi); if (error) @@ -1300,7 +1300,7 @@ xfs_imap_lookup( * we have a record, we need to ensure it contains the inode number * we are looking up. */ - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); if (!error) { if (i) diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 7e309b1..41e4883 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -49,7 +49,8 @@ xfs_inobt_dup_cursor( struct xfs_btree_cur *cur) { return xfs_inobt_init_cursor(cur->bc_mp, cur->bc_tp, - cur->bc_private.a.agbp, cur->bc_private.a.agno); + cur->bc_private.a.agbp, cur->bc_private.a.agno, + cur->bc_btnum); } STATIC void @@ -325,7 +326,8 @@ xfs_inobt_init_cursor( struct xfs_mount *mp, /* file system mount point */ struct xfs_trans *tp, /* transaction pointer */ struct xfs_buf *agbp, /* buffer for agi structure */ - xfs_agnumber_t agno) /* allocation group number */ + xfs_agnumber_t agno, /* allocation group number */ + xfs_btnum_t btnum) /* ialloc or free ino btree */ { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); struct xfs_btree_cur *cur; @@ -335,7 +337,7 @@ xfs_inobt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; cur->bc_nlevels = be32_to_cpu(agi->agi_level); - cur->bc_btnum = XFS_BTNUM_INO; + cur->bc_btnum = btnum; cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_ops = &xfs_inobt_ops; diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index f38b220..d7ebea72 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -58,7 +58,8 @@ struct xfs_mount; ((index) - 1) * sizeof(xfs_inobt_ptr_t))) extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, - struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); + struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t, + xfs_btnum_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f463382..cb64f22 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -270,7 +270,8 @@ xfs_bulkstat( /* * Allocate and initialize a btree cursor for ialloc btree. */ - cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); + cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, + XFS_BTNUM_INO); irbp = irbuf; irbufend = irbuf + nirbuf; end_of_ag = 0; @@ -621,7 +622,8 @@ xfs_inumbers( agino = 0; continue; } - cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); + cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, + XFS_BTNUM_INO); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, &tmp); if (error) { -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 014C07F87 for ; Thu, 10 Apr 2014 11:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D21458F8040 for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397146121-04cbb00dc3a27f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TIFqRAS0vMw47KTy for ; Thu, 10 Apr 2014 09:08:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AG8eVw002909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:40 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dJo022375 for ; Thu, 10 Apr 2014 12:08:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BDB631256CE; Thu, 10 Apr 2014 12:08:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 10/11] xfs: report finobt status in fs geometry Date: Thu, 10 Apr 2014 12:08:35 -0400 X-ASG-Orig-Subj: [PATCH v5 10/11] xfs: report finobt status in fs geometry Message-Id: <1397146116-42546-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146121 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define the XFS_FSOP_GEOM_FLAGS_FINOBT fs geometry flag and set the associated bit if the filesystem supports the free inode btree. Reviewed-by: Dave Chinner Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index c5fc116..d34703d 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -238,6 +238,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ +#define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ /* * Minimum and maximum sizes need for growth checks. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 96e4eb0..3445ead 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -104,7 +104,9 @@ xfs_fs_geometry( (xfs_sb_version_hascrc(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_V5SB : 0) | (xfs_sb_version_hasftype(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_FTYPE : 0); + XFS_FSOP_GEOM_FLAGS_FTYPE : 0) | + (xfs_sb_version_hasfinobt(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_FINOBT : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AA8937FA4 for ; Thu, 10 Apr 2014 11:08:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D3DFAC00F for ; Thu, 10 Apr 2014 09:08:43 -0700 (PDT) X-ASG-Debug-ID: 1397146118-04cb6c77b69ee40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ro1p2hzkWAWXMvJh for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AG8clJ002817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AG8cFX031924 for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AE2181256CE; Thu, 10 Apr 2014 12:08:36 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 00/11] xfs: introduce the free inode btree Date: Thu, 10 Apr 2014 12:08:25 -0400 X-ASG-Orig-Subj: [PATCH v5 00/11] xfs: introduce the free inode btree Message-Id: <1397146116-42546-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: 1397146119 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is a minor rebase of the finobt series on the latest for-next branch. The previous version (v4) is here: http://oss.sgi.com/archives/xfs/2014-02/msg00763.html The most recent series with review feedback is v3: http://oss.sgi.com/archives/xfs/2014-02/msg00121.html Brian v5: - Rebase to latest for-next. v4: - Fixed up comments associated with separation of the AGI into separate logging regions. - Added warning on ENOSPC failure of ifree reservation and comment describing reasoning for ifree being reserve-enabled. - Removed finobt res. from xfs_calc_create_resv_alloc() (v4 sb only). - Updated xfs_calc_finobt_res() to account for free space btrees and enable for inode alloc. record modification scenario. - Renamed xfs_dialloc_ag_slow() to xfs_dialloc_ag_inobt(). - Refactored the inode allocation algorithm into several smaller helper functions. - Fixed up comments in xfs_difree_finobt(). v3: - Rebased to latest master. - Fixed up unused variable warning in xfs_difree_inobt(). - Replaced a few more typedefs. v2: - Rebase to latest xfs tree (minor shifting around of some header bits). - Added "xfs: report finobt status in fs geometry" patch to series. v1: - Separate patch to enable rw finobt support at end of series. - Rework xfs_ialloc_log_agi() to log the agi in two distinct regions. - Rework xfs_ialloc_btree.c changes to use separate finobt handlers where appropriate. - Fix bug to show fibt2 stats data in stat proc file. - Move finobt log reservation calculations into separate helper, made conditional and merged to a single patch. - Use reserved block pool in xfs_inactive() codepath instead of flush. - Moved and cleaned up xfs_inobt_insert() to use inobt helpers. - Enhanced lookup algorithm for allocation (xfs_dialloc_ag()). - Refactored xfs_difree() to use xfs_difree_inobt() and xfs_difree_finobt(), cleaned up the latter. Brian Foster (11): xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers xfs: reserve v5 superblock read-only compat. feature bit for finobt xfs: support the XFS_BTNUM_FINOBT free inode btree type xfs: update inode allocation/free transaction reservations for finobt xfs: insert newly allocated inode chunks into the finobt xfs: use and update the finobt on inode allocation xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper xfs: update the finobt on inode free xfs: add finobt support to growfs xfs: report finobt status in fs geometry xfs: enable the finobt feature on v5 superblocks fs/xfs/xfs_ag.h | 36 ++- fs/xfs/xfs_btree.c | 6 +- fs/xfs/xfs_btree.h | 3 + fs/xfs/xfs_format.h | 14 +- fs/xfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 36 ++- fs/xfs/xfs_ialloc.c | 695 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_ialloc_btree.c | 68 ++++- fs/xfs/xfs_ialloc_btree.h | 3 +- fs/xfs/xfs_inode.c | 25 +- fs/xfs/xfs_itable.c | 6 +- fs/xfs/xfs_log_recover.c | 2 + fs/xfs/xfs_sb.h | 10 +- fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +- fs/xfs/xfs_trans_resv.c | 53 +++- fs/xfs/xfs_trans_space.h | 7 +- fs/xfs/xfs_types.h | 2 +- 18 files changed, 850 insertions(+), 136 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 98FB87F9B for ; Thu, 10 Apr 2014 11:08:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8426F30405F for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-ASG-Debug-ID: 1397146119-04cbb00dc5a27e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OQKZrZlluo9UgG2Z for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8djJ030623 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8caD022362 for ; Thu, 10 Apr 2014 12:08:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 785E41256D4; Thu, 10 Apr 2014 12:08:36 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Date: Thu, 10 Apr 2014 12:08:28 -0400 X-ASG-Orig-Subj: [PATCH v5 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-Id: <1397146116-42546-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146119 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define the AGI fields for the finobt root/level and add magic numbers. Update the btree code to add support for the new XFS_BTNUM_FINOBT inode btree. The finobt root block is reserved immediately following the inobt root block in the AG. Update XFS_PREALLOC_BLOCKS() to determine the starting AG data block based on whether finobt support is enabled. Signed-off-by: Brian Foster --- fs/xfs/xfs_ag.h | 36 +++++++++++++++++----------- fs/xfs/xfs_btree.c | 6 +++-- fs/xfs/xfs_btree.h | 3 +++ fs/xfs/xfs_format.h | 14 ++++++++++- fs/xfs/xfs_ialloc.c | 38 +++++++++++++++++++++++++----- fs/xfs/xfs_ialloc_btree.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_log_recover.c | 2 ++ fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +++++++++++++- fs/xfs/xfs_types.h | 2 +- 10 files changed, 153 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 0fdd410..6e247a9 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -160,30 +160,38 @@ typedef struct xfs_agi { * still being referenced. */ __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; - + /* + * This marks the end of logging region 1 and start of logging region 2. + */ uuid_t agi_uuid; /* uuid of filesystem */ __be32 agi_crc; /* crc of agi sector */ __be32 agi_pad32; __be64 agi_lsn; /* last write sequence */ + __be32 agi_free_root; /* root of the free inode btree */ + __be32 agi_free_level;/* levels in free inode btree */ + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; #define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc) -#define XFS_AGI_MAGICNUM 0x00000001 -#define XFS_AGI_VERSIONNUM 0x00000002 -#define XFS_AGI_SEQNO 0x00000004 -#define XFS_AGI_LENGTH 0x00000008 -#define XFS_AGI_COUNT 0x00000010 -#define XFS_AGI_ROOT 0x00000020 -#define XFS_AGI_LEVEL 0x00000040 -#define XFS_AGI_FREECOUNT 0x00000080 -#define XFS_AGI_NEWINO 0x00000100 -#define XFS_AGI_DIRINO 0x00000200 -#define XFS_AGI_UNLINKED 0x00000400 -#define XFS_AGI_NUM_BITS 11 -#define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) +#define XFS_AGI_MAGICNUM (1 << 0) +#define XFS_AGI_VERSIONNUM (1 << 1) +#define XFS_AGI_SEQNO (1 << 2) +#define XFS_AGI_LENGTH (1 << 3) +#define XFS_AGI_COUNT (1 << 4) +#define XFS_AGI_ROOT (1 << 5) +#define XFS_AGI_LEVEL (1 << 6) +#define XFS_AGI_FREECOUNT (1 << 7) +#define XFS_AGI_NEWINO (1 << 8) +#define XFS_AGI_DIRINO (1 << 9) +#define XFS_AGI_UNLINKED (1 << 10) +#define XFS_AGI_NUM_BITS_R1 11 /* end of the 1st agi logging region */ +#define XFS_AGI_ALL_BITS_R1 ((1 << XFS_AGI_NUM_BITS_R1) - 1) +#define XFS_AGI_FREE_ROOT (1 << 11) +#define XFS_AGI_FREE_LEVEL (1 << 12) +#define XFS_AGI_NUM_BITS_R2 13 /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index e80d59f..b920745 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -43,9 +43,10 @@ kmem_zone_t *xfs_btree_cur_zone; * Btree magic numbers. */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { - { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, + XFS_FIBT_MAGIC }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, - XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] @@ -1115,6 +1116,7 @@ xfs_btree_set_refs( xfs_buf_set_ref(bp, XFS_ALLOC_BTREE_REF); break; case XFS_BTNUM_INO: + case XFS_BTNUM_FINO: xfs_buf_set_ref(bp, XFS_INO_BTREE_REF); break; case XFS_BTNUM_BMAP: diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 91e34f2..d2ac586 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -62,6 +62,7 @@ union xfs_btree_rec { #define XFS_BTNUM_CNT ((xfs_btnum_t)XFS_BTNUM_CNTi) #define XFS_BTNUM_BMAP ((xfs_btnum_t)XFS_BTNUM_BMAPi) #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) +#define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) /* * For logging record fields. @@ -92,6 +93,7 @@ do { \ case XFS_BTNUM_CNT: __XFS_BTREE_STATS_INC(abtc, stat); break; \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(ibt, stat); break; \ + case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(fibt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) @@ -105,6 +107,7 @@ do { \ case XFS_BTNUM_CNT: __XFS_BTREE_STATS_ADD(abtc, stat, val); break; \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_ADD(bmbt, stat, val); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_ADD(ibt, stat, val); break; \ + case XFS_BTNUM_FINO: __XFS_BTREE_STATS_ADD(fibt, stat, val); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/fs/xfs/xfs_format.h b/fs/xfs/xfs_format.h index 9898f31..34d85ac 100644 --- a/fs/xfs/xfs_format.h +++ b/fs/xfs/xfs_format.h @@ -202,6 +202,8 @@ typedef __be32 xfs_alloc_ptr_t; */ #define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ #define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ +#define XFS_FIBT_MAGIC 0x46494254 /* 'FIBT' */ +#define XFS_FIBT_CRC_MAGIC 0x46494233 /* 'FIB3' */ typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -244,7 +246,17 @@ typedef __be32 xfs_inobt_ptr_t; * block numbers in the AG. */ #define XFS_IBT_BLOCK(mp) ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1)) -#define XFS_PREALLOC_BLOCKS(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) +#define XFS_FIBT_BLOCK(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) + +/* + * The first data block of an AG depends on whether the filesystem was formatted + * with the finobt feature. If so, account for the finobt reserved root btree + * block. + */ +#define XFS_PREALLOC_BLOCKS(mp) \ + (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ + XFS_FIBT_BLOCK(mp) + 1 : \ + XFS_IBT_BLOCK(mp) + 1) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e676572..a0aead5 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1488,7 +1488,16 @@ xfs_ialloc_compute_maxlevels( } /* - * Log specified fields for the ag hdr (inode section) + * Log specified fields for the ag hdr (inode section). The growth of the agi + * structure over time requires that we interpret the buffer as two logical + * regions delineated by the end of the unlinked list. This is due to the size + * of the hash table and its location in the middle of the agi. + * + * For example, a request to log a field before agi_unlinked and a field after + * agi_unlinked could cause us to log the entire hash table and use an excessive + * amount of log space. To avoid this behavior, log the region up through + * agi_unlinked in one call and the region after agi_unlinked through the end of + * the structure in another. */ void xfs_ialloc_log_agi( @@ -1511,6 +1520,8 @@ xfs_ialloc_log_agi( offsetof(xfs_agi_t, agi_newino), offsetof(xfs_agi_t, agi_dirino), offsetof(xfs_agi_t, agi_unlinked), + offsetof(xfs_agi_t, agi_free_root), + offsetof(xfs_agi_t, agi_free_level), sizeof(xfs_agi_t) }; #ifdef DEBUG @@ -1519,15 +1530,30 @@ xfs_ialloc_log_agi( agi = XFS_BUF_TO_AGI(bp); ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); #endif + + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); + /* - * Compute byte offsets for the first and last fields. + * Compute byte offsets for the first and last fields in the first + * region and log the agi buffer. This only logs up through + * agi_unlinked. */ - xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS, &first, &last); + if (fields & XFS_AGI_ALL_BITS_R1) { + xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R1, + &first, &last); + xfs_trans_log_buf(tp, bp, first, last); + } + /* - * Log the allocation group inode header buffer. + * Mask off the bits in the first region and calculate the first and + * last field offsets for any bits in the second region. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); - xfs_trans_log_buf(tp, bp, first, last); + fields &= ~XFS_AGI_ALL_BITS_R1; + if (fields) { + xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R2, + &first, &last); + xfs_trans_log_buf(tp, bp, first, last); + } } #ifdef DEBUG diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 41e4883..3789c6f 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -67,6 +67,21 @@ xfs_inobt_set_root( xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); } +STATIC void +xfs_finobt_set_root( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *nptr, + int inc) /* level change */ +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + + agi->agi_free_root = nptr->s; + be32_add_cpu(&agi->agi_free_level, inc); + xfs_ialloc_log_agi(cur->bc_tp, agbp, + XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL); +} + STATIC int xfs_inobt_alloc_block( struct xfs_btree_cur *cur, @@ -174,6 +189,17 @@ xfs_inobt_init_ptr_from_cur( ptr->s = agi->agi_root; } +STATIC void +xfs_finobt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + struct xfs_agi *agi = XFS_BUF_TO_AGI(cur->bc_private.a.agbp); + + ASSERT(cur->bc_private.a.agno == be32_to_cpu(agi->agi_seqno)); + ptr->s = agi->agi_free_root; +} + STATIC __int64_t xfs_inobt_key_diff( struct xfs_btree_cur *cur, @@ -204,6 +230,7 @@ xfs_inobt_verify( */ switch (block->bb_magic) { case cpu_to_be32(XFS_IBT_CRC_MAGIC): + case cpu_to_be32(XFS_FIBT_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)) @@ -215,6 +242,7 @@ xfs_inobt_verify( return false; /* fall through */ case cpu_to_be32(XFS_IBT_MAGIC): + case cpu_to_be32(XFS_FIBT_MAGIC): break; default: return 0; @@ -318,6 +346,28 @@ static const struct xfs_btree_ops xfs_inobt_ops = { #endif }; +static const struct xfs_btree_ops xfs_finobt_ops = { + .rec_len = sizeof(xfs_inobt_rec_t), + .key_len = sizeof(xfs_inobt_key_t), + + .dup_cursor = xfs_inobt_dup_cursor, + .set_root = xfs_finobt_set_root, + .alloc_block = xfs_inobt_alloc_block, + .free_block = xfs_inobt_free_block, + .get_minrecs = xfs_inobt_get_minrecs, + .get_maxrecs = xfs_inobt_get_maxrecs, + .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_rec_from_key = xfs_inobt_init_rec_from_key, + .init_rec_from_cur = xfs_inobt_init_rec_from_cur, + .init_ptr_from_cur = xfs_finobt_init_ptr_from_cur, + .key_diff = xfs_inobt_key_diff, + .buf_ops = &xfs_inobt_buf_ops, +#if defined(DEBUG) || defined(XFS_WARN) + .keys_inorder = xfs_inobt_keys_inorder, + .recs_inorder = xfs_inobt_recs_inorder, +#endif +}; + /* * Allocate a new inode btree cursor. */ @@ -336,11 +386,17 @@ xfs_inobt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; - cur->bc_nlevels = be32_to_cpu(agi->agi_level); cur->bc_btnum = btnum; + if (btnum == XFS_BTNUM_INO) { + cur->bc_nlevels = be32_to_cpu(agi->agi_level); + cur->bc_ops = &xfs_inobt_ops; + } else { + cur->bc_nlevels = be32_to_cpu(agi->agi_free_level); + cur->bc_ops = &xfs_finobt_ops; + } + 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; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index bce53ac..f7843df 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2138,7 +2138,9 @@ xlog_recover_validate_buf_type( bp->b_ops = &xfs_allocbt_buf_ops; break; case XFS_IBT_CRC_MAGIC: + case XFS_FIBT_CRC_MAGIC: case XFS_IBT_MAGIC: + case XFS_FIBT_MAGIC: bp->b_ops = &xfs_inobt_buf_ops; break; case XFS_BMAP_CRC_MAGIC: diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c index ce372b7..f224038 100644 --- a/fs/xfs/xfs_stats.c +++ b/fs/xfs/xfs_stats.c @@ -59,6 +59,7 @@ static int xfs_stat_proc_show(struct seq_file *m, void *v) { "abtc2", XFSSTAT_END_ABTC_V2 }, { "bmbt2", XFSSTAT_END_BMBT_V2 }, { "ibt2", XFSSTAT_END_IBT_V2 }, + { "fibt2", XFSSTAT_END_FIBT_V2 }, /* we print both series of quota information together */ { "qm", XFSSTAT_END_QM }, }; diff --git a/fs/xfs/xfs_stats.h b/fs/xfs/xfs_stats.h index c03ad38..c8f238b 100644 --- a/fs/xfs/xfs_stats.h +++ b/fs/xfs/xfs_stats.h @@ -183,7 +183,23 @@ struct xfsstats { __uint32_t xs_ibt_2_alloc; __uint32_t xs_ibt_2_free; __uint32_t xs_ibt_2_moves; -#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_IBT_V2+6) +#define XFSSTAT_END_FIBT_V2 (XFSSTAT_END_IBT_V2+15) + __uint32_t xs_fibt_2_lookup; + __uint32_t xs_fibt_2_compare; + __uint32_t xs_fibt_2_insrec; + __uint32_t xs_fibt_2_delrec; + __uint32_t xs_fibt_2_newroot; + __uint32_t xs_fibt_2_killroot; + __uint32_t xs_fibt_2_increment; + __uint32_t xs_fibt_2_decrement; + __uint32_t xs_fibt_2_lshift; + __uint32_t xs_fibt_2_rshift; + __uint32_t xs_fibt_2_split; + __uint32_t xs_fibt_2_join; + __uint32_t xs_fibt_2_alloc; + __uint32_t xs_fibt_2_free; + __uint32_t xs_fibt_2_moves; +#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_FIBT_V2+6) __uint32_t xs_qm_dqreclaims; __uint32_t xs_qm_dqreclaim_misses; __uint32_t xs_qm_dquot_dups; diff --git a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h index 82bbc34..65c6e66 100644 --- a/fs/xfs/xfs_types.h +++ b/fs/xfs/xfs_types.h @@ -134,7 +134,7 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_BMAPi, XFS_BTNUM_INOi, - XFS_BTNUM_MAX + XFS_BTNUM_FINOi, XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:08:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 182817FA5 for ; Thu, 10 Apr 2014 11:08:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D6F238F8040 for ; Thu, 10 Apr 2014 09:08:40 -0700 (PDT) X-ASG-Debug-ID: 1397146119-04bdf07dc7a3d10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OsFF8KmKJjPgwEY1 for ; Thu, 10 Apr 2014 09:08:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AG8dSU030627 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AG8dpF013380 for ; Thu, 10 Apr 2014 12:08:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CADB61256CE; Thu, 10 Apr 2014 12:08:37 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 06/11] xfs: use and update the finobt on inode allocation Date: Thu, 10 Apr 2014 12:08:31 -0400 X-ASG-Orig-Subj: [PATCH v5 06/11] xfs: use and update the finobt on inode allocation Message-Id: <1397146116-42546-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146116-42546-1-git-send-email-bfoster@redhat.com> References: <1397146116-42546-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: 1397146119 X-Barracuda-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 xfs_dialloc_ag() with an implementation that looks for a record in the finobt. The finobt only tracks records with at least one free inode. This eliminates the need for the intra-ag scan in the original algorithm. Once the inode is allocated, update the finobt appropriately (possibly removing the record) as well as the inobt. Move the original xfs_dialloc_ag() algorithm to xfs_dialloc_ag_inobt() and fall back as such if finobt support is not enabled. Signed-off-by: Brian Foster --- fs/xfs/xfs_ialloc.c | 295 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 290 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 203db98..8982c88 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -722,13 +722,10 @@ xfs_ialloc_get_rec( } /* - * Allocate an inode. - * - * The caller selected an AG for us, and made sure that free inodes are - * available. + * Allocate an inode using the inobt-only algorithm. */ STATIC int -xfs_dialloc_ag( +xfs_dialloc_ag_inobt( struct xfs_trans *tp, struct xfs_buf *agbp, xfs_ino_t parent, @@ -987,6 +984,294 @@ error0: } /* + * Use the free inode btree to allocate an inode based on distance from the + * parent. Note that the provided cursor may be deleted and replaced. + */ +STATIC int +xfs_dialloc_ag_finobt_near( + xfs_agino_t pagino, + struct xfs_btree_cur **ocur, + struct xfs_inobt_rec_incore *rec) +{ + struct xfs_btree_cur *lcur = *ocur; /* left search cursor */ + struct xfs_btree_cur *rcur; /* right search cursor */ + struct xfs_inobt_rec_incore rrec; + int error; + int i, j; + + error = xfs_inobt_lookup(lcur, pagino, XFS_LOOKUP_LE, &i); + if (error) + return error; + + if (i == 1) { + error = xfs_inobt_get_rec(lcur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + + /* + * See if we've landed in the parent inode record. The finobt + * only tracks chunks with at least one free inode, so record + * existence is enough. + */ + if (pagino >= rec->ir_startino && + pagino < (rec->ir_startino + XFS_INODES_PER_CHUNK)) + return 0; + } + + error = xfs_btree_dup_cursor(lcur, &rcur); + if (error) + return error; + + error = xfs_inobt_lookup(rcur, pagino, XFS_LOOKUP_GE, &j); + if (error) + goto error_rcur; + if (j == 1) { + error = xfs_inobt_get_rec(rcur, &rrec, &j); + if (error) + goto error_rcur; + XFS_WANT_CORRUPTED_GOTO(j == 1, error_rcur); + } + + XFS_WANT_CORRUPTED_GOTO(i == 1 || j == 1, error_rcur); + if (i == 1 && j == 1) { + /* + * Both the left and right records are valid. Choose the closer + * inode chunk to the target. + */ + if ((pagino - rec->ir_startino + XFS_INODES_PER_CHUNK - 1) > + (rrec.ir_startino - pagino)) { + *rec = rrec; + xfs_btree_del_cursor(lcur, XFS_BTREE_NOERROR); + *ocur = rcur; + } else { + xfs_btree_del_cursor(rcur, XFS_BTREE_NOERROR); + } + } else if (j == 1) { + /* only the right record is valid */ + *rec = rrec; + xfs_btree_del_cursor(lcur, XFS_BTREE_NOERROR); + *ocur = rcur; + } else if (i == 1) { + /* only the left record is valid */ + xfs_btree_del_cursor(rcur, XFS_BTREE_NOERROR); + } + + return 0; + +error_rcur: + xfs_btree_del_cursor(rcur, XFS_BTREE_ERROR); + return error; +} + +/* + * Use the free inode btree to find a free inode based on a newino hint. If + * the hint is NULL, find the first free inode in the AG. + */ +STATIC int +xfs_dialloc_ag_finobt_newino( + struct xfs_agi *agi, + struct xfs_btree_cur *cur, + struct xfs_inobt_rec_incore *rec) +{ + int error; + int i; + + if (agi->agi_newino != cpu_to_be32(NULLAGINO)) { + error = xfs_inobt_lookup(cur, agi->agi_newino, XFS_LOOKUP_EQ, + &i); + if (error) + return error; + if (i == 1) { + error = xfs_inobt_get_rec(cur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + + return 0; + } + } + + /* + * Find the first inode available in the AG. + */ + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + + error = xfs_inobt_get_rec(cur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + + return 0; +} + +/* + * Update the inobt based on a modification made to the finobt. Also ensure that + * the records from both trees are equivalent post-modification. + */ +STATIC int +xfs_dialloc_ag_update_inobt( + struct xfs_btree_cur *cur, /* inobt cursor */ + struct xfs_inobt_rec_incore *frec, /* finobt record */ + int offset) /* inode offset */ +{ + struct xfs_inobt_rec_incore rec; + int error; + int i; + + error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + + rec.ir_free &= ~XFS_INOBT_MASK(offset); + rec.ir_freecount--; + + XFS_WANT_CORRUPTED_RETURN((rec.ir_free == frec->ir_free) && + (rec.ir_freecount == frec->ir_freecount)); + + error = xfs_inobt_update(cur, &rec); + if (error) + return error; + + return 0; +} + +/* + * Allocate an inode using the free inode btree, if available. Otherwise, fall + * back to the inobt search algorithm. + * + * The caller selected an AG for us, and made sure that free inodes are + * available. + */ +STATIC int +xfs_dialloc_ag( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_ino_t parent, + xfs_ino_t *inop) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agnumber_t pagno = XFS_INO_TO_AGNO(mp, parent); + xfs_agino_t pagino = XFS_INO_TO_AGINO(mp, parent); + struct xfs_perag *pag; + struct xfs_btree_cur *cur; /* finobt cursor */ + struct xfs_btree_cur *icur; /* inobt cursor */ + struct xfs_inobt_rec_incore rec; + xfs_ino_t ino; + int error; + int offset; + int i; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return xfs_dialloc_ag_inobt(tp, agbp, parent, inop); + + pag = xfs_perag_get(mp, agno); + + /* + * If pagino is 0 (this is the root inode allocation) use newino. + * This must work because we've just allocated some. + */ + if (!pagino) + pagino = be32_to_cpu(agi->agi_newino); + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error_cur; + + /* + * The search algorithm depends on whether we're in the same AG as the + * parent. If so, find the closest available inode to the parent. If + * not, consider the agi hint or find the first free inode in the AG. + */ + if (agno == pagno) + error = xfs_dialloc_ag_finobt_near(pagino, &cur, &rec); + else + error = xfs_dialloc_ag_finobt_newino(agi, cur, &rec); + if (error) + goto error_cur; + + offset = xfs_lowbit64(rec.ir_free); + ASSERT(offset >= 0); + ASSERT(offset < XFS_INODES_PER_CHUNK); + ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino + offset); + + /* + * Modify or remove the finobt record. + */ + rec.ir_free &= ~XFS_INOBT_MASK(offset); + rec.ir_freecount--; + if (rec.ir_freecount) + error = xfs_inobt_update(cur, &rec); + else + error = xfs_btree_delete(cur, &i); + if (error) + goto error_cur; + + /* + * The finobt has now been updated appropriately. We haven't updated the + * agi and superblock yet, so we can create an inobt cursor and validate + * the original freecount. If all is well, make the equivalent update to + * the inobt using the finobt record and offset information. + */ + icur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); + + error = xfs_check_agi_freecount(icur, agi); + if (error) + goto error_icur; + + error = xfs_dialloc_ag_update_inobt(icur, &rec, offset); + if (error) + goto error_icur; + + /* + * Both trees have now been updated. We must update the perag and + * superblock before we can check the freecount for each btree. + */ + be32_add_cpu(&agi->agi_freecount, -1); + xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT); + pag->pagi_freecount--; + + xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1); + + error = xfs_check_agi_freecount(icur, agi); + if (error) + goto error_icur; + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error_icur; + + xfs_btree_del_cursor(icur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_perag_put(pag); + *inop = ino; + return 0; + +error_icur: + xfs_btree_del_cursor(icur, XFS_BTREE_ERROR); +error_cur: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + xfs_perag_put(pag); + return error; +} + +/* * Allocate an inode on disk. * * Mode is used to tell whether the new inode will need space, and whether it -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1B9F57FAB for ; Thu, 10 Apr 2014 11:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A42A8F8040 for ; Thu, 10 Apr 2014 09:11:13 -0700 (PDT) X-ASG-Debug-ID: 1397146272-04cbb00dc6a2b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iwdWxSkL4anETi0q for ; Thu, 10 Apr 2014 09:11:12 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBCce003670 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCAc023648 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ED2B4125602; Thu, 10 Apr 2014 12:11:10 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 01/20] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Date: Thu, 10 Apr 2014 12:10:51 -0400 X-ASG-Orig-Subj: [PATCH v3 01/20] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Message-Id: <1397146270-42993-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146272 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The introduction of the free inode btree (finobt) requires that xfs_ialloc_btree.c handle multiple trees. Refactor xfs_ialloc_btree.c so the caller specifies the btree type on cursor initialization to prepare for addition of the finobt. Signed-off-by: Brian Foster --- include/xfs_ialloc_btree.h | 3 ++- libxfs/xfs_ialloc.c | 8 ++++---- libxfs/xfs_ialloc_btree.c | 8 +++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index f38b220..d7ebea7 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -58,7 +58,8 @@ struct xfs_mount; ((index) - 1) * sizeof(xfs_inobt_ptr_t))) extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, - struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); + struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t, + xfs_btnum_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c19d84a..d4a4511 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -432,7 +432,7 @@ xfs_ialloc_ag_alloc( /* * Insert records describing the new inode chunk into the btree. */ - cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO); for (thisino = newino; thisino < newino + newlen; thisino += XFS_INODES_PER_CHUNK) { @@ -678,7 +678,7 @@ xfs_dialloc_ag( ASSERT(pag->pagi_freecount > 0); restart_pagno: - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); /* * If pagino is 0 (this is the root inode allocation) use newino. * This must work because we've just allocated some. @@ -1140,7 +1140,7 @@ xfs_difree( /* * Initialize the cursor. */ - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); error = xfs_check_agi_freecount(cur, agi); if (error) @@ -1271,7 +1271,7 @@ xfs_imap_lookup( * we have a record, we need to ensure it contains the inode number * we are looking up. */ - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); if (!error) { if (i) diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 0a29d73..2027bc6 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -30,7 +30,8 @@ xfs_inobt_dup_cursor( struct xfs_btree_cur *cur) { return xfs_inobt_init_cursor(cur->bc_mp, cur->bc_tp, - cur->bc_private.a.agbp, cur->bc_private.a.agno); + cur->bc_private.a.agbp, cur->bc_private.a.agno, + cur->bc_btnum); } STATIC void @@ -379,7 +380,8 @@ xfs_inobt_init_cursor( struct xfs_mount *mp, /* file system mount point */ struct xfs_trans *tp, /* transaction pointer */ struct xfs_buf *agbp, /* buffer for agi structure */ - xfs_agnumber_t agno) /* allocation group number */ + xfs_agnumber_t agno, /* allocation group number */ + xfs_btnum_t btnum) /* ialloc or free ino btree */ { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); struct xfs_btree_cur *cur; @@ -389,7 +391,7 @@ xfs_inobt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; cur->bc_nlevels = be32_to_cpu(agi->agi_level); - cur->bc_btnum = XFS_BTNUM_INO; + cur->bc_btnum = btnum; cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_ops = &xfs_inobt_ops; -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 43E5C7FAF for ; Thu, 10 Apr 2014 11:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4394AC002 for ; Thu, 10 Apr 2014 09:11:13 -0700 (PDT) X-ASG-Debug-ID: 1397146272-04cb6c77b59f160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AkR6ewnHAN1C1bSq for ; Thu, 10 Apr 2014 09:11: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-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 s3AGBCGB003700 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBCaB012021 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0C0921256CE; Thu, 10 Apr 2014 12:11:10 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 02/20] xfs: reserve v5 superblock read-only compat. feature bit for finobt Date: Thu, 10 Apr 2014 12:10:52 -0400 X-ASG-Orig-Subj: [PATCH v3 02/20] xfs: reserve v5 superblock read-only compat. feature bit for finobt Message-Id: <1397146270-42993-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@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: 1397146272 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Reserve a v5 read-only compatibility feature bit for the finobt and create the xfs_sb_version_hasfinobt() helper to determine whether an fs has the feature enabled. The finobt does not change existing on-disk structures, but must remain consistent with the ialloc btree. Modifications from older kernels would violate that constrant. Therefore, we restrict older kernels to read-only mounts of finobt-enabled filesystems. Note that this does not yet enable the ability to rw mount a finobt fs (by setting the feature bit in the XFS_SB_FEAT_RO_COMPAT_ALL mask). Signed-off-by: Brian Foster --- include/xfs_sb.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index f7b2fe7..7f53a85 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -587,6 +587,7 @@ xfs_sb_has_compat_feature( return (sbp->sb_features_compat & feature) != 0; } +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ #define XFS_SB_FEAT_RO_COMPAT_ALL 0 #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool @@ -641,6 +642,12 @@ static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } +static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); +} + /* * end of superblock version macros */ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5997C7FD7 for ; Thu, 10 Apr 2014 11:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2BF5A304066 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04bdf07dc7a4080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rwiAQ8MDyU1DXkge for ; Thu, 10 Apr 2014 09:11: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-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 s3AGBC8K007950 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBCRK012027 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 457901256D4; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 04/20] xfs: update inode allocation/free transaction reservations for finobt Date: Thu, 10 Apr 2014 12:10:54 -0400 X-ASG-Orig-Subj: [PATCH v3 04/20] xfs: update inode allocation/free transaction reservations for finobt Message-Id: <1397146270-42993-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@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: 1397146273 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Create the xfs_calc_finobt_res() helper to calculate the finobt log reservation for inode allocation and free. Update XFS_IALLOC_SPACE_RES() to reserve blocks for the additional finobt insertion on inode allocation. Create XFS_IFREE_SPACE_RES() to reserve blocks for the potential finobt record insertion on inode free (i.e., if an inode chunk was previously fully allocated). Signed-off-by: Brian Foster --- include/xfs_trans_space.h | 7 ++++++- libxfs/xfs_trans_resv.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/include/xfs_trans_space.h b/include/xfs_trans_space.h index 7d2c920..a7d1721 100644 --- a/include/xfs_trans_space.h +++ b/include/xfs_trans_space.h @@ -47,7 +47,9 @@ #define XFS_DIRREMOVE_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) #define XFS_IALLOC_SPACE_RES(mp) \ - (XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels - 1) + (XFS_IALLOC_BLOCKS(mp) + \ + (xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1 * \ + ((mp)->m_in_maxlevels - 1))) /* * Space reservation values for various transactions. @@ -82,5 +84,8 @@ (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) #define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) +#define XFS_IFREE_SPACE_RES(mp) \ + (xfs_sb_version_hasfinobt(&mp->m_sb) ? (mp)->m_in_maxlevels : 0) + #endif /* __XFS_TRANS_SPACE_H__ */ diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 1e59fad..870d4fc 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -81,6 +81,37 @@ xfs_calc_inode_res( } /* + * The free inode btree is a conditional feature and the log reservation + * requirements differ slightly from that of the traditional inode allocation + * btree. The finobt tracks records for inode chunks with at least one free inode. + * Therefore, a record can be removed from the tree for an inode allocation or + * free and the associated merge reservation is unconditional. This also covers + * the possibility of a split on record insertion. + * + * the free inode btree: max depth * block size + * the free inode btree entry: block size + * + * TODO: is the modify res really necessary? covered by the merge/split res? + * This seems to be the pattern of ifree, but not create_resv_alloc. Why? + */ +STATIC uint +xfs_calc_finobt_res( + struct xfs_mount *mp, + int modify) +{ + uint res; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return 0; + + res = xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)); + if (modify) + res += (uint)XFS_FSB_TO_B(mp, 1); + + return res; +} + +/* * Various log reservation values. * * These are based on the size of the file system block because that is what @@ -250,6 +281,7 @@ xfs_calc_remove_reservation( * the superblock for the nlink flag: sector size * the directory btree: (max depth + v2) * dir block size * the directory inode's bmap btree: (max depth + v2) * block size + * the finobt */ STATIC uint xfs_calc_create_resv_modify( @@ -258,7 +290,8 @@ xfs_calc_create_resv_modify( return xfs_calc_inode_res(mp, 2) + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + (uint)XFS_FSB_TO_B(mp, 1) + - xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)); + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 1); } /* @@ -268,6 +301,7 @@ xfs_calc_create_resv_modify( * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt */ STATIC uint xfs_calc_create_resv_alloc( @@ -278,7 +312,8 @@ xfs_calc_create_resv_alloc( xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 0); } STATIC uint @@ -296,6 +331,7 @@ __xfs_calc_create_reservation( * the superblock for the nlink flag: sector size * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt */ STATIC uint xfs_calc_icreate_resv_alloc( @@ -305,7 +341,8 @@ xfs_calc_icreate_resv_alloc( mp->m_sb.sb_sectsize + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 0); } STATIC uint @@ -359,6 +396,7 @@ xfs_calc_symlink_reservation( * the on disk inode before ours in the agi hash list: inode cluster size * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt */ STATIC uint xfs_calc_ifree_reservation( @@ -374,7 +412,8 @@ xfs_calc_ifree_reservation( xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels, 0) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 1); } /* -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1B9BB7F91 for ; Thu, 10 Apr 2014 11:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95A8A8F8035 for ; Thu, 10 Apr 2014 09:11:13 -0700 (PDT) X-ASG-Debug-ID: 1397146272-04cb6c77b69f160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zJXkjoVLBDBRS3F2 for ; Thu, 10 Apr 2014 09:11: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 s3AGBCj0003693 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCfd021274 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D445E1256CC; Thu, 10 Apr 2014 12:11:10 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 00/20] xfsprogs: introduce the free inode btree Date: Thu, 10 Apr 2014 12:10:50 -0400 X-ASG-Orig-Subj: [PATCH v3 00/20] xfsprogs: introduce the free inode btree Message-Id: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146272 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is the v3 userspace portion of finobt support corresponding to v5 of the kernel series. Patches 1-10 are straight application of the corresponding kernel patches with omissions where appropriate. Patch 11 adds mkfs support. Patches 12 and 13 provide a couple minor db and repair fixes to support the new agi fields and calculate the fs format respectively. Patches 14-18 add real repair support for the finobt. Patch 19 adds support to report finobt state in xfs_info. Patch 20 adds support for metadump. Thoughts, reviews, flames appreciated. Brian v3: - Rebased to latest master. v2: - Rebased onto the CRC v5 series and v2 kernel finobt bits. - Core finobt repair support. - xfs_info support. - xfs_metadump support. Brian Foster (20): xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers xfs: reserve v5 superblock read-only compat. feature bit for finobt xfs: support the XFS_BTNUM_FINOBT free inode btree type xfs: update inode allocation/free transaction reservations for finobt xfs: insert newly allocated inode chunks into the finobt xfs: use and update the finobt on inode allocation xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper xfs: update the finobt on inode free xfs: report finobt status in fs geometry xfs: enable the finobt feature on v5 superblocks xfsprogs/mkfs: finobt mkfs support xfsprogs/db: finobt support xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation xfsprogs/repair: phase 2 finobt scan xfsprogs/repair: pass btree block magic as param to build_ino_tree() xfsprogs/repair: pull the build_agi() call up out of the inode tree build xfsprogs/repair: helpers for finding in-core inode records w/ free inodes xfsprogs/repair: reconstruct the finobt in phase 5 xfsprogs/growfs: report finobt status in fs geometry (xfs_info) xfsprogs/db: add finobt support to metadump db/agi.c | 2 + db/btblock.c | 12 + db/metadump.c | 25 +- growfs/xfs_growfs.c | 14 +- include/xfs_ag.h | 32 ++- include/xfs_btree.h | 3 + include/xfs_format.h | 14 +- include/xfs_fs.h | 1 + include/xfs_ialloc_btree.h | 3 +- include/xfs_sb.h | 10 +- include/xfs_trans_space.h | 7 +- include/xfs_types.h | 2 +- libxfs/xfs_btree.c | 6 +- libxfs/xfs_ialloc.c | 617 ++++++++++++++++++++++++++++++++++++++------- libxfs/xfs_ialloc_btree.c | 68 ++++- libxfs/xfs_trans_resv.c | 47 +++- mkfs/xfs_mkfs.c | 83 ++++-- repair/incore.h | 27 ++ repair/phase5.c | 109 ++++++-- repair/scan.c | 239 +++++++++++++++++- repair/xfs_repair.c | 2 + 21 files changed, 1144 insertions(+), 179 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8F6777FAB for ; Thu, 10 Apr 2014 11:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 70B33304066 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04cbb00dc5a2b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vw3f8ITmpI9iX9VD for ; Thu, 10 Apr 2014 09:11:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBC8u031387 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCEx015420 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2AABE1256D0; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 03/20] xfs: support the XFS_BTNUM_FINOBT free inode btree type Date: Thu, 10 Apr 2014 12:10:53 -0400 X-ASG-Orig-Subj: [PATCH v3 03/20] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-Id: <1397146270-42993-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146273 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define the AGI fields for the finobt root/level and add magic numbers. Update the btree code to add support for the new XFS_BTNUM_FINOBT inode btree. The finobt root block is reserved immediately following the inobt root block in the AG. Update XFS_PREALLOC_BLOCKS() to determine the starting AG data block based on whether finobt support is enabled. Signed-off-by: Brian Foster --- include/xfs_ag.h | 32 +++++++++++++++---------- include/xfs_btree.h | 3 +++ include/xfs_format.h | 14 ++++++++++- include/xfs_types.h | 2 +- libxfs/xfs_btree.c | 6 +++-- libxfs/xfs_ialloc.c | 37 +++++++++++++++++++++++++---- libxfs/xfs_ialloc_btree.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- 7 files changed, 130 insertions(+), 24 deletions(-) diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 0fdd410..2531658 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -166,24 +166,30 @@ typedef struct xfs_agi { __be32 agi_pad32; __be64 agi_lsn; /* last write sequence */ + __be32 agi_free_root; /* root of the free inode btree */ + __be32 agi_free_level;/* levels in free inode btree */ + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; #define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc) -#define XFS_AGI_MAGICNUM 0x00000001 -#define XFS_AGI_VERSIONNUM 0x00000002 -#define XFS_AGI_SEQNO 0x00000004 -#define XFS_AGI_LENGTH 0x00000008 -#define XFS_AGI_COUNT 0x00000010 -#define XFS_AGI_ROOT 0x00000020 -#define XFS_AGI_LEVEL 0x00000040 -#define XFS_AGI_FREECOUNT 0x00000080 -#define XFS_AGI_NEWINO 0x00000100 -#define XFS_AGI_DIRINO 0x00000200 -#define XFS_AGI_UNLINKED 0x00000400 -#define XFS_AGI_NUM_BITS 11 -#define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) +#define XFS_AGI_MAGICNUM (1 << 0) +#define XFS_AGI_VERSIONNUM (1 << 1) +#define XFS_AGI_SEQNO (1 << 2) +#define XFS_AGI_LENGTH (1 << 3) +#define XFS_AGI_COUNT (1 << 4) +#define XFS_AGI_ROOT (1 << 5) +#define XFS_AGI_LEVEL (1 << 6) +#define XFS_AGI_FREECOUNT (1 << 7) +#define XFS_AGI_NEWINO (1 << 8) +#define XFS_AGI_DIRINO (1 << 9) +#define XFS_AGI_UNLINKED (1 << 10) +#define XFS_AGI_NUM_BITS_R1 11 /* end of the 1st agi logging region */ +#define XFS_AGI_ALL_BITS_R1 ((1 << XFS_AGI_NUM_BITS_R1) - 1) +#define XFS_AGI_FREE_ROOT (1 << 11) +#define XFS_AGI_FREE_LEVEL (1 << 12) +#define XFS_AGI_NUM_BITS_R2 13 /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 6afe0b2..2590d40 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -37,6 +37,7 @@ extern kmem_zone_t *xfs_btree_cur_zone; #define XFS_BTNUM_CNT ((xfs_btnum_t)XFS_BTNUM_CNTi) #define XFS_BTNUM_BMAP ((xfs_btnum_t)XFS_BTNUM_BMAPi) #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) +#define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) /* * For logging record fields. @@ -67,6 +68,7 @@ do { \ case XFS_BTNUM_CNT: __XFS_BTREE_STATS_INC(abtc, stat); break; \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(ibt, stat); break; \ + case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(fibt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) @@ -80,6 +82,7 @@ do { \ case XFS_BTNUM_CNT: __XFS_BTREE_STATS_ADD(abtc, stat, val); break; \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_ADD(bmbt, stat, val); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_ADD(ibt, stat, val); break; \ + case XFS_BTNUM_FINO: __XFS_BTREE_STATS_ADD(fibt, stat, val); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/include/xfs_format.h b/include/xfs_format.h index 77f6b8b..758052f 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -202,6 +202,8 @@ typedef __be32 xfs_alloc_ptr_t; */ #define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ #define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ +#define XFS_FIBT_MAGIC 0x46494254 /* 'FIBT' */ +#define XFS_FIBT_CRC_MAGIC 0x46494233 /* 'FIB3' */ typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -244,7 +246,17 @@ typedef __be32 xfs_inobt_ptr_t; * block numbers in the AG. */ #define XFS_IBT_BLOCK(mp) ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1)) -#define XFS_PREALLOC_BLOCKS(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) +#define XFS_FIBT_BLOCK(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) + +/* + * The first data block of an AG depends on whether the filesystem was formatted + * with the finobt feature. If so, account for the finobt reserved root btree + * block. + */ +#define XFS_PREALLOC_BLOCKS(mp) \ + (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ + XFS_FIBT_BLOCK(mp) + 1 : \ + XFS_IBT_BLOCK(mp) + 1) diff --git a/include/xfs_types.h b/include/xfs_types.h index 82bbc34..65c6e66 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -134,7 +134,7 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_BMAPi, XFS_BTNUM_INOi, - XFS_BTNUM_MAX + XFS_BTNUM_FINOi, XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 9be4abd..cc823f5 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -27,9 +27,10 @@ kmem_zone_t *xfs_btree_cur_zone; * Btree magic numbers. */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { - { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, + XFS_FIBT_MAGIC }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, - XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] @@ -1099,6 +1100,7 @@ xfs_btree_set_refs( xfs_buf_set_ref(bp, XFS_ALLOC_BTREE_REF); break; case XFS_BTNUM_INO: + case XFS_BTNUM_FINO: xfs_buf_set_ref(bp, XFS_INO_BTREE_REF); break; case XFS_BTNUM_BMAP: diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index d4a4511..4a7746a 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1482,6 +1482,8 @@ xfs_ialloc_log_agi( offsetof(xfs_agi_t, agi_newino), offsetof(xfs_agi_t, agi_dirino), offsetof(xfs_agi_t, agi_unlinked), + offsetof(xfs_agi_t, agi_free_root), + offsetof(xfs_agi_t, agi_free_level), sizeof(xfs_agi_t) }; #ifdef DEBUG @@ -1491,14 +1493,39 @@ xfs_ialloc_log_agi( ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); #endif /* - * Compute byte offsets for the first and last fields. + * The growth of the agi buffer over time now requires that we interpret + * the buffer as two logical regions delineated at the end of the unlinked + * list. This is due to the size of the hash table and its location in the + * middle of the agi. + * + * For example, a request to log a field before agi_unlinked and a field + * after agi_unlinked could cause us to log the entire hash table and use + * an excessive amount of log space. To avoid this behavior, log the + * region up through agi_unlinked in one call and the region after + * agi_unlinked through the end of the structure in another. */ - xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS, &first, &last); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); + /* - * Log the allocation group inode header buffer. + * Compute byte offsets for the first and last fields in the first + * region and log agi buffer. This only logs up through agi_unlinked. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); - xfs_trans_log_buf(tp, bp, first, last); + if (fields & XFS_AGI_ALL_BITS_R1) { + xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R1, + &first, &last); + xfs_trans_log_buf(tp, bp, first, last); + } + + /* + * Mask off the bits in the first region and calculate the first and last + * field offsets for any bits in the second region. + */ + fields &= ~XFS_AGI_ALL_BITS_R1; + if (fields) { + xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R2, + &first, &last); + xfs_trans_log_buf(tp, bp, first, last); + } } #ifdef DEBUG diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 2027bc6..c337389 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -48,6 +48,21 @@ xfs_inobt_set_root( xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); } +STATIC void +xfs_finobt_set_root( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *nptr, + int inc) /* level change */ +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + + agi->agi_free_root = nptr->s; + be32_add_cpu(&agi->agi_free_level, inc); + xfs_ialloc_log_agi(cur->bc_tp, agbp, + XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL); +} + STATIC int xfs_inobt_alloc_block( struct xfs_btree_cur *cur, @@ -155,6 +170,17 @@ xfs_inobt_init_ptr_from_cur( ptr->s = agi->agi_root; } +STATIC void +xfs_finobt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + struct xfs_agi *agi = XFS_BUF_TO_AGI(cur->bc_private.a.agbp); + + ASSERT(cur->bc_private.a.agno == be32_to_cpu(agi->agi_seqno)); + ptr->s = agi->agi_free_root; +} + STATIC __int64_t xfs_inobt_key_diff( struct xfs_btree_cur *cur, @@ -185,6 +211,7 @@ xfs_inobt_verify( */ switch (block->bb_magic) { case cpu_to_be32(XFS_IBT_CRC_MAGIC): + case cpu_to_be32(XFS_FIBT_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)) @@ -196,6 +223,7 @@ xfs_inobt_verify( return false; /* fall through */ case cpu_to_be32(XFS_IBT_MAGIC): + case cpu_to_be32(XFS_FIBT_MAGIC): break; default: return 0; @@ -372,6 +400,28 @@ static const struct xfs_btree_ops xfs_inobt_ops = { #endif }; +static const struct xfs_btree_ops xfs_finobt_ops = { + .rec_len = sizeof(xfs_inobt_rec_t), + .key_len = sizeof(xfs_inobt_key_t), + + .dup_cursor = xfs_inobt_dup_cursor, + .set_root = xfs_finobt_set_root, + .alloc_block = xfs_inobt_alloc_block, + .free_block = xfs_inobt_free_block, + .get_minrecs = xfs_inobt_get_minrecs, + .get_maxrecs = xfs_inobt_get_maxrecs, + .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_rec_from_key = xfs_inobt_init_rec_from_key, + .init_rec_from_cur = xfs_inobt_init_rec_from_cur, + .init_ptr_from_cur = xfs_finobt_init_ptr_from_cur, + .key_diff = xfs_inobt_key_diff, + .buf_ops = &xfs_inobt_buf_ops, +#if defined(DEBUG) || defined(XFS_WARN) + .keys_inorder = xfs_inobt_keys_inorder, + .recs_inorder = xfs_inobt_recs_inorder, +#endif +}; + /* * Allocate a new inode btree cursor. */ @@ -390,11 +440,17 @@ xfs_inobt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; - cur->bc_nlevels = be32_to_cpu(agi->agi_level); cur->bc_btnum = btnum; + if (btnum == XFS_BTNUM_INO) { + cur->bc_nlevels = be32_to_cpu(agi->agi_level); + cur->bc_ops = &xfs_inobt_ops; + } else { + cur->bc_nlevels = be32_to_cpu(agi->agi_free_level); + cur->bc_ops = &xfs_finobt_ops; + } + 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; -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 004A47FD7 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C628E304064 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04bdf07dcca40a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hUOPVRonEf29oyoW for ; Thu, 10 Apr 2014 09:11: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-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 s3AGBDaP009671 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCsb023652 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 72FEB1256D8; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 07/20] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Date: Thu, 10 Apr 2014 12:10:57 -0400 X-ASG-Orig-Subj: [PATCH v3 07/20] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Message-Id: <1397146270-42993-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146273 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Refactor xfs_difree() in preparation for the finobt. xfs_difree() performs the validity checks against the ag and reads the agi header. The work of physically updating the inode allocation btree is pushed down into the new xfs_difree_inobt() helper. Signed-off-by: Brian Foster --- libxfs/xfs_ialloc.c | 161 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 96 insertions(+), 65 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 462340b..f0d6397 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1325,74 +1325,30 @@ out_error: return XFS_ERROR(error); } -/* - * Free disk inode. Carefully avoids touching the incore inode, all - * manipulations incore are the caller's responsibility. - * The on-disk inode is not changed by this operation, only the - * btree (free inode mask) is changed. - */ -int -xfs_difree( - xfs_trans_t *tp, /* transaction pointer */ - xfs_ino_t inode, /* inode to be freed */ - xfs_bmap_free_t *flist, /* extents to free */ - int *delete, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino) /* first inode in deleted cluster */ +STATIC int +xfs_difree_inobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t agino, + struct xfs_bmap_free *flist, + int *delete, + xfs_ino_t *first_ino, + struct xfs_inobt_rec_incore *orec) { - /* REFERENCED */ - xfs_agblock_t agbno; /* block number containing inode */ - xfs_buf_t *agbp; /* buffer containing allocation group header */ - xfs_agino_t agino; /* inode number relative to allocation group */ - xfs_agnumber_t agno; /* allocation group number */ - xfs_agi_t *agi; /* allocation group header */ - xfs_btree_cur_t *cur; /* inode btree cursor */ - int error; /* error return value */ - int i; /* result code */ - int ilen; /* inodes in an inode cluster */ - xfs_mount_t *mp; /* mount structure for filesystem */ - int off; /* offset of inode in inode chunk */ - xfs_inobt_rec_incore_t rec; /* btree record */ - struct xfs_perag *pag; - - mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + struct xfs_perag *pag; + struct xfs_btree_cur *cur; + struct xfs_inobt_rec_incore rec; + int ilen; + int error; + int i; + int off; - /* - * Break up inode number into its components. - */ - agno = XFS_INO_TO_AGNO(mp, inode); - if (agno >= mp->m_sb.sb_agcount) { - xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", - __func__, agno, mp->m_sb.sb_agcount); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - agino = XFS_INO_TO_AGINO(mp, inode); - if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { - xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", - __func__, (unsigned long long)inode, - (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - agbno = XFS_AGINO_TO_AGBNO(mp, agino); - if (agbno >= mp->m_sb.sb_agblocks) { - xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", - __func__, agbno, mp->m_sb.sb_agblocks); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - /* - * Get the allocation group header. - */ - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - if (error) { - xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", - __func__, error); - return error; - } - agi = XFS_BUF_TO_AGI(agbp); ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); - ASSERT(agbno < be32_to_cpu(agi->agi_length)); + ASSERT(XFS_AGINO_TO_AGBNO(mp, agino) < be32_to_cpu(agi->agi_length)); + /* * Initialize the cursor. */ @@ -1488,6 +1444,7 @@ xfs_difree( if (error) goto error0; + *orec = rec; xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; @@ -1496,6 +1453,80 @@ error0: return error; } +/* + * Free disk inode. Carefully avoids touching the incore inode, all + * manipulations incore are the caller's responsibility. + * The on-disk inode is not changed by this operation, only the + * btree (free inode mask) is changed. + */ +int +xfs_difree( + struct xfs_trans *tp, /* transaction pointer */ + xfs_ino_t inode, /* inode to be freed */ + struct xfs_bmap_free *flist, /* extents to free */ + int *delete,/* set if inode cluster was deleted */ + xfs_ino_t *first_ino)/* first inode in deleted cluster */ +{ + /* REFERENCED */ + xfs_agblock_t agbno; /* block number containing inode */ + struct xfs_buf *agbp; /* buffer for allocation group header */ + xfs_agino_t agino; /* allocation group inode number */ + xfs_agnumber_t agno; /* allocation group number */ + int error; /* error return value */ + struct xfs_mount *mp; /* mount structure for filesystem */ + struct xfs_inobt_rec_incore rec;/* btree record */ + + mp = tp->t_mountp; + + /* + * Break up inode number into its components. + */ + agno = XFS_INO_TO_AGNO(mp, inode); + if (agno >= mp->m_sb.sb_agcount) { + xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", + __func__, agno, mp->m_sb.sb_agcount); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + agino = XFS_INO_TO_AGINO(mp, inode); + if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { + xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", + __func__, (unsigned long long)inode, + (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + agbno = XFS_AGINO_TO_AGBNO(mp, agino); + if (agbno >= mp->m_sb.sb_agblocks) { + xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", + __func__, agbno, mp->m_sb.sb_agblocks); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + /* + * Get the allocation group header. + */ + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", + __func__, error); + return error; + } + + /* + * Fix up the inode allocation btree. + */ + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, delete, first_ino, + &rec); + if (error) + goto error0; + + return 0; + +error0: + return error; +} + STATIC int xfs_imap_lookup( struct xfs_mount *mp, -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A6897FDA for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 178F3304064 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04cb6c77b69f180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MKGCYh5lbtVbkU7Z for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBDNM031395 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCqw021278 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ECFFC125602; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support Date: Thu, 10 Apr 2014 12:11:01 -0400 X-ASG-Orig-Subj: [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support Message-Id: <1397146270-42993-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146274 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add the 'finobt' metadata option to mkfs to format an fs with free inode btree support. If enabled, initialize the associated AGI header fields and btree root block. Also, do the initialization of the superblock version and feature bits (including the new finobt flag) a bit earlier. These fields must now be initialized prior to the use of XFS_PREALLOC_BLOCKS(), as the latter returns a value that depends on whether a finobt root btree block is reserved. Signed-off-by: Brian Foster --- mkfs/xfs_mkfs.c | 83 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 20 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index f7cf394..654cb8a 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -183,6 +183,8 @@ char *sopts[] = { char *mopts[] = { #define M_CRC 0 "crc", +#define M_FINOBT 1 + "finobt", NULL }; @@ -962,6 +964,7 @@ main( struct fs_topology ft; int lazy_sb_counters; int crcs_enabled; + int finobt; progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -995,6 +998,7 @@ main( worst_freelist = 0; lazy_sb_counters = 1; crcs_enabled = 0; + finobt = 0; memset(&fsx, 0, sizeof(fsx)); memset(&xi, 0, sizeof(xi)); @@ -1486,6 +1490,14 @@ _("cannot specify both crc and ftype\n")); usage(); } break; + case M_FINOBT: + if (!value || *value == '\0') + reqval('m', mopts, M_CRC); + c = atoi(value); + if (c < 0 || c > 1) + illegal(value, "m finobt"); + finobt = c; + break; default: unknown('m', value); } @@ -2415,6 +2427,30 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT; mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; + /* + * sb_versionnum and finobt flags must be set before we use + * XFS_PREALLOC_BLOCKS(). + */ + sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, + attrversion == 2, !projid16bit, 0, + (!crcs_enabled && dirftype)); + sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, + dsunit != 0, + logversion == 2, attrversion == 1, + (sectorsize != BBSIZE || + lsectorsize != BBSIZE), + nci, sbp->sb_features2 != 0); + /* + * Due to a structure alignment issue, sb_features2 ended up in one + * of two locations, the second "incorrect" location represented by + * the sb_bad_features2 field. To avoid older kernels mounting + * filesystems they shouldn't, set both field to the same value. + */ + sbp->sb_bad_features2 = sbp->sb_features2; + + if (finobt) + sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; + if (loginternal) { /* * Readjust the log size to fit within an AG if it was sized @@ -2477,7 +2513,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" - " =%-22s crc=%u\n" + " =%-22s crc=%-8u finobt=%u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" @@ -2486,7 +2522,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), dfile, isize, (long long)agcount, (long long)agsize, "", sectorsize, attrversion, !projid16bit, - "", crcs_enabled, + "", crcs_enabled, finobt, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, dirversion, dirblocksize, nci, dirftype, @@ -2555,23 +2591,6 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_logsectsize = 0; } - sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, - attrversion == 2, !projid16bit, 0, - (!crcs_enabled && dirftype)); - sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, - dsunit != 0, - logversion == 2, attrversion == 1, - (sectorsize != BBSIZE || - lsectorsize != BBSIZE), - nci, sbp->sb_features2 != 0); - /* - * Due to a structure alignment issue, sb_features2 ended up in one - * of two locations, the second "incorrect" location represented by - * the sb_bad_features2 field. To avoid older kernels mounting - * filesystems they shouldn't, set both field to the same value. - */ - sbp->sb_bad_features2 = sbp->sb_features2; - if (force_overwrite) zero_old_xfs_structures(&xi, sbp); @@ -2728,6 +2747,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agi->agi_count = 0; agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp)); agi->agi_level = cpu_to_be32(1); + if (finobt) { + agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); + agi->agi_free_level = cpu_to_be32(1); + } agi->agi_freecount = 0; agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO); @@ -2853,6 +2876,26 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), xfs_btree_init_block(mp, buf, XFS_IBT_MAGIC, 0, 0, agno, 0); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + + /* + * Free INO btree root block + */ + if (!finobt) + continue; + + buf = libxfs_getbuf(mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, XFS_FIBT_BLOCK(mp)), + bsize); + buf->b_ops = &xfs_inobt_buf_ops; + block = XFS_BUF_TO_BLOCK(buf); + memset(block, 0, blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_FIBT_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_FIBT_MAGIC, 0, 0, + agno, 0); + libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } /* @@ -3089,7 +3132,7 @@ usage( void ) { fprintf(stderr, _("Usage: %s\n\ /* blocksize */ [-b log=n|size=num]\n\ -/* metadata */ [-m crc=[0|1]\n\ +/* metadata */ [-m crc=0|1,finobt=0|1]\n\ /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\ (sunit=value,swidth=value|su=num,sw=num|noalign),\n\ sectlog=n|sectsize=num\n\ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C84197FAF for ; Thu, 10 Apr 2014 11:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A045AC002 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04cb6c77b79f170001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v8DRyimbhCkIZ7fK for ; Thu, 10 Apr 2014 09:11: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 s3AGBDQ2003766 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBC6A000750 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A63821256DB; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 09/20] xfs: report finobt status in fs geometry Date: Thu, 10 Apr 2014 12:10:59 -0400 X-ASG-Orig-Subj: [PATCH v3 09/20] xfs: report finobt status in fs geometry Message-Id: <1397146270-42993-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146273 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define the XFS_FSOP_GEOM_FLAGS_FINOBT fs geometry flag and set the associated bit if the filesystem supports the free inode btree. Signed-off-by: Brian Foster --- include/xfs_fs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 554fd66..59c40fc 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -238,6 +238,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ +#define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ /* -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F1FC7FD8 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE711AC007 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04cb6c77b69f170001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s8yydy4TBkjLCOhn for ; Thu, 10 Apr 2014 09:11: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 s3AGBD8u003825 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBCQw000747 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 195581256CE; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 12/20] xfsprogs/db: finobt support Date: Thu, 10 Apr 2014 12:11:02 -0400 X-ASG-Orig-Subj: [PATCH v3 12/20] xfsprogs/db: finobt support Message-Id: <1397146270-42993-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146273 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add the AGI finobt fields and fibt layouts. Signed-off-by: Brian Foster --- db/agi.c | 2 ++ db/btblock.c | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/db/agi.c b/db/agi.c index 398bdbb..6f167ac 100644 --- a/db/agi.c +++ b/db/agi.c @@ -57,6 +57,8 @@ const field_t agi_flds[] = { { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "free_root", FLDT_AGBLOCK, OI(OFF(free_root)), C1, 0, TYP_INOBT }, + { "free_level", FLDT_UINT32D, OI(OFF(free_level)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/btblock.c b/db/btblock.c index 1ea0cff..cdb8b1d 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -60,6 +60,12 @@ struct xfs_db_btree { sizeof(xfs_inobt_rec_t), sizeof(__be32), }, + { XFS_FIBT_MAGIC, + XFS_BTREE_SBLOCK_LEN, + sizeof(xfs_inobt_key_t), + sizeof(xfs_inobt_rec_t), + sizeof(__be32), + }, { XFS_BMAP_CRC_MAGIC, XFS_BTREE_LBLOCK_CRC_LEN, sizeof(xfs_bmbt_key_t), @@ -84,6 +90,12 @@ struct xfs_db_btree { sizeof(xfs_inobt_rec_t), sizeof(__be32), }, + { XFS_FIBT_CRC_MAGIC, + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_inobt_key_t), + sizeof(xfs_inobt_rec_t), + sizeof(__be32), + }, { 0, }, }; -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 378A07FDB for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 255BE8F8040 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04cbb00dc3a2b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LRHrNKCLaBpR1qPf for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBDs4005015 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCqu021278 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 565A01256D2; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 05/20] xfs: insert newly allocated inode chunks into the finobt Date: Thu, 10 Apr 2014 12:10:55 -0400 X-ASG-Orig-Subj: [PATCH v3 05/20] xfs: insert newly allocated inode chunks into the finobt Message-Id: <1397146270-42993-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146274 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A newly allocated inode chunk, by definition, has at least one free inode, so a record is always inserted into the finobt. Create the xfs_inobt_insert() helper from existing code to insert a record in an inobt based on the provided BTNUM. Update xfs_ialloc_ag_alloc() to invoke the helper for the existing XFS_BTNUM_INO tree and XFS_BTNUM_FINO tree, if enabled. Signed-off-by: Brian Foster --- libxfs/xfs_ialloc.c | 93 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 23 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 4a7746a..c5759aa 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -88,6 +88,66 @@ xfs_inobt_get_rec( } /* + * Insert a single inobt record. Cursor must already point to desired location. + */ +STATIC int +xfs_inobt_insert_rec( + struct xfs_btree_cur *cur, + __int32_t freecount, + xfs_inofree_t free, + int *stat) +{ + cur->bc_rec.i.ir_freecount = freecount; + cur->bc_rec.i.ir_free = free; + return xfs_btree_insert(cur, stat); +} + +/* + * Insert records describing a newly allocated inode chunk into the inobt. + */ +STATIC int +xfs_inobt_insert( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t newino, + xfs_agino_t newlen, + xfs_btnum_t btnum) +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agino_t thisino; + int i; + int error; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + for (thisino = newino; + thisino < newino + newlen; + thisino += XFS_INODES_PER_CHUNK) { + error = xfs_inobt_lookup(cur, thisino, XFS_LOOKUP_EQ, &i); + if (error) { + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; + } + ASSERT(i == 0); + + error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + XFS_INOBT_ALL_FREE, &i); + if (error) { + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; + } + ASSERT(i == 1); + } + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + + return 0; +} + +/* * Verify that the number of free inodes in the AGI is correct. */ #ifdef DEBUG @@ -286,13 +346,10 @@ xfs_ialloc_ag_alloc( { xfs_agi_t *agi; /* allocation group header */ xfs_alloc_arg_t args; /* allocation argument structure */ - xfs_btree_cur_t *cur; /* inode btree cursor */ xfs_agnumber_t agno; int error; - int i; xfs_agino_t newino; /* new first inode's number */ xfs_agino_t newlen; /* new number of inodes */ - xfs_agino_t thisino; /* current inode number, for loop */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ struct xfs_perag *pag; @@ -430,29 +487,19 @@ xfs_ialloc_ag_alloc( agi->agi_newino = cpu_to_be32(newino); /* - * Insert records describing the new inode chunk into the btree. + * Insert records describing the new inode chunk into the btrees. */ - cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO); - for (thisino = newino; - thisino < newino + newlen; - thisino += XFS_INODES_PER_CHUNK) { - cur->bc_rec.i.ir_startino = thisino; - cur->bc_rec.i.ir_freecount = XFS_INODES_PER_CHUNK; - cur->bc_rec.i.ir_free = XFS_INOBT_ALL_FREE; - error = xfs_btree_lookup(cur, XFS_LOOKUP_EQ, &i); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; - } - ASSERT(i == 0); - error = xfs_btree_insert(cur, &i); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_FINO); + if (error) return error; - } - ASSERT(i == 1); } - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); /* * Log allocation group header fields */ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 449AD7FDF for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 260A5304066 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04cbb00dc6a2b40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QiUj92qgHkYbd5Yf for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBDRT009772 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBC6C000750 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 75F581256D4; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 15/20] xfsprogs/repair: pass btree block magic as param to build_ino_tree() Date: Thu, 10 Apr 2014 12:11:05 -0400 X-ASG-Orig-Subj: [PATCH v3 15/20] xfsprogs/repair: pass btree block magic as param to build_ino_tree() Message-Id: <1397146270-42993-16-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146274 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A minor cleanup to build_ino_tree() to provide the appropriate magic value for btree block initialization from the caller. This facilitates use of separate magic values for finobt blocks when building the free inode btree. Signed-off-by: Brian Foster --- repair/phase5.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 77eb125..10ed1eb 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1097,7 +1097,7 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, */ static void build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs) + bt_status_t *btree_curs, __uint32_t magic) { xfs_agnumber_t i; xfs_agblock_t j; @@ -1135,11 +1135,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = 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, + xfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + xfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, 0); } @@ -1166,11 +1166,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = 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, + xfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + xfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, 0); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); @@ -1483,6 +1483,7 @@ phase5_func( xfs_extlen_t freeblks2; #endif xfs_agblock_t num_extents; + __uint32_t magic; if (verbose) do_log(_(" - agno = %d\n"), agno); @@ -1616,7 +1617,9 @@ phase5_func( /* * build inode allocation tree. this also build the agi */ - build_ino_tree(mp, agno, &ino_btree_curs); + magic = xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC; + build_ino_tree(mp, agno, &ino_btree_curs, magic); write_cursor(&ino_btree_curs); /* * tear down cursors -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 501EB7FE1 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C9098F8035 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04bdf07dcaa40a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FxTzGy9TdmZYaYHX for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBDi2031393 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBDwW014729 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C8E3C1256CC; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 10/20] xfs: enable the finobt feature on v5 superblocks Date: Thu, 10 Apr 2014 12:11:00 -0400 X-ASG-Orig-Subj: [PATCH v3 10/20] xfs: enable the finobt feature on v5 superblocks Message-Id: <1397146270-42993-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146274 X-Barracuda-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 the finobt feature bit to the list of known features. As of this point, the kernel code knows how to mount and manage both finobt and non-finobt formatted filesystems. Signed-off-by: Brian Foster --- include/xfs_sb.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 7f53a85..950d1ea 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -588,7 +588,8 @@ xfs_sb_has_compat_feature( } #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ -#define XFS_SB_FEAT_RO_COMPAT_ALL 0 +#define XFS_SB_FEAT_RO_COMPAT_ALL \ + (XFS_SB_FEAT_RO_COMPAT_FINOBT) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool xfs_sb_has_ro_compat_feature( -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 60E507F91 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04B96AC002 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04cbb00dc4a2b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AbDQqhyLHhqieUQm for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBDMp008063 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCsd023652 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4A9811256D2; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Date: Thu, 10 Apr 2014 12:11:03 -0400 X-ASG-Orig-Subj: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Message-Id: <1397146270-42993-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146273 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Account for the finobt in calc_mkfs(). Signed-off-by: Brian Foster --- repair/xfs_repair.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 08b25f0..356125b 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -407,6 +407,8 @@ calc_mkfs(xfs_mount_t *mp) bcntbt_root = bnobt_root + 1; inobt_root = bnobt_root + 2; fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + fino_bno++; /* * If the log is allocated in the first allocation group we need to -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 480C17FE0 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3E5FAC00C for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-ASG-Debug-ID: 1397146273-04cb6c77b49f160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0vk6GiCyzEpazaQ5 for ; Thu, 10 Apr 2014 09:11:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBDlh007972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCBQ015427 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7D8721256DA; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 08/20] xfs: update the finobt on inode free Date: Thu, 10 Apr 2014 12:10:58 -0400 X-ASG-Orig-Subj: [PATCH v3 08/20] xfs: update the finobt on inode free Message-Id: <1397146270-42993-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146273 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An inode free operation can have several effects on the finobt. If all inodes have been freed and the chunk deallocated, we remove the finobt record. If the inode chunk was previously full, we must insert a new record based on the existing inobt record. Otherwise, we modify the record in place. Create the xfs_ifree_finobt() function to identify the potential scenarios and update the finobt appropriately. Signed-off-by: Brian Foster --- libxfs/xfs_ialloc.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index f0d6397..21af5b3 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1454,6 +1454,106 @@ error0: } /* + * Free an inode in the free inode btree. + */ +STATIC int +xfs_difree_finobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t agino, + struct xfs_inobt_rec_incore *ibtrec) /* inobt record */ +{ + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + struct xfs_btree_cur *cur; + struct xfs_inobt_rec_incore rec; + int offset = agino - ibtrec->ir_startino; + int error; + int i; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + + error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + if (i == 0) { + /* + * If the record does not exist in the finobt, we must have just + * freed an inode in a previously fully allocated chunk. If not, + * something is out of sync. + */ + XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); + + error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + ibtrec->ir_free, &i); + if (error) + goto error; + ASSERT(i == 1); + + goto out; + } + + /* + * Read and update the existing record. + */ + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + rec.ir_free |= XFS_INOBT_MASK(offset); + rec.ir_freecount++; + + XFS_WANT_CORRUPTED_GOTO((rec.ir_free == ibtrec->ir_free) && + (rec.ir_freecount == ibtrec->ir_freecount), + error); + + /* + * The content of inobt records should always match between the inobt + * and finobt. The lifecycle of records in the finobt is different from + * the inobt in that the finobt only tracks records with at least one + * free inode. This is to optimize lookup for inode allocation purposes. + * The following checks determine whether to update the existing record or + * remove it entirely. + */ + + if (rec.ir_freecount == XFS_IALLOC_INODES(mp) && + !(mp->m_flags & XFS_MOUNT_IKEEP)) { + /* + * If all inodes are free and we're in !ikeep mode, the entire + * inode chunk has been deallocated. Remove the record from the + * finobt. + */ + error = xfs_btree_delete(cur, &i); + if (error) + goto error; + ASSERT(i == 1); + } else { + /* + * The existing finobt record was modified and has a combination + * of allocated and free inodes or is completely free and ikeep + * is enabled. Update the record. + */ + error = xfs_inobt_update(cur, &rec); + if (error) + goto error; + } + +out: + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error; + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; + +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Free disk inode. Carefully avoids touching the incore inode, all * manipulations incore are the caller's responsibility. * The on-disk inode is not changed by this operation, only the @@ -1521,6 +1621,15 @@ xfs_difree( if (error) goto error0; + /* + * Fix up the free inode btree. + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + error = xfs_difree_finobt(mp, tp, agbp, agino, &rec); + if (error) + goto error0; + } + return 0; error0: -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A15D67FED for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50A99AC007 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04bdf07dc7a40a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g57KJj2mZSfvBeCm for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBEW4009777 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBDwY014729 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 96CB21256CC; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 16/20] xfsprogs/repair: pull the build_agi() call up out of the inode tree build Date: Thu, 10 Apr 2014 12:11:06 -0400 X-ASG-Orig-Subj: [PATCH v3 16/20] xfsprogs/repair: pull the build_agi() call up out of the inode tree build Message-Id: <1397146270-42993-17-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146274 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Pull the build_agi() call out of build_ino_tree() in phase 5. This is to prepare for finobt support, in which build_agi() will require context from multiple inode tree reconstructions (both the inode allocation tree and free inode tree, when it exists). Create the new 'agi_stat' structure to carry the requisite state from the build_ino_tree() operation to build_agi(). Signed-off-by: Brian Foster --- repair/phase5.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 10ed1eb..9632d2c 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -74,6 +74,15 @@ typedef struct bt_status { bt_stat_level_t level[XFS_BTREE_MAXLEVELS]; } bt_status_t; +/* + * extra metadata for the agi + */ +struct agi_stat { + xfs_agino_t first_agino; + xfs_agino_t count; + xfs_agino_t freecount; +}; + static __uint64_t *sb_icount_ag; /* allocated inodes per ag */ static __uint64_t *sb_ifree_ag; /* free inodes per ag */ static __uint64_t *sb_fdblocks_ag; /* free data blocks per ag */ @@ -1053,8 +1062,7 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, */ static void build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs, xfs_agino_t first_agino, - xfs_agino_t count, xfs_agino_t freecount) + bt_status_t *btree_curs, struct agi_stat *agi_stat) { xfs_buf_t *agi_buf; xfs_agi_t *agi; @@ -1075,11 +1083,11 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, else agi->agi_length = cpu_to_be32(mp->m_sb.sb_dblocks - (xfs_drfsbno_t) mp->m_sb.sb_agblocks * agno); - agi->agi_count = cpu_to_be32(count); + agi->agi_count = cpu_to_be32(agi_stat->count); agi->agi_root = cpu_to_be32(btree_curs->root); agi->agi_level = cpu_to_be32(btree_curs->num_levels); - agi->agi_freecount = cpu_to_be32(freecount); - agi->agi_newino = cpu_to_be32(first_agino); + agi->agi_freecount = cpu_to_be32(agi_stat->freecount); + agi->agi_newino = cpu_to_be32(agi_stat->first_agino); agi->agi_dirino = cpu_to_be32(NULLAGINO); for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) @@ -1097,7 +1105,8 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, */ static void build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs, __uint32_t magic) + bt_status_t *btree_curs, __uint32_t magic, + struct agi_stat *agi_stat) { xfs_agnumber_t i; xfs_agblock_t j; @@ -1227,7 +1236,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, } } - build_agi(mp, agno, btree_curs, first_agino, count, freecount); + if (agi_stat) { + agi_stat->first_agino = first_agino; + agi_stat->count = count; + agi_stat->freecount = freecount; + } } /* @@ -1484,6 +1497,7 @@ phase5_func( #endif xfs_agblock_t num_extents; __uint32_t magic; + struct agi_stat agi_stat = {0,}; if (verbose) do_log(_(" - agno = %d\n"), agno); @@ -1615,12 +1629,16 @@ phase5_func( build_agf_agfl(mp, agno, &bno_btree_curs, &bcnt_btree_curs, freeblks1, extra_blocks); /* - * build inode allocation tree. this also build the agi + * build inode allocation tree. */ magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC; - build_ino_tree(mp, agno, &ino_btree_curs, magic); + build_ino_tree(mp, agno, &ino_btree_curs, magic, &agi_stat); write_cursor(&ino_btree_curs); + + /* build the agi */ + build_agi(mp, agno, &ino_btree_curs, &agi_stat); + /* * tear down cursors */ -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 85A587FE9 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B4138F8035 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04cb6c77b79f180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GJE9gdSNauf9yAIU for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBD8x005014 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBCQu000747 for ; Thu, 10 Apr 2014 12:11:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 649371256D6; Thu, 10 Apr 2014 12:11:11 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 06/20] xfs: use and update the finobt on inode allocation Date: Thu, 10 Apr 2014 12:10:56 -0400 X-ASG-Orig-Subj: [PATCH v3 06/20] xfs: use and update the finobt on inode allocation Message-Id: <1397146270-42993-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146274 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Replace xfs_dialloc_ag() with an implementation that looks for a record in the finobt. The finobt only tracks records with at least one free inode. This eliminates the need for the intra-ag scan in the original algorithm. Once the inode is allocated, update the finobt appropriately (possibly removing the record) as well as the inobt. Move the original xfs_dialloc_ag() algorithm to xfs_dialloc_ag_slow() and fall back as such if finobt support is not enabled. Signed-off-by: Brian Foster --- libxfs/xfs_ialloc.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 210 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c5759aa..462340b 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -699,7 +699,7 @@ xfs_ialloc_get_rec( * available. */ STATIC int -xfs_dialloc_ag( +xfs_dialloc_ag_slow( struct xfs_trans *tp, struct xfs_buf *agbp, xfs_ino_t parent, @@ -957,6 +957,215 @@ error0: return error; } +STATIC int +xfs_dialloc_ag( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_ino_t parent, + xfs_ino_t *inop) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agnumber_t pagno = XFS_INO_TO_AGNO(mp, parent); + xfs_agino_t pagino = XFS_INO_TO_AGINO(mp, parent); + struct xfs_perag *pag; + struct xfs_btree_cur *cur; + struct xfs_btree_cur *tcur; + struct xfs_inobt_rec_incore rec; + struct xfs_inobt_rec_incore trec; + xfs_ino_t ino; + int error; + int offset; + int i, j; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return xfs_dialloc_ag_slow(tp, agbp, parent, inop); + + pag = xfs_perag_get(mp, agno); + + /* + * If pagino is 0 (this is the root inode allocation) use newino. + * This must work because we've just allocated some. + */ + if (!pagino) + pagino = be32_to_cpu(agi->agi_newino); + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error_cur; + + if (agno == pagno) { + /* + * We're in the same AG as the parent inode so allocate the + * closest inode to the parent. + */ + error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); + if (error) + goto error_cur; + if (i == 1) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + + /* + * See if we've landed in the parent inode record. The + * finobt only tracks chunks with at least one free + * inode, so record existence is enough. + */ + if (pagino >= rec.ir_startino && + pagino < (rec.ir_startino + XFS_INODES_PER_CHUNK)) + goto alloc_inode; + } + + error = xfs_btree_dup_cursor(cur, &tcur); + if (error) + goto error_cur; + + error = xfs_inobt_lookup(tcur, pagino, XFS_LOOKUP_GE, &j); + if (error) + goto error_tcur; + if (j == 1) { + error = xfs_inobt_get_rec(tcur, &trec, &j); + if (error) + goto error_tcur; + XFS_WANT_CORRUPTED_GOTO(j == 1, error_tcur); + } + + if (i == 1 && j == 1) { + if ((pagino - rec.ir_startino + XFS_INODES_PER_CHUNK - 1) > + (trec.ir_startino - pagino)) { + rec = trec; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = tcur; + } else { + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + } + } else if (j == 1) { + rec = trec; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = tcur; + } else { + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + } + } else { + /* + * Different AG from the parent inode. Check the record for the + * most recently allocated inode. + */ + if (agi->agi_newino != cpu_to_be32(NULLAGINO)) { + error = xfs_inobt_lookup(cur, agi->agi_newino, + XFS_LOOKUP_EQ, &i); + if (error) + goto error_cur; + if (i == 1) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + goto alloc_inode; + } + } + + /* + * Allocate the first inode available in the AG. + */ + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + } + +alloc_inode: + offset = xfs_lowbit64(rec.ir_free); + ASSERT(offset >= 0); + ASSERT(offset < XFS_INODES_PER_CHUNK); + ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino + offset); + + /* + * Modify or remove the finobt record. + */ + rec.ir_free &= ~XFS_INOBT_MASK(offset); + rec.ir_freecount--; + if (rec.ir_freecount) + error = xfs_inobt_update(cur, &rec); + else + error = xfs_btree_delete(cur, &i); + if (error) + goto error_cur; + + /* + * Lookup and modify the equivalent record in the inobt. + */ + tcur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); + + error = xfs_check_agi_freecount(tcur, agi); + if (error) + goto error_tcur; + + error = xfs_inobt_lookup(tcur, rec.ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error_tcur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_tcur); + + error = xfs_inobt_get_rec(tcur, &trec, &i); + if (error) + goto error_tcur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_tcur); + ASSERT((XFS_AGINO_TO_OFFSET(mp, trec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + + trec.ir_free &= ~XFS_INOBT_MASK(offset); + trec.ir_freecount--; + + XFS_WANT_CORRUPTED_GOTO((rec.ir_free == trec.ir_free) && + (rec.ir_freecount == trec.ir_freecount), + error_tcur); + + error = xfs_inobt_update(tcur, &trec); + if (error) + goto error_tcur; + + /* + * Update the perag and superblock. + */ + be32_add_cpu(&agi->agi_freecount, -1); + xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT); + pag->pagi_freecount--; + + xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1); + + error = xfs_check_agi_freecount(tcur, agi); + if (error) + goto error_tcur; + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error_tcur; + + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_perag_put(pag); + *inop = ino; + return 0; + +error_tcur: + xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); +error_cur: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + xfs_perag_put(pag); + return error; +} + /* * Allocate an inode on disk. * -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB38D7FF3 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B7A8A8F8035 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04cb6c77b59f180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dRlE93ek2CgZiul7 for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBEs8003828 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCr0021278 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B91EB1256CE; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 18/20] xfsprogs/repair: reconstruct the finobt in phase 5 Date: Thu, 10 Apr 2014 12:11:08 -0400 X-ASG-Orig-Subj: [PATCH v3 18/20] xfsprogs/repair: reconstruct the finobt in phase 5 Message-Id: <1397146270-42993-19-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146274 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Support reconstruction of the finobt in phase 5 of xfs_repair. We create a new cursor for the finobt and write the in-core records that contain free inodes to the tree. Finally, pass the cursor along to build_agi() to include the finobt root and level count in the agi header. Signed-off-by: Brian Foster --- repair/phase5.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 9632d2c..e138a6a 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -881,10 +881,11 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, */ static void init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, - __uint64_t *num_inos, __uint64_t *num_free_inos) + __uint64_t *num_inos, __uint64_t *num_free_inos, int finobt) { __uint64_t ninos; __uint64_t nfinos; + __uint64_t rec_nfinos; ino_tree_node_t *ino_rec; int num_recs; int level; @@ -920,13 +921,22 @@ init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, * build up statistics */ for (num_recs = 0; ino_rec != NULL; ino_rec = next_ino_rec(ino_rec)) { - ninos += XFS_INODES_PER_CHUNK; - num_recs++; + rec_nfinos = 0; for (i = 0; i < XFS_INODES_PER_CHUNK; i++) { ASSERT(is_inode_confirmed(ino_rec, i)); if (is_inode_free(ino_rec, i)) - nfinos++; + rec_nfinos++; } + + /* + * finobt only considers records with free inodes + */ + if (finobt && !rec_nfinos) + continue; + + nfinos += rec_nfinos; + ninos += XFS_INODES_PER_CHUNK; + num_recs++; } blocks_allocated = lptr->num_blocks = howmany(num_recs, @@ -1061,8 +1071,8 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, * 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, struct agi_stat *agi_stat) +build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, + bt_status_t *finobt_curs, struct agi_stat *agi_stat) { xfs_buf_t *agi_buf; xfs_agi_t *agi; @@ -1096,6 +1106,11 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, if (xfs_sb_version_hascrc(&mp->m_sb)) platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + agi->agi_free_root = cpu_to_be32(finobt_curs->root); + agi->agi_free_level = cpu_to_be32(finobt_curs->num_levels); + } + libxfs_writebuf(agi_buf, 0); } @@ -1106,7 +1121,7 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, static void build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, __uint32_t magic, - struct agi_stat *agi_stat) + struct agi_stat *agi_stat, int finobt) { xfs_agnumber_t i; xfs_agblock_t j; @@ -1158,7 +1173,10 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, * pointers for the parent. that can recurse up to the root * if required. set the sibling pointers for leaf level here. */ - ino_rec = findfirst_inode_rec(agno); + if (finobt) + ino_rec = findfirst_free_inode_rec(agno); + else + ino_rec = findfirst_inode_rec(agno); if (ino_rec != NULL) first_agino = ino_rec->ino_startnum; @@ -1210,7 +1228,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_rec[j].ir_freecount = cpu_to_be32(inocnt); freecount += inocnt; count += XFS_INODES_PER_CHUNK; - ino_rec = next_ino_rec(ino_rec); + + if (finobt) + ino_rec = next_free_ino_rec(ino_rec); + else + ino_rec = next_ino_rec(ino_rec); } if (ino_rec != NULL) { @@ -1486,9 +1508,12 @@ phase5_func( { __uint64_t num_inos; __uint64_t num_free_inos; + __uint64_t finobt_num_inos; + __uint64_t finobt_num_free_inos; bt_status_t bno_btree_curs; bt_status_t bcnt_btree_curs; bt_status_t ino_btree_curs; + bt_status_t fino_btree_curs; int extra_blocks = 0; uint num_freeblocks; xfs_extlen_t freeblks1; @@ -1533,8 +1558,13 @@ phase5_func( * on-disk btrees (includs pre-allocating all * required blocks for the trees themselves) */ - init_ino_cursor(mp, agno, &ino_btree_curs, - &num_inos, &num_free_inos); + init_ino_cursor(mp, agno, &ino_btree_curs, &num_inos, + &num_free_inos, 0); + + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + init_ino_cursor(mp, agno, &fino_btree_curs, + &finobt_num_inos, &finobt_num_free_inos, + 1); sb_icount_ag[agno] += num_inos; sb_ifree_ag[agno] += num_free_inos; @@ -1633,17 +1663,31 @@ phase5_func( */ magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC; - build_ino_tree(mp, agno, &ino_btree_curs, magic, &agi_stat); + build_ino_tree(mp, agno, &ino_btree_curs, magic, &agi_stat, 0); write_cursor(&ino_btree_curs); + /* + * build free inode tree + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC; + build_ino_tree(mp, agno, &fino_btree_curs, magic, + NULL, 1); + write_cursor(&fino_btree_curs); + } + /* build the agi */ - build_agi(mp, agno, &ino_btree_curs, &agi_stat); + build_agi(mp, agno, &ino_btree_curs, &fino_btree_curs, + &agi_stat); /* * tear down cursors */ finish_cursor(&bno_btree_curs); finish_cursor(&ino_btree_curs); + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + finish_cursor(&fino_btree_curs); finish_cursor(&bcnt_btree_curs); /* * release the incore per-AG bno/bcnt trees so -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E0D137FF5 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA7A68F8052 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04bdf07dcaa40b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id b3BksdFdj9hbuC5I for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBEop003921 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCBU015427 for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0305F1256D2; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 20/20] xfsprogs/db: add finobt support to metadump Date: Thu, 10 Apr 2014 12:11:10 -0400 X-ASG-Orig-Subj: [PATCH v3 20/20] xfsprogs/db: add finobt support to metadump Message-Id: <1397146270-42993-21-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146274 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Include the free inode btree in metadump images. If the source fs is finobt-enabled, run an additional scan_btree() of the finobt. Since the private 'agi' scanfunc_ino() parameter is unused, change the private parameter to a flag that indicates whether the current scan is for the inobt or finobt. If the latter, we skip copying the actual inode chunks as this work is already performed by the inobt scan. Signed-off-by: Brian Foster --- db/metadump.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/db/metadump.c b/db/metadump.c index 09bb85a..38cd441 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1917,6 +1917,7 @@ scanfunc_ino( xfs_inobt_ptr_t *pp; int i; int numrecs; + int finobt = *(int *) arg; numrecs = be16_to_cpu(block->bb_numrecs); @@ -1928,6 +1929,14 @@ scanfunc_ino( typtab[btype].name, agno, agbno); numrecs = mp->m_inobt_mxr[0]; } + + /* + * Only copy the btree blocks for the finobt. The inobt scan + * copies the inode chunks. + */ + if (finobt) + return 1; + rp = XFS_INOBT_REC_ADDR(mp, block, 1); for (i = 0; i < numrecs; i++, rp++) { if (!copy_inode_chunk(agno, rp)) @@ -1967,6 +1976,7 @@ copy_inodes( { xfs_agblock_t root; int levels; + int finobt = 0; root = be32_to_cpu(agi->agi_root); levels = be32_to_cpu(agi->agi_level); @@ -1985,7 +1995,20 @@ copy_inodes( return 1; } - return scan_btree(agno, root, levels, TYP_INOBT, agi, scanfunc_ino); + if (!scan_btree(agno, root, levels, TYP_INOBT, &finobt, scanfunc_ino)) + return 0; + + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + root = be32_to_cpu(agi->agi_free_root); + levels = be32_to_cpu(agi->agi_free_level); + + finobt = 1; + if (!scan_btree(agno, root, levels, TYP_INOBT, &finobt, + scanfunc_ino)) + return 0; + } + + return 1; } static int -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 148C87FF8 for ; Thu, 10 Apr 2014 11:11:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E5D0D8F8035 for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146275-04cb6c77b79f190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 25joU6doOfcb11yi for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBEwW005037 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3AGBCR0000747 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B0BBF125602; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Date: Thu, 10 Apr 2014 12:11:07 -0400 X-ASG-Orig-Subj: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Message-Id: <1397146270-42993-18-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-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: 1397146275 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add the findfirst_free_inode_rec() and next_free_ino_rec() helpers to assist scanning the in-core inode records for records with at least one free inode. These will be used to determine what records are included in the free inode btree. Signed-off-by: Brian Foster --- repair/incore.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/repair/incore.h b/repair/incore.h index 5419884..5f8c188 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -381,6 +381,33 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); ((ino_tree_node_t *) ((ino_node_ptr)->avl_node.avl_forw)) /* + * finobt helpers + */ +static inline ino_tree_node_t * +findfirst_free_inode_rec(xfs_agnumber_t agno) +{ + ino_tree_node_t *ino_rec; + + ino_rec = findfirst_inode_rec(agno); + + while (ino_rec && !ino_rec->ir_free) + ino_rec = next_ino_rec(ino_rec); + + return ino_rec; +} + +static inline ino_tree_node_t * +next_free_ino_rec(ino_tree_node_t *ino_rec) +{ + ino_rec = next_ino_rec(ino_rec); + + while (ino_rec && !ino_rec->ir_free) + ino_rec = next_ino_rec(ino_rec); + + return ino_rec; +} + +/* * Has an inode been processed for phase 6 (reference count checking)? * * add_inode_refchecked() is set on an inode when it gets traversed -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA1B78004 for ; Thu, 10 Apr 2014 11:11:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A1008F8035 for ; Thu, 10 Apr 2014 09:11:16 -0700 (PDT) X-ASG-Debug-ID: 1397146275-04bdf07dcca40c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HSFUYPP7MRHmY8wx for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGBElB005052 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:15 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCsf023652 for ; Thu, 10 Apr 2014 12:11:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D5EC91256D6; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 19/20] xfsprogs/growfs: report finobt status in fs geometry (xfs_info) Date: Thu, 10 Apr 2014 12:11:09 -0400 X-ASG-Orig-Subj: [PATCH v3 19/20] xfsprogs/growfs: report finobt status in fs geometry (xfs_info) Message-Id: <1397146270-42993-20-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146275 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Check and report on the free inode btree status bit in the fs geometry. Signed-off-by: Brian Foster --- growfs/xfs_growfs.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c index fb7eda8..119dc28 100644 --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -56,12 +56,13 @@ report_info( int projid32bit, int crcs_enabled, int cimode, - int ftype_enabled) + int ftype_enabled, + int finobt_enabled) { printf(_( "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" - " =%-22s crc=%u\n" + " =%-22s crc=%-8u finobt=%u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" @@ -71,7 +72,7 @@ report_info( mntpoint, geo.inodesize, geo.agcount, geo.agblocks, "", geo.sectsize, attrversion, projid32bit, - "", crcs_enabled, + "", crcs_enabled, finobt_enabled, "", geo.blocksize, (unsigned long long)geo.datablocks, geo.imaxpct, "", geo.sunit, geo.swidth, @@ -123,6 +124,7 @@ main(int argc, char **argv) int projid32bit; int crcs_enabled; int ftype_enabled = 0; + int finobt_enabled; /* free inode btree */ progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -245,11 +247,12 @@ main(int argc, char **argv) projid32bit = geo.flags & XFS_FSOP_GEOM_FLAGS_PROJID32 ? 1 : 0; crcs_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_V5SB ? 1 : 0; ftype_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_FTYPE ? 1 : 0; + finobt_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_FINOBT ? 1 : 0; if (nflag) { report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, attrversion, projid32bit, crcs_enabled, ci, - ftype_enabled); + ftype_enabled, finobt_enabled); exit(0); } @@ -286,7 +289,8 @@ main(int argc, char **argv) report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, - attrversion, projid32bit, crcs_enabled, ci, ftype_enabled); + attrversion, projid32bit, crcs_enabled, ci, ftype_enabled, + finobt_enabled); ddsize = xi.dsize; dlsize = ( xi.logBBsize? xi.logBBsize : -- 1.8.3.1 From bfoster@redhat.com Thu Apr 10 11:11:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CABB97FF2 for ; Thu, 10 Apr 2014 11:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7C2DCAC00D for ; Thu, 10 Apr 2014 09:11:15 -0700 (PDT) X-ASG-Debug-ID: 1397146274-04cb6c77b59f170001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IKjZil6pwB2JfaFb for ; Thu, 10 Apr 2014 09:11:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBDhc008070 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGBCBS015427 for ; Thu, 10 Apr 2014 12:11:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 613211256D0; Thu, 10 Apr 2014 12:11:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Date: Thu, 10 Apr 2014 12:11:04 -0400 X-ASG-Orig-Subj: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Message-Id: <1397146270-42993-15-git-send-email-bfoster@redhat.com> In-Reply-To: <1397146270-42993-1-git-send-email-bfoster@redhat.com> References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397146274 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 If one exists, scan the free inode btree in phase 2 of xfs_repair. We use the same general infrastructure as for the inobt scan, but trigger finobt chunk scan logic in in scan_inobt() via the magic value. The new scan_single_finobt_chunk() function is similar to the inobt equivalent with some finobt specific logic. We can expect that underlying inode chunk blocks are already marked used due to the previous inobt scan. We can also expect to find every record tracked by the finobt already accounted for in the in-core tree with equivalent (and internally consistent) inobt record data. Spit out a warning on any divergences from the above and add the inodes referenced by the current finobt record to the appropriate in-core tree. Signed-off-by: Brian Foster --- repair/scan.c | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 234 insertions(+), 5 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 1744c32..cd4d51b 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -46,6 +46,7 @@ struct aghdr_cnts { __uint64_t fdblocks; __uint64_t icount; __uint64_t ifreecount; + __uint32_t fibtfreecount; }; void @@ -877,6 +878,196 @@ _("inode rec for ino %" PRIu64 " (%d/%d) overlaps existing rec (start %d/%d)\n") return suspect; } +static int +scan_single_finobt_chunk( + xfs_agnumber_t agno, + xfs_inobt_rec_t *rp, + int suspect) +{ + xfs_ino_t lino; + xfs_agino_t ino; + xfs_agblock_t agbno; + int j; + int nfree; + int off; + int state; + ino_tree_node_t *first_rec, *last_rec, *ino_rec; + + ino = be32_to_cpu(rp->ir_startino); + off = XFS_AGINO_TO_OFFSET(mp, ino); + agbno = XFS_AGINO_TO_AGBNO(mp, ino); + lino = XFS_AGINO_TO_INO(mp, agno, ino); + + /* + * on multi-block block chunks, all chunks start + * at the beginning of the block. with multi-chunk + * blocks, all chunks must start on 64-inode boundaries + * since each block can hold N complete chunks. if + * fs has aligned inodes, all chunks must start + * at a fs_ino_alignment*N'th agbno. skip recs + * with badly aligned starting inodes. + */ + if (ino == 0 || + (inodes_per_block <= XFS_INODES_PER_CHUNK && off != 0) || + (inodes_per_block > XFS_INODES_PER_CHUNK && + off % XFS_INODES_PER_CHUNK != 0) || + (fs_aligned_inodes && agbno % fs_ino_alignment != 0)) { + do_warn( + _("badly aligned finobt inode rec (starting inode = %" PRIu64 ")\n"), + lino); + suspect++; + } + + /* + * verify numeric validity of inode chunk first + * before inserting into a tree. don't have to + * worry about the overflow case because the + * starting ino number of a chunk can only get + * within 255 inodes of max (NULLAGINO). if it + * gets closer, the agino number will be illegal + * as the agbno will be too large. + */ + if (verify_aginum(mp, agno, ino)) { + do_warn( +_("bad starting inode # (%" PRIu64 " (0x%x 0x%x)) in finobt rec, skipping rec\n"), + lino, agno, ino); + return ++suspect; + } + + if (verify_aginum(mp, agno, + ino + XFS_INODES_PER_CHUNK - 1)) { + do_warn( +_("bad ending inode # (%" PRIu64 " (0x%x 0x%zx)) in finobt rec, skipping rec\n"), + lino + XFS_INODES_PER_CHUNK - 1, + agno, + ino + XFS_INODES_PER_CHUNK - 1); + return ++suspect; + } + + /* + * cross check state of each block containing inodes referenced by the + * finobt against what we have already scanned from the alloc inobt. + */ + if (off == 0 && !suspect) { + for (j = 0; + j < XFS_INODES_PER_CHUNK; + j += mp->m_sb.sb_inopblock) { + agbno = XFS_AGINO_TO_AGBNO(mp, ino + j); + + state = get_bmap(agno, agbno); + if (state == XR_E_INO) { + continue; + } else if ((state == XR_E_UNKNOWN) || + (state == XR_E_INUSE_FS && agno == 0 && + ino + j >= first_prealloc_ino && + ino + j < last_prealloc_ino)) { + do_warn( +_("inode chunk claims untracked block, finobt block - agno %d, bno %d, inopb %d\n"), + agno, agbno, mp->m_sb.sb_inopblock); + + set_bmap(agno, agbno, XR_E_INO); + suspect++; + } else { + do_warn( +_("inode chunk claims used block, finobt block - agno %d, bno %d, inopb %d\n"), + agno, agbno, mp->m_sb.sb_inopblock); + return ++suspect; + } + } + } + + /* + * ensure we have an incore entry for each chunk + */ + find_inode_rec_range(mp, agno, ino, ino + XFS_INODES_PER_CHUNK, + &first_rec, &last_rec); + + if (first_rec) { + if (suspect) + return suspect; + + /* + * verify consistency between finobt record and incore state + */ + if (first_rec->ino_startnum != ino) { + do_warn( +_("finobt rec for ino %" PRIu64 " (%d/%u) does not match existing rec (%d/%d)\n"), + lino, agno, ino, agno, first_rec->ino_startnum); + return ++suspect; + } + + nfree = 0; + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { + nfree++; + if (!suspect && !is_inode_free(first_rec, j)) + suspect++; + } + } + + goto check_freecount; + } + + /* + * the finobt contains a record that the previous alloc inobt scan never + * found. insert the inodes into the appropriate tree. + */ + + do_warn( + _("undiscovered finobt record, ino %" PRIu64 " (%d/%u)\n"), + lino, agno, ino); + + if (!suspect) { + /* + * inodes previously inserted into the uncertain tree should be + * superceded by these when the uncertain tree is processed + */ + nfree = 0; + if (XFS_INOBT_IS_FREE_DISK(rp, 0)) { + nfree++; + ino_rec = set_inode_free_alloc(mp, agno, ino); + } else { + ino_rec = set_inode_used_alloc(mp, agno, ino); + } + for (j = 1; j < XFS_INODES_PER_CHUNK; j++) { + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { + nfree++; + set_inode_free(ino_rec, j); + } else { + set_inode_used(ino_rec, j); + } + } + } else { + /* + * this should handle the case where the inobt scan may have + * already added uncertain inodes + */ + nfree = 0; + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { + add_aginode_uncertain(mp, agno, ino + j, 1); + nfree++; + } else { + add_aginode_uncertain(mp, agno, ino + j, 0); + } + } + } + +check_freecount: + + if (nfree != be32_to_cpu(rp->ir_freecount)) { + do_warn( +_("finobt ir_freecount/free mismatch, inode chunk %d/%u, freecount %d nfree %d\n"), + agno, ino, be32_to_cpu(rp->ir_freecount), nfree); + } + + if (!nfree) { + do_warn( +_("finobt record with no free inodes, inode chunk %d/%u\n"), agno, ino); + } + + return suspect; +} /* * this one walks the inode btrees sucking the info there into @@ -985,12 +1176,29 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), * the block. skip processing of bogus records. */ for (i = 0; i < numrecs; i++) { - agcnts->agicount += XFS_INODES_PER_CHUNK; - agcnts->icount += XFS_INODES_PER_CHUNK; - agcnts->agifreecount += be32_to_cpu(rp[i].ir_freecount); - agcnts->ifreecount += be32_to_cpu(rp[i].ir_freecount); + if (magic == XFS_IBT_MAGIC || + magic == XFS_IBT_CRC_MAGIC) { + agcnts->agicount += XFS_INODES_PER_CHUNK; + agcnts->icount += XFS_INODES_PER_CHUNK; + agcnts->agifreecount += + be32_to_cpu(rp[i].ir_freecount); + agcnts->ifreecount += + be32_to_cpu(rp[i].ir_freecount); + + suspect = scan_single_ino_chunk(agno, &rp[i], + suspect); + } else { + /* + * the finobt tracks records with free inodes, + * so only the free inode count is expected to be + * consistent with the agi + */ + agcnts->fibtfreecount += + be32_to_cpu(rp[i].ir_freecount); - suspect = scan_single_ino_chunk(agno, &rp[i], suspect); + suspect = scan_single_finobt_chunk(agno, &rp[i], + suspect); + } } if (suspect) @@ -1175,6 +1383,20 @@ validate_agi( be32_to_cpu(agi->agi_root), agno); } + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + bno = be32_to_cpu(agi->agi_free_root); + if (bno != 0 && verify_agbno(mp, agno, bno)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC; + scan_sbtree(bno, be32_to_cpu(agi->agi_free_level), + agno, 0, scan_inobt, 1, magic, agcnts, + &xfs_inobt_buf_ops); + } else { + do_warn(_("bad agbno %u for finobt root, agno %d\n"), + be32_to_cpu(agi->agi_free_root), agno); + } + } + if (be32_to_cpu(agi->agi_count) != agcnts->agicount) { do_warn(_("agi_count %u, counted %u in ag %u\n"), be32_to_cpu(agi->agi_count), agcnts->agicount, agno); @@ -1185,6 +1407,13 @@ validate_agi( be32_to_cpu(agi->agi_freecount), agcnts->agifreecount, agno); } + if (xfs_sb_version_hasfinobt(&mp->m_sb) && + be32_to_cpu(agi->agi_freecount) != agcnts->fibtfreecount) { + do_warn(_("agi_freecount %u, counted %u in ag %u finobt\n"), + be32_to_cpu(agi->agi_freecount), agcnts->fibtfreecount, + agno); + } + for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) { xfs_agino_t agino = be32_to_cpu(agi->agi_unlinked[i]); -- 1.8.3.1 From msnitzer@redhat.com Thu Apr 10 11:25:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B099E29DF7 for ; Thu, 10 Apr 2014 11:25:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96DF88F8040 for ; Thu, 10 Apr 2014 09:25:26 -0700 (PDT) X-ASG-Debug-ID: 1397147124-04cbb00dc4a3ce0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5ZmLy8moR16XmmcV for ; Thu, 10 Apr 2014 09:25:25 -0700 (PDT) X-Barracuda-Envelope-From: msnitzer@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3AGPFqx006091 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 10 Apr 2014 12:25:16 -0400 Received: from localhost ([10.18.25.149]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AGPDnk030245 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 10 Apr 2014 12:25:14 -0400 Date: Thu, 10 Apr 2014 12:25:13 -0400 From: Mike Snitzer To: Dave Chinner Cc: xfs@oss.sgi.com, bob.mastors@solidfire.com Subject: Re: xfs: unmount does not wait for shutdown during unmount Message-ID: <20140410162513.GA21960@redhat.com> X-ASG-Orig-Subj: Re: xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1397104955-7247-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397147125 X-Barracuda-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, Apr 10 2014 at 12:42am -0400, Dave Chinner wrote: > From: Dave Chinner > > And interesting situation can occur if a log IO error occurs during > the unmount of a filesystem. The cases reported have the same > signature - the update of the superblock counters fails due to a log > write IO error: > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > XFS (dm-16): xfs_log_force: error 5 returned. > XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > It can be seen that the last line of output contains a corrupt > device name - this is because the log and xfs_mount structures have > already been freed by the time this message is printed. A kernel > oops closely follows. > > The issue is that the shutdown is occurring in a separate IO > completion thread to the unmount. Once the shutdown processing has > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > log shutdown code wakes anyone waiting on a log force so they can > process the shutdown error. This wakes up the unmount code that > is doing a synchronous transaction to update the superblock > counters. > > The unmount path now sees all the iclogs are marked with > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > it does, there will not be a wakeup trigger for it and we will hang > the unmount if we do. Hence the unmount runs through all the > remaining code and frees all the filesystem structures while the > xlog_iodone() is still processing the shutdown. When the log > shutdown processing completes, xfs_do_force_shutdown() emits the > "Please umount the filesystem and rectify the problem(s)" message, > and xlog_iodone() then aborts all the objects attached to the iclog. > An iclog that has already been freed.... > > The real issue here is that there is no serialisation point between > the log IO and the unmount. We have serialisations points for log > writes, log forces, reservations, etc, but we don't actually have > any code that wakes for log IO to fully complete. We do that for all > other types of object, so why not iclogbufs? > > Well, it turns out that we can easily do this. We've got xfs_buf > handles, and that's what everyone else uses for IO serialisation. > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > release the lock in xlog_iodone() when we are finished with the > buffer. That way before we tear down the iclog, we can lock and > unlock the buffer to ensure IO completion has finished completely > before we tear it down. > > Signed-off-by: Dave Chinner Works for the dm-thinp test-case that was failing, thanks Dave! Tested-by: Mike Snitzer From lczerner@redhat.com Thu Apr 10 12:36:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D32057F82 for ; Thu, 10 Apr 2014 12:36:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B847E304053 for ; Thu, 10 Apr 2014 10:36:01 -0700 (PDT) X-ASG-Debug-ID: 1397151360-04cbb00dc6a93b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WEjevtU65ltWDZWX for ; Thu, 10 Apr 2014 10:36:00 -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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3AHZx3L006476 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 10 Apr 2014 13:36:00 -0400 Received: from dell-per710-02.lab.eng.brq.redhat.com (dell-per710-02.lab.eng.brq.redhat.com [10.34.32.55]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3AHZv7k020916; Thu, 10 Apr 2014 13:35:58 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, Lukas Czerner Subject: [PATCH] xfstests: Add -s option to run only specified sections Date: Thu, 10 Apr 2014 19:35:52 +0200 X-ASG-Orig-Subj: [PATCH] xfstests: Add -s option to run only specified sections Message-Id: <1397151352-6614-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397151360 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds -s option which allows you to specify only certain sections from the config file to be run. The '-s' argument can be specified multiple times to allow multiple sections to be run. The options are still carried between section, that includes the sections which are not going to be run. Update README.config-sections as well. Signed-off-by: Lukas Czerner --- README.config-sections | 30 ++++++++++++++++++++++++++++++ check | 16 +++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/README.config-sections b/README.config-sections index 2849fd5..865ca93 100644 --- a/README.config-sections +++ b/README.config-sections @@ -57,6 +57,36 @@ system. You can also force the file system recreation by specifying RECREATE_TEST_DEV. +Run specified section only +-------------------------- + +Specifying '-s' argument with section name will run only the section +specified. The '-s' argument can be specified multiple times to allow multiple +sections to be run. + +The options are still carried between section, that includes the sections +which are not going to be run. So you can do something like + +[ext4] +TEST_DEV=/dev/sda1 +TEST_DIR=/mnt/test +SCRATCH_DEV=/dev/sdb1 +SCRATCH_MNT=/mnt/test1 +FSTYP=ext4 + +[xfs] +FSTYP=xfs + +[btrfs] +FSTYP=btrfs + + +and run + +./check -s xfs -s btrfs + +to check xfs and btrfs only. All the devices and mounts are still going to +be parsed from the section [ext4]. Example ------- diff --git a/check b/check index 09d753b..e7ace63 100755 --- a/check +++ b/check @@ -75,6 +75,7 @@ check options -T output timestamps -r randomize test order --large-fs optimise scratch device for large filesystems + -s section run only specified section from config file testlist options -g group[,group...] include tests from these groups @@ -221,7 +222,7 @@ while [ $# -gt 0 ]; do done done ;; - + -s) RUN_SECTION="$RUN_SECTION $2"; shift ;; -l) diff="diff" ;; -udiff) diff="$diff -u" ;; @@ -389,6 +390,19 @@ for section in $HOST_OPTIONS_SECTIONS; do OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS get_next_config $section + # Do we need to run only some sections ? + if [ ! -z "$RUN_SECTION" ]; then + skip=true + for s in $RUN_SECTION; do + if [ $section == $s ]; then + skip=false + fi + done + if $skip; then + continue + fi + fi + mkdir -p $RESULT_BASE if [ ! -d $RESULT_BASE ]; then echo "failed to create results directory $RESULT_BASE" -- 1.8.3.1 From sandeen@sandeen.net Thu Apr 10 12:53:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E32D7F84 for ; Thu, 10 Apr 2014 12:53:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 21A348F8054 for ; Thu, 10 Apr 2014 10:53:25 -0700 (PDT) X-ASG-Debug-ID: 1397152402-04cb6c77b7a75a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GrDfAL0wKH0AdTpi for ; Thu, 10 Apr 2014 10:53: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 69CA6653C22C; Thu, 10 Apr 2014 12:53:22 -0500 (CDT) Message-ID: <5346DA91.3090305@sandeen.net> Date: Thu, 10 Apr 2014 12:53:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Lukas Czerner , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: Fix generic/022 output file References: <1397139797-9650-1-git-send-email-lczerner@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: Fix generic/022 output file In-Reply-To: <1397139797-9650-1-git-send-email-lczerner@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397152402 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/10/14, 9:23 AM, Lukas Czerner wrote: > In commit 21723cdb I've accidentally changed header in the output file > to a wrong number. It should be 022, fix it. > > Signed-off-by: Lukas Czerner > --- > tests/generic/022.out | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tests/generic/022.out b/tests/generic/022.out > index 96c2d33..fbffa59 100644 > --- a/tests/generic/022.out > +++ b/tests/generic/022.out > @@ -1,4 +1,4 @@ > -QA output created by 009 > +QA output created by 022 > 1. into a hole > f4f35d60b3cc18aaa6d8d92f0cd3708a > 2. into allocated space > I can review this one! ;) Reviewed-by: Eric Sandeen From david@fromorbit.com Thu Apr 10 16:52:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B27A27F8C for ; Thu, 10 Apr 2014 16:52:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A6E5AC002 for ; Thu, 10 Apr 2014 14:52:24 -0700 (PDT) X-ASG-Debug-ID: 1397166741-04cbb00dc3b79f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id kPNeflqMyMrHuh6b for ; Thu, 10 Apr 2014 14:52: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: AlRaAJ0RR1N5LEcvPGdsb2JhbABSCIMGiFm3DIVdgSMXAwEBAQE4NYIlAQEBAwEnCwEjIwULCAECFQMJJQ8FJQMHGhOHdAeNcb57FxaOAFYHgySBFAEDmF2WBSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 07:22:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYMtO-00073K-Ux; Fri, 11 Apr 2014 07:52:18 +1000 Date: Fri, 11 Apr 2014 07:52:18 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com, bob.mastors@solidfire.com, snitzer@redhat.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-ID: <20140410215218.GD27519@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> <53469C9C.8010604@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <53469C9C.8010604@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: 1397166742 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 08:29:00AM -0500, Mark Tinguely wrote: > On 04/09/14 23:42, Dave Chinner wrote: > >From: Dave Chinner > > > >And interesting situation can occur if a log IO error occurs during > >the unmount of a filesystem. The cases reported have the same > >signature - the update of the superblock counters fails due to a log > >write IO error: > > > >XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > >XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > >XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > >XFS (dm-16): xfs_log_force: error 5 returned. > >XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > > >It can be seen that the last line of output contains a corrupt > >device name - this is because the log and xfs_mount structures have > >already been freed by the time this message is printed. A kernel > >oops closely follows. > > > >The issue is that the shutdown is occurring in a separate IO > >completion thread to the unmount. Once the shutdown processing has > >started and all the iclogs are marked with XLOG_STATE_IOERROR, the > >log shutdown code wakes anyone waiting on a log force so they can > >process the shutdown error. This wakes up the unmount code that > >is doing a synchronous transaction to update the superblock > >counters. > > > >The unmount path now sees all the iclogs are marked with > >XLOG_STATE_IOERROR and so never waits on them again, knowing that if > >it does, there will not be a wakeup trigger for it and we will hang > >the unmount if we do. Hence the unmount runs through all the > >remaining code and frees all the filesystem structures while the > >xlog_iodone() is still processing the shutdown. When the log > >shutdown processing completes, xfs_do_force_shutdown() emits the > >"Please umount the filesystem and rectify the problem(s)" message, > >and xlog_iodone() then aborts all the objects attached to the iclog. > >An iclog that has already been freed.... > > > >The real issue here is that there is no serialisation point between > >the log IO and the unmount. We have serialisations points for log > >writes, log forces, reservations, etc, but we don't actually have > >any code that wakes for log IO to fully complete. We do that for all > >other types of object, so why not iclogbufs? > > > >Well, it turns out that we can easily do this. We've got xfs_buf > >handles, and that's what everyone else uses for IO serialisation. > >i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > >release the lock in xlog_iodone() when we are finished with the > >buffer. That way before we tear down the iclog, we can lock and > >unlock the buffer to ensure IO completion has finished completely > >before we tear it down. > > > >Signed-off-by: Dave Chinner > > The wait queue "xc_commit_wait" is used for two purposes, first to > start the next ic_log buffer completion and also to wake those > waiting for a syncronous event. Shutdown does syncronous cil pushes > but it does not wait for the IO to happen. First of all, shutdown does not do a CIL push if the source of the shutdown is a log error, as is this case. Secondly, shutdown can't wait for log IO completion because it can be run from log IO completion, as is this case. Thirdly, xc_commit_wait does not guarantee that *other* iclogbufs are not under IO, just that specific CIL push is complete. Indeed, we could be writing the unmount record, which writes to the iclogbufs and issues IO directly and hence cannot be waited on by a xc_commit_wait. If you want to wait on iclogbuf state machine transitions (i.e. when it considers the iclogbuf to be clean and active), that's what the iclog->ic_write_wait wait queue is for. But even that is not sufficient for our purposes, because the IO completion code references the iclog after it has woken waiters during state machine transitions. Finally, the issue is that the superblock counter update transaction is blocked in _xfs_log_force_lsn() as it is a synchronous transaction. This is after the CIL has been pushed and now we are waiting on iclogbuf IO completion blocked on the the iclog->ic_force_wait wait queue. The last thing xfs_log_force_unmount() does in a shutdown - after the state machines are moved to error states - is wake up any waiters on the iclog->ic_force_wait wait queues. That's where the "xfs_log_force: error 5" message comes from - the sync transaction failing the transaction commit. Again, this happens before the iclogbuf IO completion processing is finished, and hence we cannot use any of the existing wait queue mechanisms to wait for iclogbuf IO completion to be finished. Hence, a new mechanism is required, and that's what the patch provides. > Why not wait for the IO to happen or fail > before waking out the sync waiters? How? You can't wait for IO completion when it's IO completion that has detected the error and is running the shutdown. > If you want to keep the speedier completion of the next cil > push add another wait queue. There only a few (typically 8) per > filesystem. I don't follow you. What does this have to do with ensuring iclogbufs are not still in use when we free them? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 17:37:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 222E77F91 for ; Thu, 10 Apr 2014 17:37:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AD15304053 for ; Thu, 10 Apr 2014 15:37:46 -0700 (PDT) X-ASG-Debug-ID: 1397169464-04cbb00dc5ba210001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id iwSJydCfrJaeJEw1 for ; Thu, 10 Apr 2014 15:37:45 -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: Ak1aACocR1N5LEcvPGdsb2JhbABagwaIWbcMhV2BIxcDAQEBATg1giUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOHe8xvFxaOVgeDJIEUBJhdlgUr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 08:05:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYNZS-000791-JL; Fri, 11 Apr 2014 08:35:46 +1000 Date: Fri, 11 Apr 2014 08:35:46 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-ID: <20140410223546.GE27519@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-5-git-send-email-david@fromorbit.com> <20140410104001.GG17641@infradead.org> <20140410122259.GC27519@dastard> <20140410123332.GA15577@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410123332.GA15577@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1397169464 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 05:33:32AM -0700, Christoph Hellwig wrote: > On Thu, Apr 10, 2014 at 10:22:59PM +1000, Dave Chinner wrote: > > XFS_B_TO_FSB gives the same result given that we've already rounded > > start_boundary to block granularity.... > > It does, but XFS_B_TO_FSBT is one less operation, and it's the better > example for a start offset when people start copy & pasting it. *nod*. Fixed it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 17:52:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 312767F56 for ; Thu, 10 Apr 2014 17:52:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 092A3304059 for ; Thu, 10 Apr 2014 15:52:38 -0700 (PDT) X-ASG-Debug-ID: 1397170356-04cbb00dc6baf20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id f1f8piuPlRz1u3xg for ; Thu, 10 Apr 2014 15:52:37 -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: AkxaAOsfR1N5LEcvPGdsb2JhbABagwaIWbcNhV2BIxcDAQEBATg1giUBAQEEOhwjEAgDGAklDwUlAwcaE4d7zGgXFo5WB4MkgRQEmF2KZIshKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 08:22:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYNpi-0007Ax-Kl; Fri, 11 Apr 2014 08:52:34 +1000 Date: Fri, 11 Apr 2014 08:52:34 +1000 From: Dave Chinner To: Sasha Levin Cc: Al Viro , Dave Jones , Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140410225234.GF27519@dastard> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. References: <20140329223109.GA24098@redhat.com> <20140330234335.GB16336@dastard> <20140330235717.GO18016@ZenIV.linux.org.uk> <20140331004053.GA17603@dastard> <53445EC0.9060707@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53445EC0.9060707@oracle.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: 1397170356 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 08, 2014 at 04:40:32PM -0400, Sasha Levin wrote: > On 03/30/2014 08:40 PM, Dave Chinner wrote: > > On Mon, Mar 31, 2014 at 12:57:17AM +0100, Al Viro wrote: > >> > On Mon, Mar 31, 2014 at 10:43:35AM +1100, Dave Chinner wrote: > >>> > > filldir on a directory inode vs page fault on regular file. Known > >>> > > issue, definitely a false positive. We have to change locking > >>> > > algorithms to avoid such deficiencies of lockdep (a case of "lockdep > >>> > > considered harmful", perhaps?) so it's not something I'm about to > >>> > > rush... > >> > > >> > Give i_lock on directories a separate class, as it's been done for i_mutex... > > Already done that. Commit: > > > > 93a8614 xfs: fix directory inode iolock lockdep false positive > > Hi Dave, > > The commit above introduces a new lockdep issue for me: Right, it's fixed one class of false positive which uncovers the next class of false positive. lockdep gives me the shits at times because every time we make some obviously correct locking change to the XFS inodes we then spend the next 3-4 kernel releases chasing down and annotating locks so that lockdep doesn't throw false positives everywhere. It's on my queue of things to fix but, quite frankly, lockdep false positives are low priority to fix right now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 18:53:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4AD37F8E for ; Thu, 10 Apr 2014 18:53:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60BCBAC002 for ; Thu, 10 Apr 2014 16:53:29 -0700 (PDT) X-ASG-Debug-ID: 1397174007-04bdf07dcabfc60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id wtbs5avIIBj4ds8v for ; Thu, 10 Apr 2014 16:53: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: AkxaAP8tR1N5LEcvPGdsb2JhbABagwaIWbcRhV2BHRcDAQEBATg1giUBAQEDATocIxAIAxgJJQ8FJQMHLYd0B8xaFxaOVgcWgw6BFASYXZYFKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 09:23:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYOmY-0007J0-93; Fri, 11 Apr 2014 09:53:22 +1000 Date: Fri, 11 Apr 2014 09:53:22 +1000 From: Dave Chinner To: alexander.tsvetkov@oracle.com Cc: xfs@oss.sgi.com Subject: Re: generic/204: correct log size for XFS Message-ID: <20140410235322.GA15995@dastard> X-ASG-Orig-Subj: Re: generic/204: correct log size for XFS References: <53467259.1080604@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53467259.1080604@oracle.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: 1397174007 X-Barracuda-URL: http://192.48.157.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.3.4770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Apr 10, 2014 at 02:28:41PM +0400, alexander.tsvetkov@oracle.com wrote: > generic/204 fails on device with Advanced Format of 4096 bytes per > physical sector and when partition starts at the 4K boundary/./In this case > filesystem sector/block size will be of 4096 bytes size and > _scratch_mkfs_sized > fails because mkfs reports that 5Mb log size is not enough to create > a filesystem, > for example attempt to make filesystem on such partition: > > mkfs.xfs -f -bsize=4096 -l size=5m -d size=109051904 /dev/sdb2" > > results to: > > "log size 1280 blocks too small, minimum size is 1605 blocks" > > and generic/204fails with ENOSPC before it has finished creating the > necessary files: > > "QA output created by 204 > ./tests/generic/204: line 86: echo: write error: No space left on device > ..." > > Log size of 7Mbis enough to make filesytem and pass this test. This is missing a s-o-b line. Can you add one? > > diff --git a/tests/generic/204 b/tests/generic/204 > index 13a762a..4ebab26 100755 > --- a/tests/generic/204 > +++ b/tests/generic/204 > @@ -53,9 +53,9 @@ _scratch_mkfs 2> /dev/null | _filter_mkfs 2> > $tmp.mkfs > /dev/null > > # For xfs, we need to handle the different default log sizes that > different > # versions of mkfs create. All should be valid with a 5MB log, so > use that. > -[ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=5m" > +[ $FSTYP = "xfs" ] && MKFS_OPTIONS="$MKFS_OPTIONS -l size=7m" > > -SIZE=`expr 104 \* 1024 \* 1024` > +SIZE=`expr 106 \* 1024 \* 1024` > _scratch_mkfs_sized $SIZE $dbsize 2> /dev/null \ > | _filter_mkfs 2> $tmp.mkfs > /dev/null > _scratch_mount The change looks fine, but your mailer is line wrapping and whitespace mangling the patches. Please read Documentation/SubmittingPatches in the kernel tree for how to do this correctly. Also, please don't send patches in multipart emails - turn off html sending so that git am doesn't throw a wobbly over it... I've fixed it up this time.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 19:12:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6E6DE7F8E for ; Thu, 10 Apr 2014 19:12:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 502FC304053 for ; Thu, 10 Apr 2014 17:12:39 -0700 (PDT) X-ASG-Debug-ID: 1397175157-04bdf07dc7c0a20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id IPVpEbM836f5MVGw for ; Thu, 10 Apr 2014 17:12:37 -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: Ak1aAOgyR1N5LEcvPGdsb2JhbABagwaIWbcShV2BHRcDAQEBATg1giUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOHe8xSFxaNcmQHgySBFASYXZYFK4Es Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 09:42:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYP59-0007Lu-Pt; Fri, 11 Apr 2014 10:12:35 +1000 Date: Fri, 11 Apr 2014 10:12:35 +1000 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH] ext4/306: disable 64bit feature too Message-ID: <20140411001235.GB15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] ext4/306: disable 64bit feature too References: <1397044147-15727-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397044147-15727-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1397175157 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 09, 2014 at 07:49:07PM +0800, Eryu Guan wrote: > mke2fs ext4 without extent feature will fail if 64bit feature is > enabled in mke2fs.conf > > mke2fs 1.42.9 (28-Dec-2013) > Extents MUST be enabled for a 64-bit filesystem. Pass -O extents to rectify. > > So disable 64bit feature together with extent explicitly. > > Signed-off-by: Eryu Guan > --- > tests/ext4/306 | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tests/ext4/306 b/tests/ext4/306 > index 9559cf2..fd50b0e 100755 > --- a/tests/ext4/306 > +++ b/tests/ext4/306 > @@ -48,7 +48,7 @@ _require_scratch > rm -f $seqres.full > > # Make a small ext4 fs with extents disabled & mount it > -yes | mkfs.ext4 -O ^extents $SCRATCH_DEV 512m >> $seqres.full 2>&1 > +yes | mkfs.ext4 -O ^extents,^64bit $SCRATCH_DEV 512m >> $seqres.full 2>&1 > _scratch_mount || _fail "couldn't mount fs" > > # Create a small non-extent-based file > -- > 1.9.0 Looks fine to me, but you should CC ext4 test changes to linux-ext4@vger.kernel.org as well so that the ext4 developers can review such changes are well... Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 19:14:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 768447F9C for ; Thu, 10 Apr 2014 19:14:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6473B8F8037 for ; Thu, 10 Apr 2014 17:14:13 -0700 (PDT) X-ASG-Debug-ID: 1397175251-04cb6c77b5bc380001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Em6JNw3XsQDIj30a for ; Thu, 10 Apr 2014 17:14:11 -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: Ak1aAOgyR1N5LEcvPGdsb2JhbABagwaIWbcShV2BHRcDAQEBATg1giUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOHe8xSFxaOVgeDJIEUBJhdlgUr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 09:44:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYP6g-0007MP-5W; Fri, 11 Apr 2014 10:14:10 +1000 Date: Fri, 11 Apr 2014 10:14:10 +1000 From: Dave Chinner To: Lukas Czerner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix specifying configuration value with equality sign Message-ID: <20140411001410.GC15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix specifying configuration value with equality sign References: <1397123737-3478-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397123737-3478-1-git-send-email-lczerner@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: 1397175251 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 11:55:37AM +0200, Lukas Czerner wrote: > Currently there is a problem with parse_config_section() when the > configuration value contains equality sign like this for example: > > MOUNT_OPTIONS="-o data=journal" > > the result will be > > export MOUNT_OPTIONS="-o data="journal" > > which is not going to work. The reason is that the expression used to > parse the configuration options uses greedy matching '.*'. Fix this by > using non greedy expression to match the first equality sign '[^=]'. > > Signed-off-by: Lukas Czerner Looks fine. Reviewed-by: Dave Chinner It would probably be a good idea to comment what the sed line noise is actually doing, so it's easier to understand in future... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 19:15:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F00B97F99 for ; Thu, 10 Apr 2014 19:15:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDD22304053 for ; Thu, 10 Apr 2014 17:15:12 -0700 (PDT) X-ASG-Debug-ID: 1397175311-04cbb00dc3bf3b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id E9awUXlSYNZAG7z7 for ; Thu, 10 Apr 2014 17:15:11 -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: Ak1aAOgyR1N5LEcvPGdsb2JhbABagwaIWbcShV2BHRcDAQEBATg1giUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOHe8xSFxaOVgeDJIEUBJhdlgUr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 09:45:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYP7e-0007Md-2q; Fri, 11 Apr 2014 10:15:10 +1000 Date: Fri, 11 Apr 2014 10:15:10 +1000 From: Dave Chinner To: Lukas Czerner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: Fix generic/022 output file Message-ID: <20140411001509.GD15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: Fix generic/022 output file References: <1397139797-9650-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397139797-9650-1-git-send-email-lczerner@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: 1397175311 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 10, 2014 at 04:23:17PM +0200, Lukas Czerner wrote: > In commit 21723cdb I've accidentally changed header in the output file > to a wrong number. It should be 022, fix it. Actually, my mistake when I renumbered it during integration. I just hadn't sent my local patch out for review yet. Regardless, Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 19:16:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B08957F99 for ; Thu, 10 Apr 2014 19:16:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8EDDB304039 for ; Thu, 10 Apr 2014 17:16:39 -0700 (PDT) X-ASG-Debug-ID: 1397175397-04cbb00dc6bf4e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Q133sncApEC0fCkR for ; Thu, 10 Apr 2014 17:16:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak5aAA40R1N5LEcvPGdsb2JhbABagwaIWbcShV2BHRcDAQEBATg1giUBAQEEOhwREhAIAw4KCSUPBSUDBxoTh3vMUxcWjlYHgySBFAEDmF2WBSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 09:46:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYP8j-0007Mo-Hm; Fri, 11 Apr 2014 10:16:17 +1000 Date: Fri, 11 Apr 2014 10:16:17 +1000 From: Dave Chinner To: Lukas Czerner Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH] xfstests: Add -s option to run only specified sections Message-ID: <20140411001617.GE15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: Add -s option to run only specified sections References: <1397151352-6614-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397151352-6614-1-git-send-email-lczerner@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: 1397175397 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 07:35:52PM +0200, Lukas Czerner wrote: > This commit adds -s option which allows you to specify only certain > sections from the config file to be run. The '-s' argument can be > specified multiple times to allow multiple sections to be run. > > The options are still carried between section, that includes the > sections which are not going to be run. > > Update README.config-sections as well. > > Signed-off-by: Lukas Czerner Neat. Looks simple enough. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 10 20:26:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 983F47F72 for ; Thu, 10 Apr 2014 20:26:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7925330405F for ; Thu, 10 Apr 2014 18:26:44 -0700 (PDT) X-ASG-Debug-ID: 1397179602-04bdf07dccc3e00001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 60cy6xT8Ws8bbYm7 for ; Thu, 10 Apr 2014 18:26: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: Art6AH9ER1N5LEcvPGdsb2JhbABagwY7gxOFC6M2k1yGehcDAQEBATg1gmYcOyQ0BSUDBy2He5pvsg4WjnODDoEUBJhdlgUr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 11 Apr 2014 10:56:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYQEI-0007Wp-W0 for xfs@oss.sgi.com; Fri, 11 Apr 2014 11:26:07 +1000 Date: Fri, 11 Apr 2014 11:26:06 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsdump: master branch updated to b1d6979 Message-ID: <20140411012606.GF15995@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsdump: master branch updated to b1d6979 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1397179602 X-Barracuda-URL: http://192.48.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.95 X-Barracuda-Spam-Status: No, SCORE=1.95 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7582A, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.75 BSF_RULE_7582A Custom Rule 7582A 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) Hi folks, The xfsdump repository at git://oss.sgi.com/xfs/cmds/xfsdump has just been updated. The new head of the master branch is commit: b1d6979 remove ancient sys_getdents code paths New Commits: Boris Ranto (1): [c3a4db1] xfsdump: Fix memory and fd leak in invutil/stobj.c Kyle McMartin (2): [9ed517b] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents [b1d6979] remove ancient sys_getdents code paths Code Diffstat: common/getdents.c | 282 +++++++++++++----------------------------------------- invutil/stobj.c | 13 +-- 2 files changed, 76 insertions(+), 219 deletions(-) -- Dave Chinner david@fromorbit.com From dcxf@chinamold.org Thu Apr 10 20:30:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.7 required=5.0 tests=FH_FROMEML_NOTLD,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 9D7957F59 for ; Thu, 10 Apr 2014 20:30:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5EFE730405F for ; Thu, 10 Apr 2014 18:30:24 -0700 (PDT) X-ASG-Debug-ID: 1397179822-04cbb00dc6c3240001-NocioJ Received: from smtp.fax.bionlib.biz (fax.bionlib.biz [192.129.201.186]) by cuda.sgi.com with ESMTP id C8KZUC2wUxEVFrxw for ; Thu, 10 Apr 2014 18:30:22 -0700 (PDT) X-Barracuda-Envelope-From: dcxf@chinamold.org X-Barracuda-Apparent-Source-IP: 192.129.201.186 Reply-To: peter@pf-mold.com Message-ID: <14A88B024FA77D837BD9D0FE82D4BFFA@axamil> From: PFMOLD To: Subject: Mould and Molding-pfmold Date: Fri, 11 Apr 2014 09:30:31 +0800 X-ASG-Orig-Subj: Mould and Molding-pfmold Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0F2A_01584E44.15203620" X-Priority: 1 X-MSMail-Priority: High X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7601.17609 X-Barracuda-Connect: fax.bionlib.biz[192.129.201.186] X-Barracuda-Start-Time: 1397179822 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4773 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_0F2A_01584E44.15203620 Content-Type: multipart/alternative; boundary="----=_NextPart_001_073C_01584E44.15203620" ------=_NextPart_001_073C_01584E44.15203620 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 RGVhciBGcmllbmRzLA0KIA0KUEYgaXMgYSBwcm9mZXNzaW9uYWwgSW5qZWN0aW9uIE1vbGQsIFBs YXN0aWMgbW9sZGluZyxEaWUtY2FzdGluZyBtYW51ZmFjdHVyZXIgd2l0aCBtb3JlIHRoYW4gZGVj YWRlIGV4cGVyaWVuY2UgDQpsb2NhdGVkIGluIENoaW5hLiB3ZSBhbHNvIG9mZmVyIENOQ3MgbWFj aGluaW5nLFJhcGlkIFByb3RvdHlwaW5nLCBzaWxrLXNjcmVlbiBhbmQgYXNzZW1ibHkgc2Vydmlj ZXMuDQoNCk91ciBhZHZhbnRhZ2VzOg0KDQoxLSBXZSB3aWxsIHF1b3RlIHlvdXIgUkZRIHdpdGhp biAgMTIgaG91cnMuDQoyLSBXZSBoYXZlIHJpY2ggZXhwcmVpZW5jZSBmb3IgRE1FLEhBU0NPIHN0 YW5kYXJkLg0KMy0gT3VyIDgwJSBtb2xkcyBhcmUgZXhwb3J0ZWQuDQo0LSBXZSBwcm92aWRlIG9u ZS1zdG9wIHNlcnZpY2U6IGRlc2lnbiwgbWFudWZhY3R1cmluZywgc2lsay1zY3JlbiwgcGFja2Fn ZSBhbmQgZGVsaXZlcnkuDQo1LSBHb29kIGNvbW11bmljYXRpb24gd2l0aCByaWNoIGV4cGVyaWVu Y2Ugc2FsZXMgYW5kIGVuZ2luZWVyIGluIEVuZ2xpc2guDQo2LSBRdWFsaXR5LCBjb3N0IGFuZCBk ZWxpdmVyeSBpbiB0aW1lIGFyZSBhbGwgaW1wb3J0YW50Lg0KDQoNCkZvciBtb3JlIGluZm9ybWF0 aW9uIHBsZWFzZSB2aWV3IHd3dy5wZi1tb2xkLmNvbSAuIExvb2tpbmcgZm9yd2FyZCB0byB5b3Vy IFJGUS4NCg0KVGhhbmtzICYgQmVzdCByZWdhcmRzDQoNClBldGVyDQpQRiBJbmR1c3RyeSBDby4s IExpbWl0ZWQuIA0KVGVsOis4Ni03NTUtMjgzMjY2NTYgRmF4Ois4Ni03NTUtMjgzMjY2NTUNCldl Yjogd3d3LnBmLW1vbGQuY29tIA0KRW1haWw6bWFuYWdlckBwZm1vbGQuY29tICBwZm1vbGRAaG90 bWFpbC5jb20NClNreXBlOnBmbW9sZCAoMjQgaG91cnMgb25saW5lKQ0KDQppZiB5b3UgZG9uJ3Qg d2FudCB0byByZWNlaXZlIG91ciBlbWFpbCBhZ2FpbqO6VW5zdWJzY3JpYmUNCg0KMjAxNC80LzEx DQog ------=_NextPart_001_073C_01584E44.15203620 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxodG1sIHhtbG5zOm8+PGhlYWQ+DQo8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNo YXJzZXQ9Z2IyMzEyIiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjwvaGVhZD4NCjxib2R5Pg0K PHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48c3BhbiANCnN0 eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9IkZP TlQtRkFNSUxZOiAiPjxmb250IA0KZmFjZT1BcmlhbD48Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAx MHB0Ij48Zm9udCBjb2xvcj1ibHVlPkRlYXIgDQpGcmllbmRzLDwvZm9udD48L2ZvbnQ+PC9mb250 Pjwvc3Bhbj48L3NwYW4+PC9wPg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBj bSAwY20gMHB0Ij48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxzcGFu IGxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250IA0KZmFjZT1BcmlhbD48Zm9u dCBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCANCmNvbG9yPWJsdWU+PC9mb250PjwvZm9u dD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj4mbmJzcDs8L3A+DQo8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5 bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xF X0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpm YWNlPUFyaWFsPjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGNvbG9yPWJsdWU+ UEYmbmJzcDtpcyBhIA0KcHJvZmVzc2lvbmFsPGIgc3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0 OiBub3JtYWwiPiBJbmplY3Rpb24gTW9sZCwgUGxhc3RpYyANCm1vbGRpbmcsRGllLWNhc3Rpbmcg bWFudWZhY3R1cmVyPC9iPiB3aXRoIG1vcmUgdGhhbiBkZWNhZGUgZXhwZXJpZW5jZSANCjxicj48 L2ZvbnQ+PC9mb250PjwvZm9udD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29r bWFyazogT0xFX0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+ PGZvbnQgDQpmYWNlPUFyaWFsPjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGNv bG9yPWJsdWU+bG9jYXRlZCBpbiBDaGluYS4gd2UgDQphbHNvIG9mZmVyIDxiIHN0eWxlPSJtc28t YmlkaS1mb250LXdlaWdodDogbm9ybWFsIj5DTkNzIG1hY2hpbmluZzwvYj4sPC9mb250PjxiIA0K c3R5bGU9Im1zby1iaWRpLWZvbnQtd2VpZ2h0OiBub3JtYWwiPjxmb250IGNvbG9yPWJsdWU+UmFw aWQgUHJvdG90eXBpbmcsIA0Kc2lsay1zY3JlZW4gYW5kIDwvZm9udD48L2I+PC9mb250PjwvZm9u dD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxMiI+ PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpmYWNlPUFyaWFs Pjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGNvbG9yPWJsdWU+PGIgDQpzdHls ZT0ibXNvLWJpZGktZm9udC13ZWlnaHQ6IG5vcm1hbCI+YXNzZW1ibHkmbmJzcDs8L2I+c2Vydmlj ZXMuPGJyPjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bhbj48L3NwYW4+PHNwYW4gDQpzdHlsZT0i bXNvLWJvb2ttYXJrOiBPTEVfTElOSzEyIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSJGT05ULUZB TUlMWTogIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMDAwMGZmIj48 Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4Ij48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEy cHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBG T05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMDAwMGZmIj48c3BhbiANCnN0eWxlPSJGT05ULVNJ WkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4gbGFuZz1FTi1VUyANCnN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6 IGJsdWUiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTkszIj48c3BhbiBzdHls ZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzQiPjxzcGFuIA0KbGFuZz1FTi1VUyANCnN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6 IGJsdWUiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxMiI+PHNwYW4gbGFu Zz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBDT0xPUjogIzAwMDBmZiI+PGZvbnQgc3R5bGU9IkZPTlQtU0laRTogMTJweCI+PGZvbnQg DQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWwiPjxmb250IA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJweDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzAwMDBmZiI+ PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWwiPjxicj48 Zm9udCBjb2xvcj1yZWQ+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB0OyBGT05ULUZBTUlM WTogQXJpYWw7IEZPTlQtVkFSSUFOVDogbm9ybWFsOyBWRVJUSUNBTC1BTElHTjogYmFzZWxpbmU7 IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6IGJsYWNrOyBG T05ULVNUWUxFOiBub3JtYWw7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9u dC1rZXJuaW5nOiAxMi4wcHQ7IGxhbmd1YWdlOiBlbi1VUzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5 OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tY29sb3ItaW5kZXg6IDE7 IHRleHQtY29tYmluZTogbGV0dGVyczsgbXNvLXRleHQtcmFpc2U6IDAlOyBtc28tc3R5bGUtdGV4 dG91dGxpbmUtdHlwZTogbm9uZTsgbXNvLXN0eWxlLXRleHRmaWxsLXR5cGU6IHNvbGlkOyBtc28t c3R5bGUtdGV4dGZpbGwtZmlsbC10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLXRleHRmaWxs LWZpbGwtY29sb3I6IGJsYWNrOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1hbHBoYTogMTAwLjAl Ij48Zm9udCANCmNvbG9yPWJsdWUgc2l6ZT0yPk91ciANCmFkdmFudGFnZXM6PGJyPjwvcD48L2Zv bnQ+PC9zcGFuPjwvZm9udD48L3NwYW4+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bh bj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2ZvbnQ+PC9mb250 PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6 IE9MRV9MSU5LMTIiPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250 IA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IHN0eWxlPSJG T05ULVNJWkU6IDEycHgiPjxmb250IA0Kc3R5bGU9IkZPTlQtU0laRTogMTJweDsgRk9OVC1GQU1J TFk6IEFyaWFsIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBB cmlhbDsgQ09MT1I6ICMwMDAwZmYiPjxzcGFuIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJweDsgRk9O VC1GQU1JTFk6IEFyaWFsIj48c3BhbiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZSI+PHNwYW4g DQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzMiPjxzcGFuIHN0eWxlPSJtc28tYm9va21h cms6IE9MRV9MSU5LNCI+PHNwYW4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZSI+PHNwYW4g DQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzEyIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxl PSJGT05ULUZBTUlMWTogIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAj MDAwMGZmIj48Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAxMnB4Ij48Zm9udCANCnN0eWxlPSJGT05U LVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpF OiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMDAwMGZmIj48c3BhbiANCnN0eWxl PSJGT05ULVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgY29sb3I9cmVkPg0K PHAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyB1bmljb2RlLWJpZGk6IGVtYmVk OyBXT1JELUJSRUFLOiBub3JtYWw7IERJUkVDVElPTjogbHRyOyBURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDMuMzZwdCAwaW4gMHB0IDAuNThpbjsgTElORS1IRUlHSFQ6IG5vcm1hbDsgVEVYVC1J TkRFTlQ6IC0wLjU4aW47IGxhbmd1YWdlOiB6aC1DTjsgbXNvLWxpbmUtYnJlYWstb3ZlcnJpZGU6 IG5vbmU7IHB1bmN0dWF0aW9uLXdyYXA6IGhhbmdpbmciPjxmb250IA0KY29sb3I9Ymx1ZSBzaXpl PTI+PC9mb250PjwvcD4NCjxwIA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgdW5p Y29kZS1iaWRpOiBlbWJlZDsgV09SRC1CUkVBSzogbm9ybWFsOyBESVJFQ1RJT046IGx0cjsgVEVY VC1BTElHTjogbGVmdDsgTUFSR0lOOiAzLjM2cHQgMGluIDBwdCAwLjU4aW47IExJTkUtSEVJR0hU OiBub3JtYWw7IFRFWFQtSU5ERU5UOiAtMC41OGluOyBsYW5ndWFnZTogemgtQ047IG1zby1saW5l LWJyZWFrLW92ZXJyaWRlOiBub25lOyBwdW5jdHVhdGlvbi13cmFwOiBoYW5naW5nIj48c3BhbiAN CnN0eWxlPSJGT05ULVNJWkU6IDE0cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1WQVJJQU5U OiBub3JtYWw7IFZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IEZPTlQtV0VJR0hUOiBib2xkOyBDT0xPUjogYmxhY2s7IEZPTlQtU1RZTEU6IG5vcm1hbDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDEyLjBwdDsgbGFu Z3VhZ2U6IGVuLVVTOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250 LWZhbWlseTogQXJpYWw7IG1zby1jb2xvci1pbmRleDogMTsgdGV4dC1jb21iaW5lOiBsZXR0ZXJz OyBtc28tdGV4dC1yYWlzZTogMCU7IG1zby1zdHlsZS10ZXh0b3V0bGluZS10eXBlOiBub25lOyBt c28tc3R5bGUtdGV4dGZpbGwtdHlwZTogc29saWQ7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLXRo ZW1lY29sb3I6IHRleHQxOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1jb2xvcjogYmxhY2s7IG1z by1zdHlsZS10ZXh0ZmlsbC1maWxsLWFscGhhOiAxMDAuMCUiPjxmb250IA0KY29sb3I9Ymx1ZSBz aXplPTI+MS0gV2Ugd2lsbCBxdW90ZSB5b3VyIFJGUSB3aXRoaW4mbmJzcDsgMTIgDQpob3Vycy48 L2ZvbnQ+PC9zcGFuPjwvcD4NCjxwIA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsg dW5pY29kZS1iaWRpOiBlbWJlZDsgV09SRC1CUkVBSzogbm9ybWFsOyBESVJFQ1RJT046IGx0cjsg VEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAzLjM2cHQgMGluIDBwdCAwLjU4aW47IExJTkUtSEVJ R0hUOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAtMC41OGluOyBsYW5ndWFnZTogemgtQ047IG1zby1s aW5lLWJyZWFrLW92ZXJyaWRlOiBub25lOyBwdW5jdHVhdGlvbi13cmFwOiBoYW5naW5nIj48c3Bh biANCnN0eWxlPSJGT05ULVNJWkU6IDE0cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1WQVJJ QU5UOiBub3JtYWw7IFZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgVEVYVC1UUkFOU0ZPUk06IG5v bmU7IEZPTlQtV0VJR0hUOiBib2xkOyBDT0xPUjogYmxhY2s7IEZPTlQtU1RZTEU6IG5vcm1hbDsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDEyLjBwdDsg bGFuZ3VhZ2U6IGVuLVVTOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1m b250LWZhbWlseTogQXJpYWw7IG1zby1jb2xvci1pbmRleDogMTsgdGV4dC1jb21iaW5lOiBsZXR0 ZXJzOyBtc28tdGV4dC1yYWlzZTogMCU7IG1zby1zdHlsZS10ZXh0b3V0bGluZS10eXBlOiBub25l OyBtc28tc3R5bGUtdGV4dGZpbGwtdHlwZTogc29saWQ7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxs LXRoZW1lY29sb3I6IHRleHQxOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1jb2xvcjogYmxhY2s7 IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLWFscGhhOiAxMDAuMCUiPjxmb250IA0KY29sb3I9Ymx1 ZSBzaXplPTI+Mi0gV2UgaGF2ZSByaWNoIGV4cHJlaWVuY2UgZm9yIERNRSxIQVNDTyANCnN0YW5k YXJkLjwvZm9udD48L3NwYW4+PC9wPg0KPHAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046IGJhc2Vs aW5lOyB1bmljb2RlLWJpZGk6IGVtYmVkOyBXT1JELUJSRUFLOiBub3JtYWw7IERJUkVDVElPTjog bHRyOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDMuMzZwdCAwaW4gMHB0IDAuNThpbjsgTElO RS1IRUlHSFQ6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6IC0wLjU4aW47IGxhbmd1YWdlOiB6aC1DTjsg bXNvLWxpbmUtYnJlYWstb3ZlcnJpZGU6IG5vbmU7IHB1bmN0dWF0aW9uLXdyYXA6IGhhbmdpbmci PjxzcGFuIA0Kc3R5bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05U LVZBUklBTlQ6IG5vcm1hbDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBURVhULVRSQU5TRk9S TTogbm9uZTsgRk9OVC1XRUlHSFQ6IGJvbGQ7IENPTE9SOiBibGFjazsgRk9OVC1TVFlMRTogbm9y bWFsOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMTIu MHB0OyBsYW5ndWFnZTogZW4tVVM7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWNvbG9yLWluZGV4OiAxOyB0ZXh0LWNvbWJpbmU6 IGxldHRlcnM7IG1zby10ZXh0LXJhaXNlOiAwJTsgbXNvLXN0eWxlLXRleHRvdXRsaW5lLXR5cGU6 IG5vbmU7IG1zby1zdHlsZS10ZXh0ZmlsbC10eXBlOiBzb2xpZDsgbXNvLXN0eWxlLXRleHRmaWxs LWZpbGwtdGhlbWVjb2xvcjogdGV4dDE7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLWNvbG9yOiBi bGFjazsgbXNvLXN0eWxlLXRleHRmaWxsLWZpbGwtYWxwaGE6IDEwMC4wJSI+PGZvbnQgDQpjb2xv cj1ibHVlIHNpemU9Mj4zLSZuYnNwO091ciA4MCUgbW9sZHMgYXJlIGV4cG9ydGVkLjwvZm9udD48 L3NwYW4+PC9wPg0KPHAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyB1bmljb2Rl LWJpZGk6IGVtYmVkOyBXT1JELUJSRUFLOiBub3JtYWw7IERJUkVDVElPTjogbHRyOyBURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDMuMzZwdCAwaW4gMHB0IDAuNThpbjsgTElORS1IRUlHSFQ6IG5v cm1hbDsgVEVYVC1JTkRFTlQ6IC0wLjU4aW47IGxhbmd1YWdlOiB6aC1DTjsgbXNvLWxpbmUtYnJl YWstb3ZlcnJpZGU6IG5vbmU7IHB1bmN0dWF0aW9uLXdyYXA6IGhhbmdpbmciPjxzcGFuIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVZBUklBTlQ6IG5v cm1hbDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9O VC1XRUlHSFQ6IGJvbGQ7IENPTE9SOiBibGFjazsgRk9OVC1TVFlMRTogbm9ybWFsOyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTogy87M5TsgbXNvLWZvbnQta2VybmluZzogMTIuMHB0OyBsYW5ndWFn ZTogZW4tVVM7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQtZmFt aWx5OiBBcmlhbDsgbXNvLWNvbG9yLWluZGV4OiAxOyB0ZXh0LWNvbWJpbmU6IGxldHRlcnM7IG1z by10ZXh0LXJhaXNlOiAwJTsgbXNvLXN0eWxlLXRleHRvdXRsaW5lLXR5cGU6IG5vbmU7IG1zby1z dHlsZS10ZXh0ZmlsbC10eXBlOiBzb2xpZDsgbXNvLXN0eWxlLXRleHRmaWxsLWZpbGwtdGhlbWVj b2xvcjogdGV4dDE7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLWNvbG9yOiBibGFjazsgbXNvLXN0 eWxlLXRleHRmaWxsLWZpbGwtYWxwaGE6IDEwMC4wJSI+PGZvbnQgDQpjb2xvcj1ibHVlIHNpemU9 Mj40LSBXZSBwcm92aWRlIG9uZS1zdG9wIHNlcnZpY2U6IGRlc2lnbiwgbWFudWZhY3R1cmluZywg DQpzaWxrLXNjcmVuLCBwYWNrYWdlIGFuZCBkZWxpdmVyeS48L2ZvbnQ+PC9zcGFuPjwvcD4NCjxw IA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBiYXNlbGluZTsgdW5pY29kZS1iaWRpOiBlbWJlZDsg V09SRC1CUkVBSzogbm9ybWFsOyBESVJFQ1RJT046IGx0cjsgVEVYVC1BTElHTjogbGVmdDsgTUFS R0lOOiAzLjM2cHQgMGluIDBwdCAwLjU4aW47IExJTkUtSEVJR0hUOiBub3JtYWw7IFRFWFQtSU5E RU5UOiAtMC41OGluOyBsYW5ndWFnZTogemgtQ047IG1zby1saW5lLWJyZWFrLW92ZXJyaWRlOiBu b25lOyBwdW5jdHVhdGlvbi13cmFwOiBoYW5naW5nIj48c3BhbiANCnN0eWxlPSJGT05ULVNJWkU6 IDE0cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1WQVJJQU5UOiBub3JtYWw7IFZFUlRJQ0FM LUFMSUdOOiBiYXNlbGluZTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJR0hUOiBib2xk OyBDT0xPUjogYmxhY2s7IEZPTlQtU1RZTEU6IG5vcm1hbDsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDEyLjBwdDsgbGFuZ3VhZ2U6IGVuLVVTOyBtc28t YXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWw7IG1z by1jb2xvci1pbmRleDogMTsgdGV4dC1jb21iaW5lOiBsZXR0ZXJzOyBtc28tdGV4dC1yYWlzZTog MCU7IG1zby1zdHlsZS10ZXh0b3V0bGluZS10eXBlOiBub25lOyBtc28tc3R5bGUtdGV4dGZpbGwt dHlwZTogc29saWQ7IG1zby1zdHlsZS10ZXh0ZmlsbC1maWxsLXRoZW1lY29sb3I6IHRleHQxOyBt c28tc3R5bGUtdGV4dGZpbGwtZmlsbC1jb2xvcjogYmxhY2s7IG1zby1zdHlsZS10ZXh0ZmlsbC1m aWxsLWFscGhhOiAxMDAuMCUiPjxmb250IA0KY29sb3I9Ymx1ZSBzaXplPTI+NS0gR29vZCBjb21t dW5pY2F0aW9uIHdpdGggcmljaCBleHBlcmllbmNlIHNhbGVzIGFuZCBlbmdpbmVlciANCmluIEVu Z2xpc2guPC9mb250Pjwvc3Bhbj48L3A+DQo8cCANCnN0eWxlPSJWRVJUSUNBTC1BTElHTjogYmFz ZWxpbmU7IHVuaWNvZGUtYmlkaTogZW1iZWQ7IFdPUkQtQlJFQUs6IG5vcm1hbDsgRElSRUNUSU9O OiBsdHI7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMy4zNnB0IDBpbiAwcHQgMC41OGluOyBM SU5FLUhFSUdIVDogbm9ybWFsOyBURVhULUlOREVOVDogLTAuNThpbjsgbGFuZ3VhZ2U6IHpoLUNO OyBtc28tbGluZS1icmVhay1vdmVycmlkZTogbm9uZTsgcHVuY3R1YXRpb24td3JhcDogaGFuZ2lu ZyI+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB0OyBGT05ULUZBTUlMWTogQXJpYWw7IEZP TlQtVkFSSUFOVDogbm9ybWFsOyBWRVJUSUNBTC1BTElHTjogYmFzZWxpbmU7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6IGJsYWNrOyBGT05ULVNUWUxFOiBu b3JtYWw7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDLzszlOyBtc28tZm9udC1rZXJuaW5nOiAx Mi4wcHQ7IGxhbmd1YWdlOiBlbi1VUzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNv LWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tY29sb3ItaW5kZXg6IDE7IHRleHQtY29tYmlu ZTogbGV0dGVyczsgbXNvLXRleHQtcmFpc2U6IDAlOyBtc28tc3R5bGUtdGV4dG91dGxpbmUtdHlw ZTogbm9uZTsgbXNvLXN0eWxlLXRleHRmaWxsLXR5cGU6IHNvbGlkOyBtc28tc3R5bGUtdGV4dGZp bGwtZmlsbC10aGVtZWNvbG9yOiB0ZXh0MTsgbXNvLXN0eWxlLXRleHRmaWxsLWZpbGwtY29sb3I6 IGJsYWNrOyBtc28tc3R5bGUtdGV4dGZpbGwtZmlsbC1hbHBoYTogMTAwLjAlIj48Zm9udCANCmNv bG9yPWJsdWUgc2l6ZT0yPjYtIFF1YWxpdHksIGNvc3QgYW5kIGRlbGl2ZXJ5IGluIHRpbWUgYXJl IGFsbCANCmltcG9ydGFudC48L2ZvbnQ+PC9zcGFuPjwvcD48L2ZvbnQ+PC9zcGFuPjwvZm9udD48 Zm9udCBjb2xvcj1ibHVlPg0KPHAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9Ik1BUkdJTjogMGNt IDBjbSAwcHQiPjxicj48L2ZvbnQ+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48 L2ZvbnQ+PC9mb250PjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPjwv c3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksx MiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09M T1I6IGJsdWUiPjxicj48Zm9udCANCmNvbG9yPWJsdWU+Rm9yIG1vcmUgaW5mb3JtYXRpb24gcGxl YXNlIHZpZXcgPC9mb250PjxhIA0KaHJlZj0iaHR0cDovL3d3dy5wZi1tb2xkLmNvbSI+PGZvbnQg Y29sb3I9Ymx1ZT53d3cucGYtbW9sZC5jb208L2ZvbnQ+PC9hPjxmb250IA0KY29sb3I9Ymx1ZT4m bmJzcDsuIExvb2tpbmcgZm9yd2FyZCB0byB5b3VyIA0KUkZRLjwvZm9udD48YnI+PC9zcGFuPjwv Zm9udD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksx MiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09M T1I6IGJsdWUiPjxicj48Zm9udCANCmNvbG9yPWJsdWU+VGhhbmtzICYgQmVzdCByZWdhcmRzPC9m b250Pjwvc3Bhbj48L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz1Nc29Ob3JtYWwg c3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazog T0xFX0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQg DQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNl cmlmJzsgQ09MT1I6IGJsdWUiPjxmb250IA0KY29sb3I9Ymx1ZT48YnI+UGV0ZXI8L2ZvbnQ+PC9z cGFuPjwvZm9udD48L3NwYW4+PC9zcGFuPjxzcGFuIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xF X0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1JTFk6ICI+PGZvbnQgDQpz dHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzAwMDBmZiI+PHNwYW4gbGFuZz1FTi1VUyAN CnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlm JzsgQ09MT1I6IGJsdWUiPjwvcD48L3NwYW4+PC9mb250Pjwvc3Bhbj48L3NwYW4+DQo8cCBjbGFz cz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxzcGFuIA0Kc3R5bGU9Im1z by1ib29rbWFyazogT0xFX0xJTksxMiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iRk9OVC1GQU1J TFk6ICI+PGZvbnQgDQpmYWNlPUFyaWFsPjxmb250IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiIGNv bG9yPSMwMDAwZmY+PGZvbnQgY29sb3I9IzAwMDBmZj48c3BhbiANCnN0eWxlPSJGT05ULVNJWkU6 IDEwcHg7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4 OyBDT0xPUjogIzAwMDBmZiI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBDT0xPUjog IzAwMDBmZiI+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogOyBD T0xPUjogIzAwMDBmZiI+PGZvbnQgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBDT0xPUjogIzAw MDBmZiI+PGZvbnQgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogIzMzOTk2NiI+ PHN0cm9uZz48Zm9udCBjb2xvcj1ibHVlPlBGIEluZHVzdHJ5IA0KQ28uLCBMaW1pdGVkLjwvZm9u dD48L3N0cm9uZz48c3Ryb25nPjxmb250IGNvbG9yPWJsdWU+IA0KPC9mb250Pjwvc3Ryb25nPjwv Zm9udD48L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2ZvbnQ+PC9m b250Pjwvc3Bhbj48L3NwYW4+PC9wPg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46 IDBjbSAwY20gMHB0Ij48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxz cGFuIGxhbmc9RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250IA0KZmFjZT1BcmlhbD48 Zm9udCBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0IiBjb2xvcj0jMDAwMGZmPjxmb250IGNvbG9yPSMw MDAwZmY+PHNwYW4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB4OyBGT05ULUZBTUlMWTogQXJpYWwi Pjxmb250IA0Kc3R5bGU9IkZPTlQtU0laRTogMTJweDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IA0K c3R5bGU9IkZPTlQtU0laRTogMTJweDsgQ09MT1I6ICMwMDAwZmYiPjxzcGFuIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJweDsgRk9OVC1GQU1JTFk6IDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJweDsgQ09MT1I6ICMwMDAwZmYiPjxmb250IA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMzMzk5NjYiPjxzdHJvbmc+PGZvbnQgDQpjb2xvcj1ibHVl PlRlbDorODYtNzU1LTI4MzI2NjU2IA0KRmF4Ois4Ni03NTUtMjgzMjY2NTU8L2ZvbnQ+PC9zdHJv bmc+PC9mb250Pjwvc3Bhbj48L2ZvbnQ+PC9mb250PjwvZm9udD48L3A+DQo8ZGl2IHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiCh5EFyaWFsoeQ7IENPTE9SOiAjMDAwMGZmIj4N CjxkaXY+PGZvbnQgc2l6ZT0yPjxzcGFuIHN0eWxlPSJGT05ULUZBTUlMWTogIj48Zm9udCBjb2xv cj1ibHVlPldlYjogPC9mb250PjxhIA0KaHJlZj0iaHR0cDovL3d3dy5wZi1tb2xkLmNvbSI+PGZv bnQgY29sb3I9Ymx1ZT53d3cucGYtbW9sZC5jb208L2ZvbnQ+PC9hPjxmb250IA0KY29sb3I9Ymx1 ZT4mbmJzcDs8L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2Rpdj4NCjxkaXY+PGZvbnQgc2l6ZT0yPjxz cGFuIHN0eWxlPSJGT05ULUZBTUlMWTogIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEycHg7 IENPTE9SOiAjMDAwMGZmIj48Zm9udCANCnN0eWxlPSJGT05ULVNJWkU6IDEycHg7IENPTE9SOiAj MDAwMGZmIj48Zm9udCANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAjMzM5OTY2 Ij48Zm9udCANCmNvbG9yPWJsdWU+RW1haWw6bWFuYWdlckBwZm1vbGQuY29tJm5ic3A7IDwvZm9u dD48YSANCmhyZWY9Im1haWx0bzpwZm1vbGRAaG90bWFpbC5jb20iPjxmb250IA0KY29sb3I9Ymx1 ZT5wZm1vbGRAaG90bWFpbC5jb208L2ZvbnQ+PC9hPjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bh bj48L2ZvbnQ+PC9kaXY+DQo8ZGl2Pjxmb250IHNpemU9Mj48c3BhbiBzdHlsZT0iRk9OVC1GQU1J TFk6ICI+PC9zcGFuPjwvZm9udD48c3BhbiANCmNsYXNzPWVjeE1zb0h5cGVybGluayANCnN0eWxl PSJGT05ULVNJWkU6IDEycHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6ICMzMzk5NjYiPjxm b250IA0KY29sb3I9Ymx1ZT5Ta3lwZTpwZm1vbGQgKDI0IGhvdXJzIG9ubGluZSk8YnIgDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICI+PC9mb250Pjwvc3Bhbj48c3BhbiBjbGFzcz1lY3hNc29IeXBlcmxp bmsgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB4OyBGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiAj MzM5OTY2Ij48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LNiI+PHNwYW4gc3R5 bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxMyI+PHNwYW4gDQpzdHlsZT0ibXNvLWJvb2ttYXJr OiBPTEVfTElOSzQ2Ij48c3BhbiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Rk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZTsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IMvOzOU7IG1zby1mb250LWtlcm5pbmc6IDBwdCI+PC9kaXY+DQo8ZGl2 Pg0KPHA+PGZvbnQgY29sb3I9Ymx1ZT5pZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIG91ciBl bWFpbCBhZ2FpbqO6PC9mb250PjxhIA0KaHJlZj0iaHR0cDovL3d3dy5wZi1tZmcuY29tL3JldHVy bi9yZXR1cm4uYXNwP21haWxfaWQ9cGZtb2xkJmVtYWlsPXhmc0Bvc3Muc2dpLmNvbSIgDQp0YXJn ZXQ9X2JsYW5rPjxmb250IGNvbG9yPWJsdWU+VW5zdWJzY3JpYmU8L2ZvbnQ+PC9hPjwvcD4NCjxw Pjxmb250IGNvbG9yPWJsdWU+PGltZyBib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIgDQpzcmM9Imh0 dHA6Ly93d3cucGYtbWZnLmNvbS9yZXR1cm4vc3RhdC5hc3A/bWFpbF9pZD1wZm1vbGQmZW1haWw9 eGZzQG9zcy5zZ2kuY29tIiANCmFsaWduPWJhc2VsaW5lPjxicj4yMDE0LzQvMTE8L2ZvbnQ+PC9w Pg0KPHA+PGZvbnQgY29sb3I9Ymx1ZT48c3BhbiBzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElO SzEyIj48c3BhbiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250IGNvbG9y PXJlZD48c3BhbiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMTIiPjxzcGFuIGxhbmc9 RU4tVVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAiPjxmb250IA0KY29sb3I9cmVkPjwvZm9udD48L3Nw YW4+PC9zcGFuPjwvZm9udD48L3NwYW4+PC9zcGFuPjwvZm9udD4mbmJzcDs8L3A+PC9zcGFuPjwv c3Bhbj48L3NwYW4+PC9zcGFuPjwvZGl2Pjwvc3Bhbj48L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2Zv bnQ+PC9zcGFuPjwvZm9udD48L2ZvbnQ+PC9mb250Pjwvc3Bhbj48L3NwYW4+PCEtLWVuZGZyYWdt ZW50LS0+PCEtLWVuZGZyYWdtZW50LS0+PC9kaXY+PC9ib2R5PjwvaHRtbD4NCg== ------=_NextPart_001_073C_01584E44.15203620-- ------=_NextPart_000_0F2A_01584E44.15203620 Content-Type: text/plain; name="pfmold.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pfmold.txt" ------=_NextPart_000_0F2A_01584E44.15203620-- From dx-wl@163.com Thu Apr 10 21:40:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41E9F7F37 for ; Thu, 10 Apr 2014 21:40:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E94D304053 for ; Thu, 10 Apr 2014 19:40:48 -0700 (PDT) X-ASG-Debug-ID: 1397184045-04cb6c77b5c22f0001-NocioJ Received: from sam.nabble.com (sam.nabble.com [216.139.236.26]) by cuda.sgi.com with ESMTP id 3RH9Iry4bN7vUY0u (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 10 Apr 2014 19:40:45 -0700 (PDT) X-Barracuda-Envelope-From: dx-wl@163.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 1WYROW-00043q-On for xfs@oss.sgi.com; Thu, 10 Apr 2014 19:40:44 -0700 Date: Thu, 10 Apr 2014 19:40:44 -0700 (PDT) From: daiguochao To: xfs@oss.sgi.com Message-ID: <1397184044761-35016.post@n7.nabble.com> In-Reply-To: <1396596386220-35015.post@n7.nabble.com> References: <1396596386220-35015.post@n7.nabble.com> Subject: Re: 10GB memorys occupied by XFS MIME-Version: 1.0 X-ASG-Orig-Subj: Re: 10GB memorys occupied by XFS 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: 1397184045 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dear Stan, I can't send email to you.So I leave a message here.I hope not to bother you. Thank you for your kind assistance. In accordance with your suggestion, we executed "echo 3 > /proc/sysm/drop_caches" for trying to release vfs dentries and inodes. Really, our lost memory came back. But we learned that the memory of vfs dentries and inodes is distributed from slab. Please check our system "Slab: 509708 kB" from /proc/meminfo, and it seems only be took up 500MB and xfs_buf take up 450MB among. And /proc/meminfo indicated that our system memory is anomalous, there is about 10GB out of the statistics. We want to know how the system could observe the usage amount of vfs dentries and iodes through the system interface. If the memory usage of system is not reflected in /proc/meminfo as we can not find the statistics, and we thought it as a bug of xfs. My vm.vfs_cache_pressure of linux system is 100. We think that the system will proactively take the memory back when the memory is not enough, rather than oom-killer kills our work process. Our datas of /proc/meminfo occurred during the system problem as below: 130> cat /proc/meminfo MemTotal: 12173268 kB MemFree: 223044 kB Buffers: 244 kB Cached: 4540 kB SwapCached: 0 kB Active: 1700 kB Inactive: 5312 kB Active(anon): 1616 kB Inactive(anon): 1128 kB Active(file): 84 kB Inactive(file): 4184 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 2556 kB Mapped: 1088 kB Shmem: 196 kB Slab: 509708 kB SReclaimable: 7596 kB SUnreclaim: 502112 kB KernelStack: 1096 kB PageTables: 748 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 6086632 kB Committed_AS: 9440 kB VmallocTotal: 34359738367 kB VmallocUsed: 303488 kB VmallocChunk: 34359426132 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 6152 kB DirectMap2M: 2070528 kB DirectMap1G: 10485760 kB Best Regards, Guochao -- View this message in context: http://xfs.9218.n7.nabble.com/10GB-memorys-occupied-by-XFS-tp35015p35016.html Sent from the Xfs - General mailing list archive at Nabble.com. From eguan@redhat.com Thu Apr 10 22:23:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A317B7F6B for ; Thu, 10 Apr 2014 22:23:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3411AAC002 for ; Thu, 10 Apr 2014 20:23:24 -0700 (PDT) X-ASG-Debug-ID: 1397186602-04cb6c77b6c3d90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UbCBdNxZb9Hy97rR for ; Thu, 10 Apr 2014 20:23:23 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3B3NKct030053 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 10 Apr 2014 23:23:21 -0400 Received: from localhost (dhcp12-144.nay.redhat.com [10.66.12.144] (may be forged)) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3B3NIg9014092; Thu, 10 Apr 2014 23:23:20 -0400 Date: Fri, 11 Apr 2014 11:23:18 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] ext4/306: disable 64bit feature too Message-ID: <20140411032318.GL24329@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] ext4/306: disable 64bit feature too References: <1397044147-15727-1-git-send-email-eguan@redhat.com> <20140411001235.GB15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140411001235.GB15995@dastard> 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: 1397186603 X-Barracuda-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, Apr 11, 2014 at 10:12:35AM +1000, Dave Chinner wrote: > On Wed, Apr 09, 2014 at 07:49:07PM +0800, Eryu Guan wrote: > > mke2fs ext4 without extent feature will fail if 64bit feature is > > enabled in mke2fs.conf > > > > mke2fs 1.42.9 (28-Dec-2013) > > Extents MUST be enabled for a 64-bit filesystem. Pass -O extents to rectify. > > > > So disable 64bit feature together with extent explicitly. > > > > Signed-off-by: Eryu Guan > > --- > > tests/ext4/306 | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/tests/ext4/306 b/tests/ext4/306 > > index 9559cf2..fd50b0e 100755 > > --- a/tests/ext4/306 > > +++ b/tests/ext4/306 > > @@ -48,7 +48,7 @@ _require_scratch > > rm -f $seqres.full > > > > # Make a small ext4 fs with extents disabled & mount it > > -yes | mkfs.ext4 -O ^extents $SCRATCH_DEV 512m >> $seqres.full 2>&1 > > +yes | mkfs.ext4 -O ^extents,^64bit $SCRATCH_DEV 512m >> $seqres.full 2>&1 > > _scratch_mount || _fail "couldn't mount fs" > > > > # Create a small non-extent-based file > > -- > > 1.9.0 > > Looks fine to me, but you should CC ext4 test changes to > linux-ext4@vger.kernel.org as well so that the ext4 developers can > review such changes are well... Ok, will do in future. > > Reviewed-by: Dave Chinner Thanks for the review. Eryu > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Thu Apr 10 23:27:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F6A47F6D for ; Thu, 10 Apr 2014 23:27:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 269E38F8037 for ; Thu, 10 Apr 2014 21:27:05 -0700 (PDT) X-ASG-Debug-ID: 1397190420-04bdf07dcacae70001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id YyyBR1Jg2m9EkiRG for ; Thu, 10 Apr 2014 21:27:00 -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: Ai11AKxuR1N5LEcvPGdsb2JhbABZgwY7gxOFC7cXhV2BHhcDAQEBATg1giUBAQEEOhwjEAgDGAklDwUlAwcaE4d7zRQWjXQRAVAHhDgEmF2WBSuBNQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2014 13:56:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYT2o-0007se-15; Fri, 11 Apr 2014 14:26:26 +1000 Date: Fri, 11 Apr 2014 14:26:25 +1000 From: Dave Chinner To: daiguochao Cc: xfs@oss.sgi.com Subject: Re: 10GB memorys occupied by XFS Message-ID: <20140411042625.GG15995@dastard> X-ASG-Orig-Subj: Re: 10GB memorys occupied by XFS References: <1396596386220-35015.post@n7.nabble.com> <1397184044761-35016.post@n7.nabble.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397184044761-35016.post@n7.nabble.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: 1397190420 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4777 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 07:40:44PM -0700, daiguochao wrote: > Dear Stan, I can't send email to you.So I leave a message here.I hope not to > bother you. > Thank you for your kind assistance. > > In accordance with your suggestion, we executed "echo 3 > > /proc/sysm/drop_caches" for trying to release vfs dentries and inodes. > Really, > our lost memory came back. But we learned that the memory of vfs dentries > and inodes is distributed from slab. Please check our system "Slab: 509708 > kB" from /proc/meminfo, and it seems only be took up 500MB and xfs_buf take > up 450MB among. That's where your memory is - in metadata buffers. The xfs_buf slab entries are just the handles - the metadata pages in the buffers usually take much more space and it's not accounted to the slab cache nor the page cache. Can you post the output of /proc/slabinfo, and what is the output of xfs_info on the filesystem in question? Also, a description of your workload that is resulting in large amounts of cached metadata buffers but no inodes or dentries would be helpful. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Thu Apr 10 23:46:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2EEC67F72 for ; Thu, 10 Apr 2014 23:46:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 157DD304053 for ; Thu, 10 Apr 2014 21:46:29 -0700 (PDT) X-ASG-Debug-ID: 1397191587-04cbb00dc4cd880001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id SoPSgd4nRm74hx95 for ; Thu, 10 Apr 2014 21:46:28 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AptvAGlyR1N5LEcvPGdsb2JhbABZgwaIWbx0gR4XAwEBAQE4NYIlAS0vOxhqAwcth3ubDbINjghZKIQiBKxfggMrgSw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2014 14:16:16 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WYTLz-0007ub-D5 for xfs@oss.sgi.com; Fri, 11 Apr 2014 14:46:15 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WYTLz-0000ZD-Bz for xfs@oss.sgi.com; Fri, 11 Apr 2014 14:46:15 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: wrong error sign conversion during failed DIO writes Date: Fri, 11 Apr 2014 14:46:15 +1000 X-ASG-Orig-Subj: [PATCH] xfs: wrong error sign conversion during failed DIO writes Message-Id: <1397191575-2144-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397191587 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4777 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We negate the error value being returned from a generic function incorrectly. The code path that it is running in returned negative errors, so there is no need to negate it to get the correct error signs here. This was uncovered by generic/019. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 003c005..067c3aa 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -679,7 +679,7 @@ xfs_file_dio_aio_write( goto out; if (mapping->nrpages) { - ret = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, + ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, pos, -1); if (ret) goto out; -- 1.9.0 From david@fromorbit.com Thu Apr 10 23:49:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E144A7F75 for ; Thu, 10 Apr 2014 23:49:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67A0CAC00B for ; Thu, 10 Apr 2014 21:49:21 -0700 (PDT) X-ASG-Debug-ID: 1397191758-04cbb00dc5cdb00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id QOCk0TBdlU4d8xyG for ; Thu, 10 Apr 2014 21:49:19 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiJ1AJZzR1N5LEcvPGdsb2JhbABZgwaDToULtxeFXYEeFwMBAQEBODWCJQEBAQQ6HCMQCAMUBAklDwUlAwcaE4d7zQIXFo5WB4Q4BJhdimSLISs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Apr 2014 14:18:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYTOO-0007un-9t; Fri, 11 Apr 2014 14:48:44 +1000 Date: Fri, 11 Apr 2014 14:48:44 +1000 From: Dave Chinner To: Eric Sandeen Cc: Mark Tinguely , xfs-oss Subject: Re: [PATCH] xfs_io: fix random pread/pwrite to honor offset Message-ID: <20140411044844.GH15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_io: fix random pread/pwrite to honor offset References: <53459C4E.9030902@sandeen.net> <5345B209.5040906@sgi.com> <5345B3AD.5020805@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5345B3AD.5020805@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1397191758 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4778 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 09, 2014 at 03:55:09PM -0500, Eric Sandeen wrote: > On 4/9/14, 3:48 PM, Mark Tinguely wrote: > > On 04/09/14 14:15, Eric Sandeen wrote: > >> xfs_io's pread & pwrite claim to support a random IO mode > >> where it will do random IOs between offset & offset+len. > >> > >> However, offset was ignored, and we did the IOs between 0 > >> and len instead. > >> > >> Clang caught this by pointing out that the calculated/normalized > >> "offset" variable was never read. > >> > >> (NB: If the range is larger than RAND_MAX, these functions don't > >> work, but that's always been true, so I'll leave it for another > >> day...) > >> > >> Signed-off-by: Eric Sandeen > >> --- .... > > > > Looks like this was introduced in: > > commit 8fb2237e65555ff540e8b6108ffccfffefe239ac > > Author: Nathan Scott > > Date: Fri Nov 11 14:25:18 2005 +0000 > > > > Provide further debugging options and tweaks for analysing the read/write paths. > > Merge of master-melb:xfs-cmds:24372a by kenmcd. > > > > --- > > > > If it was broken for 8.5 years, I think it could be removed. > > Eh, could, or we could fix it. :) I suppose this means it needs a test... :/ And document it ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Fri Apr 11 00:09:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CF6037F76 for ; Fri, 11 Apr 2014 00:09:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FA89AC00B for ; Thu, 10 Apr 2014 22:09:53 -0700 (PDT) X-ASG-Debug-ID: 1397192988-04cb6c77b6c7e20001-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 ZVaJcqAAflRGwWI2 for ; Thu, 10 Apr 2014 22:09:48 -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 369856C1B8; Fri, 11 Apr 2014 00:09:48 -0500 (CDT) Message-ID: <5347791A.6040609@hardwarefreak.com> Date: Fri, 11 Apr 2014 00:09:46 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: =?UTF-8?B?5oi05Zu96LaF?= CC: xfs@oss.sgi.com Subject: Re: 10GB memorys occupied by XFS References: <1396596386220-35015.post@n7.nabble.com> <533F14EC.6040705@hardwarefreak.com> <76016fc7.13c84.14546bad411.Coremail.dx-wl@163.com> X-ASG-Orig-Subj: Re: 10GB memorys occupied by XFS In-Reply-To: <76016fc7.13c84.14546bad411.Coremail.dx-wl@163.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1397192988 X-Barracuda-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/9/2014 8:43 AM, 戴国超 wrote: > Dear Stan, > Thank you for your kind assistance. > > In accordance with your suggestion, we executed "echo 3 > /proc/sysm/drop_caches" for trying to release vfs dentries and inodes. Really, > our lost memory came back. But we learned that the memory of vfs dentries and inodes is distributed from slab. Please check our system "Slab: 509708 kB" from /proc/meminfo, and it seems only be took up 500MB and xfs_buf take up 450MB among. To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free reclaimable slab objects (includes dentries and inodes): echo 2 > /proc/sys/vm/drop_caches To free slab objects and pagecache: echo 3 > /proc/sys/vm/drop_caches > And /proc/meminfo indicated that our system memory is anomalous, there is about 10GB out of the statistics. We want to know how the system could observe the usage amount of vfs dentries and iodes through the system interface. If the memory usage of system is not reflected in /proc/meminfo as we can not find the statistics, and we thought it as a bug of xfs. It seems much of this 10 GB of memory is being consumed by pagecache, not dentries and inodes. So the question is: Why is pagecache not being reclaimed without manual intervention? > My vm.vfs_cache_pressure of linux system is 100. We think that the system will proactively take the memory back when the memory is not enough, rather than oom-killer kills our work process. Our datas of /proc/meminfo occurred during the system problem as below: Except most of your slab is reported as not reclaimable, see below. > 130> cat /proc/meminfo > MemTotal: 12173268 kB > MemFree: 223044 kB > Buffers: 244 kB > Cached: 4540 kB <------ 4.5 MB is reported use by the pagecache. But some 10 GB is being consumed by the page cache and not reported here. > SwapCached: 0 kB > Active: 1700 kB > Inactive: 5312 kB > Active(anon): 1616 kB > Inactive(anon): 1128 kB > Active(file): 84 kB > Inactive(file): 4184 kB > Unevictable: 0 kB > Mlocked: 0 kB > SwapTotal: 0 kB > SwapFree: 0 kB > Dirty: 0 kB > Writeback: 0 kB > AnonPages: 2556 kB > Mapped: 1088 kB > Shmem: 196 kB > Slab: 509708 kB <------ > SReclaimable: 7596 kB <------ > SUnreclaim: 502112 kB <------ This indicates that your slab is not being reclaimed, but not why. > KernelStack: 1096 kB > PageTables: 748 kB > NFS_Unstable: 0 kB > Bounce: 0 kB > WritebackTmp: 0 kB > CommitLimit: 6086632 kB > Committed_AS: 9440 kB > VmallocTotal: 34359738367 kB > VmallocUsed: 303488 kB > VmallocChunk: 34359426132 kB > HardwareCorrupted: 0 kB > AnonHugePages: 0 kB > HugePages_Total: 0 > HugePages_Free: 0 > HugePages_Rsvd: 0 > HugePages_Surp: 0 > Hugepagesize: 2048 kB > DirectMap4k: 6152 kB > DirectMap2M: 2070528 kB > DirectMap1G: 10485760 kB > > I look forward to hearing from you and thank you very much for your kind assistance. Unfortunately I don't have solid answers for you at this point, nor a solution. This is beyond my expertise. Maybe someone else with more knowledge/experience will jump in. I suspect your application may be doing something a bit unusual. Cheers, Stan > Best Regards, > > Guochao > > > At 2014-04-05 04:24:12,"Stan Hoeppner" wrote: >> On 4/4/2014 2:26 AM, daiguochao wrote: >>> Hello folks, >> >> Hello, >> >> Note that your problems are not XFS specific, but can occur with any >> Linux filesystem. >> >>> I used xfs file system in kernel-2.6.32-220.13.1.el6.x86_64 for store >>> pictures. About 100 days system memorys is lost and some nginx process is >>> killed by oom-killer.So,I looked /proc/meminfo and find memorys is >>> lost.Finally, I try to umount xfs system and 10GB memorys is coming back. l >>> look xfs bugzilla no such BUG.I have no idea for it. >>> >>> Cheers, >>> >>> Guochao. >>> >>> some memorys info: >>> >>> 0> free -m >>> total used free shared buffers cached >>> Mem: 11887 11668 219 0 0 2 >>> -/+ buffers/cache: 11665 222 >>> Swap: 0 0 0 >> >> >> First problem: no swap >> Second problem: cache is not being reclaimed >> >> Read vfs_cache_pressure at: >> https://www.kernel.org/doc/Documentation/sysctl/vm.txt >> >> You've likely set this value to zero. Changing it to 200 should prompt >> the kernel to reclaim dentries and inodes aggressively, preventing the >> oom-killer from kicking in. >> >> Cheers, >> >> Stan From BATV+d70b2720cc0687438191+3883+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 11 02:34:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E9C67F7C for ; Fri, 11 Apr 2014 02:34:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF716304053 for ; Fri, 11 Apr 2014 00:34:50 -0700 (PDT) X-ASG-Debug-ID: 1397201688-04cb6c77b5ce360001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id a0gqRt9z2rJx3ESp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 11 Apr 2014 00:34:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d70b2720cc0687438191+3883+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYVz5-0001hG-Q4; Fri, 11 Apr 2014 07:34:47 +0000 Date: Fri, 11 Apr 2014 00:34:47 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-ID: <20140411073447.GA6397@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-5-git-send-email-david@fromorbit.com> <20140410104001.GG17641@infradead.org> <20140410122259.GC27519@dastard> <20140410123332.GA15577@infradead.org> <20140410223546.GE27519@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410223546.GE27519@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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397201688 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 11, 2014 at 08:35:46AM +1000, Dave Chinner wrote: > Fixed it. Reviewed-by: Christoph Hellwig with that little tweak. And yes, we'll need that series ASAP - I not hit the asserts everytime I do an xfstests run. From BATV+d70b2720cc0687438191+3883+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 11 02:39:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 72F567F7E for ; Fri, 11 Apr 2014 02:39:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16C74AC002 for ; Fri, 11 Apr 2014 00:39:40 -0700 (PDT) X-ASG-Debug-ID: 1397201979-04bdf07dccd3330001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id jLDzL36QMGwzkNpN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 11 Apr 2014 00:39:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d70b2720cc0687438191+3883+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYW3n-0002yO-7G; Fri, 11 Apr 2014 07:39:39 +0000 Date: Fri, 11 Apr 2014 00:39:39 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: wrong error sign conversion during failed DIO writes Message-ID: <20140411073939.GA11314@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: wrong error sign conversion during failed DIO writes References: <1397191575-2144-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397191575-2144-1-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397201979 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 11, 2014 at 02:46:15PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We negate the error value being returned from a generic function > incorrectly. The code path that it is running in returned negative > errors, so there is no need to negate it to get the correct error > signs here. > > This was uncovered by generic/019. Looks good, Reviewed-by: Christoph Hellwig From N.Concha@lse.ac.uk Fri Apr 11 07:13:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=HTML_IMAGE_ONLY_04, HTML_MESSAGE,MPART_ALT_DIFF,T_REMOTE_IMAGE,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DDDD67F37 for ; Fri, 11 Apr 2014 07:13:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ACF398F8037 for ; Fri, 11 Apr 2014 05:13:00 -0700 (PDT) X-ASG-Debug-ID: 1397218378-04cbb00dc3f1010001-NocioJ Received: from mail1.bemta4.messagelabs.com (mail1.bemta4.messagelabs.com [85.158.143.242]) by cuda.sgi.com with ESMTP id 1jd353676L6HukS4 for ; Fri, 11 Apr 2014 05:12:59 -0700 (PDT) X-Barracuda-Envelope-From: N.Concha@lse.ac.uk X-Barracuda-Apparent-Source-IP: 85.158.143.242 Received: from [85.158.143.99:28175] by server-1.bemta-4.messagelabs.com id 79/E9-09853-54CD7435; Fri, 11 Apr 2014 12:12:53 +0000 X-Env-Sender: N.Concha@lse.ac.uk X-Msg-Ref: server-2.tower-216.messagelabs.com!1397218372!23972410!1 X-Originating-IP: [158.143.216.142] X-StarScan-Received: X-StarScan-Version: 6.11.1; banners=lse.ac.uk,-,- X-VirusChecked: Checked Received: (qmail 20616 invoked from network); 11 Apr 2014 12:12:52 -0000 Received: from lm.lse.ac.uk (HELO EXCHIC2.lse.ac.uk) (158.143.216.142) by server-2.tower-216.messagelabs.com with SMTP; 11 Apr 2014 12:12:52 -0000 Received: from exchic3.lse.ac.uk ([158.143.216.143]) by EXCHIC2.lse.ac.uk with Microsoft SMTPSVC(6.0.3790.4675); Fri, 11 Apr 2014 13:12:51 +0100 Received: from exchic3.lse.ac.uk ([158.143.216.143]) by exchic3.lse.ac.uk with Microsoft SMTPSVC(6.0.3790.4675); Fri, 11 Apr 2014 13:11:56 +0100 Received: from [76.73.71.184] ([76.73.71.184]) by exchic3.lse.ac.uk over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Fri, 11 Apr 2014 13:06:15 +0100 Content-Type: multipart/alternative; boundary="===============1030061863==" MIME-Version: 1.0 Subject: REAL To: Recipients X-ASG-Orig-Subj: REAL From: "ED & SOP" Date: Fri, 11 Apr 2014 05:05:34 -0700 Reply-To: hansenpalomare@yeah.net Message-ID: X-OriginalArrivalTime: 11 Apr 2014 12:06:15.0441 (UTC) FILETIME=[703E6010:01CF557E] X-Barracuda-Connect: mail1.bemta4.messagelabs.com[85.158.143.242] X-Barracuda-Start-Time: 1397218379 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.09 X-Barracuda-Spam-Status: No, SCORE=1.09 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA148a, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_IMAGE_ONLY_04, HTML_MESSAGE, MPART_ALT_DIFF, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.10 BSF_SC0_SA148a URI: Custom Rule SA148a 0.34 HTML_IMAGE_ONLY_04 BODY: HTML: images with 0-400 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 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. --===============1030061863== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Please access the attached hyperlink for an important electronic communica= tions disclaimer: http://lse.ac.uk/emailDisclaimer --===============1030061863== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body =
Please access the attached hyperlink for an important electronic communica= tions disclaimer: http://lse.ac.uk/emailDisclaimer
--===============1030061863==-- From thermomural@gmail.com Fri Apr 11 07:20:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 504CE7F55 for ; Fri, 11 Apr 2014 07:20:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE631AC002 for ; Fri, 11 Apr 2014 05:20:22 -0700 (PDT) X-ASG-Debug-ID: 1397218817-04cbb00dc3f1e70001-NocioJ Received: from [139.170.2.34] ([139.170.2.34]) by cuda.sgi.com with SMTP id k4T4VPeezWiUgoWx for ; Fri, 11 Apr 2014 05:20:19 -0700 (PDT) X-Barracuda-Envelope-From: thermomural@gmail.com X-Barracuda-Apparent-Source-IP: 139.170.2.34 Reply-To: thermomural@gmail.com From: thermomural@gmail.com To: xfs@oss.sgi.com Subject: promo climatiseur mural Sender: thermomural@gmail.com X-ASG-Orig-Subj: promo climatiseur mural Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Date: Fri, 11 Apr 2014 20:15:10 +0800 X-Barracuda-Connect: UNKNOWN[139.170.2.34] X-Barracuda-Start-Time: 1397218817 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, MISSING_MID, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4788 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140411122022.83FC4106C71C@cuda.sgi.com> Vente surplus d'inventaire 2013 sur thermopompes murales de marque Napoleon Climatisation-Déhumidification-Chauffage jusqu'à - 15 Celcius (Avec arrêt automatique)-Dc Inverter Compresseur Toshiba-Garantie 6 ans complète Un appareil haut de gamme à prix imbattable. Appareil certifié Energy star. Éligible à une subvention de 650,00 dollars. 12 000 BTU à partir de 2195,00 dollars installation incluse. Profitez rapidement de nos spéciaux, vous pourrez ainsi commencer à économiser sur vos coûts de chauffage dès maintenant. Aussi disponiple climatiseurs muraux . Compresseur Toshiba Garantie 5 ans sur compresseur Fiabilité à tout épreuve. 9000 à 24000 Btu à partir de 1295.00 dollars avec installation. Contactez- nous Service rapide et professionnel. Frigor et Groupe Senick 8355 1929-45 Numero RBQ Reservez maintenant. Telepnone 514 792 6461 From bfoster@redhat.com Fri Apr 11 08:10:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED98B7F53 for ; Fri, 11 Apr 2014 08:10:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C395C304053 for ; Fri, 11 Apr 2014 06:10:54 -0700 (PDT) X-ASG-Debug-ID: 1397221850-04cbb00dc5f83d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UsCkIyLqxvMUxrEC for ; Fri, 11 Apr 2014 06:10:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3BDAm2r026536 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 09:10:48 -0400 Received: from laptop.bfoster (vpn-60-48.rdu2.redhat.com [10.10.60.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BDAlIo015491; Fri, 11 Apr 2014 09:10:48 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 535D4120AC3; Fri, 11 Apr 2014 09:10:47 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3BDAkrb012623; Fri, 11 Apr 2014 09:10:46 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 11 Apr 2014 09:10:45 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: delalloc, dio and corruption... Message-ID: <20140411131044.GA11718@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: delalloc, dio and corruption... References: <1397106053-7489-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397106053-7489-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397221850 X-Barracuda-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, Apr 10, 2014 at 03:00:47PM +1000, Dave Chinner wrote: > Hi folks, > > This is version 2 of the DIO vs delalloc patchset I posted here: > > http://oss.sgi.com/archives/xfs/2014-03/msg00313.html > > The changes to this version are: > > - the bug fix to patch 2 that Brain noticed, > - I dropped the delalloc extent splittting patch because > with the fix to patch 2 I can't trigger that bug anymore, > and that patch was causing transaction overruns in > xfs/297. Hence without an existing reproducer, I won't try > to fix that problem. > - the last patch is new, and is a bug in the collapse range > code where it fails to shift the last N extents correctly > if there are N delalloc extents before the shifted range. > > With these 6 patches, all of the xfstests fsx/fsstress tests pass > on 1k, 2k and 4k block size filesystems, with and without CRCs > enabled, on 1, 2 and 16p test VMs. > > I'm much happier with these patches now - I don't think that there > are more problems lurking, but only time will tell. I'd like to get > these fixes to Linus for 3.15 (probably for -rc2), so eyeballs and > testing would be appreciated. > The series looks pretty good to me now with the latest fix. I was previously tripping all over the delalloc asserts. With this set (and also running with finobt enabled), my tests ran clean on a 4k fs. I've seen generic/270 still hit an assert once or twice on a 1k block fs (as noted on irc), but that's proven rather difficult to reproduce. I'll continue beating on it a bit, but otherwise: Tested-by: Brian Foster Brian > Cheers, > > Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From miklos@szeredi.hu Fri Apr 11 10:52:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8973D7F3F for ; Fri, 11 Apr 2014 10:52:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A7B3304067 for ; Fri, 11 Apr 2014 08:52:08 -0700 (PDT) X-ASG-Debug-ID: 1397231525-04bdf07dc8105110001-NocioJ Received: from mail-ee0-f51.google.com (mail-ee0-f51.google.com [74.125.83.51]) by cuda.sgi.com with ESMTP id iUNyKgDRauB5FdNu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 08:52:06 -0700 (PDT) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 74.125.83.51 Received: by mail-ee0-f51.google.com with SMTP id c13so4266493eek.24 for ; Fri, 11 Apr 2014 08:52:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cQN/z8VUXtgzomsr17o0aBBSZMNic4xQGu5DJgVVgGw=; b=Wl4fGH34aC7pZdgEKu4ntrZKVbJzEjtJrNhD/eB3jfxw3aqCBPMsoZwgne6jkTXiRx xkx1FQ7vnt/BlPJGUjiNnchBkaAqW9lv/U30HrVIXpwlNknKYGa1S2CSe2tqWpDOLpmr 8HYb5BKsJ2B9nnEKRptI27qLUDf9TJno6pL34= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cQN/z8VUXtgzomsr17o0aBBSZMNic4xQGu5DJgVVgGw=; b=QQ5ywuZfMbYFrzYSIY4EE/oO3s1fFl5hRUP0HM1Az3c7LXND/WHozZTPwBD4QQQyHv CH+tPJpmnHTSrNXnEMRNnOgLujkJM78TQyq8o/2i8DnwLtbx/r1EsjOVWKKTDoX+drf3 BU/lKd3a3+9pbWO42P+gqyQB4JdtwM00WVlyWnnN6TLTveeVVBUrP0PC3hhDV9/o1lVW 7Yn6J+dtDltGudkpMuPczrUd1Xo2Rc9u/QE3K629+B9gyh+8/KO6JTOEkmSYA6dcVgpL rfA+lwURtPQRD18B9vOiCsE8LYGueMTZYtLrX/OV1AiwJthlF8zJweE9Pb8HUzvTy/lY Uklw== X-Gm-Message-State: ALoCoQmvVofxFmaxVhDe21Hau8orlyKg4J2Nxa6C5PRhLcCn22hatxQ5YgiDnNMBMFenuMK95MZ8 X-Received: by 10.14.47.12 with SMTP id s12mr2284822eeb.116.1397231525181; Fri, 11 Apr 2014 08:52:05 -0700 (PDT) Received: from tucsk.pomaz.szeredi.hu (2E8B5005.mobile.pool.telekom.hu. [46.139.80.5]) by mx.google.com with ESMTPSA id u1sm18492033eex.31.2014.04.11.08.52.03 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Apr 2014 08:52:04 -0700 (PDT) From: Miklos Szeredi To: xfs@oss.sgi.com Cc: Miklos Szeredi Subject: [PATCH 2/4] renameat2 syscall: check plain rename Date: Fri, 11 Apr 2014 17:51:55 +0200 X-ASG-Orig-Subj: [PATCH 2/4] renameat2 syscall: check plain rename Message-Id: <1397231517-4641-2-git-send-email-miklos@szeredi.hu> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> X-Barracuda-Connect: mail-ee0-f51.google.com[74.125.83.51] X-Barracuda-Start-Time: 1397231526 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Miklos Szeredi Check with zero flags. This is what rename(2) and renameat(2) now call, so this actually tests the behavior of these syscalls as well. Signed-off-by: Miklos Szeredi --- tests/generic/323 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/323.out | 51 +++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 109 insertions(+) create mode 100755 tests/generic/323 create mode 100644 tests/generic/323.out diff --git a/tests/generic/323 b/tests/generic/323 new file mode 100755 index 0000000..84772bb --- /dev/null +++ b/tests/generic/323 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. generic/323 +# +# Check renameat2 syscall without flags +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Miklos Szeredi. 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/renameat2 + +_supported_fs generic +_supported_os Linux + +_requires_renameat2 + +# real QA test starts here + +rename_dir=$TEST_DIR/$$ +mkdir -p $rename_dir +_rename_tests $rename_dir +rmdir $rename_dir + +# success, all done +status=0 +exit diff --git a/tests/generic/323.out b/tests/generic/323.out new file mode 100644 index 0000000..bb85b9a --- /dev/null +++ b/tests/generic/323.out @@ -0,0 +1,51 @@ +QA output created by 323 +samedir none/none -> No such file or directory +samedir none/regu -> No such file or directory +samedir none/symb -> No such file or directory +samedir none/dire -> No such file or directory +samedir none/tree -> No such file or directory +samedir regu/none -> none/regu. +samedir regu/regu -> none/regu. +samedir regu/symb -> none/regu. +samedir regu/dire -> Is a directory +samedir regu/tree -> Is a directory +samedir symb/none -> none/symb. +samedir symb/regu -> none/symb. +samedir symb/symb -> none/symb. +samedir symb/dire -> Is a directory +samedir symb/tree -> Is a directory +samedir dire/none -> none/dire. +samedir dire/regu -> Not a directory +samedir dire/symb -> Not a directory +samedir dire/dire -> none/dire. +samedir dire/tree -> Directory not empty +samedir tree/none -> none/tree. +samedir tree/regu -> Not a directory +samedir tree/symb -> Not a directory +samedir tree/dire -> none/tree. +samedir tree/tree -> Directory not empty +crossdir none/none -> No such file or directory +crossdir none/regu -> No such file or directory +crossdir none/symb -> No such file or directory +crossdir none/dire -> No such file or directory +crossdir none/tree -> No such file or directory +crossdir regu/none -> none/regu. +crossdir regu/regu -> none/regu. +crossdir regu/symb -> none/regu. +crossdir regu/dire -> Is a directory +crossdir regu/tree -> Is a directory +crossdir symb/none -> none/symb. +crossdir symb/regu -> none/symb. +crossdir symb/symb -> none/symb. +crossdir symb/dire -> Is a directory +crossdir symb/tree -> Is a directory +crossdir dire/none -> none/dire. +crossdir dire/regu -> Not a directory +crossdir dire/symb -> Not a directory +crossdir dire/dire -> none/dire. +crossdir dire/tree -> Directory not empty +crossdir tree/none -> none/tree. +crossdir tree/regu -> Not a directory +crossdir tree/symb -> Not a directory +crossdir tree/dire -> none/tree. +crossdir tree/tree -> Directory not empty diff --git a/tests/generic/group b/tests/generic/group index 1c1693d..26e584b 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -136,3 +136,4 @@ 320 auto rw 321 auto quick metadata log 322 auto quick metadata log +323 auto quick -- 1.8.1.4 From miklos@szeredi.hu Fri Apr 11 10:52:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C9E17F4E for ; Fri, 11 Apr 2014 10:52:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DEE78304059 for ; Fri, 11 Apr 2014 08:52:09 -0700 (PDT) X-ASG-Debug-ID: 1397231528-04cbb00dc410b7b0001-NocioJ Received: from mail-ee0-f51.google.com (mail-ee0-f51.google.com [74.125.83.51]) by cuda.sgi.com with ESMTP id beVEO0rwpvJc0ibI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 08:52:08 -0700 (PDT) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 74.125.83.51 Received: by mail-ee0-f51.google.com with SMTP id c13so4266550eek.24 for ; Fri, 11 Apr 2014 08:52:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Bs3j1FxL3eCRAm2AAs8tkK2V+tH8HP39vZWJKviXovE=; b=Hd+Zd2Z/uphQ2GAAFyxZhnAtAlLfxbi8b3UewYXqah7syG3tjPSUaYle0kGgDfflIy QhiH3ZHa1DRAo1719MIP5eKVxIU0VuiTg6528sS0Zdd6u47HPpZBgFduPhWC2ltqCZki aGgm3Z6ZleWuuhFfXpe0xoItshP1C/RJziFy8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Bs3j1FxL3eCRAm2AAs8tkK2V+tH8HP39vZWJKviXovE=; b=Le9Ei3E75rf+m3R5qrONa4tjLFe6nibi+rBd9xbZKGclY1OGpkCzkZYOiCnROhlfVR O/Y9x4VNadTqzwpJDTzZEwLnYjf0LAiYzerVvCD82xNjfbW+wJ2pQO5K4GUWGpy/S7rf OUx0eolEGO69b1qNr8CwXFGPyDdw8YXJt78J3LlWNi3Yw4JTF6sTiZQfCssNXL06Pv09 9b2Bo/l1+mneVo9Hr4TMsiqgwDexcrJQ1uksF3xSRdwyuNyZxMf8COQ1H/tGtHL56Vf5 819yllDuO4FdYhK8x/v5P+/zTArQ7D6ZdIUzHC6iEfjzUrIbKuzIjlR0RC27cJWTqR+f cBUw== X-Gm-Message-State: ALoCoQkJVHvKWnqrqbc+AlDP3+Ikvl8+OkCXk4e8teKK9bHKRTre5Chu692JSqrXCcsxov1hhXeW X-Received: by 10.15.27.195 with SMTP id p43mr30119073eeu.2.1397231527700; Fri, 11 Apr 2014 08:52:07 -0700 (PDT) Received: from tucsk.pomaz.szeredi.hu (2E8B5005.mobile.pool.telekom.hu. [46.139.80.5]) by mx.google.com with ESMTPSA id u1sm18492033eex.31.2014.04.11.08.52.06 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Apr 2014 08:52:07 -0700 (PDT) From: Miklos Szeredi To: xfs@oss.sgi.com Cc: Miklos Szeredi Subject: [PATCH 4/4] renameat2 syscall: check cross rename Date: Fri, 11 Apr 2014 17:51:57 +0200 X-ASG-Orig-Subj: [PATCH 4/4] renameat2 syscall: check cross rename Message-Id: <1397231517-4641-4-git-send-email-miklos@szeredi.hu> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> X-Barracuda-Connect: mail-ee0-f51.google.com[74.125.83.51] X-Barracuda-Start-Time: 1397231528 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Miklos Szeredi Check with RENAME_EXCHANGE flag. This flag indicates that the source and destination files are to be exchanged. Signed-off-by: Miklos Szeredi --- tests/generic/325 | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/325.out | 51 ++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 116 insertions(+) create mode 100755 tests/generic/325 create mode 100644 tests/generic/325.out diff --git a/tests/generic/325 b/tests/generic/325 new file mode 100755 index 0000000..6776e10 --- /dev/null +++ b/tests/generic/325 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. generic/325 +# +# Check renameat2 syscall with RENAME_EXCHANGE flag +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Miklos Szeredi. 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/renameat2 + +_supported_fs generic +_supported_os Linux + +_requires_renameat2 + +rename_dir=$TEST_DIR/$$ +mkdir $rename_dir +touch $rename_dir/foo $rename_dir/bar +if ! src/renameat2 -t -x $rename_dir/foo $rename_dir/bar; then + rm -f $rename_dir/foo $rename_dir/bar; rmdir $rename_dir + _notrun "fs doesn't support RENAME_EXCHANGE" +fi +rm -f $rename_dir/foo $rename_dir/bar + +# real QA test starts here + +_rename_tests $rename_dir -x +rmdir $rename_dir + +# success, all done +status=0 +exit diff --git a/tests/generic/325.out b/tests/generic/325.out new file mode 100644 index 0000000..f73d7c1 --- /dev/null +++ b/tests/generic/325.out @@ -0,0 +1,51 @@ +QA output created by 325 +samedir none/none -> No such file or directory +samedir none/regu -> No such file or directory +samedir none/symb -> No such file or directory +samedir none/dire -> No such file or directory +samedir none/tree -> No such file or directory +samedir regu/none -> No such file or directory +samedir regu/regu -> regu/regu. +samedir regu/symb -> symb/regu. +samedir regu/dire -> dire/regu. +samedir regu/tree -> tree/regu. +samedir symb/none -> No such file or directory +samedir symb/regu -> regu/symb. +samedir symb/symb -> symb/symb. +samedir symb/dire -> dire/symb. +samedir symb/tree -> tree/symb. +samedir dire/none -> No such file or directory +samedir dire/regu -> regu/dire. +samedir dire/symb -> symb/dire. +samedir dire/dire -> dire/dire. +samedir dire/tree -> tree/dire. +samedir tree/none -> No such file or directory +samedir tree/regu -> regu/tree. +samedir tree/symb -> symb/tree. +samedir tree/dire -> dire/tree. +samedir tree/tree -> tree/tree. +crossdir none/none -> No such file or directory +crossdir none/regu -> No such file or directory +crossdir none/symb -> No such file or directory +crossdir none/dire -> No such file or directory +crossdir none/tree -> No such file or directory +crossdir regu/none -> No such file or directory +crossdir regu/regu -> regu/regu. +crossdir regu/symb -> symb/regu. +crossdir regu/dire -> dire/regu. +crossdir regu/tree -> tree/regu. +crossdir symb/none -> No such file or directory +crossdir symb/regu -> regu/symb. +crossdir symb/symb -> symb/symb. +crossdir symb/dire -> dire/symb. +crossdir symb/tree -> tree/symb. +crossdir dire/none -> No such file or directory +crossdir dire/regu -> regu/dire. +crossdir dire/symb -> symb/dire. +crossdir dire/dire -> dire/dire. +crossdir dire/tree -> tree/dire. +crossdir tree/none -> No such file or directory +crossdir tree/regu -> regu/tree. +crossdir tree/symb -> symb/tree. +crossdir tree/dire -> dire/tree. +crossdir tree/tree -> tree/tree. diff --git a/tests/generic/group b/tests/generic/group index 37697d8..8ea9b10 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -138,3 +138,4 @@ 322 auto quick metadata log 323 auto quick 324 auto quick +325 auto quick -- 1.8.1.4 From miklos@szeredi.hu Fri Apr 11 10:52:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B3807F50 for ; Fri, 11 Apr 2014 10:52:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C15BD304053 for ; Fri, 11 Apr 2014 08:52:09 -0700 (PDT) X-ASG-Debug-ID: 1397231526-04bdf07dc7105110001-NocioJ Received: from mail-ee0-f49.google.com (mail-ee0-f49.google.com [74.125.83.49]) by cuda.sgi.com with ESMTP id 3k5EuDKkO9F1vtF9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 08:52:07 -0700 (PDT) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 74.125.83.49 Received: by mail-ee0-f49.google.com with SMTP id c41so4309707eek.36 for ; Fri, 11 Apr 2014 08:52:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RsWkQpQtqt/U4eRc8El0+MabUsT/s3YEgGbGsy7xNCg=; b=podp2KFF/lUA9pTG/QoZYGG06lj10DedCvr4IdFUuUKNtZHfQ5WVwli3yYntf+c2xN 3DozxRrQCzNHDZe+CKxfh+DEyv3ohDcinp7v/1pBNHB5Eu3HV7iSqGwgcFzfqEdRwBQY dgQJsZLrQL8dxkdD4EhRThHOJYF2EIF7CUA/E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RsWkQpQtqt/U4eRc8El0+MabUsT/s3YEgGbGsy7xNCg=; b=V3IXGhNSW6KUbAt8f5uiMgnULTdOwIVlLMhwi/vxlsKbgJSDLU8NazbTkhxrlwVsYf 0lR+WkLP1iso6HP4942ox4JNrS2UgOCd3PSBhi2eNJ4bnnxO8ZRWQISUlp+FK/BBPW74 GwQx7tWU6zGa8TixOQNGFG8mVdZpGxAvUJqnQFY5Ea+kIWUGO9Re2JVTt7IFj2eWImpu Sx2K7cL8h8SeN81vvYSiiaYRFmnmmUTU30roDXGDiPQ1jMAFjPg9xY7EM72xugmqBEc6 kmQrmiy5CdHe8Tr069y/6SNphZL/A5raHDJTY8J3voEccMrrtOi9TYusQ3LyljACidIi h3nw== X-Gm-Message-State: ALoCoQlBXW3MJQQ6sGmmkfUGxTDibpgfu/cPeEADx0CPm3u11PiKi5wBeAi/D+jSeOhAB/ADdC5L X-Received: by 10.15.49.65 with SMTP id i41mr3228499eew.87.1397231526469; Fri, 11 Apr 2014 08:52:06 -0700 (PDT) Received: from tucsk.pomaz.szeredi.hu (2E8B5005.mobile.pool.telekom.hu. [46.139.80.5]) by mx.google.com with ESMTPSA id u1sm18492033eex.31.2014.04.11.08.52.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Apr 2014 08:52:05 -0700 (PDT) From: Miklos Szeredi To: xfs@oss.sgi.com Cc: Miklos Szeredi Subject: [PATCH 3/4] renameat2 syscall: check noreplace rename Date: Fri, 11 Apr 2014 17:51:56 +0200 X-ASG-Orig-Subj: [PATCH 3/4] renameat2 syscall: check noreplace rename Message-Id: <1397231517-4641-3-git-send-email-miklos@szeredi.hu> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> X-Barracuda-Connect: mail-ee0-f49.google.com[74.125.83.49] X-Barracuda-Start-Time: 1397231527 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Miklos Szeredi Check with RENAME_NOREPLACE flag. This flag indicates that the rename must fail if the target of the rename exists. Signed-off-by: Miklos Szeredi --- tests/generic/324 | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/324.out | 51 ++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 116 insertions(+) create mode 100755 tests/generic/324 create mode 100644 tests/generic/324.out diff --git a/tests/generic/324 b/tests/generic/324 new file mode 100755 index 0000000..7b45ca8 --- /dev/null +++ b/tests/generic/324 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. generic/324 +# +# Check renameat2 syscall with RENAME_NOREPLACE flag +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Miklos Szeredi. 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/renameat2 + +_supported_fs generic +_supported_os Linux + +_requires_renameat2 + +rename_dir=$TEST_DIR/$$ +mkdir $rename_dir +touch $rename_dir/foo +if ! src/renameat2 -t -n $rename_dir/foo $rename_dir/bar; then + rm -f $rename_dir/foo $rename_dir/bar; rmdir $rename_dir + _notrun "fs doesn't support RENAME_NOREPLACE" +fi +rm -f $rename_dir/foo $rename_dir/bar + +# real QA test starts here + +_rename_tests $rename_dir -n +rmdir $rename_dir + +# success, all done +status=0 +exit diff --git a/tests/generic/324.out b/tests/generic/324.out new file mode 100644 index 0000000..fff5547 --- /dev/null +++ b/tests/generic/324.out @@ -0,0 +1,51 @@ +QA output created by 324 +samedir none/none -> No such file or directory +samedir none/regu -> No such file or directory +samedir none/symb -> No such file or directory +samedir none/dire -> No such file or directory +samedir none/tree -> No such file or directory +samedir regu/none -> none/regu. +samedir regu/regu -> File exists +samedir regu/symb -> File exists +samedir regu/dire -> File exists +samedir regu/tree -> File exists +samedir symb/none -> none/symb. +samedir symb/regu -> File exists +samedir symb/symb -> File exists +samedir symb/dire -> File exists +samedir symb/tree -> File exists +samedir dire/none -> none/dire. +samedir dire/regu -> File exists +samedir dire/symb -> File exists +samedir dire/dire -> File exists +samedir dire/tree -> File exists +samedir tree/none -> none/tree. +samedir tree/regu -> File exists +samedir tree/symb -> File exists +samedir tree/dire -> File exists +samedir tree/tree -> File exists +crossdir none/none -> No such file or directory +crossdir none/regu -> No such file or directory +crossdir none/symb -> No such file or directory +crossdir none/dire -> No such file or directory +crossdir none/tree -> No such file or directory +crossdir regu/none -> none/regu. +crossdir regu/regu -> File exists +crossdir regu/symb -> File exists +crossdir regu/dire -> File exists +crossdir regu/tree -> File exists +crossdir symb/none -> none/symb. +crossdir symb/regu -> File exists +crossdir symb/symb -> File exists +crossdir symb/dire -> File exists +crossdir symb/tree -> File exists +crossdir dire/none -> none/dire. +crossdir dire/regu -> File exists +crossdir dire/symb -> File exists +crossdir dire/dire -> File exists +crossdir dire/tree -> File exists +crossdir tree/none -> none/tree. +crossdir tree/regu -> File exists +crossdir tree/symb -> File exists +crossdir tree/dire -> File exists +crossdir tree/tree -> File exists diff --git a/tests/generic/group b/tests/generic/group index 26e584b..37697d8 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -137,3 +137,4 @@ 321 auto quick metadata log 322 auto quick metadata log 323 auto quick +324 auto quick -- 1.8.1.4 From miklos@szeredi.hu Fri Apr 11 10:52:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 33F797F56 for ; Fri, 11 Apr 2014 10:52:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB58A304053 for ; Fri, 11 Apr 2014 08:52:08 -0700 (PDT) X-ASG-Debug-ID: 1397231524-04cbb00dc610b7a0001-NocioJ Received: from mail-ee0-f48.google.com (mail-ee0-f48.google.com [74.125.83.48]) by cuda.sgi.com with ESMTP id bcHGTB4Er2OcDc47 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 08:52:05 -0700 (PDT) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 74.125.83.48 Received: by mail-ee0-f48.google.com with SMTP id b57so4263276eek.35 for ; Fri, 11 Apr 2014 08:52:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=from:to:cc:subject:date:message-id; bh=NQsvMg2MVHlKHPfx5SznC+4KiMlrZbW+onKGnY54wlc=; b=MU84K2nXH8WO6mgdxDQ6UYKhv7TfOKGFAJXlFfe0oWr5X8K1R3NuPIX0Ax62byb0BH EZKPW9bG5AZmzIlYqvggMV9Yo+7W314BHLim4MMsvzJMfKpZQuSlzLP7SfcUiAQjYFXt muMij6455+kpaFauwc5iQ36d74sA41NwPmMfw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=NQsvMg2MVHlKHPfx5SznC+4KiMlrZbW+onKGnY54wlc=; b=A6kyDDyZY+nq3yo80GfE2ZNY/3gfFc0k0Z+N3PZk9Sc05/6dvkE7UCcrPsoH6Nwaob AaD+AvknW/QT2N9YCSASQJtIBNjuV4CPDYPBx5S5jNr2YT91zFB3Q2l27FFyiBHRsToT GfIRbN42yZDJulr0breg8fZxgylrY0yjjMGFW+Ius0e/ZGiBmRX5ldOkbQ3b1+cQkr3s gU7/cHii10773xZxGmrlLyutbC6Pbbd6VVkyu8tAmGk7tCIhCZA+Iahe2hvKcLdrSpdk Y1KtHgvDKlvnNsGWwDU2cXIY555IPoTwNrkvp+E4Ev/M5iMIZpdav/kLFvBONRIPduIT hLbw== X-Gm-Message-State: ALoCoQkySj0otmPxiGAT1sPCnBoAyR/5tNNhIzxtMccJfKHAf1y0JapCnW74zV7DPzn++8vKOqfn X-Received: by 10.15.54.6 with SMTP id s6mr29815966eew.4.1397231523883; Fri, 11 Apr 2014 08:52:03 -0700 (PDT) Received: from tucsk.pomaz.szeredi.hu (2E8B5005.mobile.pool.telekom.hu. [46.139.80.5]) by mx.google.com with ESMTPSA id u1sm18492033eex.31.2014.04.11.08.52.02 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Apr 2014 08:52:03 -0700 (PDT) From: Miklos Szeredi To: xfs@oss.sgi.com Cc: Miklos Szeredi Subject: [PATCH 1/4] renameat2 syscall: add infrastructure Date: Fri, 11 Apr 2014 17:51:54 +0200 X-ASG-Orig-Subj: [PATCH 1/4] renameat2 syscall: add infrastructure Message-Id: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> X-Mailer: git-send-email 1.8.1.4 X-Barracuda-Connect: mail-ee0-f48.google.com[74.125.83.48] X-Barracuda-Start-Time: 1397231524 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Miklos Szeredi The renameat2() syscall was merged into 3.15-rc (merge commit: 7df934526c0b). This adds the shared infrastructure for the actual test scripts. Signed-off-by: Miklos Szeredi --- .gitignore | 1 + common/renameat2 | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 + src/Makefile | 3 +- src/renameat2.c | 102 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 common/renameat2 create mode 100644 src/renameat2.c diff --git a/.gitignore b/.gitignore index e8c5012..66e6ee8 100644 --- a/.gitignore +++ b/.gitignore @@ -106,6 +106,7 @@ /src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer /src/aio-dio-regress/aiodio_sparse2 /src/cloner +/src/renameat2 # dmapi/ binaries /dmapi/src/common/cmd/read_invis diff --git a/common/renameat2 b/common/renameat2 new file mode 100644 index 0000000..a335169 --- /dev/null +++ b/common/renameat2 @@ -0,0 +1,129 @@ +###### +# +# renameat2 helpers +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Miklos Szeredi. 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 +#----------------------------------------------------------------------- +# + +# +# Setup source or dest +# +_setup_one() +{ + local path=$1 + local type=$2 + + case $type in + none) ;; + regu) echo foo > $path;; + symb) ln -s foo $path;; + dire) mkdir $path;; + tree) mkdir $path; echo foo > $path/bar;; + esac +} + +# +# Cleanup source or dest +# +_cleanup_one() +{ + local path=$1 + + if test -d $path; then + rm -f $path/bar + rmdir $path + else + rm -f $path + fi +} + +# +# Check type of source or destination +# +_showtype_one() +{ + local path=$1 + + if test -e $path -o -h $path; then + if test -d $path -a -e $path/bar; then + echo -n "tree" + else + echo -n `stat -c %F $path | cut -b-4` + fi + else + echo -n "none" + fi +} + +# +# This runs renameat2 on all combinations of source and dest +# +_rename_tests_source_dest() +{ + local source=$1 + local dest=$2 + local options=$3 + + for stype in none regu symb dire tree; do + for dtype in none regu symb dire tree; do + echo -n "$options $stype/$dtype -> " + _setup_one $source $stype + _setup_one $dest $dtype + src/renameat2 $source $dest $flags + if test $? == 0; then + _showtype_one $source + echo -n "/" + _showtype_one $dest + echo "." + fi + _cleanup_one $source + _cleanup_one $dest + done + done +} + +# +# This runs _rename_tests_source_dest() for both same-directory and +# cross-directory renames +# +_rename_tests() +{ + local testdir=$1 + local flags=$2 + + #same directory renames + _rename_tests_source_dest $testdir/src $testdir/dst "samedir " + + #cross directory renames + mkdir $testdir/x $testdir/y + _rename_tests_source_dest $testdir/x/src $testdir/y/dst "crossdir" + rmdir $testdir/x $testdir/y +} + +# +# This checks whether the renameat2 syscall is supported +# +_requires_renameat2() +{ + if test ! -x src/renameat2; then + _notrun "renameat2 binary not found" + fi + if ! src/renameat2 -t; then + _notrun "kernel doesn't support renameat2 syscall" + fi +} diff --git a/configure.ac b/configure.ac index 2f95c4c..43e6029 100644 --- a/configure.ac +++ b/configure.ac @@ -76,6 +76,8 @@ in ;; esac +AC_CHECK_FUNCS([renameat2]) + AC_CONFIG_HEADER(include/config.h) AC_CONFIG_FILES([include/builddefs]) AC_OUTPUT diff --git a/src/Makefile b/src/Makefile index 2dbc696..d754048 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,8 @@ 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 fsync-tester nsexec cloner + seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \ + renameat2 SUBDIRS = diff --git a/src/renameat2.c b/src/renameat2.c new file mode 100644 index 0000000..5145959 --- /dev/null +++ b/src/renameat2.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2014, Miklos Szeredi + * This file is published under GPL2+. + * + * This is a trivial wrapper around the renameat2 syscall. + */ + +#include "global.h" + +#ifndef HAVE_RENAMEAT2 +#include + +#if !defined(SYS_renameat2) && defined(__x86_64__) +#define SYS_renameat2 316 +#endif + +static int renameat2(int dfd1, const char *path1, + int dfd2, const char *path2, + unsigned int flags) +{ +#ifdef SYS_renameat2 + return syscall(SYS_renameat2, dfd1, path1, dfd2, path2, flags); +#else + errno = ENOSYS; + return -1; +#endif +} +#endif + +#ifndef RENAME_NOREPLACE +#define RENAME_NOREPLACE (1 << 0) /* Don't overwrite target */ +#endif +#ifndef RENAME_EXCHANGE +#define RENAME_EXCHANGE (1 << 1) /* Exchange source and dest */ +#endif +#ifndef RENAME_WHITEOUT +#define RENAME_WHITEOUT (1 << 2) /* Whiteout source */ +#endif + +int main(int argc, char *argv[]) +{ + int ret; + int c; + const char *path1 = NULL; + const char *path2 = NULL; + unsigned int flags = 0; + int test = 0; + + for (c = 1; c < argc; c++) { + if (argv[c][0] == '-') { + switch (argv[c][1]) { + case 't': + test = 1; + break; + case 'n': + flags |= RENAME_NOREPLACE; + break; + case 'x': + flags |= RENAME_EXCHANGE; + break; + case 'w': + flags |= RENAME_WHITEOUT; + break; + default: + goto usage; + } + } else if (!path1) { + path1 = argv[c]; + } else if (!path2) { + path2 = argv[c]; + } else { + goto usage; + } + } + + if (!test && (!path1 || !path2)) + goto usage; + + ret = renameat2(AT_FDCWD, path1, AT_FDCWD, path2, flags); + if (ret == -1) { + if (test) { + if (errno == ENOSYS || errno == EINVAL) + return 1; + else + return 0; + } + perror(""); + return 1; + } + + return 0; + +usage: + fprintf(stderr, + "usage: %s [-t] [-n|-x|-w] path1 path2\n" + " -t test\n" + " -n noreplace\n" + " -x exchange\n" + " -w whiteout\n", argv[0]); + + return 1; +} -- 1.8.1.4 From P@draigbrady.com Fri Apr 11 12:14:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 928F17F3F for ; Fri, 11 Apr 2014 12:14:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A44C8F8033 for ; Fri, 11 Apr 2014 10:14:08 -0700 (PDT) X-ASG-Debug-ID: 1397236443-04cb6c77b4107410001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PvYJOyvxjIl8vXvt for ; Fri, 11 Apr 2014 10:14:04 -0700 (PDT) X-Barracuda-Envelope-From: P@draigBrady.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 s3BHE3g4002694 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 11 Apr 2014 13:14:03 -0400 Received: from [10.36.116.46] (ovpn-116-46.ams2.redhat.com [10.36.116.46]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3BHE0CO017550 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 11 Apr 2014 13:14:02 -0400 Message-ID: <534822D7.7090803@draigBrady.com> Date: Fri, 11 Apr 2014 18:13:59 +0100 From: =?UTF-8?B?UMOhZHJhaWcgQnJhZHk=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: xfs-oss CC: =?UTF-8?B?T25kxZllaiBWYcWhw61r?= Subject: Strange hole creation behavior X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: Strange hole creation behavior 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: 1397236444 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 So this coreutils test is failing on XFS: http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=blob;f=tests/dd/sparse.sh;h=06efc7017 Specifically the last hole check on line 66. In summary what's happening is that a write(1MiB), lseek(1MiB), write(1MiB) creates only a 64KiB hole. Is that expected? Now a 1MiB hole is supported using truncate: dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock truncate -s+1M file.in dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock conv=notrunc oflag=append $ du -k file.in 2048 file.in But when trying to create the 1MiB hole with dd (lseek) it fails? # Create 3MiB input file file $ dd if=/dev/urandom of=file.in bs=1M count=3 iflag=fullblock $ dd if=/dev/zero of=file.in bs=1M count=1 seek=1 conv=notrunc $ du -k file.in 3072 file.in # Convert to 1MiB hole doesn't work :( $ dd if=file.in of=file.out bs=1M conv=sparse $ du -k file.out 3008 file.out # Again with syscall details: $ strace -e write,lseek dd if=file.in of=file.out bs=1M conv=sparse write(1, "...", 1048576) = 1048576 lseek(1, 1048576, SEEK_CUR) = 2097152 write(1, "...", 1048576) = 1048576 So it seems that the lseeks are treated differently to the truncate that was done in the first example, which is surprising. If we look at the file layout we can see the hole is only at the last 64KiB of the middle 1MiB of zeros, rather than for the whole middle 1MiB as in the first example?? $ filefrag -v file.out Filesystem type is: 58465342 File size of file.out is 3145728 (768 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 495: 31271.. 31766: 496: 1: 512.. 767: 31783.. 32038: 256: 31767: eof thanks, Pádraig. Versions etc. in case useful $ uname -a Linux tp2 3.12.6-300.fc20.x86_64 #1 SMP Mon Dec 23 16:44:31 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux $ xfs_info . meta-data=/dev/loop2 isize=256 agcount=4, agsize=65536 blks = sectsz=512 attr=2 data = bsize=4096 blocks=262144, 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 From lczerner@redhat.com Fri Apr 11 13:57:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4765729DF7 for ; Fri, 11 Apr 2014 13:57:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12049304059 for ; Fri, 11 Apr 2014 11:57:51 -0700 (PDT) X-ASG-Debug-ID: 1397242670-04cb6c77b7110900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1H2yuyU0Trxkyrbw for ; Fri, 11 Apr 2014 11:57:50 -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-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 s3BIvnJA030269 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 14:57:50 -0400 Received: from localhost.localdomain.com (vpn1-6-179.ams2.redhat.com [10.36.6.179]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BIvljQ004828; Fri, 11 Apr 2014 14:57:48 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Lukas Czerner Subject: [PATCH 1/4] ext4: Remove unnecessary check for APPEND and IMMUTABLE Date: Fri, 11 Apr 2014 20:57:42 +0200 X-ASG-Orig-Subj: [PATCH 1/4] ext4: Remove unnecessary check for APPEND and IMMUTABLE Message-Id: <1397242665-2183-1-git-send-email-lczerner@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: 1397242670 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 All the checks IS_APPEND and IS_IMMUTABLE for the fallocate operation on the inode are done in vfs. No need to do this again in ext4. Remove it. Signed-off-by: Lukas Czerner --- fs/ext4/extents.c | 6 ------ fs/ext4/inode.c | 6 +----- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 89f2227..0177150 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -5387,12 +5387,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) /* Take mutex lock */ mutex_lock(&inode->i_mutex); - /* It's not possible punch hole on append only file */ - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { - ret = -EPERM; - goto out_mutex; - } - if (IS_SWAPFILE(inode)) { ret = -ETXTBSY; goto out_mutex; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 1922f48..56f1ff4 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3528,11 +3528,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) } mutex_lock(&inode->i_mutex); - /* It's not possible punch hole on append only file */ - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { - ret = -EPERM; - goto out_mutex; - } + if (IS_SWAPFILE(inode)) { ret = -ETXTBSY; goto out_mutex; -- 1.8.3.1 From lczerner@redhat.com Fri Apr 11 13:57:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DFBD329DFE for ; Fri, 11 Apr 2014 13:57:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67873AC002 for ; Fri, 11 Apr 2014 11:57:55 -0700 (PDT) X-ASG-Debug-ID: 1397242674-04cbb00dc611c420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id n2BbAqBq2xN1l3wa for ; Fri, 11 Apr 2014 11:57:54 -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-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 s3BIvrpn018635 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 14:57:53 -0400 Received: from localhost.localdomain.com (vpn1-6-179.ams2.redhat.com [10.36.6.179]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BIvljS004828; Fri, 11 Apr 2014 14:57:52 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Lukas Czerner Subject: [PATCH 3/4] fs: Remove i_size check from do_fallocate Date: Fri, 11 Apr 2014 20:57:44 +0200 X-ASG-Orig-Subj: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-Id: <1397242665-2183-3-git-send-email-lczerner@redhat.com> In-Reply-To: <1397242665-2183-1-git-send-email-lczerner@redhat.com> References: <1397242665-2183-1-git-send-email-lczerner@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: 1397242674 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently in do_fallocate in collapse range case we're checking whether offset + len is not bigger than i_size. However there is nothing which would prevent i_size from changing so the check is pointless. It should be done in the file system itself and the file system needs to make sure that i_size is not going to change. As it is now we can easily crash kernel by having two processes doing truncate and fallocate collapse range at the same time. This can be reproduced on ext4 and it is theoretically possible on xfs even though I was not able to trigger it with this simple test. This commit removes the check from do_fallocate and adds it to the file system. Signed-off-by: Lukas Czerner --- fs/ext4/extents.c | 11 +++++++++-- fs/open.c | 8 -------- fs/xfs/xfs_file.c | 10 +++++++++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 0177150..ff823b7 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -5364,8 +5364,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) loff_t new_size; int ret; - BUG_ON(offset + len > i_size_read(inode)); - /* Collapse range works only on fs block size aligned offsets. */ if (offset & (EXT4_BLOCK_SIZE(sb) - 1) || len & (EXT4_BLOCK_SIZE(sb) - 1)) @@ -5387,6 +5385,15 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) /* Take mutex lock */ mutex_lock(&inode->i_mutex); + /* + * There is no need to overlap collapse range with EOF, in which case + * it is effectively a truncate operation + */ + if (offset + len >= i_size_read(inode)) { + ret = -EINVAL; + goto out_mutex; + } + if (IS_SWAPFILE(inode)) { ret = -ETXTBSY; goto out_mutex; diff --git a/fs/open.c b/fs/open.c index 7882ff5..14af6be 100644 --- a/fs/open.c +++ b/fs/open.c @@ -287,14 +287,6 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) return -EFBIG; - /* - * There is no need to overlap collapse range with EOF, in which case - * it is effectively a truncate operation - */ - if ((mode & FALLOC_FL_COLLAPSE_RANGE) && - (offset + len >= i_size_read(inode))) - return -EINVAL; - if (!file->f_op->fallocate) return -EOPNOTSUPP; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 003c005..4ba0ae9 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -840,7 +840,15 @@ xfs_file_fallocate( goto out_unlock; } - ASSERT(offset + len < i_size_read(inode)); + /* + * There is no need to overlap collapse range with EOF, + * in which case it is effectively a truncate operation + */ + if (offset + len >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + new_size = i_size_read(inode) - len; error = xfs_collapse_file_space(ip, offset, len); -- 1.8.3.1 From lczerner@redhat.com Fri Apr 11 13:57:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8BDA729DFE for ; Fri, 11 Apr 2014 13:57:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E0D0AC002 for ; Fri, 11 Apr 2014 11:57:53 -0700 (PDT) X-ASG-Debug-ID: 1397242672-04bdf07dc7114530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KysBIOr4ZYbKsuWJ for ; Fri, 11 Apr 2014 11:57:52 -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-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 s3BIvpqB021098 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 14:57:51 -0400 Received: from localhost.localdomain.com (vpn1-6-179.ams2.redhat.com [10.36.6.179]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BIvljR004828; Fri, 11 Apr 2014 14:57:50 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Lukas Czerner Subject: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Date: Fri, 11 Apr 2014 20:57:43 +0200 X-ASG-Orig-Subj: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-Id: <1397242665-2183-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1397242665-2183-1-git-send-email-lczerner@redhat.com> References: <1397242665-2183-1-git-send-email-lczerner@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: 1397242672 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently punch hole and collapse range fallocate operation are not allowed on append only file. This should be case for zero range as well. Fix it. Signed-off-by: Lukas Czerner --- fs/open.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/open.c b/fs/open.c index 631aea81..7882ff5 100644 --- a/fs/open.c +++ b/fs/open.c @@ -254,10 +254,11 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) return -EBADF; /* - * It's not possible to punch hole or perform collapse range - * on append only file + * It's not possible to punch hole, perform collapse range + * or zero range on append only file */ - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE | + FALLOC_FL_ZERO_RANGE) && IS_APPEND(inode)) return -EPERM; -- 1.8.3.1 From lczerner@redhat.com Fri Apr 11 13:57:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E85D729E04 for ; Fri, 11 Apr 2014 13:57:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C05888F8039 for ; Fri, 11 Apr 2014 11:57:56 -0700 (PDT) X-ASG-Debug-ID: 1397242675-04cb6c77b6110930001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UWFeLCORjRIOH5Sb for ; Fri, 11 Apr 2014 11:57:55 -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-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 s3BIvt8w025785 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 14:57:55 -0400 Received: from localhost.localdomain.com (vpn1-6-179.ams2.redhat.com [10.36.6.179]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BIvljT004828; Fri, 11 Apr 2014 14:57:53 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Lukas Czerner Subject: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile Date: Fri, 11 Apr 2014 20:57:45 +0200 X-ASG-Orig-Subj: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile Message-Id: <1397242665-2183-4-git-send-email-lczerner@redhat.com> In-Reply-To: <1397242665-2183-1-git-send-email-lczerner@redhat.com> References: <1397242665-2183-1-git-send-email-lczerner@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: 1397242675 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently some file system have IS_SWAPFILE check in their fallocate implementations and some does not. However we should really prevent any fallocate operation on swapfile so move the check to vfs and remove the redundant checks from the file systems fallocate implementations. Signed-off-by: Lukas Czerner --- fs/ceph/file.c | 3 --- fs/ext4/extents.c | 5 ----- fs/ext4/inode.c | 5 ----- fs/open.c | 7 +++++++ 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 66075a4..3a69d80 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -1219,9 +1219,6 @@ static long ceph_fallocate(struct file *file, int mode, if (!S_ISREG(inode->i_mode)) return -EOPNOTSUPP; - if (IS_SWAPFILE(inode)) - return -ETXTBSY; - mutex_lock(&inode->i_mutex); if (ceph_snap(inode) != CEPH_NOSNAP) { diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index ff823b7..517b376 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -5394,11 +5394,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) goto out_mutex; } - if (IS_SWAPFILE(inode)) { - ret = -ETXTBSY; - goto out_mutex; - } - /* Currently just for extent based files */ if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { ret = -EOPNOTSUPP; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 56f1ff4..d8a270d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3529,11 +3529,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) mutex_lock(&inode->i_mutex); - if (IS_SWAPFILE(inode)) { - ret = -ETXTBSY; - goto out_mutex; - } - /* No need to punch hole beyond i_size */ if (offset >= inode->i_size) goto out_mutex; diff --git a/fs/open.c b/fs/open.c index 14af6be..48e3fd0 100644 --- a/fs/open.c +++ b/fs/open.c @@ -266,6 +266,13 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) return -EPERM; /* + * We can not allow to do any fallocate operation on an active + * swapfile + */ + if (IS_SWAPFILE(inode)) + ret = -ETXTBSY; + + /* * Revalidate the write permissions, in case security policy has * changed since the files were opened. */ -- 1.8.3.1 From bfoster@redhat.com Fri Apr 11 14:02:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1670C29DF7 for ; Fri, 11 Apr 2014 14:02:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A096FAC002 for ; Fri, 11 Apr 2014 12:02:46 -0700 (PDT) X-ASG-Debug-ID: 1397242965-04cb6c77b5111010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WYi9Aa97FGycW6eF for ; Fri, 11 Apr 2014 12:02:45 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3BJ2jO6032218 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 11 Apr 2014 15:02:45 -0400 Received: from laptop.bfoster (vpn-60-48.rdu2.redhat.com [10.10.60.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BJ2ikZ009149; Fri, 11 Apr 2014 15:02:45 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 910CC120AC3; Fri, 11 Apr 2014 15:02:44 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3BJ2c0X017428; Fri, 11 Apr 2014 15:02:38 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 11 Apr 2014 15:02:31 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/14] xfsprogs: varius & sundry fixes for coverity defects Message-ID: <20140411190231.GA16717@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 00/14] xfsprogs: varius & sundry fixes for coverity defects References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396999504-13769-1-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397242965 X-Barracuda-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, Apr 08, 2014 at 06:24:50PM -0500, Eric Sandeen wrote: > This series knocks out 30 or so coverity defects. > Noted a few nits... things that could probably be fixed up at commit time if so desired. Otherwise, the series looks good to me. Thanks Eric. Reviewed-by: Brian Foster > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Apr 11 14:03:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 73F2B29DF7 for ; Fri, 11 Apr 2014 14:03:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25C4FAC003 for ; Fri, 11 Apr 2014 12:03:09 -0700 (PDT) X-ASG-Debug-ID: 1397242988-04bdf07dc7114c60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 80DY8CGhe3zKh5IE for ; Fri, 11 Apr 2014 12:03:08 -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 s3BJ38pW023167 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 11 Apr 2014 15:03:08 -0400 Received: from laptop.bfoster (vpn-60-48.rdu2.redhat.com [10.10.60.48]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BJ37nR007380; Fri, 11 Apr 2014 15:03:07 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 17211120AC3; Fri, 11 Apr 2014 15:03:07 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3BJ36Rw017436; Fri, 11 Apr 2014 15:03:06 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 11 Apr 2014 15:03:05 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/14] xfsprogs: trivial buffer frees on error paths Message-ID: <20140411190304.GB16717@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 03/14] xfsprogs: trivial buffer frees on error paths References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> <1396999504-13769-4-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396999504-13769-4-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397242988 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 08, 2014 at 06:24:53PM -0500, Eric Sandeen wrote: > Lots of memory leaks on error paths etc, spotted by > coverity. This patch rolls up the super-straightforward > fixes across xfsprogs. > > Signed-off-by: Eric Sandeen > --- > db/addr.c | 15 +++++++-------- > db/check.c | 4 +++- > db/write.c | 2 ++ > io/parent.c | 2 ++ > mkfs/proto.c | 3 ++- > 5 files changed, 16 insertions(+), 10 deletions(-) > > diff --git a/db/addr.c b/db/addr.c > index f74dd62..f9f760d 100644 > --- a/db/addr.c > +++ b/db/addr.c > @@ -85,16 +85,14 @@ addr_f( > fl = flist_scan(argv[1]); > if (fl == NULL) > return 0; > - if (!flist_parse(fld, fl, iocur_top->data, 0)) { > - flist_free(fl); > - return 0; > - } > + if (!flist_parse(fld, fl, iocur_top->data, 0)) > + goto out; > + You've got some trailing whitespace here (tab in the empty line). Brian > flist_print(fl); > for (tfl = fl; tfl->child != NULL; tfl = tfl->child) { > if ((tfl->flags & FL_OKLOW) && tfl->low < tfl->high) { > dbprintf(_("array not allowed for addr command\n")); > - flist_free(fl); > - return 0; > + goto out; > } > } > fld = tfl->fld; > @@ -103,7 +101,7 @@ addr_f( > next = inode_next_type(); > if (next == TYP_NONE) { > dbprintf(_("no next type for field %s\n"), fld->name); > - return 0; > + goto out; > } > fa = &ftattrtab[fld->ftyp]; > ASSERT(fa->ftyp == fld->ftyp); > @@ -111,9 +109,10 @@ addr_f( > if (adf == NULL) { > dbprintf(_("no addr function for field %s (type %s)\n"), > fld->name, fa->name); > - return 0; > + goto out; > } > (*adf)(iocur_top->data, tfl->offset, next); > +out: > flist_free(fl); > return 0; > } > diff --git a/db/check.c b/db/check.c > index 4867698..baf7f9f 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -1136,7 +1136,7 @@ blocktrash_f( > } > if (blocks == 0) { > dbprintf(_("blocktrash: no matching blocks\n")); > - return 0; > + goto out; > } > if (!sopt) > dbprintf(_("blocktrash: seed %u\n"), seed); > @@ -1161,6 +1161,7 @@ blocktrash_f( > } > } > } > +out: > xfree(lentab); > return 0; > } > @@ -1907,6 +1908,7 @@ ncheck_f( > break; > default: > dbprintf(_("bad option -%c for ncheck command\n"), c); > + xfree(ilist); > return 0; > } > } > diff --git a/db/write.c b/db/write.c > index 7b34fc0..ca8bd0f 100644 > --- a/db/write.c > +++ b/db/write.c > @@ -233,6 +233,7 @@ bwrite_lrot( > memcpy(hold_region, base, shift); > memcpy(base, base+shift, len-shift); > memcpy(base+(len-shift), hold_region, shift); > + free(hold_region); > } > > /* ARGSUSED */ > @@ -265,6 +266,7 @@ bwrite_rrot( > memcpy(hold_region, base+(len-shift), shift); > memmove(base+shift, base, len-shift); > memcpy(base, hold_region, shift); > + free(hold_region); > } > > /* ARGSUSED */ > diff --git a/io/parent.c b/io/parent.c > index 47faaa0..ca989e9 100644 > --- a/io/parent.c > +++ b/io/parent.c > @@ -258,6 +258,8 @@ parent_check(void) > if (!bstatbuf || !parentbuf) { > fprintf(stderr, _("unable to allocate buffers: %s\n"), > strerror(errno)); > + free(bstatbuf); > + free(parentbuf); > return 1; > } > > diff --git a/mkfs/proto.c b/mkfs/proto.c > index b7e0761..95583c9 100644 > --- a/mkfs/proto.c > +++ b/mkfs/proto.c > @@ -49,7 +49,7 @@ char * > setup_proto( > char *fname) > { > - char *buf; > + char *buf = NULL; > static char dflt[] = "d--755 0 0 $"; > int fd; > long size; > @@ -85,6 +85,7 @@ setup_proto( > > out_fail: > close(fd); > + free(buf); > exit(1); > } > > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Apr 11 14:03:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 99E8C29DF7 for ; Fri, 11 Apr 2014 14:03:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F635304066 for ; Fri, 11 Apr 2014 12:03:34 -0700 (PDT) X-ASG-Debug-ID: 1397243013-04cb6c77b5111160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ng9p0Av80xo1WsVU for ; Fri, 11 Apr 2014 12:03:33 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3BJ3X7s027870 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 11 Apr 2014 15:03:33 -0400 Received: from laptop.bfoster (vpn-60-48.rdu2.redhat.com [10.10.60.48]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3BJ3W8q014485; Fri, 11 Apr 2014 15:03:33 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 33AD6120AC3; Fri, 11 Apr 2014 15:03:32 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3BJ3Vw5017440; Fri, 11 Apr 2014 15:03:31 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 11 Apr 2014 15:03:31 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space error paths Message-ID: <20140411190330.GC16717@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space error paths References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> <1396999504-13769-9-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396999504-13769-9-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397243013 X-Barracuda-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, Apr 08, 2014 at 06:24:58PM -0500, Eric Sandeen wrote: > The bmap freelist & transaction pointer weren't > being freed in libxfs_alloc_file_space error paths; > more or less copy the error handling that exists > in kernelspace to resolve this. > > Signed-off-by: Eric Sandeen > --- > libxfs/util.c | 20 +++++++++++++++++--- > 1 files changed, 17 insertions(+), 3 deletions(-) > > diff --git a/libxfs/util.c b/libxfs/util.c > index 1b05540..f1aa4c6 100644 > --- a/libxfs/util.c > +++ b/libxfs/util.c > @@ -582,8 +582,17 @@ libxfs_alloc_file_space( > resblks = (uint)XFS_DIOSTRAT_SPACE_RES(mp, datablocks); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > resblks, 0); > - if (error) > + /* > + * Check for running out of space > + */ > + if (error) { > + /* > + * Free the transaction structure. > + */ > + ASSERT(error == ENOSPC); /* XXX ERS? */ XXX ? > + xfs_trans_cancel(tp, 0); > break; > + } > xfs_trans_ijoin(tp, ip, 0); > xfs_trans_ihold(tp, ip); > > @@ -593,12 +602,12 @@ libxfs_alloc_file_space( > &reccount, &free_list); > > if (error) > - break; > + goto error0; > > /* complete the transaction */ > error = xfs_bmap_finish(&tp, &free_list, &committed); > if (error) > - break; > + goto error0; > > error = xfs_trans_commit(tp, 0); > if (error) > @@ -612,6 +621,11 @@ libxfs_alloc_file_space( > allocatesize_fsb -= allocated_fsb; > } > return error; > + > +error0: /* Cancel bmap, unlock inode, cancel trans */ Nit, but since it appears we don't lock the inode, the comment is wrong. Brian > + xfs_bmap_cancel(&free_list); > + xfs_trans_cancel(tp, 0); > + return error; > } > > unsigned int > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bob.mastors@solidfire.com Fri Apr 11 14:21:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 811EE29DF7 for ; Fri, 11 Apr 2014 14:21:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04E38AC003 for ; Fri, 11 Apr 2014 12:21:26 -0700 (PDT) X-ASG-Debug-ID: 1397244084-04cb6c77b7112a70001-NocioJ Received: from mail-ve0-f176.google.com (mail-ve0-f176.google.com [209.85.128.176]) by cuda.sgi.com with ESMTP id YQV02TC4Yu51459i (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 12:21:24 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.128.176 Received: by mail-ve0-f176.google.com with SMTP id db11so5093616veb.7 for ; Fri, 11 Apr 2014 12:21:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=uPEYtTZtFnmqv13BK+lANO/fS8nW+q8vDe+YUD5wP8c=; b=ebFPb8750lbw2F33npR9Q95al9+yeo8zzuMohLPGSeRLDw+FIDo+p+Elvwo//tJQyl qVtOOxVaIKmUMDccoddu87tewtUOlPc6IIvFHhi1Ypc+xPB8bjWWHMA7L396frtjdTO9 EbaL8PcxkIGnf+B1YdmvCzDOSEeDGNTevZU0w7hRs3DBST6LhrOzO5lVMUCvujBlVIMQ dR82GisxmMShziSZhR4tfpydR29GX0g0DRoHKVbwfHW2Am4slGoZvQXJhHqXMCF++jXX ZmVFXGBBlxKy4IBOOQTim6+uyvAObG+nYLHTXcpv9pBtaCr/o2dRGLuieDCHAxRGnGYJ eUbA== X-Gm-Message-State: ALoCoQnhv/v7aWeReuxji0RMHT/qImthbDi6PGPGKNb9e8lTHOGWVkpxEUgkJ01ZVmsSpoXca9Pz MIME-Version: 1.0 X-Received: by 10.52.99.168 with SMTP id er8mr7116057vdb.26.1397244084259; Fri, 11 Apr 2014 12:21:24 -0700 (PDT) Received: by 10.52.78.67 with HTTP; Fri, 11 Apr 2014 12:21:24 -0700 (PDT) In-Reply-To: <1397104955-7247-1-git-send-email-david@fromorbit.com> References: <1397104955-7247-1-git-send-email-david@fromorbit.com> Date: Fri, 11 Apr 2014 13:21:24 -0600 Message-ID: Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount From: Bob Mastors X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount To: Dave Chinner Cc: xfs@oss.sgi.com, snitzer@redhat.com Content-Type: multipart/alternative; boundary=20cf3071cab04eceb904f6c93de9 X-Barracuda-Connect: mail-ve0-f176.google.com[209.85.128.176] X-Barracuda-Start-Time: 1397244084 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4798 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --20cf3071cab04eceb904f6c93de9 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Thanks Dave. This fixed the umount problem I was seeing. Tried it a few thousand times. Works great. Bob On Wed, Apr 9, 2014 at 10:42 PM, Dave Chinner wrote: > From: Dave Chinner > > And interesting situation can occur if a log IO error occurs during > the unmount of a filesystem. The cases reported have the same > signature - the update of the superblock counters fails due to a log > write IO error: > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file > fs/xfs/xfs_log.c. Return address =3D 0xffffffffa08a44a1 > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > XFS (dm-16): Unable to update superblock counters. Freespace may not be > correct on next mount. > XFS (dm-16): xfs_log_force: error 5 returned. > XFS (=BF-=BF=BF=BF): Please umount the filesystem and rectify the problem= (s) > > It can be seen that the last line of output contains a corrupt > device name - this is because the log and xfs_mount structures have > already been freed by the time this message is printed. A kernel > oops closely follows. > > The issue is that the shutdown is occurring in a separate IO > completion thread to the unmount. Once the shutdown processing has > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > log shutdown code wakes anyone waiting on a log force so they can > process the shutdown error. This wakes up the unmount code that > is doing a synchronous transaction to update the superblock > counters. > > The unmount path now sees all the iclogs are marked with > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > it does, there will not be a wakeup trigger for it and we will hang > the unmount if we do. Hence the unmount runs through all the > remaining code and frees all the filesystem structures while the > xlog_iodone() is still processing the shutdown. When the log > shutdown processing completes, xfs_do_force_shutdown() emits the > "Please umount the filesystem and rectify the problem(s)" message, > and xlog_iodone() then aborts all the objects attached to the iclog. > An iclog that has already been freed.... > > The real issue here is that there is no serialisation point between > the log IO and the unmount. We have serialisations points for log > writes, log forces, reservations, etc, but we don't actually have > any code that wakes for log IO to fully complete. We do that for all > other types of object, so why not iclogbufs? > > Well, it turns out that we can easily do this. We've got xfs_buf > handles, and that's what everyone else uses for IO serialisation. > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > release the lock in xlog_iodone() when we are finished with the > buffer. That way before we tear down the iclog, we can lock and > unlock the buffer to ensure IO completion has finished completely > before we tear it down. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log.c | 53 > ++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 44 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 8497a00..08624dc 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1181,11 +1181,14 @@ xlog_iodone(xfs_buf_t *bp) > /* log I/O is always issued ASYNC */ > ASSERT(XFS_BUF_ISASYNC(bp)); > xlog_state_done_syncing(iclog, aborted); > + > /* > - * do not reference the buffer (bp) here as we could race > - * with it being freed after writing the unmount record to the > - * log. > + * drop the buffer lock now that we are done. Nothing references > + * the buffer after this, so an unmount waiting on this lock can > now > + * tear it down safely. As such, it is unsafe to reference the > buffer > + * (bp) after the unlock as we could race with it being freed. > */ > + xfs_buf_unlock(bp); > } > > /* > @@ -1368,8 +1371,16 @@ xlog_alloc_log( > bp =3D xfs_buf_alloc(mp->m_logdev_targp, 0, > BTOBB(log->l_iclog_size), 0); > if (!bp) > goto out_free_log; > - bp->b_iodone =3D xlog_iodone; > + > + /* > + * The iclogbuf buffer locks are held over IO but we are not goin= g > to do > + * IO yet. Hence unlock the buffer so that the log IO path can > grab it > + * when appropriately. > + */ > ASSERT(xfs_buf_islocked(bp)); > + xfs_buf_unlock(bp); > + > + bp->b_iodone =3D xlog_iodone; > log->l_xbuf =3D bp; > > spin_lock_init(&log->l_icloglock); > @@ -1398,6 +1409,9 @@ xlog_alloc_log( > if (!bp) > goto out_free_iclog; > > + ASSERT(xfs_buf_islocked(bp)); > + xfs_buf_unlock(bp); > + > bp->b_iodone =3D xlog_iodone; > iclog->ic_bp =3D bp; > iclog->ic_data =3D bp->b_addr; > @@ -1422,7 +1436,6 @@ xlog_alloc_log( > iclog->ic_callback_tail =3D &(iclog->ic_callback); > iclog->ic_datap =3D (char *)iclog->ic_data + > log->l_iclog_hsize; > > - ASSERT(xfs_buf_islocked(iclog->ic_bp)); > init_waitqueue_head(&iclog->ic_force_wait); > init_waitqueue_head(&iclog->ic_write_wait); > > @@ -1631,6 +1644,12 @@ xlog_cksum( > * we transition the iclogs to IOERROR state *after* flushing all existi= ng > * iclogs to disk. This is because we don't want anymore new transaction= s > to be > * started or completed afterwards. > + * > + * We lock the iclogbufs here so that we can serialise against IO > completion > + * during unmount. We might be processing a shutdown triggered during > unmount, > + * and that can occur asynchronously to the unmount thread, and hence we > need to > + * ensure that completes before tearing down the iclogbufs. Hence we nee= d > to > + * hold the buffer lock across the log IO to acheive that. > */ > STATIC int > xlog_bdstrat( > @@ -1638,6 +1657,7 @@ xlog_bdstrat( > { > struct xlog_in_core *iclog =3D bp->b_fspriv; > > + xfs_buf_lock(bp); > if (iclog->ic_state & XLOG_STATE_IOERROR) { > xfs_buf_ioerror(bp, EIO); > xfs_buf_stale(bp); > @@ -1645,7 +1665,8 @@ xlog_bdstrat( > /* > * It would seem logical to return EIO here, but we rely = on > * the log state machine to propagate I/O errors instead = of > - * doing it here. > + * doing it here. Similarly, IO completion will unlock th= e > + * buffer, so we don't do it here. > */ > return 0; > } > @@ -1847,14 +1868,28 @@ xlog_dealloc_log( > xlog_cil_destroy(log); > > /* > - * always need to ensure that the extra buffer does not point to > memory > - * owned by another log buffer before we free it. > + * Cycle all the iclogbuf locks to make sure all log IO completio= n > + * is done before we tear down these buffers. > */ > + iclog =3D log->l_iclog; > + for (i =3D 0; i < log->l_iclog_bufs; i++) { > + xfs_buf_lock(iclog->ic_bp); > + xfs_buf_unlock(iclog->ic_bp); > + iclog =3D iclog->ic_next; > + } > + > + /* > + * Always need to ensure that the extra buffer does not point to > memory > + * owned by another log buffer before we free it. Also, cycle the > lock > + * first to ensure we've completed IO on it. > + */ > + xfs_buf_lock(log->l_xbuf); > + xfs_buf_unlock(log->l_xbuf); > xfs_buf_set_empty(log->l_xbuf, BTOBB(log->l_iclog_size)); > xfs_buf_free(log->l_xbuf); > > iclog =3D log->l_iclog; > - for (i=3D0; il_iclog_bufs; i++) { > + for (i =3D 0; i < log->l_iclog_bufs; i++) { > xfs_buf_free(iclog->ic_bp); > next_iclog =3D iclog->ic_next; > kmem_free(iclog); > -- > 1.9.0 > > --20cf3071cab04eceb904f6c93de9 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Thanks Dave.
This fixed the umount problem I was seein= g.
Tried it a few thousand times. Works great.
Bob


On Wed= , Apr 9, 2014 at 10:42 PM, Dave Chinner <david@fromorbit.com> wrote:
From: Dave Chinner <dchinner@redhat.com>

And interesting situation can occur if a log IO error occurs during
the unmount of a filesystem. The cases reported have the same
signature - the update of the superblock counters fails due to a log
write IO error:

XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xf= s/xfs_log.c. =A0Return address =3D 0xffffffffa08a44a1
XFS (dm-16): Log I/O Error Detected. =A0Shutting down filesystem
XFS (dm-16): Unable to update superblock counters. Freespace may not be cor= rect on next mount.
XFS (dm-16): xfs_log_force: error 5 returned.
XFS (=BF-=BF=BF=BF): Please umount the filesystem and rectify the problem(s= )

It can be seen that the last line of output contains a corrupt
device name - this is because the log and xfs_mount structures have
already been freed by the time this message is printed. A kernel
oops closely follows.

The issue is that the shutdown is occurring in a separate IO
completion thread to the unmount. Once the shutdown processing has
started and all the iclogs are marked with XLOG_STATE_IOERROR, the
log shutdown code wakes anyone waiting on a log force so they can
process the shutdown error. This wakes up the unmount code that
is doing a synchronous transaction to update the superblock
counters.

The unmount path now sees all the iclogs are marked with
XLOG_STATE_IOERROR and so never waits on them again, knowing that if
it does, there will not be a wakeup trigger for it and we will hang
the unmount if we do. Hence the unmount runs through all the
remaining code and frees all the filesystem structures while the
xlog_iodone() is still processing the shutdown. When the log
shutdown processing completes, xfs_do_force_shutdown() emits the
"Please umount the filesystem and rectify the problem(s)" message= ,
and xlog_iodone() then aborts all the objects attached to the iclog.
An iclog that has already been freed....

The real issue here is that there is no serialisation point between
the log IO and the unmount. We have serialisations points for log
writes, log forces, reservations, etc, but we don't actually have
any code that wakes for log IO to fully complete. We do that for all
other types of object, so why not iclogbufs?

Well, it turns out that we can easily do this. We've got xfs_buf
handles, and that's what everyone else uses for IO serialisation.
i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only
release the lock in xlog_iodone() when we are finished with the
buffer. That way before we tear down the iclog, we can lock and
unlock the buffer to ensure IO completion has finished completely
before we tear it down.

Signed-off-by: Dave Chinner <dchi= nner@redhat.com>
---
=A0fs/xfs/xfs_log.c | 53 ++++++++++++++++++++++++++++++++++++++++++++------= ---
=A01 file changed, 44 insertions(+), 9 deletions(-)

diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 8497a00..08624dc 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1181,11 +1181,14 @@ xlog_iodone(xfs_buf_t *bp)
=A0 =A0 =A0 =A0 /* log I/O is always issued ASYNC */
=A0 =A0 =A0 =A0 ASSERT(XFS_BUF_ISASYNC(bp));
=A0 =A0 =A0 =A0 xlog_state_done_syncing(iclog, aborted);
+
=A0 =A0 =A0 =A0 /*
- =A0 =A0 =A0 =A0* do not reference the buffer (bp) here as we could race - =A0 =A0 =A0 =A0* with it being freed after writing the unmount record to = the
- =A0 =A0 =A0 =A0* log.
+ =A0 =A0 =A0 =A0* drop the buffer lock now that we are done. Nothing refer= ences
+ =A0 =A0 =A0 =A0* the buffer after this, so an unmount waiting on this loc= k can now
+ =A0 =A0 =A0 =A0* tear it down safely. As such, it is unsafe to reference = the buffer
+ =A0 =A0 =A0 =A0* (bp) after the unlock as we could race with it being fre= ed.
=A0 =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 xfs_buf_unlock(bp);
=A0}

=A0/*
@@ -1368,8 +1371,16 @@ xlog_alloc_log(
=A0 =A0 =A0 =A0 bp =3D xfs_buf_alloc(mp->m_logdev_targp, 0, BTOBB(log-&g= t;l_iclog_size), 0);
=A0 =A0 =A0 =A0 if (!bp)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto out_free_log;
- =A0 =A0 =A0 bp->b_iodone =3D xlog_iodone;
+
+ =A0 =A0 =A0 /*
+ =A0 =A0 =A0 =A0* The iclogbuf buffer locks are held over IO but we are no= t going to do
+ =A0 =A0 =A0 =A0* IO yet. =A0Hence unlock the buffer so that the log IO pa= th can grab it
+ =A0 =A0 =A0 =A0* when appropriately.
+ =A0 =A0 =A0 =A0*/
=A0 =A0 =A0 =A0 ASSERT(xfs_buf_islocked(bp));
+ =A0 =A0 =A0 xfs_buf_unlock(bp);
+
+ =A0 =A0 =A0 bp->b_iodone =3D xlog_iodone;
=A0 =A0 =A0 =A0 log->l_xbuf =3D bp;

=A0 =A0 =A0 =A0 spin_lock_init(&log->l_icloglock);
@@ -1398,6 +1409,9 @@ xlog_alloc_log(
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!bp)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto out_free_iclog;

+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 ASSERT(xfs_buf_islocked(bp));
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_buf_unlock(bp);
+
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bp->b_iodone =3D xlog_iodone;
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 iclog->ic_bp =3D bp;
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 iclog->ic_data =3D bp->b_addr;
@@ -1422,7 +1436,6 @@ xlog_alloc_log(
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 iclog->ic_callback_tail =3D &(iclog-= >ic_callback);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 iclog->ic_datap =3D (char *)iclog->ic= _data + log->l_iclog_hsize;

- =A0 =A0 =A0 =A0 =A0 =A0 =A0 ASSERT(xfs_buf_islocked(iclog->ic_bp)); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 init_waitqueue_head(&iclog->ic_force= _wait);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 init_waitqueue_head(&iclog->ic_write= _wait);

@@ -1631,6 +1644,12 @@ xlog_cksum(
=A0 * we transition the iclogs to IOERROR state *after* flushing all existi= ng
=A0 * iclogs to disk. This is because we don't want anymore new transac= tions to be
=A0 * started or completed afterwards.
+ *
+ * We lock the iclogbufs here so that we can serialise against IO completi= on
+ * during unmount. We might be processing a shutdown triggered during unmo= unt,
+ * and that can occur asynchronously to the unmount thread, and hence we n= eed to
+ * ensure that completes before tearing down the iclogbufs. Hence we need = to
+ * hold the buffer lock across the log IO to acheive that.
=A0 */
=A0STATIC int
=A0xlog_bdstrat(
@@ -1638,6 +1657,7 @@ xlog_bdstrat(
=A0{
=A0 =A0 =A0 =A0 struct xlog_in_core =A0 =A0 *iclog =3D bp->b_fspriv;

+ =A0 =A0 =A0 xfs_buf_lock(bp);
=A0 =A0 =A0 =A0 if (iclog->ic_state & XLOG_STATE_IOERROR) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_buf_ioerror(bp, EIO);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_buf_stale(bp);
@@ -1645,7 +1665,8 @@ xlog_bdstrat(
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* It would seem logical to return EIO he= re, but we rely on
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* the log state machine to propagate I/O= errors instead of
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* doing it here.
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* doing it here. Similarly, IO completion = will unlock the
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* buffer, so we don't do it here.
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return 0;
=A0 =A0 =A0 =A0 }
@@ -1847,14 +1868,28 @@ xlog_dealloc_log(
=A0 =A0 =A0 =A0 xlog_cil_destroy(log);

=A0 =A0 =A0 =A0 /*
- =A0 =A0 =A0 =A0* always need to ensure that the extra buffer does not poi= nt to memory
- =A0 =A0 =A0 =A0* owned by another log buffer before we free it.
+ =A0 =A0 =A0 =A0* Cycle all the iclogbuf locks to make sure all log IO com= pletion
+ =A0 =A0 =A0 =A0* is done before we tear down these buffers.
=A0 =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 iclog =3D log->l_iclog;
+ =A0 =A0 =A0 for (i =3D 0; i < log->l_iclog_bufs; i++) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_buf_lock(iclog->ic_bp);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_buf_unlock(iclog->ic_bp);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 iclog =3D iclog->ic_next;
+ =A0 =A0 =A0 }
+
+ =A0 =A0 =A0 /*
+ =A0 =A0 =A0 =A0* Always need to ensure that the extra buffer does not poi= nt to memory
+ =A0 =A0 =A0 =A0* owned by another log buffer before we free it. Also, cyc= le the lock
+ =A0 =A0 =A0 =A0* first to ensure we've completed IO on it.
+ =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 xfs_buf_lock(log->l_xbuf);
+ =A0 =A0 =A0 xfs_buf_unlock(log->l_xbuf);
=A0 =A0 =A0 =A0 xfs_buf_set_empty(log->l_xbuf, BTOBB(log->l_iclog_siz= e));
=A0 =A0 =A0 =A0 xfs_buf_free(log->l_xbuf);

=A0 =A0 =A0 =A0 iclog =3D log->l_iclog;
- =A0 =A0 =A0 for (i=3D0; i<log->l_iclog_bufs; i++) {
+ =A0 =A0 =A0 for (i =3D 0; i < log->l_iclog_bufs; i++) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xfs_buf_free(iclog->ic_bp);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 next_iclog =3D iclog->ic_next;
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 kmem_free(iclog);
--
1.9.0


--20cf3071cab04eceb904f6c93de9-- From bfoster@redhat.com Fri Apr 11 15:43:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6F75D7F3F for ; Fri, 11 Apr 2014 15:43:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4FACAC002 for ; Fri, 11 Apr 2014 13:43:44 -0700 (PDT) X-ASG-Debug-ID: 1397249023-04cbb00dc3126090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id b5MPooVFe1nLm3wf for ; Fri, 11 Apr 2014 13:43:43 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3BKhfs1022162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 16:43:41 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BKhebP003360; Fri, 11 Apr 2014 16:43:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45CD71256CC; Fri, 11 Apr 2014 16:43:39 -0400 (EDT) Date: Fri, 11 Apr 2014 16:43:39 -0400 From: Brian Foster To: =?iso-8859-1?Q?P=E1draig?= Brady Cc: xfs-oss , =?utf-8?B?T25kxZllaiBWYcWhw61r?= Subject: Re: Strange hole creation behavior Message-ID: <20140411204338.GA38024@bfoster.bfoster> X-ASG-Orig-Subj: Re: Strange hole creation behavior References: <534822D7.7090803@draigBrady.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <534822D7.7090803@draigBrady.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: 1397249023 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Apr 11, 2014 at 06:13:59PM +0100, Pádraig Brady wrote: > So this coreutils test is failing on XFS: > http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=blob;f=tests/dd/sparse.sh;h=06efc7017 > Specifically the last hole check on line 66. > > In summary what's happening is that a write(1MiB), lseek(1MiB), write(1MiB) > creates only a 64KiB hole. Is that expected? > This is expected behavior due to speculative preallocation. An FAQ with regard to this behavior is pending, but see here for reference: http://oss.sgi.com/archives/xfs/2014-04/msg00083.html In that particular write(1MB), lseek(+1MB), write(1MB) workload, each write is preallocating some extra space beyond the current EOF. The seek then moves past that space, but the space doesn't go away. The subsequent writes will extend EOF. The previously preallocated space now resides in the middle of the file and can't be trimmed away when the file is closed. > Now a 1MiB hole is supported using truncate: > dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock > truncate -s+1M file.in > dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock conv=notrunc oflag=append > $ du -k file.in > 2048 file.in > This works simply because it is broken into multiple commands. When the first dd exits, the excess space is trimmed off (the file descriptor is closed). The subsequent truncate extends the file size without any extra space getting caught between the old and new EOF. You can confirm this by using the 'allocsize=4k' mount option to the XFS mount. If you wanted something more generic for the purpose of testing the coreutils functionality, you could also set the size of file.out in advance. E.g., with preallocation in effect: # dd if=file.in of=file.out bs=1M conv=sparse # xfs_bmap -v file.out file.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..3967]: 9773944..9777911 1 (9080..13047) 3968 1: [3968..4095]: hole 128 2: [4096..6143]: 9778040..9780087 1 (13176..15223) 2048 ... and then prevent preallocation by ensuring writes do not extend the file: # rm -f file.out # truncate --size=3M file.out # dd if=file.in of=file.out bs=1M conv=sparse,notrunc # xfs_bmap -v file.out file.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..2047]: 9773944..9775991 1 (9080..11127) 2048 1: [2048..4095]: hole 2048 2: [4096..6143]: 9778040..9780087 1 (13176..15223) 2048 Hope that helps. Brian > But when trying to create the 1MiB hole with dd (lseek) it fails? > > # Create 3MiB input file file > $ dd if=/dev/urandom of=file.in bs=1M count=3 iflag=fullblock > $ dd if=/dev/zero of=file.in bs=1M count=1 seek=1 conv=notrunc > $ du -k file.in > 3072 file.in > > # Convert to 1MiB hole doesn't work :( > $ dd if=file.in of=file.out bs=1M conv=sparse > $ du -k file.out > 3008 file.out > > # Again with syscall details: > $ strace -e write,lseek dd if=file.in of=file.out bs=1M conv=sparse > write(1, "...", 1048576) = 1048576 > lseek(1, 1048576, SEEK_CUR) = 2097152 > write(1, "...", 1048576) = 1048576 > > So it seems that the lseeks are treated differently to the truncate > that was done in the first example, which is surprising. > If we look at the file layout we can see the hole is > only at the last 64KiB of the middle 1MiB of zeros, > rather than for the whole middle 1MiB as in the first example?? > > $ filefrag -v file.out > Filesystem type is: 58465342 > File size of file.out is 3145728 (768 blocks of 4096 bytes) > ext: logical_offset: physical_offset: length: expected: flags: > 0: 0.. 495: 31271.. 31766: 496: > 1: 512.. 767: 31783.. 32038: 256: 31767: eof > > thanks, > Pádraig. > > Versions etc. in case useful > > $ uname -a > Linux tp2 3.12.6-300.fc20.x86_64 #1 SMP Mon Dec 23 16:44:31 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux > > $ xfs_info . > meta-data=/dev/loop2 isize=256 agcount=4, agsize=65536 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=262144, 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 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From stan@hardwarefreak.com Fri Apr 11 16:35:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E0F67F3F for ; Fri, 11 Apr 2014 16:35:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B540EAC003 for ; Fri, 11 Apr 2014 14:35:51 -0700 (PDT) X-ASG-Debug-ID: 1397252150-04bdf07dca120d50001-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 5GoaOITkPW7XMp9Q for ; Fri, 11 Apr 2014 14:35:50 -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 1412B6C170; Fri, 11 Apr 2014 16:35:50 -0500 (CDT) Message-ID: <53486031.5050503@hardwarefreak.com> Date: Fri, 11 Apr 2014 16:35:45 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: daiguochao , xfs@oss.sgi.com Subject: Re: 10GB memorys occupied by XFS References: <1396596386220-35015.post@n7.nabble.com> <1397184044761-35016.post@n7.nabble.com> X-ASG-Orig-Subj: Re: 10GB memorys occupied by XFS In-Reply-To: <1397184044761-35016.post@n7.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1397252150 X-Barracuda-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/10/2014 9:40 PM, daiguochao wrote: > Dear Stan, I can't send email to you.So I leave a message here.I hope not to > bother you. > Thank you for your kind assistance. I received all of the ones you sent to the list and that should always be the case. One that you sent directly to me was rejected but I think I've fixed that now. And I think my delayed reply made things seem worse than they are. Anyway, Dave replied while I was typing my last response. He'll be much more able to assist you. Your problem seems beyond the edge of my knowledge. Cheers, Stan > In accordance with your suggestion, we executed "echo 3 > > /proc/sysm/drop_caches" for trying to release vfs dentries and inodes. > Really, > our lost memory came back. But we learned that the memory of vfs dentries > and inodes is distributed from slab. Please check our system "Slab: 509708 > kB" from /proc/meminfo, and it seems only be took up 500MB and xfs_buf take > up 450MB among. And /proc/meminfo indicated that our system memory is > anomalous, there is about 10GB out of the statistics. We want to know how > the system could observe the usage amount of vfs dentries and iodes through > the system interface. If the memory usage of system is not reflected in > /proc/meminfo as we can not find the statistics, and we thought it as a bug > of xfs. > > My vm.vfs_cache_pressure of linux system is 100. We think that the system > will proactively take the memory back when the memory is not enough, rather > than oom-killer kills our work process. Our datas of /proc/meminfo occurred > during the system problem as below: > 130> cat /proc/meminfo > MemTotal: 12173268 kB > MemFree: 223044 kB > Buffers: 244 kB > Cached: 4540 kB > SwapCached: 0 kB > Active: 1700 kB > Inactive: 5312 kB > Active(anon): 1616 kB > Inactive(anon): 1128 kB > Active(file): 84 kB > Inactive(file): 4184 kB > Unevictable: 0 kB > Mlocked: 0 kB > SwapTotal: 0 kB > SwapFree: 0 kB > Dirty: 0 kB > Writeback: 0 kB > AnonPages: 2556 kB > Mapped: 1088 kB > Shmem: 196 kB > Slab: 509708 kB > SReclaimable: 7596 kB > SUnreclaim: 502112 kB > KernelStack: 1096 kB > PageTables: 748 kB > NFS_Unstable: 0 kB > Bounce: 0 kB > WritebackTmp: 0 kB > CommitLimit: 6086632 kB > Committed_AS: 9440 kB > VmallocTotal: 34359738367 kB > VmallocUsed: 303488 kB > VmallocChunk: 34359426132 kB > HardwareCorrupted: 0 kB > AnonHugePages: 0 kB > HugePages_Total: 0 > HugePages_Free: 0 > HugePages_Rsvd: 0 > HugePages_Surp: 0 > Hugepagesize: 2048 kB > DirectMap4k: 6152 kB > DirectMap2M: 2070528 kB > DirectMap1G: 10485760 kB > > Best Regards, > > Guochao > > > > -- > View this message in context: http://xfs.9218.n7.nabble.com/10GB-memorys-occupied-by-XFS-tp35015p35016.html > Sent from the Xfs - General mailing list archive at Nabble.com. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From enwlinux@gmail.com Fri Apr 11 16:43:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 99DE47F3F for ; Fri, 11 Apr 2014 16:43:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85E74304051 for ; Fri, 11 Apr 2014 14:43:13 -0700 (PDT) X-ASG-Debug-ID: 1397252591-04cb6c77b611d8a0001-NocioJ Received: from mail-qc0-f174.google.com (mail-qc0-f174.google.com [209.85.216.174]) by cuda.sgi.com with ESMTP id EV1gHRnB6hpaVXBz (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 14:43:12 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.174] Received: by mail-qc0-f174.google.com with SMTP id c9so6502953qcz.19 for ; Fri, 11 Apr 2014 14:43:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=9IU8L1iUU6+abJjtmwKJzVoBnqZ500yUoBXBjIVm6qE=; b=uLiYvbYW7GyH4GdbsKAgO+B3aP12gpLktgd8KZVltPJc4E+hHpthjH/RZ6weJoZgO3 zYgJ7P+RqP/Um4fCC0uMxQ3Ix6EscnqJHUX9XLBsS3vPyCLyiSwxuLWziZSELkOkCpvg Kk9OzyfOHDRHesULSeoRlx26WGTTGaBoVb8aWwib54GauHET58lwkA39+5SRTqvnDdI7 HHPlkH0gLFvwpFMd+vNnzikGLvQO4c58HoL7HsmE0fuNnnb3jOo6hCXrdRPURdNuNx/J BG5PSVk1akFgCd2t0ySeCiPdzvZky0z+9eCy7dgJoeAHjLm5ISMzzcuLTOS/e1RYw9ax mUZg== X-Received: by 10.140.29.131 with SMTP id b3mr31512437qgb.5.1397252591267; Fri, 11 Apr 2014 14:43:11 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id j1sm10383742qan.32.2014.04.11.14.43.10 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 11 Apr 2014 14:43:10 -0700 (PDT) Date: Fri, 11 Apr 2014 17:43:07 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH] generic: add fallocate() checks to generic/300 Message-ID: <20140411214307.GC10174@wallace> X-ASG-Orig-Subj: [PATCH] generic: add fallocate() checks to generic/300 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-qc0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1397252591 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4801 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 Generic/300 fails when run on a test filesystem that does not support fallocate(). It uses fio's falloc ioengine to generate part of its I/O load and both allocates blocks and punches holes. This causes EOPNOTSUPP failures when the test is run on indirect block-mapped ext4 filesystems or pre-3.14 ext4 filesystems created with bigalloc. Verify that the test filesystem supports fallocate() before proceeding with the test, checking for both block allocation and hole punching capabilities. Also, delete any pre-existing test output. Signed-off-by: Eric Whitney --- tests/generic/300 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/generic/300 b/tests/generic/300 index 7c60728..4e07f8a 100755 --- a/tests/generic/300 +++ b/tests/generic/300 @@ -44,6 +44,13 @@ _supported_os Linux _need_to_be_root _require_scratch +# xfs_io is not required for this test, but it's the best way to verify +# the test system supports fallocate() for allocation and hole punching +_require_xfs_io_falloc +_require_xfs_io_falloc_punch + +rm -f $seqres.full + NUM_JOBS=$((4*LOAD_FACTOR)) BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` if [ $((BLK_DEV_SIZE)) -gt 1048576 ] -- 1.8.3.2 From enwlinux@gmail.com Fri Apr 11 16:46:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=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 E8C267F3F for ; Fri, 11 Apr 2014 16:46:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 956F8AC003 for ; Fri, 11 Apr 2014 14:46:29 -0700 (PDT) X-ASG-Debug-ID: 1397252787-04bdf07dca1219c0001-NocioJ Received: from mail-qc0-f171.google.com (mail-qc0-f171.google.com [209.85.216.171]) by cuda.sgi.com with ESMTP id 6rsNhBB5XnfLktcw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 11 Apr 2014 14:46:28 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.171] Received: by mail-qc0-f171.google.com with SMTP id c9so6689886qcz.30 for ; Fri, 11 Apr 2014 14:46:27 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=hnTYMSsFYzfQS5YbnxMWKeiXGYeTh52PjC1LXRc+X3A=; b=PEzLd9aIYDogdGvjaFPwed0IV6dE9MLjJ3+L91DvIGQnGCLljRG34W+56RxCbl1sWT 8b7rlb/MPLkkqQi9zzYdV51BSHNzpYSM9vAAI/I4OVbd74wR5tR4QLia4KtL5yNQSOja yP2aOhEKicF8E77kS/n/F7dw8kAogf3qOUj0RTJTPgNAQW+5T+PmgxOCYAvi6DvZKGwD sicq//Bo2f1cytnEKoygbSneF2bdtdlFEYhecIHjIWZXQGT7sr4HiLVNVsOi48DI2eCf 5RbmZpIlsFFI/aSk3HCV25smJhn3LYxWR9GJdutld6hW92p/iw+4M0XNK8cFJM7bKBJ0 vq0g== X-Received: by 10.140.88.85 with SMTP id s79mr30871285qgd.70.1397252787500; Fri, 11 Apr 2014 14:46:27 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id b46sm10432372qge.7.2014.04.11.14.46.26 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 11 Apr 2014 14:46:27 -0700 (PDT) Date: Fri, 11 Apr 2014 17:46:23 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH] generic: add fallocate() check to generic/311 Message-ID: <20140411214623.GD10174@wallace> X-ASG-Orig-Subj: [PATCH] generic: add fallocate() check to generic/311 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-qc0-f171.google.com[209.85.216.171] X-Barracuda-Start-Time: 1397252788 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4801 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 Generic/311 fails when run on a test filesystem that does not support fallocate(). Its I/O load is produced by fsync-tester, which uses fallocate() system calls to allocate blocks for some of its test cases. This causes EOPNOTSUPP failures when the test is run on indirect block-mapped ext4 filesystems. Verify that the test filesystem supports fallocate() before proceeding with the test, checking for block allocation capabilities. Also, fix a minor error message typo. Signed-off-by: Eric Whitney --- tests/generic/311 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 tests/generic/311 diff --git a/tests/generic/311 b/tests/generic/311 old mode 100644 new mode 100755 index 6802a96..284b59d --- a/tests/generic/311 +++ b/tests/generic/311 @@ -57,7 +57,11 @@ _need_to_be_root _require_scratch _require_dm_flakey -[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not build" +# xfs_io is not required for this test, but it's the best way to verify +# the test system supports fallocate() for allocation +_require_xfs_io_falloc + +[ -x $here/src/fsync-tester ] || _notrun "fsync-tester not built" rm -f $seqres.full SEED=1 -- 1.8.3.2 From sandeen@sandeen.net Fri Apr 11 17:25:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E7007F3F for ; Fri, 11 Apr 2014 17:25:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AAC3304089 for ; Fri, 11 Apr 2014 15:25:48 -0700 (PDT) X-ASG-Debug-ID: 1397255147-04cb6c77b411fea0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Yp07a94GHjGOpiOy for ; Fri, 11 Apr 2014 15:25: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 104EE63C5FC1; Fri, 11 Apr 2014 17:25:47 -0500 (CDT) Message-ID: <53486BEB.4050103@sandeen.net> Date: Fri, 11 Apr 2014 17:25:47 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: [PATCH 03/14 V2] xfsprogs: trivial buffer frees on error paths References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> <1396999504-13769-4-git-send-email-sandeen@redhat.com> X-ASG-Orig-Subj: [PATCH 03/14 V2] xfsprogs: trivial buffer frees on error paths In-Reply-To: <1396999504-13769-4-git-send-email-sandeen@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397255147 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4802 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Lots of memory leaks on error paths etc, spotted by coverity. This patch rolls up the super-straightforward fixes across xfsprogs. Signed-off-by: Eric Sandeen --- V2: Fix whitespace error db/addr.c | 15 +++++++-------- db/check.c | 4 +++- db/write.c | 2 ++ io/parent.c | 2 ++ mkfs/proto.c | 3 ++- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/db/addr.c b/db/addr.c index f74dd62..f9f760d 100644 --- a/db/addr.c +++ b/db/addr.c @@ -85,16 +85,14 @@ addr_f( fl = flist_scan(argv[1]); if (fl == NULL) return 0; - if (!flist_parse(fld, fl, iocur_top->data, 0)) { - flist_free(fl); - return 0; - } + if (!flist_parse(fld, fl, iocur_top->data, 0)) + goto out; + flist_print(fl); for (tfl = fl; tfl->child != NULL; tfl = tfl->child) { if ((tfl->flags & FL_OKLOW) && tfl->low < tfl->high) { dbprintf(_("array not allowed for addr command\n")); - flist_free(fl); - return 0; + goto out; } } fld = tfl->fld; @@ -103,7 +101,7 @@ addr_f( next = inode_next_type(); if (next == TYP_NONE) { dbprintf(_("no next type for field %s\n"), fld->name); - return 0; + goto out; } fa = &ftattrtab[fld->ftyp]; ASSERT(fa->ftyp == fld->ftyp); @@ -111,9 +109,10 @@ addr_f( if (adf == NULL) { dbprintf(_("no addr function for field %s (type %s)\n"), fld->name, fa->name); - return 0; + goto out; } (*adf)(iocur_top->data, tfl->offset, next); +out: flist_free(fl); return 0; } diff --git a/db/check.c b/db/check.c index 4867698..baf7f9f 100644 --- a/db/check.c +++ b/db/check.c @@ -1136,7 +1136,7 @@ blocktrash_f( } if (blocks == 0) { dbprintf(_("blocktrash: no matching blocks\n")); - return 0; + goto out; } if (!sopt) dbprintf(_("blocktrash: seed %u\n"), seed); @@ -1161,6 +1161,7 @@ blocktrash_f( } } } +out: xfree(lentab); return 0; } @@ -1907,6 +1908,7 @@ ncheck_f( break; default: dbprintf(_("bad option -%c for ncheck command\n"), c); + xfree(ilist); return 0; } } diff --git a/db/write.c b/db/write.c index 7b34fc0..ca8bd0f 100644 --- a/db/write.c +++ b/db/write.c @@ -233,6 +233,7 @@ bwrite_lrot( memcpy(hold_region, base, shift); memcpy(base, base+shift, len-shift); memcpy(base+(len-shift), hold_region, shift); + free(hold_region); } /* ARGSUSED */ @@ -265,6 +266,7 @@ bwrite_rrot( memcpy(hold_region, base+(len-shift), shift); memmove(base+shift, base, len-shift); memcpy(base, hold_region, shift); + free(hold_region); } /* ARGSUSED */ diff --git a/io/parent.c b/io/parent.c index 47faaa0..ca989e9 100644 --- a/io/parent.c +++ b/io/parent.c @@ -258,6 +258,8 @@ parent_check(void) if (!bstatbuf || !parentbuf) { fprintf(stderr, _("unable to allocate buffers: %s\n"), strerror(errno)); + free(bstatbuf); + free(parentbuf); return 1; } diff --git a/mkfs/proto.c b/mkfs/proto.c index b7e0761..95583c9 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -49,7 +49,7 @@ char * setup_proto( char *fname) { - char *buf; + char *buf = NULL; static char dflt[] = "d--755 0 0 $"; int fd; long size; @@ -85,6 +85,7 @@ setup_proto( out_fail: close(fd); + free(buf); exit(1); } -- 1.7.1 _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Fri Apr 11 17:49:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D4517F3F for ; Fri, 11 Apr 2014 17:49:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 080B2AC003 for ; Fri, 11 Apr 2014 15:49:30 -0700 (PDT) X-ASG-Debug-ID: 1397256569-04bdf07dcc125550001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 5lYUrFsxTmNkq7kR for ; Fri, 11 Apr 2014 15:49: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2038C63C5FC1; Fri, 11 Apr 2014 17:49:29 -0500 (CDT) Message-ID: <53487179.7040008@sandeen.net> Date: Fri, 11 Apr 2014 17:49:29 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: [PATCH 08/14 V2] xfsprogs: free resources in libxfs_alloc_file_space error paths References: <1396999504-13769-1-git-send-email-sandeen@redhat.com> <1396999504-13769-9-git-send-email-sandeen@redhat.com> X-ASG-Orig-Subj: [PATCH 08/14 V2] xfsprogs: free resources in libxfs_alloc_file_space error paths In-Reply-To: <1396999504-13769-9-git-send-email-sandeen@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397256569 X-Barracuda-URL: http://192.48.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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4803 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 The bmap freelist & transaction pointer weren't being freed in libxfs_alloc_file_space error paths; more or less copy the error handling that exists in kernelspace to resolve this. Signed-off-by: Eric Sandeen --- V2: Fix comment, remove XXX :) Although: That ASSERT, while matching kernelspace, seems weird. We *can* get other errors out of xfs_trans_reserve. EIO etc... What's the assert all about? libxfs/util.c | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libxfs/util.c b/libxfs/util.c index 1b05540..f1aa4c6 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -582,8 +582,17 @@ libxfs_alloc_file_space( resblks = (uint)XFS_DIOSTRAT_SPACE_RES(mp, datablocks); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, resblks, 0); - if (error) + /* + * Check for running out of space + */ + if (error) { + /* + * Free the transaction structure. + */ + ASSERT(error == ENOSPC); + xfs_trans_cancel(tp, 0); break; + } xfs_trans_ijoin(tp, ip, 0); xfs_trans_ihold(tp, ip); @@ -593,12 +602,12 @@ libxfs_alloc_file_space( &reccount, &free_list); if (error) - break; + goto error0; /* complete the transaction */ error = xfs_bmap_finish(&tp, &free_list, &committed); if (error) - break; + goto error0; error = xfs_trans_commit(tp, 0); if (error) @@ -612,6 +621,11 @@ libxfs_alloc_file_space( allocatesize_fsb -= allocated_fsb; } return error; + +error0: /* Cancel bmap, cancel trans */ + xfs_bmap_cancel(&free_list); + xfs_trans_cancel(tp, 0); + return error; } unsigned int From P@draigbrady.com Fri Apr 11 17:58:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2D4A67F50 for ; Fri, 11 Apr 2014 17:58:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0660830407F for ; Fri, 11 Apr 2014 15:58:23 -0700 (PDT) X-ASG-Debug-ID: 1397257099-04cbb00dc512e610001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id D4I61WOfVllCa1mk for ; Fri, 11 Apr 2014 15:58:19 -0700 (PDT) X-Barracuda-Envelope-From: P@draigBrady.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3BMwFom004419 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 11 Apr 2014 18:58:15 -0400 Received: from [10.36.116.28] (ovpn-116-28.ams2.redhat.com [10.36.116.28]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3BMwCm3015958 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 11 Apr 2014 18:58:14 -0400 Message-ID: <53487383.6040001@draigBrady.com> Date: Fri, 11 Apr 2014 23:58:11 +0100 From: =?UTF-8?B?UMOhZHJhaWcgQnJhZHk=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Brian Foster CC: xfs-oss , =?UTF-8?B?T25kxZllaiBWYcWhw61r?= , Coreutils Subject: Re: Strange hole creation behavior References: <534822D7.7090803@draigBrady.com> <20140411204338.GA38024@bfoster.bfoster> X-ASG-Orig-Subj: Re: Strange hole creation behavior In-Reply-To: <20140411204338.GA38024@bfoster.bfoster> X-Enigmail-Version: 1.6 Content-Type: multipart/mixed; boundary="------------050606000501010005080301" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397257099 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a multi-part message in MIME format. --------------050606000501010005080301 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 04/11/2014 09:43 PM, Brian Foster wrote: > On Fri, Apr 11, 2014 at 06:13:59PM +0100, Pádraig Brady wrote: >> So this coreutils test is failing on XFS: >> http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=blob;f=tests/dd/sparse.sh;h=06efc7017 >> Specifically the last hole check on line 66. >> >> In summary what's happening is that a write(1MiB), lseek(1MiB), write(1MiB) >> creates only a 64KiB hole. Is that expected? >> > > This is expected behavior due to speculative preallocation. An FAQ with > regard to this behavior is pending, but see here for reference: > > http://oss.sgi.com/archives/xfs/2014-04/msg00083.html > > In that particular write(1MB), lseek(+1MB), write(1MB) workload, each > write is preallocating some extra space beyond the current EOF. The seek > then moves past that space, but the space doesn't go away. The > subsequent writes will extend EOF. The previously preallocated space now > resides in the middle of the file and can't be trimmed away when the > file is closed. > >> Now a 1MiB hole is supported using truncate: >> dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock >> truncate -s+1M file.in >> dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock conv=notrunc oflag=append >> $ du -k file.in >> 2048 file.in >> > > This works simply because it is broken into multiple commands. When the > first dd exits, the excess space is trimmed off (the file descriptor is > closed). The subsequent truncate extends the file size without any > extra space getting caught between the old and new EOF. > > You can confirm this by using the 'allocsize=4k' mount option to the XFS > mount. If you wanted something more generic for the purpose of testing > the coreutils functionality, you could also set the size of file.out in > advance. E.g., with preallocation in effect: > > # dd if=file.in of=file.out bs=1M conv=sparse > # xfs_bmap -v file.out > file.out: > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL > 0: [0..3967]: 9773944..9777911 1 (9080..13047) 3968 > 1: [3968..4095]: hole 128 > 2: [4096..6143]: 9778040..9780087 1 (13176..15223) 2048 > > ... and then prevent preallocation by ensuring writes do not extend the > file: > > # rm -f file.out > # truncate --size=3M file.out > # dd if=file.in of=file.out bs=1M conv=sparse,notrunc > # xfs_bmap -v file.out > file.out: > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL > 0: [0..2047]: 9773944..9775991 1 (9080..11127) 2048 > 1: [2048..4095]: hole 2048 > 2: [4096..6143]: 9778040..9780087 1 (13176..15223) 2048 > > Hope that helps. Excellent info thanks. With that I can adjust the test so it passes (patch attached). So for reference this means that cp can no longer recreate holes <= 1MiB from source to dest (with the default XFS allocation size): $ cp --sparse=always file.in cp.out $ xfs_bmap -v !$ xfs_bmap -v cp.out cp.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..3967]: 219104..223071 0 (219104..223071) 3968 1: [3968..4095]: hole 128 2: [4096..6143]: 225720..227767 0 (225720..227767) 2048 $ xfs_bmap -v file.out file.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..2047]: 229816..231863 0 (229816..231863) 2048 1: [2048..4095]: hole 2048 2: [4096..6143]: 233912..235959 0 (233912..235959) 2048 $ cp file.out cp.out $ xfs_bmap -v cp.out cp.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..3967]: 250296..254263 0 (250296..254263) 3968 1: [3968..4095]: hole 128 2: [4096..6143]: 254392..256439 0 (254392..256439) 2048 Though if we bump up the hole size the representation is better: $ dd if=/dev/urandom of=bigfile.in bs=1M count=1 iflag=fullblock $ truncate -s+10M bigfile.in $ dd if=/dev/urandom of=bigfile.in bs=1M count=1 iflag=fullblock conv=notrunc oflag=append $ xfs_bmap -v bigfile.in bigfile.in: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..2047]: 231864..233911 0 (231864..233911) 2048 1: [2048..22527]: hole 20480 2: [22528..24575]: 256440..258487 0 (256440..258487) 2048 $ cp bigfile.in bigfile.out $ xfs_bmap -v bigfile.out bigfile.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..3967]: 260408..264375 0 (260408..264375) 3968 1: [3968..22527]: hole 18560 2: [22528..24575]: 264376..266423 0 (264376..266423) 2048 We could I suppose use FALLOC_FL_PUNCH_HOLE where available to cater for this case. I'll see whether this is worth adding. That can be used after the fact anyway: $ fallocate --dig-holes bigfile.out $ xfs_bmap -v bigfile.out bigfile.out: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..2047]: 260408..262455 0 (260408..262455) 2048 1: [2048..22527]: hole 20480 2: [22528..24575]: 264376..266423 0 (264376..266423) 2048 thanks, Pádraig. --------------050606000501010005080301 Content-Type: text/x-patch; name="dd-sparse-xfs.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="dd-sparse-xfs.patch" >From 7c03fe2c9f498bad7e40d29f2eb4573d23e102d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Fri, 11 Apr 2014 23:44:13 +0100 Subject: [PATCH] tests: fix false dd conv=sparse failure on newer XFS * tests/dd/sparse.sh: When testing that a hole is created, use an existing sparse destination file, so that we're not write extending the file size, and thus avoiding speculative preallocation which can result in smaller holes than requested. Workaround suggested by Brian Foster --- THANKS.in | 1 + tests/dd/sparse.sh | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletions(-) diff --git a/THANKS.in b/THANKS.in index e7298ef..a92540a 100644 --- a/THANKS.in +++ b/THANKS.in @@ -95,6 +95,7 @@ Bjorn Helgaas helgaas@rsn.hp.com Bob McCracken kerouac@ravenet.com Branden Robinson branden@necrotic.deadbeast.net Brendan O'Dea bod@compusol.com.au +Brian Foster bfoster@redhat.com Brian Kimball bfk@footbag.org Brian M. Carlson sandals@crustytoothpaste.ath.cx Brian Silverman bsilverman@conceptxdesign.com diff --git a/tests/dd/sparse.sh b/tests/dd/sparse.sh index 06efc70..a7e90d2 100755 --- a/tests/dd/sparse.sh +++ b/tests/dd/sparse.sh @@ -61,8 +61,15 @@ if test $(kb_alloc file.in) -gt 3000; then dd if=file.in of=file.out bs=2M conv=sparse test 2500 -lt $(kb_alloc file.out) || fail=1 + # Note we recreate a sparse file first to avoid + # speculative preallocation seen in XFS, where a write() that + # extends a file can preallocate some extra space that + # a subsequent seek will not convert to a hole. + rm -f file.out + truncate --size=3M file.out + # Ensure that this 1MiB string of NULs *is* converted to a hole. - dd if=file.in of=file.out bs=1M conv=sparse + dd if=file.in of=file.out bs=1M conv=sparse,notrunc test $(kb_alloc file.out) -lt 2500 || fail=1 fi -- 1.7.7.6 --------------050606000501010005080301-- From sandeen@sandeen.net Fri Apr 11 18:05:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 357AB7F50 for ; Fri, 11 Apr 2014 18:05:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4EACAC003 for ; Fri, 11 Apr 2014 16:05:52 -0700 (PDT) X-ASG-Debug-ID: 1397257549-04cbb00dc512eac0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TPwsA0pzXBMG7GGD for ; Fri, 11 Apr 2014 16:05:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7345063C5FC1; Fri, 11 Apr 2014 18:05:49 -0500 (CDT) Message-ID: <5348754D.9010109@sandeen.net> Date: Fri, 11 Apr 2014 18:05:49 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: =?UTF-8?B?UMOhZHJhaWcgQnJhZHk=?= , Brian Foster CC: Coreutils , =?UTF-8?B?T25kxZllaiBWYcWhw61r?= , xfs-oss Subject: Re: Strange hole creation behavior References: <534822D7.7090803@draigBrady.com> <20140411204338.GA38024@bfoster.bfoster> <53487383.6040001@draigBrady.com> X-ASG-Orig-Subj: Re: Strange hole creation behavior In-Reply-To: <53487383.6040001@draigBrady.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397257549 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/11/14, 5:58 PM, Pádraig Brady wrote: > On 04/11/2014 09:43 PM, Brian Foster wrote: >> On Fri, Apr 11, 2014 at 06:13:59PM +0100, Pádraig Brady wrote: >>> So this coreutils test is failing on XFS: >>> http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=blob;f=tests/dd/sparse.sh;h=06efc7017 >>> Specifically the last hole check on line 66. >>> >>> In summary what's happening is that a write(1MiB), lseek(1MiB), write(1MiB) >>> creates only a 64KiB hole. Is that expected? >>> >> >> This is expected behavior due to speculative preallocation. An FAQ with >> regard to this behavior is pending, but see here for reference: >> >> http://oss.sgi.com/archives/xfs/2014-04/msg00083.html >> >> In that particular write(1MB), lseek(+1MB), write(1MB) workload, each >> write is preallocating some extra space beyond the current EOF. The seek >> then moves past that space, but the space doesn't go away. The >> subsequent writes will extend EOF. The previously preallocated space now >> resides in the middle of the file and can't be trimmed away when the >> file is closed. >> >>> Now a 1MiB hole is supported using truncate: >>> dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock >>> truncate -s+1M file.in >>> dd if=/dev/urandom of=file.in bs=1M count=1 iflag=fullblock conv=notrunc oflag=append >>> $ du -k file.in >>> 2048 file.in >>> >> >> This works simply because it is broken into multiple commands. When the >> first dd exits, the excess space is trimmed off (the file descriptor is >> closed). The subsequent truncate extends the file size without any >> extra space getting caught between the old and new EOF. >> >> You can confirm this by using the 'allocsize=4k' mount option to the XFS >> mount. If you wanted something more generic for the purpose of testing >> the coreutils functionality, you could also set the size of file.out in >> advance. E.g., with preallocation in effect: >> >> # dd if=file.in of=file.out bs=1M conv=sparse >> # xfs_bmap -v file.out >> file.out: >> EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL >> 0: [0..3967]: 9773944..9777911 1 (9080..13047) 3968 >> 1: [3968..4095]: hole 128 >> 2: [4096..6143]: 9778040..9780087 1 (13176..15223) 2048 >> >> ... and then prevent preallocation by ensuring writes do not extend the >> file: >> >> # rm -f file.out >> # truncate --size=3M file.out >> # dd if=file.in of=file.out bs=1M conv=sparse,notrunc >> # xfs_bmap -v file.out >> file.out: >> EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL >> 0: [0..2047]: 9773944..9775991 1 (9080..11127) 2048 >> 1: [2048..4095]: hole 2048 >> 2: [4096..6143]: 9778040..9780087 1 (13176..15223) 2048 >> >> Hope that helps. > > Excellent info thanks. > With that I can adjust the test so it passes (patch attached). > > So for reference this means that cp can no longer recreate holes > <= 1MiB from source to dest (with the default XFS allocation size): Well, the allocation size changes based on the filesize; there's a heuristic involved. So I fear that if you hard-code it into your tests, you risk failing again in the future... > We could I suppose use FALLOC_FL_PUNCH_HOLE where available > to cater for this case. I'll see whether this is worth adding. That might make sense. But filesystems get to pick their layout; even ext4 may opportunistically fill in holes, etc - so I think you need to be pretty careful with these sorts of tests... -Eric From david@fromorbit.com Fri Apr 11 18:23:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 890B87F52 for ; Fri, 11 Apr 2014 18:23:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 750F18F8049 for ; Fri, 11 Apr 2014 16:23:23 -0700 (PDT) X-ASG-Debug-ID: 1397258600-04cbb00dc412f6f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id gp3KEae1g48bBWCi for ; Fri, 11 Apr 2014 16:23:21 -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: AqBYAO54SFN5LEcvPGdsb2JhbABZgwaDToULu1yBHBcDAQEBATg1giUBAQEEOhwjEAgDFQMJJQ8FJQMHGhOHe8tMFxaOVgeDJIEUBJhflgYr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Apr 2014 08:53:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WYkmz-00028E-IU; Sat, 12 Apr 2014 09:23:17 +1000 Date: Sat, 12 Apr 2014 09:23:17 +1000 From: Dave Chinner To: Miklos Szeredi Cc: xfs@oss.sgi.com, Miklos Szeredi Subject: Re: [PATCH 1/4] renameat2 syscall: add infrastructure Message-ID: <20140411232317.GA27694@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] renameat2 syscall: add infrastructure References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> 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: 1397258600 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 11, 2014 at 05:51:54PM +0200, Miklos Szeredi wrote: > From: Miklos Szeredi > > The renameat2() syscall was merged into 3.15-rc (merge commit: 7df934526c0b). > > This adds the shared infrastructure for the actual test scripts. > > Signed-off-by: Miklos Szeredi Hi Miklos, all 4 patches look good now, so I'll pull them in with the next round of xfstests updates. I'll let ou know if there are any other problems I find. Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 02:59:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 25DFB7F4E for ; Sat, 12 Apr 2014 02:59:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14156304062 for ; Sat, 12 Apr 2014 00:59:57 -0700 (PDT) X-ASG-Debug-ID: 1397289595-04cbb00dc4146d60001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id LCFQXepG2Sw80PRy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:56 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqw-0006GG-Vp for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:55 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/9] xfs: handle duplicate entries in xfs_mru_cache_insert Date: Sat, 12 Apr 2014 10:01:57 +0200 X-ASG-Orig-Subj: [PATCH 3/9] xfs: handle duplicate entries in xfs_mru_cache_insert Message-Id: <1397289723-26243-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289595 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The radix tree code can detect and reject duplicate keys at insert time. Make xfs_mru_cache_insert handle this case so that future changes to the filestream allocator can take advantage of this. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_mru_cache.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c index 4aff563..4aa3166 100644 --- a/fs/xfs/xfs_mru_cache.c +++ b/fs/xfs/xfs_mru_cache.c @@ -443,6 +443,7 @@ xfs_mru_cache_insert( void *value) { xfs_mru_cache_elem_t *elem; + int error; ASSERT(mru && mru->lists); if (!mru || !mru->lists) @@ -453,8 +454,8 @@ xfs_mru_cache_insert( return ENOMEM; if (radix_tree_preload(GFP_KERNEL)) { - kmem_zone_free(xfs_mru_elem_zone, elem); - return ENOMEM; + error = ENOMEM; + goto out_free_item; } INIT_LIST_HEAD(&elem->list_node); @@ -463,13 +464,20 @@ xfs_mru_cache_insert( spin_lock(&mru->lock); - radix_tree_insert(&mru->store, key, elem); + error = -radix_tree_insert(&mru->store, key, elem); radix_tree_preload_end(); + if (error) { + spin_unlock(&mru->lock); + goto out_free_item; + } _xfs_mru_cache_list_insert(mru, elem); spin_unlock(&mru->lock); return 0; +out_free_item: + kmem_zone_free(xfs_mru_elem_zone, elem); + return error; } /* -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 02:59:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2801D7F51 for ; Sat, 12 Apr 2014 02:59:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B9A98F8039 for ; Sat, 12 Apr 2014 00:59:54 -0700 (PDT) X-ASG-Debug-ID: 1397289592-04cbb00dc3146d40001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id ZD8NI4TPP5aGY16l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqu-0006G7-6A for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:52 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/9] xfs: don't try to use the filestream allocator for metadata allocations Date: Sat, 12 Apr 2014 10:01:55 +0200 X-ASG-Orig-Subj: [PATCH 1/9] xfs: don't try to use the filestream allocator for metadata allocations Message-Id: <1397289723-26243-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289593 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_bmap_btalloc_nullfb has two entirely different control flows when using the filestream allocator vs the regular one, but it get the conditionals wrong and ends up mixing the two for metadata allocations. Fix this by adding a missing userdata check and slight refactoring. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_bmap.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index f0efc7e..3340f0e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -3566,33 +3566,31 @@ xfs_bmap_btalloc_nullfb( } else notinit = 1; - if (xfs_inode_is_filestream(ap->ip)) { + if (xfs_inode_is_filestream(ap->ip) && ap->userdata) { if (*blen >= args->maxlen) break; - 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 == NULLAGNUMBER) - break; + /* + * 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 == NULLAGNUMBER) + break; - error = xfs_filestream_new_ag(ap, &ag); - xfs_perag_put(pag); - if (error) - return error; + error = xfs_filestream_new_ag(ap, &ag); + xfs_perag_put(pag); + if (error) + return error; - /* loop again to set 'blen'*/ - startag = NULLAGNUMBER; - pag = xfs_perag_get(mp, ag); - continue; - } + /* loop again to set 'blen'*/ + startag = NULLAGNUMBER; + pag = xfs_perag_get(mp, ag); + continue; } if (++ag == mp->m_sb.sb_agcount) ag = 0; -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 02:59:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 848817F50 for ; Sat, 12 Apr 2014 02:59:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F6FBAC003 for ; Sat, 12 Apr 2014 00:59:53 -0700 (PDT) X-ASG-Debug-ID: 1397289591-04cbb00dc4146d40001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id uopAH8Lw57CNB2WX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:52 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqt-0006G3-2G for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:51 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: filestream allocator rewrite Date: Sat, 12 Apr 2014 10:01:54 +0200 X-ASG-Orig-Subj: filestream allocator rewrite Message-Id: <1397289723-26243-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289592 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This series is a major overhaul of the filestream allocator. The main point is to use the dcache to get the parent and avoiding to maintain a fstrm_item for each inode that the filestream is applied to in favor of just tracking the parent, but there's various more or less related fallout from this as well. From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 656607F53 for ; Sat, 12 Apr 2014 03:00:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 68E588F8039 for ; Sat, 12 Apr 2014 01:00:01 -0700 (PDT) X-ASG-Debug-ID: 1397289599-04cb6c77b5139be0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id vedx7jJGKJaFTNAs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsr0-0006GW-SO for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:58 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 7/9] xfs: don't create a slab cache for filestream items Date: Sat, 12 Apr 2014 10:02:01 +0200 X-ASG-Orig-Subj: [PATCH 7/9] xfs: don't create a slab cache for filestream items Message-Id: <1397289723-26243-8-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289599 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We only have very few of these around, and allocation isn't that much of a hot path. Remove the slab cache to simplify the code, and to not waste any resources for the usual case of not having any inodes that use the filestream allocator. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_filestream.c | 25 +++---------------------- fs/xfs/xfs_filestream.h | 2 -- fs/xfs/xfs_super.c | 9 +-------- 3 files changed, 4 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index ff6f902..7b94036 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -39,8 +39,6 @@ #define TRACE_FREE(mp, ip, pip, ag, cnt) #define TRACE_LOOKUP(mp, ip, pip, ag, cnt) -static kmem_zone_t *item_zone; - struct xfs_fstrm_item { struct xfs_mru_cache_elem mru; struct xfs_inode *ip; @@ -141,7 +139,7 @@ xfs_fstrm_free_func( TRACE_FREE(mp, ip, NULL, item->ag, xfs_filestream_peek_ag(mp, item->ag)); - kmem_zone_free(item_zone, item); + kmem_free(item); } /* @@ -272,7 +270,7 @@ next_ag: return 0; err = ENOMEM; - item = kmem_zone_zalloc(item_zone, KM_MAYFAIL); + item = kmem_alloc(sizeof(*item), KM_MAYFAIL); if (!item) goto out_put_ag; @@ -289,7 +287,7 @@ next_ag: return 0; out_free_item: - kmem_zone_free(item_zone, item); + kmem_free(item); out_put_ag: xfs_filestream_put_ag(mp, *agp); return err; @@ -474,20 +472,3 @@ xfs_filestream_unmount( { xfs_mru_cache_destroy(mp->m_filestream); } - - -/* needs to return a positive errno for the init path */ -int -xfs_filestream_init(void) -{ - item_zone = kmem_zone_init(sizeof(struct xfs_fstrm_item), "fstrm_item"); - if (!item_zone) - return -ENOMEM; - return 0; -} - -void -xfs_filestream_uninit(void) -{ - kmem_zone_destroy(item_zone); -} diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index e3a25f8..578d49e 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -22,8 +22,6 @@ struct xfs_mount; struct xfs_inode; struct xfs_bmalloca; -int xfs_filestream_init(void); -void xfs_filestream_uninit(void); int xfs_filestream_mount(struct xfs_mount *mp); void xfs_filestream_unmount(struct xfs_mount *mp); void xfs_filestream_deassociate(struct xfs_inode *ip); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f317488..aab37af 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1753,13 +1753,9 @@ init_xfs_fs(void) if (error) goto out_destroy_wq; - error = xfs_filestream_init(); - if (error) - goto out_mru_cache_uninit; - error = xfs_buf_init(); if (error) - goto out_filestream_uninit; + goto out_mru_cache_uninit; error = xfs_init_procfs(); if (error) @@ -1786,8 +1782,6 @@ init_xfs_fs(void) xfs_cleanup_procfs(); out_buf_terminate: xfs_buf_terminate(); - out_filestream_uninit: - xfs_filestream_uninit(); out_mru_cache_uninit: xfs_mru_cache_uninit(); out_destroy_wq: @@ -1806,7 +1800,6 @@ exit_xfs_fs(void) xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); - xfs_filestream_uninit(); xfs_mru_cache_uninit(); xfs_destroy_workqueues(); xfs_destroy_zones(); -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B9737F5F for ; Sat, 12 Apr 2014 03:00:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B33430407F for ; Sat, 12 Apr 2014 01:00:01 -0700 (PDT) X-ASG-Debug-ID: 1397289597-04bdf07dcc141f90001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id GRbGXdB8TzG7TdUc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqz-0006GO-0e for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:57 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 5/9] xfs: remove XFS_IFILESTREAM Date: Sat, 12 Apr 2014 10:01:59 +0200 X-ASG-Orig-Subj: [PATCH 5/9] xfs: remove XFS_IFILESTREAM Message-Id: <1397289723-26243-6-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289597 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We never test the flag except in xfs_inode_is_filestream, but that function already tests the on-disk flag or filesystem wide flags, and is used to decide if we want to set XFS_IFILESTREAM in the first place. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_filestream.c | 2 -- fs/xfs/xfs_filestream.h | 1 - fs/xfs/xfs_inode.c | 2 -- fs/xfs/xfs_inode.h | 4 +--- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index dde529f..c422110 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -430,8 +430,6 @@ xfs_fstrm_free_func( container_of(mru, fstrm_item_t, mru); xfs_inode_t *ip = item->ip; - xfs_iflags_clear(ip, XFS_IFILESTREAM); - /* Drop the reference taken on the AG when the item was added. */ xfs_filestream_put_ag(ip->i_mount, item->ag); diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index 6d61dbe..c4fa9a0 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -63,7 +63,6 @@ xfs_inode_is_filestream( struct xfs_inode *ip) { return (ip->i_mount->m_flags & XFS_MOUNT_FILESTREAMS) || - xfs_iflags_test(ip, XFS_IFILESTREAM) || (ip->i_d.di_flags & XFS_DIFLAG_FILESTREAM); } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5e7a38f..3328320 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -849,8 +849,6 @@ xfs_ialloc( error = xfs_filestream_associate(pip, ip); if (error < 0) return -error; - if (!error) - xfs_iflags_set(ip, XFS_IFILESTREAM); } *ipp = ip; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 396cc1f..a7c2ebf 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -209,7 +209,6 @@ xfs_get_initial_prid(struct xfs_inode *dp) #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 */ @@ -225,8 +224,7 @@ xfs_get_initial_prid(struct xfs_inode *dp) */ #define XFS_IRECLAIM_RESET_FLAGS \ (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ - XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \ - XFS_IFILESTREAM); + XFS_IDIRTY_RELEASE | XFS_ITRUNCATED) /* * Synchronize processes attempting to flush the in-core inode back to disk. -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4805B7F5E for ; Sat, 12 Apr 2014 03:00:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 030D3304062 for ; Sat, 12 Apr 2014 01:00:02 -0700 (PDT) X-ASG-Debug-ID: 1397289596-04bdf07dca141f80001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id akY1OEOXRm58Oru6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqy-0006GK-1H for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:56 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/9] xfs: embedd mru_elem into parent structure Date: Sat, 12 Apr 2014 10:01:58 +0200 X-ASG-Orig-Subj: [PATCH 4/9] xfs: embedd mru_elem into parent structure Message-Id: <1397289723-26243-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289597 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- There is no need to do a separate allocation for each mru element, just embedd the structure into the parent one in the user. Besides saving a memory allocation and the infrastructure required for it this also simplifies the API. While we do major surgery on xfs_mru_cache.c also de-typedef it and make struct mru_cache private to the implementation file. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_filestream.c | 67 ++++++++++---------- fs/xfs/xfs_mru_cache.c | 155 +++++++++++++++++++---------------------------- fs/xfs/xfs_mru_cache.h | 31 ++++------ 3 files changed, 107 insertions(+), 146 deletions(-) diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 12b6e77..dde529f 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -118,6 +118,7 @@ static kmem_zone_t *item_zone; */ typedef struct fstrm_item { + struct xfs_mru_cache_elem mru; xfs_agnumber_t ag; /* AG currently in use for the file/directory. */ xfs_inode_t *ip; /* inode self-pointer. */ xfs_inode_t *pip; /* Parent directory inode pointer. */ @@ -335,10 +336,10 @@ _xfs_filestream_update_ag( { int err = 0; xfs_mount_t *mp; - xfs_mru_cache_t *cache; fstrm_item_t *item; xfs_agnumber_t old_ag; xfs_inode_t *old_pip; + struct xfs_mru_cache_elem *mru; /* * Either ip is a regular file and pip is a directory, or ip is a @@ -349,16 +350,17 @@ _xfs_filestream_update_ag( (S_ISDIR(ip->i_d.di_mode) && !pip))); mp = ip->i_mount; - cache = mp->m_filestream; - item = xfs_mru_cache_lookup(cache, ip->i_ino); - if (item) { + mru = xfs_mru_cache_lookup(mp->m_filestream, ip->i_ino); + if (mru) { + item = container_of(mru, fstrm_item_t, mru); + ASSERT(item->ip == ip); old_ag = item->ag; item->ag = ag; old_pip = item->pip; item->pip = pip; - xfs_mru_cache_done(cache); + xfs_mru_cache_done(mp->m_filestream); /* * If the AG has changed, drop the old ref and take a new one, @@ -391,7 +393,7 @@ _xfs_filestream_update_ag( item->ip = ip; item->pip = pip; - err = xfs_mru_cache_insert(cache, ip->i_ino, item); + err = xfs_mru_cache_insert(mp->m_filestream, ip->i_ino, &item->mru); if (err) { kmem_zone_free(item_zone, item); return err; @@ -422,14 +424,12 @@ _xfs_filestream_update_ag( /* xfs_fstrm_free_func(): callback for freeing cached stream items. */ STATIC void xfs_fstrm_free_func( - unsigned long ino, - void *data) + struct xfs_mru_cache_elem *mru) { - fstrm_item_t *item = (fstrm_item_t *)data; + fstrm_item_t *item = + container_of(mru, fstrm_item_t, mru); xfs_inode_t *ip = item->ip; - ASSERT(ip->i_ino == ino); - xfs_iflags_clear(ip, XFS_IFILESTREAM); /* Drop the reference taken on the AG when the item was added. */ @@ -532,7 +532,8 @@ xfs_agnumber_t xfs_filestream_lookup_ag( xfs_inode_t *ip) { - xfs_mru_cache_t *cache; + struct xfs_mount *mp = ip->i_mount; + struct xfs_mru_cache_elem *mru; fstrm_item_t *item; xfs_agnumber_t ag; int ref; @@ -542,17 +543,17 @@ xfs_filestream_lookup_ag( return NULLAGNUMBER; } - cache = ip->i_mount->m_filestream; - item = xfs_mru_cache_lookup(cache, ip->i_ino); - if (!item) { + mru = xfs_mru_cache_lookup(mp->m_filestream, ip->i_ino); + if (!mru) { TRACE_LOOKUP(ip->i_mount, ip, NULL, NULLAGNUMBER, 0); return NULLAGNUMBER; } + item = container_of(mru, fstrm_item_t, mru); ASSERT(ip == item->ip); ag = item->ag; ref = xfs_filestream_peek_ag(ip->i_mount, ag); - xfs_mru_cache_done(cache); + xfs_mru_cache_done(mp->m_filestream); TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, ref); return ag; @@ -573,8 +574,8 @@ xfs_filestream_associate( xfs_inode_t *pip, xfs_inode_t *ip) { + struct xfs_mru_cache_elem *mru; xfs_mount_t *mp; - xfs_mru_cache_t *cache; fstrm_item_t *item; xfs_agnumber_t ag, rotorstep, startag; int err = 0; @@ -585,7 +586,6 @@ xfs_filestream_associate( return -EINVAL; mp = pip->i_mount; - cache = mp->m_filestream; /* * We have a problem, Houston. @@ -606,11 +606,13 @@ xfs_filestream_associate( return 1; /* If the parent directory is already in the cache, use its AG. */ - item = xfs_mru_cache_lookup(cache, pip->i_ino); - if (item) { + mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); + if (mru) { + item = container_of(mru, fstrm_item_t, mru); + ASSERT(item->ip == pip); ag = item->ag; - xfs_mru_cache_done(cache); + xfs_mru_cache_done(mp->m_filestream); TRACE_LOOKUP(mp, pip, pip, ag, xfs_filestream_peek_ag(mp, ag)); err = _xfs_filestream_update_ag(ip, pip, ag); @@ -671,17 +673,16 @@ xfs_filestream_new_ag( struct xfs_bmalloca *ap, xfs_agnumber_t *agp) { + struct xfs_mru_cache_elem *mru, *mru2; int flags, err; xfs_inode_t *ip, *pip = NULL; xfs_mount_t *mp; - xfs_mru_cache_t *cache; xfs_extlen_t minlen; fstrm_item_t *dir, *file; xfs_agnumber_t ag = NULLAGNUMBER; ip = ap->ip; mp = ip->i_mount; - cache = mp->m_filestream; minlen = ap->length; *agp = NULLAGNUMBER; @@ -689,8 +690,9 @@ xfs_filestream_new_ag( * Look for the file in the cache, removing it if it's found. Doing * this allows it to be held across the dir lookup that follows. */ - file = xfs_mru_cache_remove(cache, ip->i_ino); - if (file) { + mru = xfs_mru_cache_remove(mp->m_filestream, ip->i_ino); + if (mru) { + file = container_of(mru, fstrm_item_t, mru); ASSERT(ip == file->ip); /* Save the file's parent inode and old AG number for later. */ @@ -698,8 +700,9 @@ xfs_filestream_new_ag( ag = file->ag; /* Look for the file's directory in the cache. */ - dir = xfs_mru_cache_lookup(cache, pip->i_ino); - if (dir) { + mru2 = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); + if (mru2) { + dir = container_of(mru2, fstrm_item_t, mru); ASSERT(pip == dir->ip); /* @@ -714,7 +717,7 @@ xfs_filestream_new_ag( *agp = file->ag = dir->ag; } - xfs_mru_cache_done(cache); + xfs_mru_cache_done(mp->m_filestream); } /* @@ -722,9 +725,9 @@ xfs_filestream_new_ag( * function needs to be called to tidy up in the same way as if * the item had simply expired from the cache. */ - err = xfs_mru_cache_insert(cache, ip->i_ino, file); + err = xfs_mru_cache_insert(mp->m_filestream, ip->i_ino, mru); if (err) { - xfs_fstrm_free_func(ip->i_ino, file); + xfs_fstrm_free_func(mru); return err; } @@ -818,7 +821,5 @@ void xfs_filestream_deassociate( xfs_inode_t *ip) { - xfs_mru_cache_t *cache = ip->i_mount->m_filestream; - - xfs_mru_cache_delete(cache, ip->i_ino); + xfs_mru_cache_delete(ip->i_mount->m_filestream, ip->i_ino); } diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c index 4aa3166..f99b493 100644 --- a/fs/xfs/xfs_mru_cache.c +++ b/fs/xfs/xfs_mru_cache.c @@ -100,14 +100,20 @@ * likely result in a loop in one of the lists. That's a sure-fire recipe for * an infinite loop in the code. */ -typedef struct xfs_mru_cache_elem -{ - struct list_head list_node; - unsigned long key; - void *value; -} xfs_mru_cache_elem_t; +struct xfs_mru_cache { + struct radix_tree_root store; /* Core storage data structure. */ + struct list_head *lists; /* Array of lists, one per grp. */ + struct list_head reap_list; /* Elements overdue for reaping. */ + spinlock_t lock; /* Lock to protect this struct. */ + unsigned int grp_count; /* Number of discrete groups. */ + unsigned int grp_time; /* Time period spanned by grps. */ + unsigned int lru_grp; /* Group containing time zero. */ + unsigned long time_zero; /* Time first element was added. */ + xfs_mru_cache_free_func_t free_func; /* Function pointer for freeing. */ + struct delayed_work work; /* Workqueue data for reaping. */ + unsigned int queued; /* work has been queued */ +}; -static kmem_zone_t *xfs_mru_elem_zone; static struct workqueue_struct *xfs_mru_reap_wq; /* @@ -129,12 +135,12 @@ static struct workqueue_struct *xfs_mru_reap_wq; */ STATIC unsigned long _xfs_mru_cache_migrate( - xfs_mru_cache_t *mru, - unsigned long now) + struct xfs_mru_cache *mru, + unsigned long now) { - unsigned int grp; - unsigned int migrated = 0; - struct list_head *lru_list; + unsigned int grp; + unsigned int migrated = 0; + struct list_head *lru_list; /* Nothing to do if the data store is empty. */ if (!mru->time_zero) @@ -193,11 +199,11 @@ _xfs_mru_cache_migrate( */ STATIC void _xfs_mru_cache_list_insert( - xfs_mru_cache_t *mru, - xfs_mru_cache_elem_t *elem) + struct xfs_mru_cache *mru, + struct xfs_mru_cache_elem *elem) { - unsigned int grp = 0; - unsigned long now = jiffies; + unsigned int grp = 0; + unsigned long now = jiffies; /* * If the data store is empty, initialise time zero, leave grp set to @@ -231,10 +237,10 @@ _xfs_mru_cache_list_insert( */ STATIC void _xfs_mru_cache_clear_reap_list( - xfs_mru_cache_t *mru) __releases(mru->lock) __acquires(mru->lock) - + struct xfs_mru_cache *mru) + __releases(mru->lock) __acquires(mru->lock) { - xfs_mru_cache_elem_t *elem, *next; + struct xfs_mru_cache_elem *elem, *next; struct list_head tmp; INIT_LIST_HEAD(&tmp); @@ -252,15 +258,8 @@ _xfs_mru_cache_clear_reap_list( spin_unlock(&mru->lock); list_for_each_entry_safe(elem, next, &tmp, list_node) { - - /* Remove the element from the reap list. */ list_del_init(&elem->list_node); - - /* Call the client's free function with the key and value pointer. */ - mru->free_func(elem->key, elem->value); - - /* Free the element structure. */ - kmem_zone_free(xfs_mru_elem_zone, elem); + mru->free_func(elem); } spin_lock(&mru->lock); @@ -277,7 +276,8 @@ STATIC void _xfs_mru_cache_reap( struct work_struct *work) { - xfs_mru_cache_t *mru = container_of(work, xfs_mru_cache_t, work.work); + struct xfs_mru_cache *mru = + container_of(work, struct xfs_mru_cache, work.work); unsigned long now, next; ASSERT(mru && mru->lists); @@ -304,28 +304,16 @@ _xfs_mru_cache_reap( int xfs_mru_cache_init(void) { - xfs_mru_elem_zone = kmem_zone_init(sizeof(xfs_mru_cache_elem_t), - "xfs_mru_cache_elem"); - if (!xfs_mru_elem_zone) - goto out; - xfs_mru_reap_wq = alloc_workqueue("xfs_mru_cache", WQ_MEM_RECLAIM, 1); if (!xfs_mru_reap_wq) - goto out_destroy_mru_elem_zone; - + return -ENOMEM; return 0; - - out_destroy_mru_elem_zone: - kmem_zone_destroy(xfs_mru_elem_zone); - out: - return -ENOMEM; } void xfs_mru_cache_uninit(void) { destroy_workqueue(xfs_mru_reap_wq); - kmem_zone_destroy(xfs_mru_elem_zone); } /* @@ -336,14 +324,14 @@ xfs_mru_cache_uninit(void) */ int xfs_mru_cache_create( - xfs_mru_cache_t **mrup, + struct xfs_mru_cache **mrup, unsigned int lifetime_ms, unsigned int grp_count, xfs_mru_cache_free_func_t free_func) { - xfs_mru_cache_t *mru = NULL; - int err = 0, grp; - unsigned int grp_time; + struct xfs_mru_cache *mru = NULL; + int err = 0, grp; + unsigned int grp_time; if (mrup) *mrup = NULL; @@ -400,7 +388,7 @@ exit: */ static void xfs_mru_cache_flush( - xfs_mru_cache_t *mru) + struct xfs_mru_cache *mru) { if (!mru || !mru->lists) return; @@ -420,7 +408,7 @@ xfs_mru_cache_flush( void xfs_mru_cache_destroy( - xfs_mru_cache_t *mru) + struct xfs_mru_cache *mru) { if (!mru || !mru->lists) return; @@ -438,45 +426,29 @@ xfs_mru_cache_destroy( */ int xfs_mru_cache_insert( - xfs_mru_cache_t *mru, - unsigned long key, - void *value) + struct xfs_mru_cache *mru, + unsigned long key, + struct xfs_mru_cache_elem *elem) { - xfs_mru_cache_elem_t *elem; - int error; + int error; ASSERT(mru && mru->lists); if (!mru || !mru->lists) return EINVAL; - elem = kmem_zone_zalloc(xfs_mru_elem_zone, KM_SLEEP); - if (!elem) + if (radix_tree_preload(GFP_KERNEL)) return ENOMEM; - if (radix_tree_preload(GFP_KERNEL)) { - error = ENOMEM; - goto out_free_item; - } - INIT_LIST_HEAD(&elem->list_node); elem->key = key; - elem->value = value; spin_lock(&mru->lock); - error = -radix_tree_insert(&mru->store, key, elem); radix_tree_preload_end(); - if (error) { - spin_unlock(&mru->lock); - goto out_free_item; - } - _xfs_mru_cache_list_insert(mru, elem); - + if (!error) + _xfs_mru_cache_list_insert(mru, elem); spin_unlock(&mru->lock); - return 0; -out_free_item: - kmem_zone_free(xfs_mru_elem_zone, elem); return error; } @@ -486,13 +458,12 @@ out_free_item: * the client data pointer for the removed element is returned, otherwise this * function will return a NULL pointer. */ -void * +struct xfs_mru_cache_elem * xfs_mru_cache_remove( - xfs_mru_cache_t *mru, - unsigned long key) + struct xfs_mru_cache *mru, + unsigned long key) { - xfs_mru_cache_elem_t *elem; - void *value = NULL; + struct xfs_mru_cache_elem *elem; ASSERT(mru && mru->lists); if (!mru || !mru->lists) @@ -500,17 +471,11 @@ xfs_mru_cache_remove( spin_lock(&mru->lock); elem = radix_tree_delete(&mru->store, key); - if (elem) { - value = elem->value; + if (elem) list_del(&elem->list_node); - } - spin_unlock(&mru->lock); - if (elem) - kmem_zone_free(xfs_mru_elem_zone, elem); - - return value; + return elem; } /* @@ -519,13 +484,14 @@ xfs_mru_cache_remove( */ void xfs_mru_cache_delete( - xfs_mru_cache_t *mru, - unsigned long key) + struct xfs_mru_cache *mru, + unsigned long key) { - void *value = xfs_mru_cache_remove(mru, key); + struct xfs_mru_cache_elem *elem; - if (value) - mru->free_func(key, value); + elem = xfs_mru_cache_remove(mru, key); + if (elem) + mru->free_func(elem); } /* @@ -548,12 +514,12 @@ xfs_mru_cache_delete( * status, we need to help it get it right by annotating the path that does * not release the lock. */ -void * +struct xfs_mru_cache_elem * xfs_mru_cache_lookup( - xfs_mru_cache_t *mru, - unsigned long key) + struct xfs_mru_cache *mru, + unsigned long key) { - xfs_mru_cache_elem_t *elem; + struct xfs_mru_cache_elem *elem; ASSERT(mru && mru->lists); if (!mru || !mru->lists) @@ -568,7 +534,7 @@ xfs_mru_cache_lookup( } else spin_unlock(&mru->lock); - return elem ? elem->value : NULL; + return elem; } /* @@ -578,7 +544,8 @@ xfs_mru_cache_lookup( */ void xfs_mru_cache_done( - xfs_mru_cache_t *mru) __releases(mru->lock) + struct xfs_mru_cache *mru) + __releases(mru->lock) { spin_unlock(&mru->lock); } diff --git a/fs/xfs/xfs_mru_cache.h b/fs/xfs/xfs_mru_cache.h index 36dd3ec..fb5245b 100644 --- a/fs/xfs/xfs_mru_cache.h +++ b/fs/xfs/xfs_mru_cache.h @@ -18,24 +18,15 @@ #ifndef __XFS_MRU_CACHE_H__ #define __XFS_MRU_CACHE_H__ +struct xfs_mru_cache; -/* Function pointer type for callback to free a client's data pointer. */ -typedef void (*xfs_mru_cache_free_func_t)(unsigned long, void*); +struct xfs_mru_cache_elem { + struct list_head list_node; + unsigned long key; +}; -typedef struct xfs_mru_cache -{ - struct radix_tree_root store; /* Core storage data structure. */ - struct list_head *lists; /* Array of lists, one per grp. */ - struct list_head reap_list; /* Elements overdue for reaping. */ - spinlock_t lock; /* Lock to protect this struct. */ - unsigned int grp_count; /* Number of discrete groups. */ - unsigned int grp_time; /* Time period spanned by grps. */ - unsigned int lru_grp; /* Group containing time zero. */ - unsigned long time_zero; /* Time first element was added. */ - xfs_mru_cache_free_func_t free_func; /* Function pointer for freeing. */ - struct delayed_work work; /* Workqueue data for reaping. */ - unsigned int queued; /* work has been queued */ -} xfs_mru_cache_t; +/* Function pointer type for callback to free a client's data pointer. */ +typedef void (*xfs_mru_cache_free_func_t)(struct xfs_mru_cache_elem *elem); int xfs_mru_cache_init(void); void xfs_mru_cache_uninit(void); @@ -44,10 +35,12 @@ int xfs_mru_cache_create(struct xfs_mru_cache **mrup, unsigned int lifetime_ms, xfs_mru_cache_free_func_t free_func); void xfs_mru_cache_destroy(struct xfs_mru_cache *mru); int xfs_mru_cache_insert(struct xfs_mru_cache *mru, unsigned long key, - void *value); -void * xfs_mru_cache_remove(struct xfs_mru_cache *mru, unsigned long key); + struct xfs_mru_cache_elem *elem); +struct xfs_mru_cache_elem * +xfs_mru_cache_remove(struct xfs_mru_cache *mru, unsigned long key); void xfs_mru_cache_delete(struct xfs_mru_cache *mru, unsigned long key); -void *xfs_mru_cache_lookup(struct xfs_mru_cache *mru, unsigned long key); +struct xfs_mru_cache_elem * +xfs_mru_cache_lookup(struct xfs_mru_cache *mru, unsigned long key); void xfs_mru_cache_done(struct xfs_mru_cache *mru); #endif /* __XFS_MRU_CACHE_H__ */ -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 339857F53 for ; Sat, 12 Apr 2014 03:00:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE1CDAC003 for ; Sat, 12 Apr 2014 01:00:01 -0700 (PDT) X-ASG-Debug-ID: 1397289594-04bdf07dca141f70001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id IasLMdL0h6H0xT1U (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqv-0006GC-Hp for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:53 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb Date: Sat, 12 Apr 2014 10:01:56 +0200 X-ASG-Orig-Subj: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb Message-Id: <1397289723-26243-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289594 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Split xfs_bmap_btalloc_nullfb into one function for filestream allocations and one for everything else that share a few helpers. This dramatically simplifies the control flow. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_bmap.c | 200 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 117 insertions(+), 83 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 3340f0e..d5d52df 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -3517,6 +3517,67 @@ xfs_bmap_adjacent( #undef ISVALID } +static int +xfs_bmap_longest_free_extent( + struct xfs_trans *tp, + xfs_agnumber_t ag, + xfs_extlen_t *blen, + int *notinit) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_perag *pag; + xfs_extlen_t longest; + int error = 0; + + pag = xfs_perag_get(mp, ag); + if (!pag->pagf_init) { + error = xfs_alloc_pagf_init(mp, tp, ag, XFS_ALLOC_FLAG_TRYLOCK); + if (error) + goto out; + + if (!pag->pagf_init) { + *notinit = 1; + goto out; + } + } + + longest = xfs_alloc_longest_free_extent(mp, pag); + if (*blen < longest) + *blen = longest; + +out: + xfs_perag_put(pag); + return error; +} + +static void +xfs_bmap_fix_args( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + xfs_extlen_t *blen, + int notinit) +{ + if (notinit || *blen < ap->minlen) { + /* + * Since we did a BUF_TRYLOCK above, it is possible that + * there is space for this request. + */ + args->minlen = ap->minlen; + } else if (*blen < args->maxlen) { + /* + * If the best seen length is less than the request length, + * use the best as the minimum. + */ + args->minlen = *blen; + } else { + /* + * Otherwise we've seen an extent as big as maxlen, use that + * as the minimum. + */ + args->minlen = args->maxlen; + } +} + STATIC int xfs_bmap_btalloc_nullfb( struct xfs_bmalloca *ap, @@ -3524,109 +3585,74 @@ xfs_bmap_btalloc_nullfb( xfs_extlen_t *blen) { struct xfs_mount *mp = ap->ip->i_mount; - struct xfs_perag *pag; xfs_agnumber_t ag, startag; int notinit = 0; int error; - if (ap->userdata && xfs_inode_is_filestream(ap->ip)) - args->type = XFS_ALLOCTYPE_NEAR_BNO; - else - args->type = XFS_ALLOCTYPE_START_BNO; + args->type = XFS_ALLOCTYPE_START_BNO; args->total = ap->total; - /* - * 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. - */ startag = ag = XFS_FSB_TO_AGNO(mp, args->fsbno); if (startag == NULLAGNUMBER) startag = ag = 0; - pag = xfs_perag_get(mp, ag); while (*blen < args->maxlen) { - if (!pag->pagf_init) { - error = xfs_alloc_pagf_init(mp, args->tp, ag, - XFS_ALLOC_FLAG_TRYLOCK); - if (error) { - xfs_perag_put(pag); - return error; - } - } - - /* - * See xfs_alloc_fix_freelist... - */ - if (pag->pagf_init) { - xfs_extlen_t longest; - longest = xfs_alloc_longest_free_extent(mp, pag); - if (*blen < longest) - *blen = longest; - } else - notinit = 1; - - if (xfs_inode_is_filestream(ap->ip) && ap->userdata) { - if (*blen >= args->maxlen) - break; - - /* - * 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 == NULLAGNUMBER) - break; - - error = xfs_filestream_new_ag(ap, &ag); - xfs_perag_put(pag); - if (error) - return error; + error = xfs_bmap_longest_free_extent(args->tp, ag, blen, + ¬init); + if (error) + return error; - /* loop again to set 'blen'*/ - startag = NULLAGNUMBER; - pag = xfs_perag_get(mp, ag); - continue; - } if (++ag == mp->m_sb.sb_agcount) ag = 0; if (ag == startag) break; - xfs_perag_put(pag); - pag = xfs_perag_get(mp, ag); } - xfs_perag_put(pag); - /* - * 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 = 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 = *blen; - /* - * Otherwise we've seen an extent as big as maxlen, - * use that as the minimum. - */ - else - args->minlen = args->maxlen; + xfs_bmap_fix_args(ap, args, blen, notinit); + return 0; +} + +STATIC int +xfs_bmap_btalloc_filestreams( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + xfs_extlen_t *blen) +{ + struct xfs_mount *mp = ap->ip->i_mount; + xfs_agnumber_t ag; + int notinit = 0; + int error; + + args->type = XFS_ALLOCTYPE_NEAR_BNO; + args->total = ap->total; + + ag = XFS_FSB_TO_AGNO(mp, args->fsbno); + if (ag == NULLAGNUMBER) + ag = 0; + + error = xfs_bmap_longest_free_extent(args->tp, ag, blen, ¬init); + if (error) + return error; + + if (*blen < args->maxlen) { + error = xfs_filestream_new_ag(ap, &ag); + if (error) + return error; + + error = xfs_bmap_longest_free_extent(args->tp, ag, blen, + ¬init); + if (error) + return error; + + } + + xfs_bmap_fix_args(ap, args, blen, notinit); /* - * set the failure fallback case to look in the selected - * AG as the stream may have moved. + * Set the failure fallback case to look in the selected AG as stream + * may have moved. */ - if (xfs_inode_is_filestream(ap->ip)) - ap->blkno = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); - + ap->blkno = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); return 0; } @@ -3706,7 +3732,15 @@ xfs_bmap_btalloc( args.firstblock = *ap->firstblock; blen = 0; if (nullfb) { - error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); + /* + * 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. + */ + if (ap->userdata && xfs_inode_is_filestream(ap->ip)) + error = xfs_bmap_btalloc_filestreams(ap, &args, &blen); + else + error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); if (error) return error; } else if (ap->flist->xbf_low) { -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8AA0C7F60 for ; Sat, 12 Apr 2014 03:00:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A39D304062 for ; Sat, 12 Apr 2014 01:00:02 -0700 (PDT) X-ASG-Debug-ID: 1397289598-04cb6c77b4139bd0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id Dcm2ZPT3yzXTBuLr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 00:59:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsqz-0006GS-QH for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:58 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 6/9] xfs: rewrite the filestream allocator using the dentry cache Date: Sat, 12 Apr 2014 10:02:00 +0200 X-ASG-Orig-Subj: [PATCH 6/9] xfs: rewrite the filestream allocator using the dentry cache Message-Id: <1397289723-26243-7-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289599 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In Linux we will always be able to find a parent inode for file that are undergoing I/O. Use this to simply the file stream allocator by only keeping track of parent inodes. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_filestream.c | 660 ++++++++++++----------------------------------- fs/xfs/xfs_filestream.h | 31 +-- fs/xfs/xfs_inode.c | 24 +- 3 files changed, 171 insertions(+), 544 deletions(-) diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index c422110..ff6f902 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2006-2007 Silicon Graphics, Inc. + * Copyright (c) 2014 Christoph Hellwig. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -32,101 +33,28 @@ #include "xfs_filestream.h" #include "xfs_trace.h" -#ifdef XFS_FILESTREAMS_TRACE - -ktrace_t *xfs_filestreams_trace_buf; - -STATIC void -xfs_filestreams_trace( - xfs_mount_t *mp, /* mount point */ - int type, /* type of trace */ - const char *func, /* source function */ - int line, /* source line number */ - __psunsigned_t arg0, - __psunsigned_t arg1, - __psunsigned_t arg2, - __psunsigned_t arg3, - __psunsigned_t arg4, - __psunsigned_t arg5) -{ - ktrace_enter(xfs_filestreams_trace_buf, - (void *)(__psint_t)(type | (line << 16)), - (void *)func, - (void *)(__psunsigned_t)current_pid(), - (void *)mp, - (void *)(__psunsigned_t)arg0, - (void *)(__psunsigned_t)arg1, - (void *)(__psunsigned_t)arg2, - (void *)(__psunsigned_t)arg3, - (void *)(__psunsigned_t)arg4, - (void *)(__psunsigned_t)arg5, - NULL, NULL, NULL, NULL, NULL, NULL); -} - -#define TRACE0(mp,t) TRACE6(mp,t,0,0,0,0,0,0) -#define TRACE1(mp,t,a0) TRACE6(mp,t,a0,0,0,0,0,0) -#define TRACE2(mp,t,a0,a1) TRACE6(mp,t,a0,a1,0,0,0,0) -#define TRACE3(mp,t,a0,a1,a2) TRACE6(mp,t,a0,a1,a2,0,0,0) -#define TRACE4(mp,t,a0,a1,a2,a3) TRACE6(mp,t,a0,a1,a2,a3,0,0) -#define TRACE5(mp,t,a0,a1,a2,a3,a4) TRACE6(mp,t,a0,a1,a2,a3,a4,0) -#define TRACE6(mp,t,a0,a1,a2,a3,a4,a5) \ - xfs_filestreams_trace(mp, t, __func__, __LINE__, \ - (__psunsigned_t)a0, (__psunsigned_t)a1, \ - (__psunsigned_t)a2, (__psunsigned_t)a3, \ - (__psunsigned_t)a4, (__psunsigned_t)a5) - -#define TRACE_AG_SCAN(mp, ag, ag2) \ - TRACE2(mp, XFS_FSTRM_KTRACE_AGSCAN, ag, ag2); -#define TRACE_AG_PICK1(mp, max_ag, maxfree) \ - TRACE2(mp, XFS_FSTRM_KTRACE_AGPICK1, max_ag, maxfree); -#define TRACE_AG_PICK2(mp, ag, ag2, cnt, free, scan, flag) \ - TRACE6(mp, XFS_FSTRM_KTRACE_AGPICK2, ag, ag2, \ - cnt, free, scan, flag) -#define TRACE_UPDATE(mp, ip, ag, cnt, ag2, cnt2) \ - TRACE5(mp, XFS_FSTRM_KTRACE_UPDATE, ip, ag, cnt, ag2, cnt2) -#define TRACE_FREE(mp, ip, pip, ag, cnt) \ - TRACE4(mp, XFS_FSTRM_KTRACE_FREE, ip, pip, ag, cnt) -#define TRACE_LOOKUP(mp, ip, pip, ag, cnt) \ - TRACE4(mp, XFS_FSTRM_KTRACE_ITEM_LOOKUP, ip, pip, ag, cnt) -#define TRACE_ASSOCIATE(mp, ip, pip, ag, cnt) \ - TRACE4(mp, XFS_FSTRM_KTRACE_ASSOCIATE, ip, pip, ag, cnt) -#define TRACE_MOVEAG(mp, ip, pip, oag, ocnt, nag, ncnt) \ - TRACE6(mp, XFS_FSTRM_KTRACE_MOVEAG, ip, pip, oag, ocnt, nag, ncnt) -#define TRACE_ORPHAN(mp, ip, ag) \ - TRACE2(mp, XFS_FSTRM_KTRACE_ORPHAN, ip, ag); - - -#else #define TRACE_AG_SCAN(mp, ag, ag2) #define TRACE_AG_PICK1(mp, max_ag, maxfree) #define TRACE_AG_PICK2(mp, ag, ag2, cnt, free, scan, flag) -#define TRACE_UPDATE(mp, ip, ag, cnt, ag2, cnt2) #define TRACE_FREE(mp, ip, pip, ag, cnt) #define TRACE_LOOKUP(mp, ip, pip, ag, cnt) -#define TRACE_ASSOCIATE(mp, ip, pip, ag, cnt) -#define TRACE_MOVEAG(mp, ip, pip, oag, ocnt, nag, ncnt) -#define TRACE_ORPHAN(mp, ip, ag) -#endif static kmem_zone_t *item_zone; -/* - * Structure for associating a file or a directory with an allocation group. - * The parent directory pointer is only needed for files, but since there will - * generally be vastly more files than directories in the cache, using the same - * data structure simplifies the code with very little memory overhead. - */ -typedef struct fstrm_item -{ - struct xfs_mru_cache_elem mru; - xfs_agnumber_t ag; /* AG currently in use for the file/directory. */ - xfs_inode_t *ip; /* inode self-pointer. */ - xfs_inode_t *pip; /* Parent directory inode pointer. */ -} fstrm_item_t; +struct xfs_fstrm_item { + struct xfs_mru_cache_elem mru; + struct xfs_inode *ip; + xfs_agnumber_t ag; /* AG in use for this directory */ +}; + +enum xfs_fstrm_alloc { + XFS_PICK_USERDATA = 1, + XFS_PICK_LOWSPACE = 2, +}; /* * Allocation group filestream associations are tracked with per-ag atomic - * counters. These counters allow _xfs_filestream_pick_ag() to tell whether a + * counters. These counters allow xfs_filestream_pick_ag() to tell whether a * particular AG already has active filestreams associated with it. The mount * point's m_peraglock is used to protect these counters from per-ag array * re-allocation during a growfs operation. When xfs_growfs_data_private() is @@ -201,23 +129,42 @@ xfs_filestream_put_ag( xfs_perag_put(pag); } +static void +xfs_fstrm_free_func( + struct xfs_mru_cache_elem *mru) +{ + struct xfs_fstrm_item *item = + container_of(mru, struct xfs_fstrm_item, mru); + + xfs_filestream_put_ag(item->ip->i_mount, item->ag); + + TRACE_FREE(mp, ip, NULL, item->ag, + xfs_filestream_peek_ag(mp, item->ag)); + + kmem_zone_free(item_zone, item); +} + /* * Scan the AGs starting at startag looking for an AG that isn't in use and has * at least minlen blocks free. */ static int -_xfs_filestream_pick_ag( - xfs_mount_t *mp, - xfs_agnumber_t startag, - xfs_agnumber_t *agp, - int flags, - xfs_extlen_t minlen) +xfs_filestream_pick_ag( + struct xfs_inode *ip, + xfs_agnumber_t startag, + xfs_agnumber_t *agp, + int flags, + xfs_extlen_t minlen) { - int streams, max_streams; - int err, trylock, nscan; - xfs_extlen_t longest, free, minfree, maxfree = 0; - xfs_agnumber_t ag, max_ag = NULLAGNUMBER; - struct xfs_perag *pag; + struct xfs_mount *mp = ip->i_mount; + struct xfs_fstrm_item *item; + struct xfs_perag *pag; + xfs_extlen_t longest, free, minfree, maxfree = 0; + xfs_agnumber_t ag, max_ag = NULLAGNUMBER; + int streams, max_streams; + int err, trylock, nscan; + + ASSERT(S_ISDIR(ip->i_d.di_mode)); /* 2% of an AG's blocks must be free for it to be chosen. */ minfree = mp->m_sb.sb_agblocks / 50; @@ -321,205 +268,55 @@ next_ag: TRACE_AG_PICK2(mp, startag, *agp, streams, free, nscan, flags); - return 0; -} - -/* - * Set the allocation group number for a file or a directory, updating inode - * references and per-AG references as appropriate. - */ -static int -_xfs_filestream_update_ag( - xfs_inode_t *ip, - xfs_inode_t *pip, - xfs_agnumber_t ag) -{ - int err = 0; - xfs_mount_t *mp; - fstrm_item_t *item; - xfs_agnumber_t old_ag; - xfs_inode_t *old_pip; - struct xfs_mru_cache_elem *mru; - - /* - * Either ip is a regular file and pip is a directory, or ip is a - * directory and pip is NULL. - */ - ASSERT(ip && ((S_ISREG(ip->i_d.di_mode) && pip && - S_ISDIR(pip->i_d.di_mode)) || - (S_ISDIR(ip->i_d.di_mode) && !pip))); - - mp = ip->i_mount; - - mru = xfs_mru_cache_lookup(mp->m_filestream, ip->i_ino); - if (mru) { - item = container_of(mru, fstrm_item_t, mru); - - ASSERT(item->ip == ip); - old_ag = item->ag; - item->ag = ag; - old_pip = item->pip; - item->pip = pip; - xfs_mru_cache_done(mp->m_filestream); - - /* - * If the AG has changed, drop the old ref and take a new one, - * effectively transferring the reference from old to new AG. - */ - if (ag != old_ag) { - xfs_filestream_put_ag(mp, old_ag); - xfs_filestream_get_ag(mp, ag); - } - - /* - * If ip is a file and its pip has changed, drop the old ref and - * take a new one. - */ - if (pip && pip != old_pip) { - IRELE(old_pip); - IHOLD(pip); - } - - TRACE_UPDATE(mp, ip, old_ag, xfs_filestream_peek_ag(mp, old_ag), - ag, xfs_filestream_peek_ag(mp, ag)); + if (*agp == NULLAGNUMBER) return 0; - } + err = ENOMEM; item = kmem_zone_zalloc(item_zone, KM_MAYFAIL); if (!item) - return ENOMEM; + goto out_put_ag; - item->ag = ag; + item->ag = *agp; item->ip = ip; - item->pip = pip; err = xfs_mru_cache_insert(mp->m_filestream, ip->i_ino, &item->mru); if (err) { - kmem_zone_free(item_zone, item); - return err; + if (err == EEXIST) + err = 0; + goto out_free_item; } - /* Take a reference on the AG. */ - xfs_filestream_get_ag(mp, ag); - - /* - * Take a reference on the inode itself regardless of whether it's a - * regular file or a directory. - */ - IHOLD(ip); - - /* - * In the case of a regular file, take a reference on the parent inode - * as well to ensure it remains in-core. - */ - if (pip) - IHOLD(pip); - - TRACE_UPDATE(mp, ip, ag, xfs_filestream_peek_ag(mp, ag), - ag, xfs_filestream_peek_ag(mp, ag)); - return 0; -} - -/* xfs_fstrm_free_func(): callback for freeing cached stream items. */ -STATIC void -xfs_fstrm_free_func( - struct xfs_mru_cache_elem *mru) -{ - fstrm_item_t *item = - container_of(mru, fstrm_item_t, mru); - xfs_inode_t *ip = item->ip; - - /* Drop the reference taken on the AG when the item was added. */ - xfs_filestream_put_ag(ip->i_mount, item->ag); - - TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, - xfs_filestream_peek_ag(ip->i_mount, item->ag)); - - /* - * _xfs_filestream_update_ag() always takes a reference on the inode - * itself, whether it's a file or a directory. Release it here. - * This can result in the inode being freed and so we must - * not hold any inode locks when freeing filesstreams objects - * otherwise we can deadlock here. - */ - IRELE(ip); - /* - * In the case of a regular file, _xfs_filestream_update_ag() also - * takes a ref on the parent inode to keep it in-core. Release that - * too. - */ - if (item->pip) - IRELE(item->pip); - - /* Finally, free the memory allocated for the item. */ +out_free_item: kmem_zone_free(item_zone, item); +out_put_ag: + xfs_filestream_put_ag(mp, *agp); + return err; } -/* - * xfs_filestream_init() is called at xfs initialisation time to set up the - * memory zone that will be used for filestream data structure allocation. - */ -int -xfs_filestream_init(void) -{ - item_zone = kmem_zone_init(sizeof(fstrm_item_t), "fstrm_item"); - if (!item_zone) - return -ENOMEM; - - return 0; -} - -/* - * xfs_filestream_uninit() is called at xfs termination time to destroy the - * memory zone that was used for filestream data structure allocation. - */ -void -xfs_filestream_uninit(void) +static struct xfs_inode * +xfs_filestream_get_parent( + struct xfs_inode *ip) { - kmem_zone_destroy(item_zone); -} + struct inode *inode = VFS_I(ip), *dir = NULL; + struct dentry *dentry, *parent; -/* - * xfs_filestream_mount() is called when a file system is mounted with the - * filestream option. It is responsible for allocating the data structures - * needed to track the new file system's file streams. - */ -int -xfs_filestream_mount( - xfs_mount_t *mp) -{ - int err; - unsigned int lifetime, grp_count; + dentry = d_find_alias(inode); + if (!dentry) + goto out; - /* - * The filestream timer tunable is currently fixed within the range of - * one second to four minutes, with five seconds being the default. The - * group count is somewhat arbitrary, but it'd be nice to adhere to the - * timer tunable to within about 10 percent. This requires at least 10 - * groups. - */ - lifetime = xfs_fstrm_centisecs * 10; - grp_count = 10; + parent = dget_parent(dentry); + if (!parent) + goto out_dput; - err = xfs_mru_cache_create(&mp->m_filestream, lifetime, grp_count, - xfs_fstrm_free_func); + dir = igrab(parent->d_inode); + dput(parent); - return err; -} - -/* - * xfs_filestream_unmount() is called when a file system that was mounted with - * the filestream option is unmounted. It drains the data structures created - * to track the file system's file streams and frees all the memory that was - * allocated. - */ -void -xfs_filestream_unmount( - xfs_mount_t *mp) -{ - xfs_mru_cache_destroy(mp->m_filestream); +out_dput: + dput(dentry); +out: + return dir ? XFS_I(dir) : NULL; } /* @@ -528,94 +325,61 @@ xfs_filestream_unmount( */ xfs_agnumber_t xfs_filestream_lookup_ag( - xfs_inode_t *ip) + struct xfs_inode *ip) { - struct xfs_mount *mp = ip->i_mount; + struct xfs_mount *mp = ip->i_mount; + struct xfs_fstrm_item *item; + struct xfs_inode *pip = NULL; + xfs_agnumber_t ag = NULLAGNUMBER; + int ref = 0; struct xfs_mru_cache_elem *mru; - fstrm_item_t *item; - xfs_agnumber_t ag; - int ref; - if (!S_ISREG(ip->i_d.di_mode) && !S_ISDIR(ip->i_d.di_mode)) { - ASSERT(0); - return NULLAGNUMBER; - } + ASSERT(S_ISREG(ip->i_d.di_mode)); - mru = xfs_mru_cache_lookup(mp->m_filestream, ip->i_ino); - if (!mru) { - TRACE_LOOKUP(ip->i_mount, ip, NULL, NULLAGNUMBER, 0); - return NULLAGNUMBER; - } + pip = xfs_filestream_get_parent(ip); + if (!pip) + goto out; + + mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); + if (!mru) + goto out; + + item = container_of(mru, struct xfs_fstrm_item, mru); - item = container_of(mru, fstrm_item_t, mru); - ASSERT(ip == item->ip); ag = item->ag; - ref = xfs_filestream_peek_ag(ip->i_mount, ag); xfs_mru_cache_done(mp->m_filestream); - TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, ref); + ref = xfs_filestream_peek_ag(ip->i_mount, ag); +out: + TRACE_LOOKUP(mp, ip, pip, ag, ref); + IRELE(pip); return ag; } /* - * xfs_filestream_associate() should only be called to associate a regular file - * with its parent directory. Calling it with a child directory isn't - * appropriate because filestreams don't apply to entire directory hierarchies. - * Creating a file in a child directory of an existing filestream directory - * starts a new filestream with its own allocation group association. + * Make sure a directory has a filestream associated with it. * - * Returns < 0 on error, 0 if successful association occurred, > 0 if - * we failed to get an association because of locking issues. + * This is called when creating regular files in an directory that has + * filestreams enabled, so that a stream is ready by the time we need it + * in the allocator for the files inside the directory. */ int xfs_filestream_associate( - xfs_inode_t *pip, - xfs_inode_t *ip) + struct xfs_inode *pip) { + struct xfs_mount *mp = pip->i_mount; struct xfs_mru_cache_elem *mru; - xfs_mount_t *mp; - fstrm_item_t *item; - xfs_agnumber_t ag, rotorstep, startag; - int err = 0; + xfs_agnumber_t startag, ag; ASSERT(S_ISDIR(pip->i_d.di_mode)); - ASSERT(S_ISREG(ip->i_d.di_mode)); - if (!S_ISDIR(pip->i_d.di_mode) || !S_ISREG(ip->i_d.di_mode)) - return -EINVAL; - - mp = pip->i_mount; /* - * We have a problem, Houston. - * - * Taking the iolock here violates inode locking order - we already - * hold the ilock. Hence if we block getting this lock we may never - * wake. Unfortunately, that means if we can't get the lock, we're - * screwed in terms of getting a stream association - we can't spin - * waiting for the lock because someone else is waiting on the lock we - * hold and we cannot drop that as we are in a transaction here. - * - * Lucky for us, this inversion is not a problem because it's a - * directory inode that we are trying to lock here. - * - * So, if we can't get the iolock without sleeping then just give up + * If the directory already has a file stream associated we're done. */ - if (!xfs_ilock_nowait(pip, XFS_IOLOCK_EXCL)) - return 1; - - /* If the parent directory is already in the cache, use its AG. */ mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); if (mru) { - item = container_of(mru, fstrm_item_t, mru); - - ASSERT(item->ip == pip); - ag = item->ag; xfs_mru_cache_done(mp->m_filestream); - - TRACE_LOOKUP(mp, pip, pip, ag, xfs_filestream_peek_ag(mp, ag)); - err = _xfs_filestream_update_ag(ip, pip, ag); - - goto exit; + return 0; } /* @@ -623,201 +387,107 @@ xfs_filestream_associate( * use the directory inode's AG. */ if (mp->m_flags & XFS_MOUNT_32BITINODES) { - rotorstep = xfs_rotorstep; + xfs_agnumber_t rotorstep = xfs_rotorstep; startag = (mp->m_agfrotor / rotorstep) % mp->m_sb.sb_agcount; mp->m_agfrotor = (mp->m_agfrotor + 1) % (mp->m_sb.sb_agcount * rotorstep); } else startag = XFS_INO_TO_AGNO(mp, pip->i_ino); - /* Pick a new AG for the parent inode starting at startag. */ - err = _xfs_filestream_pick_ag(mp, startag, &ag, 0, 0); - if (err || ag == NULLAGNUMBER) - goto exit_did_pick; - - /* Associate the parent inode with the AG. */ - err = _xfs_filestream_update_ag(pip, NULL, ag); - if (err) - goto exit_did_pick; - - /* Associate the file inode with the AG. */ - err = _xfs_filestream_update_ag(ip, pip, ag); - if (err) - goto exit_did_pick; - - TRACE_ASSOCIATE(mp, ip, pip, ag, xfs_filestream_peek_ag(mp, ag)); - -exit_did_pick: - /* - * If _xfs_filestream_pick_ag() returned a valid AG, remove the - * reference it took on it, since the file and directory will have taken - * their own now if they were successfully cached. - */ - if (ag != NULLAGNUMBER) - xfs_filestream_put_ag(mp, ag); - -exit: - xfs_iunlock(pip, XFS_IOLOCK_EXCL); - return -err; + return xfs_filestream_pick_ag(pip, startag, &ag, 0, 0); } /* - * Pick a new allocation group for the current file and its file stream. This - * function is called by xfs_bmap_filestreams() with the mount point's per-ag - * lock held. + * Pick a new allocation group for the current file and its file stream. + * + * This is called when the allocator can't find a suitable extent in the + * current AG, and we have to move the stream into a new AG with more space. */ int xfs_filestream_new_ag( struct xfs_bmalloca *ap, xfs_agnumber_t *agp) { - struct xfs_mru_cache_elem *mru, *mru2; - int flags, err; - xfs_inode_t *ip, *pip = NULL; - xfs_mount_t *mp; - xfs_extlen_t minlen; - fstrm_item_t *dir, *file; - xfs_agnumber_t ag = NULLAGNUMBER; - - ip = ap->ip; - mp = ip->i_mount; - minlen = ap->length; - *agp = NULLAGNUMBER; - - /* - * Look for the file in the cache, removing it if it's found. Doing - * this allows it to be held across the dir lookup that follows. - */ - mru = xfs_mru_cache_remove(mp->m_filestream, ip->i_ino); - if (mru) { - file = container_of(mru, fstrm_item_t, mru); - ASSERT(ip == file->ip); - - /* Save the file's parent inode and old AG number for later. */ - pip = file->pip; - ag = file->ag; - - /* Look for the file's directory in the cache. */ - mru2 = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); - if (mru2) { - dir = container_of(mru2, fstrm_item_t, mru); - ASSERT(pip == dir->ip); - - /* - * If the directory has already moved on to a new AG, - * use that AG as the new AG for the file. Don't - * forget to twiddle the AG refcounts to match the - * movement. - */ - if (dir->ag != file->ag) { - xfs_filestream_put_ag(mp, file->ag); - xfs_filestream_get_ag(mp, dir->ag); - *agp = file->ag = dir->ag; - } + struct xfs_inode *ip = ap->ip, *pip; + struct xfs_mount *mp = ip->i_mount; + xfs_extlen_t minlen = ap->length; + xfs_agnumber_t startag = 0; + int flags, err = 0; + struct xfs_mru_cache_elem *mru; - xfs_mru_cache_done(mp->m_filestream); - } + *agp = NULLAGNUMBER; - /* - * Put the file back in the cache. If this fails, the free - * function needs to be called to tidy up in the same way as if - * the item had simply expired from the cache. - */ - err = xfs_mru_cache_insert(mp->m_filestream, ip->i_ino, mru); - if (err) { - xfs_fstrm_free_func(mru); - return err; - } + pip = xfs_filestream_get_parent(ip); + if (!pip) + goto exit; - /* - * If the file's AG was moved to the directory's new AG, there's - * nothing more to be done. - */ - if (*agp != NULLAGNUMBER) { - TRACE_MOVEAG(mp, ip, pip, - ag, xfs_filestream_peek_ag(mp, ag), - *agp, xfs_filestream_peek_ag(mp, *agp)); - return 0; - } + mru = xfs_mru_cache_remove(mp->m_filestream, pip->i_ino); + if (mru) { + struct xfs_fstrm_item *item = + container_of(mru, struct xfs_fstrm_item, mru); + startag = (item->ag + 1) % mp->m_sb.sb_agcount; } - /* - * If the file's parent directory is known, take its iolock in exclusive - * mode to prevent two sibling files from racing each other to migrate - * themselves and their parent to different AGs. - * - * Note that we lock the parent directory iolock inside the child - * iolock here. That's fine as we never hold both parent and child - * iolock in any other place. This is different from the ilock, - * which requires locking of the child after the parent for namespace - * operations. - */ - if (pip) - xfs_ilock(pip, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); - - /* - * A new AG needs to be found for the file. If the file's parent - * directory is also known, it will be moved to the new AG as well to - * ensure that files created inside it in future use the new AG. - */ - ag = (ag == NULLAGNUMBER) ? 0 : (ag + 1) % mp->m_sb.sb_agcount; flags = (ap->userdata ? XFS_PICK_USERDATA : 0) | (ap->flist->xbf_low ? XFS_PICK_LOWSPACE : 0); - err = _xfs_filestream_pick_ag(mp, ag, agp, flags, minlen); - if (err || *agp == NULLAGNUMBER) - goto exit; + err = xfs_filestream_pick_ag(pip, startag, agp, flags, minlen); /* - * If the file wasn't found in the file cache, then its parent directory - * inode isn't known. For this to have happened, the file must either - * be pre-existing, or it was created long enough ago that its cache - * entry has expired. This isn't the sort of usage that the filestreams - * allocator is trying to optimise, so there's no point trying to track - * its new AG somehow in the filestream data structures. + * Only free the item here so we skip over the old AG earlier. */ - if (!pip) { - TRACE_ORPHAN(mp, ip, *agp); - goto exit; - } + if (mru) + xfs_fstrm_free_func(mru); - /* Associate the parent inode with the AG. */ - err = _xfs_filestream_update_ag(pip, NULL, *agp); - if (err) - goto exit; - - /* Associate the file inode with the AG. */ - err = _xfs_filestream_update_ag(ip, pip, *agp); - if (err) - goto exit; + IRELE(pip); +exit: + if (*agp == NULLAGNUMBER) + *agp = 0; + return err; +} - TRACE_MOVEAG(mp, ip, pip, NULLAGNUMBER, 0, - *agp, xfs_filestream_peek_ag(mp, *agp)); +void +xfs_filestream_deassociate( + struct xfs_inode *ip) +{ + xfs_mru_cache_delete(ip->i_mount->m_filestream, ip->i_ino); +} -exit: +int +xfs_filestream_mount( + xfs_mount_t *mp) +{ /* - * If _xfs_filestream_pick_ag() returned a valid AG, remove the - * reference it took on it, since the file and directory will have taken - * their own now if they were successfully cached. + * The filestream timer tunable is currently fixed within the range of + * one second to four minutes, with five seconds being the default. The + * group count is somewhat arbitrary, but it'd be nice to adhere to the + * timer tunable to within about 10 percent. This requires at least 10 + * groups. */ - if (*agp != NULLAGNUMBER) - xfs_filestream_put_ag(mp, *agp); - else - *agp = 0; + return xfs_mru_cache_create(&mp->m_filestream, xfs_fstrm_centisecs * 10, + 10, xfs_fstrm_free_func); +} - if (pip) - xfs_iunlock(pip, XFS_IOLOCK_EXCL); +void +xfs_filestream_unmount( + xfs_mount_t *mp) +{ + xfs_mru_cache_destroy(mp->m_filestream); +} - return err; + +/* needs to return a positive errno for the init path */ +int +xfs_filestream_init(void) +{ + item_zone = kmem_zone_init(sizeof(struct xfs_fstrm_item), "fstrm_item"); + if (!item_zone) + return -ENOMEM; + return 0; } -/* - * Remove an association between an inode and a filestream object. - * Typically this is done on last close of an unlinked file. - */ void -xfs_filestream_deassociate( - xfs_inode_t *ip) +xfs_filestream_uninit(void) { - xfs_mru_cache_delete(ip->i_mount->m_filestream, ip->i_ino); + kmem_zone_destroy(item_zone); } diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index c4fa9a0..e3a25f8 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -20,44 +20,17 @@ struct xfs_mount; struct xfs_inode; -struct xfs_perag; struct xfs_bmalloca; -#ifdef XFS_FILESTREAMS_TRACE -#define XFS_FSTRM_KTRACE_INFO 1 -#define XFS_FSTRM_KTRACE_AGSCAN 2 -#define XFS_FSTRM_KTRACE_AGPICK1 3 -#define XFS_FSTRM_KTRACE_AGPICK2 4 -#define XFS_FSTRM_KTRACE_UPDATE 5 -#define XFS_FSTRM_KTRACE_FREE 6 -#define XFS_FSTRM_KTRACE_ITEM_LOOKUP 7 -#define XFS_FSTRM_KTRACE_ASSOCIATE 8 -#define XFS_FSTRM_KTRACE_MOVEAG 9 -#define XFS_FSTRM_KTRACE_ORPHAN 10 - -#define XFS_FSTRM_KTRACE_SIZE 16384 -extern ktrace_t *xfs_filestreams_trace_buf; - -#endif - -/* allocation selection flags */ -typedef enum xfs_fstrm_alloc { - XFS_PICK_USERDATA = 1, - XFS_PICK_LOWSPACE = 2, -} xfs_fstrm_alloc_t; - -/* prototypes for filestream.c */ int xfs_filestream_init(void); void xfs_filestream_uninit(void); int xfs_filestream_mount(struct xfs_mount *mp); void xfs_filestream_unmount(struct xfs_mount *mp); -xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip); -int xfs_filestream_associate(struct xfs_inode *dip, struct xfs_inode *ip); void xfs_filestream_deassociate(struct xfs_inode *ip); +xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip); +int xfs_filestream_associate(struct xfs_inode *dip); int xfs_filestream_new_ag(struct xfs_bmalloca *ap, xfs_agnumber_t *agp); - -/* filestreams for the inode? */ static inline int xfs_inode_is_filestream( struct xfs_inode *ip) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 3328320..b9b531f 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -846,9 +846,9 @@ xfs_ialloc( /* now we have set up the vfs inode we can associate the filestream */ if (filestreams) { - error = xfs_filestream_associate(pip, ip); - if (error < 0) - return -error; + error = xfs_filestream_associate(pip); + if (error) + return error; } *ipp = ip; @@ -1696,16 +1696,6 @@ xfs_release( int truncated; /* - * If we are using filestreams, and we have an unlinked - * file that we are processing the last close on, then nothing - * will be able to reopen and write to this file. Purge this - * inode from the filestreams cache so that it doesn't delay - * teardown of the inode. - */ - if ((ip->i_d.di_nlink == 0) && xfs_inode_is_filestream(ip)) - xfs_filestream_deassociate(ip); - - /* * If we previously truncated this file and removed old data * in the process, we want to initiate "early" writeout on * the last close. This is an attempt to combat the notorious @@ -2661,13 +2651,7 @@ xfs_remove( if (error) goto std_return; - /* - * If we are using filestreams, kill the stream association. - * If the file is still open it may get a new one but that - * will get killed on last close in xfs_close() so we don't - * have to worry about that. - */ - if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) + if (is_dir && xfs_inode_is_filestream(ip)) xfs_filestream_deassociate(ip); return 0; -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 18CFA7F66 for ; Sat, 12 Apr 2014 03:00:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 017F3304062 for ; Sat, 12 Apr 2014 01:00:03 -0700 (PDT) X-ASG-Debug-ID: 1397289600-04cb6c77b4139be0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id TWWXxKfkqrLMHgv1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 01:00:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsr2-0006Ge-Hf for xfs@oss.sgi.com; Sat, 12 Apr 2014 08:00:00 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 9/9] xfs: add filestream allocator tracepoints Date: Sat, 12 Apr 2014 10:02:03 +0200 X-ASG-Orig-Subj: [PATCH 9/9] xfs: add filestream allocator tracepoints Message-Id: <1397289723-26243-10-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289601 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_filestream.c | 29 +++++++----------------- fs/xfs/xfs_filestream.h | 1 + fs/xfs/xfs_trace.c | 1 + fs/xfs/xfs_trace.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index c8a8840..8ec81be 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -33,12 +33,6 @@ #include "xfs_filestream.h" #include "xfs_trace.h" -#define TRACE_AG_SCAN(mp, ag, ag2) -#define TRACE_AG_PICK1(mp, max_ag, maxfree) -#define TRACE_AG_PICK2(mp, ag, ag2, cnt, free, scan, flag) -#define TRACE_FREE(mp, ip, pip, ag, cnt) -#define TRACE_LOOKUP(mp, ip, pip, ag, cnt) - struct xfs_fstrm_item { struct xfs_mru_cache_elem mru; struct xfs_inode *ip; @@ -87,7 +81,7 @@ enum xfs_fstrm_alloc { * the cache that reference per-ag array elements that have since been * reallocated. */ -static int +int xfs_filestream_peek_ag( xfs_mount_t *mp, xfs_agnumber_t agno) @@ -136,8 +130,7 @@ xfs_fstrm_free_func( xfs_filestream_put_ag(item->ip->i_mount, item->ag); - TRACE_FREE(mp, ip, NULL, item->ag, - xfs_filestream_peek_ag(mp, item->ag)); + trace_xfs_filestream_free(item->ip, item->ag); kmem_free(item); } @@ -157,9 +150,8 @@ xfs_filestream_pick_ag( struct xfs_mount *mp = ip->i_mount; struct xfs_fstrm_item *item; struct xfs_perag *pag; - xfs_extlen_t longest, free, minfree, maxfree = 0; + xfs_extlen_t longest, free = 0, minfree, maxfree = 0; xfs_agnumber_t ag, max_ag = NULLAGNUMBER; - int streams, max_streams; int err, trylock, nscan; ASSERT(S_ISDIR(ip->i_d.di_mode)); @@ -174,8 +166,9 @@ xfs_filestream_pick_ag( trylock = XFS_ALLOC_FLAG_TRYLOCK; for (nscan = 0; 1; nscan++) { + trace_xfs_filestream_scan(ip, ag); + pag = xfs_perag_get(mp, ag); - TRACE_AG_SCAN(mp, ag, atomic_read(&pag->pagf_fstrms)); if (!pag->pagf_init) { err = xfs_alloc_pagf_init(mp, NULL, ag, trylock); @@ -192,7 +185,6 @@ xfs_filestream_pick_ag( /* Keep track of the AG with the most free blocks. */ if (pag->pagf_freeblks > maxfree) { maxfree = pag->pagf_freeblks; - max_streams = atomic_read(&pag->pagf_fstrms); max_ag = ag; } @@ -215,7 +207,6 @@ xfs_filestream_pick_ag( /* Break out, retaining the reference on the AG. */ free = pag->pagf_freeblks; - streams = atomic_read(&pag->pagf_fstrms); xfs_perag_put(pag); *agp = ag; break; @@ -251,20 +242,18 @@ next_ag: */ if (max_ag != NULLAGNUMBER) { xfs_filestream_get_ag(mp, max_ag); - TRACE_AG_PICK1(mp, max_ag, maxfree); - streams = max_streams; free = maxfree; *agp = max_ag; break; } /* take AG 0 if none matched */ - TRACE_AG_PICK1(mp, max_ag, maxfree); + trace_xfs_filestream_pick(ip, *agp, free, nscan); *agp = 0; return 0; } - TRACE_AG_PICK2(mp, startag, *agp, streams, free, nscan, flags); + trace_xfs_filestream_pick(ip, *agp, free, nscan); if (*agp == NULLAGNUMBER) return 0; @@ -330,7 +319,6 @@ xfs_filestream_lookup_ag( struct xfs_mount *mp = ip->i_mount; struct xfs_inode *pip = NULL; xfs_agnumber_t startag, ag = NULLAGNUMBER; - int ref = 0; struct xfs_mru_cache_elem *mru; ASSERT(S_ISREG(ip->i_d.di_mode)); @@ -344,8 +332,7 @@ xfs_filestream_lookup_ag( ag = container_of(mru, struct xfs_fstrm_item, mru)->ag; xfs_mru_cache_done(mp->m_filestream); - ref = xfs_filestream_peek_ag(ip->i_mount, ag); - TRACE_LOOKUP(mp, ip, pip, ag, ref); + trace_xfs_filestream_lookup(ip, ag); goto out; } diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index 2de853e..2ef4340 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -27,6 +27,7 @@ void xfs_filestream_unmount(struct xfs_mount *mp); void xfs_filestream_deassociate(struct xfs_inode *ip); xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip); int xfs_filestream_new_ag(struct xfs_bmalloca *ap, xfs_agnumber_t *agp); +int xfs_filestream_peek_ag(struct xfs_mount *mp, xfs_agnumber_t agno); static inline int xfs_inode_is_filestream( diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index dee3279..1e85bcd 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -46,6 +46,7 @@ #include "xfs_log_recover.h" #include "xfs_inode_item.h" #include "xfs_bmap_btree.h" +#include "xfs_filestream.h" /* * We include this last to have the helpers above available for the trace diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 65d8c79..6910458 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -538,6 +538,64 @@ DEFINE_BUF_ITEM_EVENT(xfs_trans_bhold_release); DEFINE_BUF_ITEM_EVENT(xfs_trans_binval); DEFINE_BUF_ITEM_EVENT(xfs_trans_buf_ordered); +DECLARE_EVENT_CLASS(xfs_filestream_class, + TP_PROTO(struct xfs_inode *ip, xfs_agnumber_t agno), + TP_ARGS(ip, agno), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_agnumber_t, agno) + __field(int, streams) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->agno = agno; + __entry->streams = xfs_filestream_peek_ag(ip->i_mount, agno); + ), + TP_printk("dev %d:%d ino 0x%llx agno %u streams %d", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->agno, + __entry->streams) +) +#define DEFINE_FILESTREAM_EVENT(name) \ +DEFINE_EVENT(xfs_filestream_class, name, \ + TP_PROTO(struct xfs_inode *ip, xfs_agnumber_t agno), \ + TP_ARGS(ip, agno)) +DEFINE_FILESTREAM_EVENT(xfs_filestream_free); +DEFINE_FILESTREAM_EVENT(xfs_filestream_lookup); +DEFINE_FILESTREAM_EVENT(xfs_filestream_scan); + +TRACE_EVENT(xfs_filestream_pick, + TP_PROTO(struct xfs_inode *ip, xfs_agnumber_t agno, + xfs_extlen_t free, int nscan), + TP_ARGS(ip, agno, free, nscan), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_agnumber_t, agno) + __field(int, streams) + __field(xfs_extlen_t, free) + __field(int, nscan) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->agno = agno; + __entry->streams = xfs_filestream_peek_ag(ip->i_mount, agno); + __entry->free = free; + __entry->nscan = nscan; + ), + TP_printk("dev %d:%d ino 0x%llx agno %u streams %d free %d nscan %d", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->agno, + __entry->streams, + __entry->free, + __entry->nscan) +); + DECLARE_EVENT_CLASS(xfs_lock_class, TP_PROTO(struct xfs_inode *ip, unsigned lock_flags, unsigned long caller_ip), -- 1.7.10.4 From BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org Sat Apr 12 03:00:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E41617F5F for ; Sat, 12 Apr 2014 03:00:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8CEA8AC003 for ; Sat, 12 Apr 2014 01:00:02 -0700 (PDT) X-ASG-Debug-ID: 1397289600-04bdf07dc8141fa0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id HhyljJ5G04G5v1Gi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 01:00:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c97c66af8cf872aecb6+3884+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYsr1-0006Ga-M2 for xfs@oss.sgi.com; Sat, 12 Apr 2014 07:59:59 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 8/9] xfs: remove xfs_filestream_associate Date: Sat, 12 Apr 2014 10:02:02 +0200 X-ASG-Orig-Subj: [PATCH 8/9] xfs: remove xfs_filestream_associate Message-Id: <1397289723-26243-9-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> References: <1397289723-26243-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1397289600 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- There is no good reason to create a filestream when a directory entry is created. Delay it until the first allocation happens to simply the code and reduce the amount of mru cache lookups we do. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_filestream.c | 57 +++++++++++++---------------------------------- fs/xfs/xfs_filestream.h | 1 - fs/xfs/xfs_inode.c | 15 ------------- 3 files changed, 15 insertions(+), 58 deletions(-) diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 7b94036..c8a8840 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -318,17 +318,18 @@ out: } /* - * Return the AG of the filestream the file or directory belongs to, or - * NULLAGNUMBER otherwise. + * Find the right allocation group for a file, either by finding an + * existing file stream or creating a new one. + * + * Returns NULLAGNUMBER in case of an error. */ xfs_agnumber_t xfs_filestream_lookup_ag( struct xfs_inode *ip) { struct xfs_mount *mp = ip->i_mount; - struct xfs_fstrm_item *item; struct xfs_inode *pip = NULL; - xfs_agnumber_t ag = NULLAGNUMBER; + xfs_agnumber_t startag, ag = NULLAGNUMBER; int ref = 0; struct xfs_mru_cache_elem *mru; @@ -339,45 +340,13 @@ xfs_filestream_lookup_ag( goto out; mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); - if (!mru) - goto out; - - item = container_of(mru, struct xfs_fstrm_item, mru); - - ag = item->ag; - xfs_mru_cache_done(mp->m_filestream); - - ref = xfs_filestream_peek_ag(ip->i_mount, ag); -out: - TRACE_LOOKUP(mp, ip, pip, ag, ref); - IRELE(pip); - return ag; -} - -/* - * Make sure a directory has a filestream associated with it. - * - * This is called when creating regular files in an directory that has - * filestreams enabled, so that a stream is ready by the time we need it - * in the allocator for the files inside the directory. - */ -int -xfs_filestream_associate( - struct xfs_inode *pip) -{ - struct xfs_mount *mp = pip->i_mount; - struct xfs_mru_cache_elem *mru; - xfs_agnumber_t startag, ag; - - ASSERT(S_ISDIR(pip->i_d.di_mode)); - - /* - * If the directory already has a file stream associated we're done. - */ - mru = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); if (mru) { + ag = container_of(mru, struct xfs_fstrm_item, mru)->ag; xfs_mru_cache_done(mp->m_filestream); - return 0; + + ref = xfs_filestream_peek_ag(ip->i_mount, ag); + TRACE_LOOKUP(mp, ip, pip, ag, ref); + goto out; } /* @@ -392,7 +361,11 @@ xfs_filestream_associate( } else startag = XFS_INO_TO_AGNO(mp, pip->i_ino); - return xfs_filestream_pick_ag(pip, startag, &ag, 0, 0); + if (xfs_filestream_pick_ag(pip, startag, &ag, 0, 0)) + ag = NULLAGNUMBER; +out: + IRELE(pip); + return ag; } /* diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index 578d49e..2de853e 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -26,7 +26,6 @@ int xfs_filestream_mount(struct xfs_mount *mp); void xfs_filestream_unmount(struct xfs_mount *mp); void xfs_filestream_deassociate(struct xfs_inode *ip); xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip); -int xfs_filestream_associate(struct xfs_inode *dip); int xfs_filestream_new_ag(struct xfs_bmalloca *ap, xfs_agnumber_t *agp); static inline int diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b9b531f..cec18e9 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -655,7 +655,6 @@ xfs_ialloc( uint flags; int error; timespec_t tv; - int filestreams = 0; /* * Call the space management code to pick @@ -772,13 +771,6 @@ xfs_ialloc( flags |= XFS_ILOG_DEV; break; case S_IFREG: - /* - * we can't set up filestreams until after the VFS inode - * is set up properly. - */ - if (pip && xfs_inode_is_filestream(pip)) - filestreams = 1; - /* fall through */ case S_IFDIR: if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) { uint di_flags = 0; @@ -844,13 +836,6 @@ xfs_ialloc( /* now that we have an i_mode we can setup inode ops and unlock */ xfs_setup_inode(ip); - /* now we have set up the vfs inode we can associate the filestream */ - if (filestreams) { - error = xfs_filestream_associate(pip); - if (error) - return error; - } - *ipp = ip; return 0; } -- 1.7.10.4 From climmural@gmail.com Sat Apr 12 08:12:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 666E67F37 for ; Sat, 12 Apr 2014 08:12:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4EE8B8F8049 for ; Sat, 12 Apr 2014 06:12:31 -0700 (PDT) X-ASG-Debug-ID: 1397308346-04cbb00dc4153bc0001-NocioJ Received: from [139.170.0.194] ([139.170.0.194]) by cuda.sgi.com with SMTP id RzKfO4ijjJ2ODQhn for ; Sat, 12 Apr 2014 06:12:27 -0700 (PDT) X-Barracuda-Envelope-From: climmural@gmail.com X-Barracuda-Apparent-Source-IP: 139.170.0.194 Reply-To: climmural@gmail.com From: climmural@gmail.com To: xfs@oss.sgi.com Subject: Liquidation sur thermopompe murale Sender: climmural@gmail.com X-ASG-Orig-Subj: Liquidation sur thermopompe murale Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Date: Sat, 12 Apr 2014 21:06:57 +0800 X-Barracuda-Connect: UNKNOWN[139.170.0.194] X-Barracuda-Start-Time: 1397308346 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, MISSING_MID, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4823 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140412131231.492B6106C71B@cuda.sgi.com> Vente surplus d'inventaire 2013 sur thermopompes murales de marque Napoleon Climatisation-Déhumidification-Chauffage jusqu'à - 15 Celcius (Avec arrêt automatique)-Dc Inverter Compresseur Toshiba-Garantie 6 ans complète Un appareil haut de gamme à prix imbattable. Appareil certifié Energy star. Éligible à une subvention de 650,00 dollars. 12 000 BTU à partir de 2195,00 dollars installation incluse. Profitez rapidement de nos spéciaux, vous pourrez ainsi commencer à économiser sur vos coûts de chauffage dès maintenant. Aussi disponiple climatiseurs muraux . Compresseur Toshiba Garantie 5 ans sur compresseur Fiabilité à tout épreuve. 9000 à 24000 Btu à partir de 1295.00 dollars avec installation. Contactez- nous Service rapide et professionnel. Frigor et Groupe Senick 8355 1929-45 Numero RBQ Reservez maintenant. Telepnone 514 792 6461 From tytso@thunk.org Sat Apr 12 08:48:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B352D7F4E for ; Sat, 12 Apr 2014 08:48:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A42E304066 for ; Sat, 12 Apr 2014 06:48:34 -0700 (PDT) X-ASG-Debug-ID: 1397310499-04cbb00dc51553b0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 713xlA4SZPQ21BiU (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 06:48:19 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WYyI6-00020Z-IM; Sat, 12 Apr 2014 13:48:18 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id D203F58032E; Sat, 12 Apr 2014 09:48:15 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397310495; bh=SqpIxGVAF9axW8VIppvejYmu9kmx5PnxxEzU09e7jOw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=CNC+BMBaXK64u49D3gC1MlhEX2z5QVpslPMbKiO62CQP8vollVWdglJJDSSeujMkX /9ebt9kErRc0ZTOfcv3pwA9iUhpMyRdgBmce0VAj8J0SytwQn6tvi8rMJ0KqytaovX 32F+lIonmb0j+a7Imf5djZdmhHu7HehchS2BJgm8= Date: Sat, 12 Apr 2014 09:48:15 -0400 From: Theodore Ts'o To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org Subject: Re: [PATCH 1/4] ext4: Remove unnecessary check for APPEND and IMMUTABLE Message-ID: <20140412134815.GA13837@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] ext4: Remove unnecessary check for APPEND and IMMUTABLE References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-1-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397310499 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4824 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 11, 2014 at 08:57:42PM +0200, Lukas Czerner wrote: > All the checks IS_APPEND and IS_IMMUTABLE for the fallocate operation on > the inode are done in vfs. No need to do this again in ext4. Remove it. > > Signed-off-by: Lukas Czerner Thanks, applied. - Ted From tytso@thunk.org Sat Apr 12 08:49:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 903187F56 for ; Sat, 12 Apr 2014 08: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 143BBAC004 for ; Sat, 12 Apr 2014 06:49:09 -0700 (PDT) X-ASG-Debug-ID: 1397310548-04cbb00dc4155430001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id oCASoy7b33JhtlBu (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 06:49:08 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WYyIu-00020n-Kp; Sat, 12 Apr 2014 13:49:08 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 018AF58032E; Sat, 12 Apr 2014 09:49:05 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397310546; bh=JQrv2IZSXHeu524ryqUTt0/fzIW+3k2sKWLe//MyaQw=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=gq1246khQ+cW2i/9CSmB5PhJAw55/UXTJYYrqOaVvUL0rsaF2ATsNDO0uEahp2Uc8 +mNblMwCpJxJSqAMcLJCuvA+NfdcxooASh6T+ilsLZhCC2aJ+fouRtX/dJ5r5LTHeE Eog6eO3mPBNLzW52aca7oC19yxELtkMUewEIiSbM= Date: Sat, 12 Apr 2014 09:49:05 -0400 From: Theodore Ts'o To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org Subject: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: <20140412134905.GB13837@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-2-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-2-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397310548 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4824 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 11, 2014 at 08:57:43PM +0200, Lukas Czerner wrote: > Currently punch hole and collapse range fallocate operation are not > allowed on append only file. This should be case for zero range as well. > Fix it. > > Signed-off-by: Lukas Czerner Looks good to me. If people don't object, I'll carry this in the ext4 tree for merging in 3.15, since this is a bug fix... - Ted From tytso@thunk.org Sat Apr 12 08:59:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 172437F51 for ; Sat, 12 Apr 2014 08:59:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA9308F8033 for ; Sat, 12 Apr 2014 06:59:10 -0700 (PDT) X-ASG-Debug-ID: 1397311148-04bdf07dc8151ba0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id RFzUDCmvsCVb9nZm (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 06:59:09 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WYySZ-000216-85; Sat, 12 Apr 2014 13:59:07 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 949F058032E; Sat, 12 Apr 2014 09:59:06 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397311146; bh=hRKZGBAwOxVmiYyIyKp3rajCF72hwJ3Vl/+IcMgu/NY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=iidJqMuAOq7dy5Lg8/Qez+N35PeRaOZ2hyV/SgQBM8aq3W/sXcLDU6Jz0HNwazKUW T+B/W18p4OhJAT8oGX/clLct3KYxpTMNZWLD8JqgLJlMrXCzJ5p93Ar5ZBK1ZJlWyh 42IZGpkIgLRJz4GaVEHw99N2PuJYuD5wIjdcrmao= Date: Sat, 12 Apr 2014 09:59:06 -0400 From: Theodore Ts'o To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: <20140412135906.GC13837@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-3-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397311148 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=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4824 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 11, 2014 at 08:57:44PM +0200, Lukas Czerner wrote: > Currently in do_fallocate in collapse range case we're checking whether > offset + len is not bigger than i_size. However there is nothing which > would prevent i_size from changing so the check is pointless. It should > be done in the file system itself and the file system needs to make sure > that i_size is not going to change. > > As it is now we can easily crash kernel by having two processes doing > truncate and fallocate collapse range at the same time. This can be > reproduced on ext4 and it is theoretically possible on xfs even though I > was not able to trigger it with this simple test. > > This commit removes the check from do_fallocate and adds it to the file > system. > > Signed-off-by: Lukas Czerner > --- > fs/ext4/extents.c | 11 +++++++++-- > fs/open.c | 8 -------- > fs/xfs/xfs_file.c | 10 +++++++++- > 3 files changed, 18 insertions(+), 11 deletions(-) Looks good to me. Do the xfs folks mind if I carry this in the ext4 tree and push it to Linus shortly after -rc1? If so, please send me an ack'ed by. If folks have a strong preference to handle this differently, let me know. Cheers, - Ted From tytso@thunk.org Sat Apr 12 09:06:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 50A367F55 for ; Sat, 12 Apr 2014 09:06:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8994AC001 for ; Sat, 12 Apr 2014 07:06:43 -0700 (PDT) X-ASG-Debug-ID: 1397311599-04cbb00dc51562e0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id J3WBvL6K4J5YTnab (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 07:06:39 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WYyZr-0002HR-IN; Sat, 12 Apr 2014 14:06:39 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id D5BF258032E; Sat, 12 Apr 2014 10:06:33 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397311593; bh=9ijiiyCUT3xtHgd2TWK/SXvYJ6kz+cs8U6yoa1ZxcmU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=g+Yb+/ngvRx9/a2pDUQ7nIXhdm1i8gllIvpYKrd7CcD61PM284Yc2PFAd98Jsada6 FoaHsdrr0IwdKQ0BAzZQtv5UmJDtWriK+QorPVp2eWesMXjEq/pqV8GnUstEx76qWV WJu/G+ZRf3cvFUe0l1z50e+KfKUK1+bzD4vVFzdI= Date: Sat, 12 Apr 2014 10:06:33 -0400 From: Theodore Ts'o To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org Subject: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile Message-ID: <20140412140633.GD13837@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-4-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-4-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397311599 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4824 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Apr 11, 2014 at 08:57:45PM +0200, Lukas Czerner wrote: > Currently some file system have IS_SWAPFILE check in their fallocate > implementations and some does not. However we should really prevent any > fallocate operation on swapfile so move the check to vfs and remove the > redundant checks from the file systems fallocate implementations. > > Signed-off-by: Lukas Czerner > --- > fs/ceph/file.c | 3 --- > fs/ext4/extents.c | 5 ----- > fs/ext4/inode.c | 5 ----- > fs/open.c | 7 +++++++ > 4 files changed, 7 insertions(+), 13 deletions(-) Thanks, applied. Again, if anyone has an objections with my carrying these patches in the ext4 tree and pushing them to Linus shortly after -rc1, please let me know. - Ted From BATV+1fdd4b917c8765947a5c+3884+infradead.org+hch@bombadil.srs.infradead.org Sat Apr 12 10:19:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CBB2C7F59 for ; Sat, 12 Apr 2014 10:19:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 69DCBAC004 for ; Sat, 12 Apr 2014 08:19:57 -0700 (PDT) X-ASG-Debug-ID: 1397315976-04bdf07dca1559c0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id id8d30M8H5hv6xwm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 08:19:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+1fdd4b917c8765947a5c+3884+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYziR-0004iX-8P; Sat, 12 Apr 2014 15:19:35 +0000 Date: Sat, 12 Apr 2014 08:19:35 -0700 From: Christoph Hellwig To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: <20140412151935.GA18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-2-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-2-git-send-email-lczerner@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397315976 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 11, 2014 at 08:57:43PM +0200, Lukas Czerner wrote: > /* > - * It's not possible to punch hole or perform collapse range > - * on append only file > + * It's not possible to punch hole, perform collapse range > + * or zero range on append only file > */ > - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) > + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE | > + FALLOC_FL_ZERO_RANGE) Might be better to make this a negative test fo the operation that is allowed on an appen only file. That's also much better future proof. From BATV+1fdd4b917c8765947a5c+3884+infradead.org+hch@bombadil.srs.infradead.org Sat Apr 12 10:21:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF7827F59 for ; Sat, 12 Apr 2014 10:21:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A897F8F8035 for ; Sat, 12 Apr 2014 08:21:22 -0700 (PDT) X-ASG-Debug-ID: 1397316077-04cb6c77b414c880001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 76XmcJQqeuaFmyHH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 08:21:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+1fdd4b917c8765947a5c+3884+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYzk5-0005vv-6F; Sat, 12 Apr 2014 15:21:17 +0000 Date: Sat, 12 Apr 2014 08:21:17 -0700 From: Christoph Hellwig To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: <20140412152117.GB18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-3-git-send-email-lczerner@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397316077 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, but the subject line is misleading, it should read something like: "fs: move falloc collapse range check into the filesystem methods" Might also be worth mentioning that size checks for the other modes are in the filesystems in the the long description. Reviewed-by: Christoph Hellwig From BATV+1fdd4b917c8765947a5c+3884+infradead.org+hch@bombadil.srs.infradead.org Sat Apr 12 10:22:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DE0E57F5D for ; Sat, 12 Apr 2014 10:22:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65299AC001 for ; Sat, 12 Apr 2014 08:22:27 -0700 (PDT) X-ASG-Debug-ID: 1397316146-04cb6c77b514c940001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id kcxDbu6bs3vA5akq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 08:22:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+1fdd4b917c8765947a5c+3884+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WYzlB-0006Tl-NX; Sat, 12 Apr 2014 15:22:25 +0000 Date: Sat, 12 Apr 2014 08:22:25 -0700 From: Christoph Hellwig To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile Message-ID: <20140412152225.GC18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-4-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397242665-2183-4-git-send-email-lczerner@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397316146 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Given that the earlier patches were about races - what protects us from swapon racing with the check outside the filesystem locks? From davidsh@host.grupoesanz.com Sat Apr 12 12:47:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=FORGED_HOTMAIL_RCVD2, FORGED_MUA_THEBAT_BOUN,FREEMAIL_FROM,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D15E129DF7 for ; Sat, 12 Apr 2014 12:47:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B3AFE8F8033 for ; Sat, 12 Apr 2014 10:47:08 -0700 (PDT) X-ASG-Debug-ID: 1397324825-04cb6c77b6153850001-NocioJ Received: from host.grupoesanz.com (host.grupoesanz.com [185.18.16.74]) by cuda.sgi.com with ESMTP id uDFC47qd0SPQ2Udp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 10:47:06 -0700 (PDT) X-Barracuda-Envelope-From: davidsh@host.grupoesanz.com X-Barracuda-Apparent-Source-IP: 185.18.16.74 Received: from davidsh by host.grupoesanz.com with local (Exim 4.82) (envelope-from ) id 1WZ20r-0006j5-FE; Sat, 12 Apr 2014 19:46:45 +0200 To: , , , , , , , , , , , , , , Subject: =?windows-1251?B?0eDs++kg4fvx8vD76SDx7+7x7uEg4fDu8ejy?= =?windows-1251?B?/CDq8/Do8vwgliDi8eXj7iDx8/Lq6CE=?= X-PHP-Originating-Script: 549:wftwvqj.php X-ASG-Orig-Subj: =?windows-1251?B?0eDs++kg4fvx8vD76SDx7+7x7uEg4fDu8ejy?= =?windows-1251?B?/CDq8/Do8vwgliDi8eXj7iDx8/Lq6CE=?= From: zyzoguxyxeb@hotmail.com Message-ID: <9558973135.20140412214634@hotmail.com> X-Mailer: The Bat! (v1.35.89) Reply-To: zyzoguxyxeb@hotmail.com MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_20EF_01CF5698.AC6BD700" Sender: Date: Sat, 12 Apr 2014 19:46:45 +0200 X-Barracuda-Connect: host.grupoesanz.com[185.18.16.74] X-Barracuda-Start-Time: 1397324826 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_SA584, FORGED_HOTMAIL_RCVD2, FORGED_MUA_THEBAT_BOUN, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4829 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' 0.00 HTML_MESSAGE BODY: HTML included in message 1.02 FORGED_MUA_THEBAT_BOUN Mail pretending to be from The Bat! (boundary) 0.20 BSF_SC0_SA584 Custom Rule SA584 ------=_NextPart_000_20EF_01CF5698.AC6BD700 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D1=E0=EC=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9 =F1=EF=EE=F1=EE=E1 =E1=F0= =EE=F1=E8=F2=FC =EA=F3=F0=E8=F2=FC XSMOKS.CO.IN ------=_NextPart_000_20EF_01CF5698.AC6BD700 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D1=E0=EC=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9 =F1=EF=EE=F1=EE=E1= =E1=F0=EE=F1=E8=F2=FC=20 =EA=F3=F0=E8=F2=FC XSMOKS.CO.IN
= ------=_NextPart_000_20EF_01CF5698.AC6BD700-- From tytso@thunk.org Sat Apr 12 17:55:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95F217F4E for ; Sat, 12 Apr 2014 17:55:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18BE7AC001 for ; Sat, 12 Apr 2014 15:55:25 -0700 (PDT) X-ASG-Debug-ID: 1397343323-04cbb00dc416e0c0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id DViDyXA1bfmN22fQ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 15:55:23 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZ6pW-0004kE-EQ; Sat, 12 Apr 2014 22:55:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 1777A58026D; Sat, 12 Apr 2014 18:55:21 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397343321; bh=ev17/V/CxqIpkMHDsQigji6VQkm+ZDyncCbUbmF586E=; h=From:To:Cc:Subject:Date:From; b=YZ7AjWkN96+95+rzgT1bU0PRNbxXYXN0KwjRQdy6PQtvHoxhePlWGmauvO5EEJ4kO vQzSeF0tJbWHANagUPU4ePgH6Kp5kb7juk+KPgMCeFps3vpwUQm122y4oklng/VXuP W5HOAnPdrhBGXPIM1qYmwlG7wH5WuhHF1zBSXAo4= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o Subject: [PATCH] ext4: add a new spinlock i_raw_lock to protect the ext4's raw inode Date: Sat, 12 Apr 2014 18:55:14 -0400 X-ASG-Orig-Subj: [PATCH] ext4: add a new spinlock i_raw_lock to protect the ext4's raw inode Message-Id: <1397343317-14669-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397343323 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature To avoid potential data races, use a spinlock which protects the raw (on-disk) inode. Signed-off-by: "Theodore Ts'o" --- fs/ext4/ext4.h | 2 ++ fs/ext4/inode.c | 5 ++++- fs/ext4/super.c | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 86c2cda..1d08a1b 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -875,6 +875,8 @@ struct ext4_inode_info { struct inode vfs_inode; struct jbd2_inode *jinode; + spinlock_t i_raw_lock; /* protects updates to the raw inode */ + /* * File creation time. Its function is same as that of * struct timespec i_{a,c,m}time in the generic inode. diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 2eb5fad..1ee8ff6 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4311,7 +4311,9 @@ static int ext4_do_update_inode(handle_t *handle, uid_t i_uid; gid_t i_gid; - /* For fields not not tracking in the in-memory inode, + spin_lock(&ei->i_raw_lock); + + /* For fields not tracked in the in-memory inode, * initialise them to zero for new inodes. */ if (ext4_test_inode_state(inode, EXT4_STATE_NEW)) memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); @@ -4419,6 +4421,7 @@ static int ext4_do_update_inode(handle_t *handle, ext4_update_inode_fsync_trans(handle, inode, need_datasync); out_brelse: + spin_unlock(&ei->i_raw_lock); brelse(bh); ext4_std_error(inode->i_sb, err); return err; diff --git a/fs/ext4/super.c b/fs/ext4/super.c index c4895c1..1f8cb18 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -879,6 +879,7 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) return NULL; ei->vfs_inode.i_version = 1; + spin_lock_init(&ei->i_raw_lock); INIT_LIST_HEAD(&ei->i_prealloc_list); spin_lock_init(&ei->i_prealloc_lock); ext4_es_init_tree(&ei->i_es_tree); -- 1.9.0 From tytso@thunk.org Sat Apr 12 17:55:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2591A7F52 for ; Sat, 12 Apr 2014 17:55:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 143328F8037 for ; Sat, 12 Apr 2014 15:55:30 -0700 (PDT) X-ASG-Debug-ID: 1397343328-04cbb00dc516e0d0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id EV3wK6ipxXByZoCD (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 15:55:29 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZ6pW-0004kG-FZ; Sat, 12 Apr 2014 22:55:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 2A74C5801A5; Sat, 12 Apr 2014 18:55:21 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397343321; bh=RPOKmpXi/GD7IvwCj07dRSnzlCGVhDTSZf4Iopq0NAM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eJdqn6qUOel1aoY2+sgbM0whI1bbRzIc71mJhmyMQTCu364ObFWsb5PscsBhbmco3 96VLvY1ylPwyd5E8KHsq+FiMRu0Y0HjsV7npv+ICS+C/A8fp2T7oCcBs+GQLXucr2i qGddpPGv+ZGmRDjqBEdfxUMReMhOOj5oc4HqxXcA= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o , Christoph Hellwig Subject: [PATCH 1/3] generic/004: fix filtering of expected error message Date: Sat, 12 Apr 2014 18:55:15 -0400 X-ASG-Orig-Subj: [PATCH 1/3] generic/004: fix filtering of expected error message Message-Id: <1397343317-14669-2-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397343317-14669-1-git-send-email-tytso@mit.edu> References: <1397343317-14669-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397343329 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.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, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature The failure message goes to stderr, so we need to redirect stderr to stdout before running sed. Signed-off-by: "Theodore Ts'o" Cc: Christoph Hellwig --- tests/generic/004 | 2 +- tests/generic/004.out | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/generic/004 b/tests/generic/004 index 406c29e..23ca349 100755 --- a/tests/generic/004 +++ b/tests/generic/004 @@ -58,7 +58,7 @@ $XFS_IO_PROG -T \ rm ${testfile} # test creating a r/o tmpfile. Should fail -$XFS_IO_PROG -Tr ${TEST_DIR} -c "close" | _filter_test_dir +$XFS_IO_PROG -Tr ${TEST_DIR} -c "close" 2>&1 | _filter_test_dir # success, all done status=0 diff --git a/tests/generic/004.out b/tests/generic/004.out index b85c11c..527b2c2 100644 --- a/tests/generic/004.out +++ b/tests/generic/004.out @@ -3,4 +3,4 @@ wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -/mnt/test: Invalid argument +TEST_DIR: Invalid argument -- 1.9.0 From tytso@thunk.org Sat Apr 12 17:55:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D19FD7F50 for ; Sat, 12 Apr 2014 17:55:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B176B8F8037 for ; Sat, 12 Apr 2014 15:55:29 -0700 (PDT) X-ASG-Debug-ID: 1397343328-04cb6c77b4160550001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id zQpYEeRfp8GpdW5p (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 15:55:28 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZ6pW-0004k6-4b; Sat, 12 Apr 2014 22:55:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 4644A5802D7; Sat, 12 Apr 2014 18:55:21 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397343321; bh=blf0MNn/FwCTCckto3I2aqHXmTqEk1KB3nPN/RlcSCs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MuE7tGApdpxHQTixaIW31U5EYWlrxzTFdLZ2+o7DFUrDWyv1Nvneo7FetSteggnS8 WCnc4LPastE+H4M0sE0392gI+ihIe9/ujMpA2cUWYuAUJmFMxVei5uRcnz2kzuuCSI mvu83thJrp+xws5K1q4/urPctduW6a8sh+n9v3vQ= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o Subject: [PATCH 3/3] generic/237: fix filtering for expected failure message Date: Sat, 12 Apr 2014 18:55:17 -0400 X-ASG-Orig-Subj: [PATCH 3/3] generic/237: fix filtering for expected failure message Message-Id: <1397343317-14669-4-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397343317-14669-1-git-send-email-tytso@mit.edu> References: <1397343317-14669-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397343328 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.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, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Newer kernels return EACCES instead of EPERM when modifying an acl fails. Update the filtering to handle this. Signed-off-by: "Theodore Ts'o" --- tests/generic/237 | 2 +- tests/generic/237.out | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/generic/237 b/tests/generic/237 index 6a61ec8..b068150 100755 --- a/tests/generic/237 +++ b/tests/generic/237 @@ -68,7 +68,7 @@ touch file1 chown $acl1.$acl1 file1 echo "Expect to FAIL" -$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | sed 's/^setfacl: \/.*file1: Operation not permitted$/setfacl: file1: Operation not permitted/' +$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | sed -e 's/Permission denied/Operation not permitted/' -e 's/file1: //' -e 's,[/a-zA-Z]*setfacl: ,setfacl: ,' echo "Test over." # success, all done diff --git a/tests/generic/237.out b/tests/generic/237.out index 09d98c6..4edafa6 100644 --- a/tests/generic/237.out +++ b/tests/generic/237.out @@ -1,4 +1,4 @@ QA output created by 237 Expect to FAIL -setfacl: file1: Operation not permitted +setfacl: Operation not permitted Test over. -- 1.9.0 From tytso@thunk.org Sat Apr 12 17:55:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A1737F5D for ; Sat, 12 Apr 2014 17:55:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 502EB30407E for ; Sat, 12 Apr 2014 15:55:33 -0700 (PDT) X-ASG-Debug-ID: 1397343328-04bdf07dc816a3f0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id Gf1RqtYmmCeusYJy (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 15:55:28 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZ6pW-0004k8-5Z; Sat, 12 Apr 2014 22:55:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 380A55802BA; Sat, 12 Apr 2014 18:55:21 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397343321; bh=CQajIs80KgBlhbKPNEGlsWESlDWpkv/vQjzn7P4BahY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BudQRFs5XyH4ijee1IO4Zits/1NIjTo0WTLYAA1eVDPtr2NWZltsOOmcLRCd/Ei+1 Lqkqc/sQapDzepnz9TI0TSZ1bktppszLQp8zHkK0pCFHSbGVJXISTrUzdmTzrgUJM6 jN4zVulsVd2MlZaclFGrT2lzY9MPt5CrIqH9P0eo= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o , Lukas Czerner Subject: [PATCH 2/3] generic/022: update expected output after the test was renamed Date: Sat, 12 Apr 2014 18:55:16 -0400 X-ASG-Orig-Subj: [PATCH 2/3] generic/022: update expected output after the test was renamed Message-Id: <1397343317-14669-3-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397343317-14669-1-git-send-email-tytso@mit.edu> References: <1397343317-14669-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397343328 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature After generic/022 was renamed by commit 21723cdb, the wrong test number was put into generic/022.out. Fix this. Signed-off-by: "Theodore Ts'o" Cc: Lukas Czerner --- tests/generic/022.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generic/022.out b/tests/generic/022.out index 96c2d33..fbffa59 100644 --- a/tests/generic/022.out +++ b/tests/generic/022.out @@ -1,4 +1,4 @@ -QA output created by 009 +QA output created by 022 1. into a hole f4f35d60b3cc18aaa6d8d92f0cd3708a 2. into allocated space -- 1.9.0 From service59@hlrichl.com Sat Apr 12 17:59:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=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: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C8D6D7F4E for ; Sat, 12 Apr 2014 17:59:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D4AE30407E for ; Sat, 12 Apr 2014 15:59:44 -0700 (PDT) X-ASG-Debug-ID: 1397343570-04bdf07dc716a5e0001-NocioJ Received: from mail.hlrichl.com ([192.157.220.207]) by cuda.sgi.com with ESMTP id BfExmQOQxZaj6cBe for ; Sat, 12 Apr 2014 15:59:30 -0700 (PDT) X-Barracuda-Envelope-From: service59@hlrichl.com X-Barracuda-Apparent-Source-IP: 192.157.220.207 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.hlrichl.com 1E20F10A7FF3A DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=hlrichl.com; s=hlrichl; t=1397343473; bh=AiIpBqA0P1YgzbkdYn/TfkcpMSQsYrYOSRT9ce63zEU=; h=Reply-To:Message-ID:From:To:Subject:Date:MIME-Version: Content-Type; b=XdTKzMWbY4856RN2cB53fjZomEBChlF4EVQIypTUwO4QmtoIuaAqnQaVp6hkxAsmX HMJC5fTQRxiYJAcvY9cJ24o4MiiqnyDLydVsKBkjRnOmZ44Y7kQK8+zcy+xtuMgVwO flvNn/fTeyLQiTwY7hMRCWSAz9KVCwvxFquIe/tw= Reply-To: Message-ID: <7B59EA57AEF6CFE0FC90839DEB13F070@vfyqnsv> From: "Jane" To: Subject: Induction heating solution Date: Sun, 13 Apr 2014 06:57:50 +0800 X-ASG-Orig-Subj: Induction heating solution MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0692_010F8146.101B5CC0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Barracuda-Connect: UNKNOWN[192.157.220.207] X-Barracuda-Start-Time: 1397343570 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: eea8d0a85ec96ff45cc795be06416563-1164-txt X-Barracuda-BRTS-Evidence: 6058caacbff8848fedcbf28169e034e2-1582-htm X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_0692_010F8146.101B5CC0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBtYW5hZ2VyLA0KSSBoYXZlIHZpZXdlZCB5b3VyIGNvbXBhbnkgcHJvZmlsZSB0aHJvdWdo IHRoZSBpbnRlcm5ldCwgYW5kIGZvdW5kIHRoZXJlIGV4aXN0cyBhbiBvcHBvcnR1bml0eSBvZiBl c3RhYmxpc2hpbmcgYnVzaW5lc3MgY29vcGVyYXRpb24gYmV0d2VlbiB0d28gb2YgdXMuIFdlIGFy ZSBhIENoaW5lc2Ugc2VuaW9yIHByZWNpc2lvbiBmb3VuZHJ5IHdoaWNoIHByb2R1Y2luZyBhbGwg a2luZHMgb2YgY2FzdGluZywgZm9yZ2luZywgc3RhbXBpbmdzIHNwYXJlIHBhcnRzLCB3ZWxkaW5n IGZhYnJpY2F0aW9uIHBhcnRzIGV0Yy4gQW5udWFsIG91dHB1dCBpcyBvdmVyIDEwLDAwMCB0b25z LiANCk1haW4gcHJvZHVjdHM6DQoxLiBDYXN0aW5nIGFuZCBtYWNoaW5pbmcgcGFydHMgKGNvbnN0 cnVjdGlvbiBlcXVpcG1lbnQgc3BhcmUgcGFydHMsIEdFVCBwYXJ0cywgYWdyaWN1bHR1cmFsIG1h Y2hpbmVyeSBwYXJ0cywgZXhjYXZhdG9yIHNwYXJlIHBhcnRzLCB0cmFpbiAmIGF1dG9tb2JpbGUg c3BhcmUgcGFydHMsIGV0Yy4pDQoyLiBPcGVuIGRpZSAmIENsb3NlZCBkaWUgRm9yZ2luZyBwYXJ0 cyAoZmxhbmdlLCBzaGFmdCwgcmluZywgZXRjKQ0KMy4gV2VsZGluZyBmYWJyaWNhdGlvbiBwYXJ0 cyAodHJhY2sgZnJhbWUsIGV4Y2F2YXRvciBidWNrZXRzLCBhZ3JpY3VsdHVyYWwgbWFjaGluZXJ5 IGZyYW1lLCBwdWx2ZXJpemVyIGZyYW1lLCkNCjQuIFN0YW1waW5nIHBhcnRzLi4NCg0KV2UgaGF2 ZSB0aGUgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgdGhlIHByb2R1Y3RzIGFjY29yZGluZyB0byB5 b3VyIGRyYXdpbmdzLCBpZiB5b3UgYXJlIGludGVyZXN0IGluIHNvbWUgDQpwcm9kdWN0cywgcGxl YXNlIHNlbmQgdGhlIGRyYXdpbmcgdG8gdXMhIFdlIHdvdWxkIGxpa2UgdG8gb2ZmZXIgeW91IHRo ZSBiZXN0IHByaWNlLCBxdWFsaXR5IGFuZCBzZXJ2aWNlIHRvIHlvdS4NCg0KU2luY2VyZWx5IHdp c2ggd29yayB3aXRoIHlvdSB0b2dldGhlciENClRoYW5rcyBhbmQgUmVnYXJkcw0KSmFuZSBUdQ0K U2FsZXMgTWFuYWdlcg0KUEFSRkVDVCBDQVNUSU5HIENPLiwgTFREDQpUZWw6IDAwODYtNTc0LTI4 NTg2OTI4IA0KRmF4OiAwMDg2LTU3NC0yNzg1MTAyMA0KRS1tYWlsOiBqYW5lQHN0ZWVsLWNhc3Rp bmctZm9yZ2luZy5jb20NCg0KQ2FzdGluZyAmIG1hY2hpbmluZyBwYXJ0OiA= ------=_NextPart_000_0692_010F8146.101B5CC0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMjM1MzYiPjwvSEVBRD4NCjxCT0RZPg0KPFA+RGVhciBtYW5h Z2VyLDwvUD4NCjxQPkkgaGF2ZSB2aWV3ZWQgeW91ciBjb21wYW55IHByb2ZpbGUgdGhyb3VnaCB0 aGUgaW50ZXJuZXQsIGFuZCBmb3VuZCB0aGVyZSANCmV4aXN0cyBhbiBvcHBvcnR1bml0eSBvZiBl c3RhYmxpc2hpbmcgYnVzaW5lc3MgY29vcGVyYXRpb24gYmV0d2VlbiB0d28gb2YgdXMuIFdlIA0K YXJlIGEgQ2hpbmVzZSBzZW5pb3IgcHJlY2lzaW9uIGZvdW5kcnkgd2hpY2ggcHJvZHVjaW5nIGFs bCBraW5kcyBvZiBjYXN0aW5nLCANCmZvcmdpbmcsIHN0YW1waW5ncyBzcGFyZSBwYXJ0cywgd2Vs ZGluZyBmYWJyaWNhdGlvbiBwYXJ0cyBldGMuIEFubnVhbCBvdXRwdXQgaXMgDQpvdmVyIDEwLDAw MCB0b25zLiA8L1A+DQo8UD5NYWluIHByb2R1Y3RzOjwvUD4NCjxQPjEuIENhc3RpbmcgYW5kIG1h Y2hpbmluZyBwYXJ0cyAoY29uc3RydWN0aW9uIGVxdWlwbWVudCBzcGFyZSBwYXJ0cywgR0VUIA0K cGFydHMsIGFncmljdWx0dXJhbCBtYWNoaW5lcnkgcGFydHMsIGV4Y2F2YXRvciBzcGFyZSBwYXJ0 cywgdHJhaW4gJmFtcDsgDQphdXRvbW9iaWxlIHNwYXJlIHBhcnRzLCBldGMuKTwvUD4NCjxQPjIu IE9wZW4gZGllICZhbXA7IENsb3NlZCBkaWUgRm9yZ2luZyBwYXJ0cyAoZmxhbmdlLCBzaGFmdCwg cmluZywgZXRjKTwvUD4NCjxQPjMuIFdlbGRpbmcgZmFicmljYXRpb24gcGFydHMgKHRyYWNrIGZy YW1lLCBleGNhdmF0b3IgYnVja2V0cywgYWdyaWN1bHR1cmFsIA0KbWFjaGluZXJ5IGZyYW1lLCBw dWx2ZXJpemVyIGZyYW1lLCk8L1A+DQo8UD40LiBTdGFtcGluZyBwYXJ0cy4uPC9QPg0KPFA+Jm5i c3A7PC9QPg0KPFA+V2UgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgdGhlIHByb2R1 Y3RzIGFjY29yZGluZyB0byB5b3VyIGRyYXdpbmdzLCANCmlmIHlvdSBhcmUgaW50ZXJlc3QgaW4g c29tZSA8L1A+DQo8UD5wcm9kdWN0cywgcGxlYXNlIHNlbmQgdGhlIGRyYXdpbmcgdG8gdXMhIFdl IHdvdWxkIGxpa2UgdG8gb2ZmZXIgeW91IHRoZSBiZXN0IA0KcHJpY2UsIHF1YWxpdHkgYW5kIHNl cnZpY2UgdG8geW91LjwvUD4NCjxQPiZuYnNwOzwvUD4NCjxQPlNpbmNlcmVseSB3aXNoIHdvcmsg d2l0aCB5b3UgdG9nZXRoZXIhPC9QPg0KPFA+VGhhbmtzIGFuZCBSZWdhcmRzPC9QPg0KPFA+SmFu ZSBUdTwvUD4NCjxQPlNhbGVzIE1hbmFnZXI8L1A+DQo8UD5QQVJGRUNUIENBU1RJTkcgQ08uLCBM VEQ8L1A+DQo8UD5UZWw6IDAwODYtNTc0LTI4NTg2OTI4IDxCUj5GYXg6IDAwODYtNTc0LTI3ODUx MDIwPEJSPkUtbWFpbDogDQpqYW5lQHN0ZWVsLWNhc3RpbmctZm9yZ2luZy5jb208L1A+DQo8UD4m bmJzcDs8L1A+DQo8UD5DYXN0aW5nICZhbXA7IG1hY2hpbmluZyBwYXJ0OiA8L1A+DQo8UD4mbmJz cDs8L1A+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_000_0692_010F8146.101B5CC0-- From tytso@thunk.org Sat Apr 12 18:03:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4CE177F4E for ; Sat, 12 Apr 2014 18:03:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C05E8F8049 for ; Sat, 12 Apr 2014 16:03:03 -0700 (PDT) X-ASG-Debug-ID: 1397343782-04cbb00dc616e480001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id a42CipOQxgflM5DA (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 16:03:02 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZ6ww-000510-HA; Sat, 12 Apr 2014 23:03:02 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id BB5EF58026D; Sat, 12 Apr 2014 19:03:01 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397343781; bh=1Hbs+zNlDP0J2w9LGk7PA6lLg0Fi7CuVLiZkYB0gL5w=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=JDit08hzFak109zAapa1B48gMACZjgS1KcAYneqggffsVpalRM0g+aLnZjVPs4/m+ y5tyE/FyR1eyK2PFFHfHb6EJP0IC6vAnZG+bUlJKGuH8nQQtfHgwUSNRex2GMqIoSd 4RW/LTV+CoJktGIKPH12V41CHGqdKExGLXIkGXi8= Date: Sat, 12 Apr 2014 19:03:01 -0400 From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List Subject: Re: [PATCH] ext4: add a new spinlock i_raw_lock to protect the ext4's raw inode Message-ID: <20140412230301.GB14599@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] ext4: add a new spinlock i_raw_lock to protect the ext4's raw inode References: <1397343317-14669-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397343317-14669-1-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397343782 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, Apr 12, 2014 at 06:55:14PM -0400, Theodore Ts'o wrote: > To avoid potential data races, use a spinlock which protects the raw > (on-disk) inode. > > Signed-off-by: "Theodore Ts'o" Sigh, sorry, left over patch in the /tmp/p directory. Please ignore.... - Ted From tytso@thunk.org Sat Apr 12 18:13:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C9F07F4E for ; Sat, 12 Apr 2014 18:13:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 084ED304075 for ; Sat, 12 Apr 2014 16:13:12 -0700 (PDT) X-ASG-Debug-ID: 1397344391-04cbb00dc516e970001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id Kqi38L0rjur8PWS1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 16:13:11 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZ76k-00051f-PM; Sat, 12 Apr 2014 23:13:10 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id F25FA58026D; Sat, 12 Apr 2014 19:13:09 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397344390; bh=kjBwXz3xp1NshErwbL250DOl9L7M3/UBQaN8Q6WPfoE=; h=From:To:Cc:Subject:Date:From; b=WpNg5mPn1T9Ci0L4Z6F+IB+WeZE8KlXXuaBpypxSJ1qKjH5E1qgZus0TzUj6a/oLg KFdRx/u4LLCSgNMcDAMbk9LmVmZ/bbCVosvoEhWKahUNJJp6Cx6O1lL7HSd4WaofY+ YgUrH9G7tDLbMGvTj5DekT7kLtqqWU7r/L24duAU= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o , Miklos Szeredi Subject: [PATCH] renameat2: add system call number for i386 Date: Sat, 12 Apr 2014 19:13:04 -0400 X-ASG-Orig-Subj: [PATCH] renameat2: add system call number for i386 Message-Id: <1397344384-15302-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397344391 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Signed-off-by: "Theodore Ts'o" Cc: Miklos Szeredi --- src/renameat2.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/renameat2.c b/src/renameat2.c index 5145959..8613aa9 100644 --- a/src/renameat2.c +++ b/src/renameat2.c @@ -14,6 +14,10 @@ #define SYS_renameat2 316 #endif +#if !defined(SYS_renameat2) && defined(__i386__) +#define SYS_renameat2 353 +#endif + static int renameat2(int dfd1, const char *path1, int dfd2, const char *path2, unsigned int flags) -- 1.9.0 From webmaster@vserver2014.net.in Sat Apr 12 18:52:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=FORGED_HOTMAIL_RCVD2, FORGED_MUA_THEBAT_BOUN,FREEMAIL_FROM,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EB6C27F4E for ; Sat, 12 Apr 2014 18:52:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC3818F8035 for ; Sat, 12 Apr 2014 16:52:22 -0700 (PDT) X-ASG-Debug-ID: 1397346738-04cb6c77b4162130001-NocioJ Received: from vserver2014.net.in (155.29.219.91.colo.ukrservers.com [91.219.29.155]) by cuda.sgi.com with ESMTP id 3KLdSoTUJN9nFlhc (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 12 Apr 2014 16:52:19 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@vserver2014.net.in X-Barracuda-Apparent-Source-IP: 91.219.29.155 Received: from www-data by vserver2014.net.in with local (Exim 4.80) (envelope-from ) id 1WZ7iS-0007v3-K3; Sun, 13 Apr 2014 03:52:08 +0400 To: , , , , , , , , , , , , , , Subject: =?windows-1251?B?wfDu8ejy/CDq8/Do8vwgLSDv8O7x8u4hIMz7?= =?windows-1251?B?IPDg8fHq4Obl7Cwg6uDqIPHg7O7x8u7/8uXr?= =?windows-1251?B?/O3uIOHw7vHo8vwg6vPw6PL8IQ==?= X-PHP-Originating-Script: 500:mailout.php X-ASG-Orig-Subj: =?windows-1251?B?wfDu8ejy/CDq8/Do8vwgLSDv8O7x8u4hIMz7?= =?windows-1251?B?IPDg8fHq4Obl7Cwg6uDqIPHg7O7x8u7/8uXr?= =?windows-1251?B?/O3uIOHw7vHo8vwg6vPw6PL8IQ==?= X-Mailer: The Bat! (v8.45.07) From: "XSMOKS h" Reply-To: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_12A1_01CF56CB.BDDDC010" Message-Id: Date: Sun, 13 Apr 2014 03:52:08 +0400 X-Barracuda-Connect: 155.29.219.91.colo.ukrservers.com[91.219.29.155] X-Barracuda-Start-Time: 1397346739 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.92 X-Barracuda-Spam-Status: No, SCORE=1.92 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA584, BSF_SC5_MJ1963, FORGED_HOTMAIL_RCVD2, HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA584 Custom Rule SA584 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_NextPart_000_12A1_01CF56CB.BDDDC010 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D1=E0=EC=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9 =F1=EF=EE=F1=EE=E1 =E1=F0= =EE=F1=E8=F2=FC =EA=F3=F0=E8=F2=FC. =CF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8 =F1= =EC=EE=F2=F0=E8=F2=E5 =ED=E0 =F1=E0=E9=F2=E5: [ =CF=C5=D0=C5=C9=D2=C8 =CD= =C0 =D1=C0=C9=D2] ------=_NextPart_000_12A1_01CF56CB.BDDDC010 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D1=E0=EC=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9 =F1=EF=EE=F1=EE=E1= =E1=F0=EE=F1=E8=F2=FC=20 =EA=F3=F0=E8=F2=FC. =CF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8 =F1=EC=EE=F2=F0=E8=F2= =E5 =ED=E0 =F1=E0=E9=F2=E5: [ =CF=C5=D0=C5=C9=D2=C8= =CD=C0 =D1=C0=C9=D2]
------=_NextPart_000_12A1_01CF56CB.BDDDC010-- From sandeen@sandeen.net Sat Apr 12 23:06:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 873847F4E for ; Sat, 12 Apr 2014 23:06:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B183304075 for ; Sat, 12 Apr 2014 21:06:09 -0700 (PDT) X-ASG-Debug-ID: 1397361965-04cbb00dc61780f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KyIjWHJpu5DBUp8f for ; Sat, 12 Apr 2014 21:06:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2F5E263C5FC2; Sat, 12 Apr 2014 23:06:05 -0500 (CDT) Message-ID: <534A0D2C.409@sandeen.net> Date: Sat, 12 Apr 2014 23:06:04 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Theodore Ts'o , xfs@oss.sgi.com CC: Christoph Hellwig , Ext4 Developers List Subject: Re: [PATCH 1/3] generic/004: fix filtering of expected error message References: <1397343317-14669-1-git-send-email-tytso@mit.edu> <1397343317-14669-2-git-send-email-tytso@mit.edu> X-ASG-Orig-Subj: Re: [PATCH 1/3] generic/004: fix filtering of expected error message In-Reply-To: <1397343317-14669-2-git-send-email-tytso@mit.edu> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397361965 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4843 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/12/14, 5:55 PM, Theodore Ts'o wrote: > The failure message goes to stderr, so we need to redirect stderr to > stdout before running sed. Heh, whoops. Reviewed-by: Eric Sandeen > Signed-off-by: "Theodore Ts'o" > Cc: Christoph Hellwig > --- > tests/generic/004 | 2 +- > tests/generic/004.out | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/tests/generic/004 b/tests/generic/004 > index 406c29e..23ca349 100755 > --- a/tests/generic/004 > +++ b/tests/generic/004 > @@ -58,7 +58,7 @@ $XFS_IO_PROG -T \ > rm ${testfile} > > # test creating a r/o tmpfile. Should fail > -$XFS_IO_PROG -Tr ${TEST_DIR} -c "close" | _filter_test_dir > +$XFS_IO_PROG -Tr ${TEST_DIR} -c "close" 2>&1 | _filter_test_dir > > # success, all done > status=0 > diff --git a/tests/generic/004.out b/tests/generic/004.out > index b85c11c..527b2c2 100644 > --- a/tests/generic/004.out > +++ b/tests/generic/004.out > @@ -3,4 +3,4 @@ wrote 4096/4096 bytes at offset 0 > XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > read 4096/4096 bytes at offset 0 > XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > -/mnt/test: Invalid argument > +TEST_DIR: Invalid argument > From sandeen@sandeen.net Sat Apr 12 23:07:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 80A5B7F53 for ; Sat, 12 Apr 2014 23:07:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F4005AC001 for ; Sat, 12 Apr 2014 21:07:15 -0700 (PDT) X-ASG-Debug-ID: 1397362034-04cbb00dc51781e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 2aXePdr9u4hadst4 for ; Sat, 12 Apr 2014 21:07:14 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5CC8B63C5FC2; Sat, 12 Apr 2014 23:07:14 -0500 (CDT) Message-ID: <534A0D72.10304@sandeen.net> Date: Sat, 12 Apr 2014 23:07:14 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Theodore Ts'o , xfs@oss.sgi.com CC: Lukas Czerner , Ext4 Developers List Subject: Re: [PATCH 2/3] generic/022: update expected output after the test was renamed References: <1397343317-14669-1-git-send-email-tytso@mit.edu> <1397343317-14669-3-git-send-email-tytso@mit.edu> X-ASG-Orig-Subj: Re: [PATCH 2/3] generic/022: update expected output after the test was renamed In-Reply-To: <1397343317-14669-3-git-send-email-tytso@mit.edu> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397362034 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4843 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 4/12/14, 5:55 PM, Theodore Ts'o wrote: > After generic/022 was renamed by commit 21723cdb, the wrong test > number was put into generic/022.out. Fix this. > > Signed-off-by: "Theodore Ts'o" > Cc: Lukas Czerner Lukas sent this a couple days ago as well. In any case, again, Reviewed-by: Eric Sandeen > --- > tests/generic/022.out | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tests/generic/022.out b/tests/generic/022.out > index 96c2d33..fbffa59 100644 > --- a/tests/generic/022.out > +++ b/tests/generic/022.out > @@ -1,4 +1,4 @@ > -QA output created by 009 > +QA output created by 022 > 1. into a hole > f4f35d60b3cc18aaa6d8d92f0cd3708a > 2. into allocated space > From webmaster@getit18.livemailz.com Sun Apr 13 00:34:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C36907F53 for ; Sun, 13 Apr 2014 00:34:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A60C8304071 for ; Sat, 12 Apr 2014 22:34:32 -0700 (PDT) X-ASG-Debug-ID: 1397367266-04cb6c77b616cf10001-NocioJ Received: from server.livemailz.com (server.livemailz.com [115.124.106.32]) by cuda.sgi.com with ESMTP id b0ddZvW6HGasPlFD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 12 Apr 2014 22:34:28 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@getit18.livemailz.com X-Barracuda-Apparent-Source-IP: 115.124.106.32 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=getit18.livemailz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=lhesBRxHSt7l0NvtdtThdZe1z9ASv57eFgg4QXYezss=; b=N7f5Gz0yYyDq4Zr4tNAcYx6evO2xCZoRFn4+iaqDqGOGX9+CHkiQAGPXFPUdXIyJ3oHyabfG4h7h3ya8WeIm4Q1ocoRzKh11nRPNsCv343kqk+JHO5rhlaiEYkefSYQvAaJGL9EX71C9AXSv3qctnV9D75CkLShzkw7GnW9JpYM=; Received: from getit18l by server.livemailz.com with local (Exim 4.82) (envelope-from ) id 1WZD3f-0002FE-2u for xfs@oss.sgi.com; Sun, 13 Apr 2014 11:04:23 +0530 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: getit18.livemailz.com/mailz/index.php for 66.249.79.86 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-79-86.googlebot.com [66.249.79.86] by getit18.livemailz.com with HTTP; Sun, 13 Apr 2014 05:34:22 +0000 Date: Sun, 13 Apr 2014 05:34:23 +0000 From: Webmaster Reply-To: Webmaster Message-ID: <3f3f87f013a32860412c2f3b72593162@getit18.livemailz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.5 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@getit18.livemailz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.livemailz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [526 32007] / [47 12] X-AntiAbuse: Sender Address Domain - getit18.livemailz.com X-Get-Message-Sender-Via: server.livemailz.com: authenticated_id: getit18l/from_h X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/getit18l/public_html/mailz/index.php X-Source-Dir: getit18.livemailz.com:/public_html/mailz X-Barracuda-Connect: server.livemailz.com[115.124.106.32] X-Barracuda-Start-Time: 1397367267 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://getit18.livemailz.com/mailz/?p=subscribe and follow the steps. Thank you From BATV+40a7f56111a05785034f+3885+infradead.org+hch@bombadil.srs.infradead.org Sun Apr 13 03:17:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 417A57F56 for ; Sun, 13 Apr 2014 03:17:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2811C8F8037 for ; Sun, 13 Apr 2014 01:17:44 -0700 (PDT) X-ASG-Debug-ID: 1397377058-04cb6c77b71716c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HmSKDaBwGTphblqt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 13 Apr 2014 01:17:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+40a7f56111a05785034f+3885+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WZFbe-0001UT-PI; Sun, 13 Apr 2014 08:17:38 +0000 Date: Sun, 13 Apr 2014 01:17:38 -0700 From: Christoph Hellwig To: Theodore Ts'o Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message Message-ID: <20140413081738.GA5331@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message References: <1397343317-14669-1-git-send-email-tytso@mit.edu> <1397343317-14669-4-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397343317-14669-4-git-send-email-tytso@mit.edu> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397377059 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Apr 12, 2014 at 06:55:17PM -0400, Theodore Ts'o wrote: > Newer kernels return EACCES instead of EPERM when modifying an acl > fails. Update the filtering to handle this. > > Signed-off-by: "Theodore Ts'o" I've not seen this yet. What exact configuration do you use to get the error? From tytso@thunk.org Sun Apr 13 07:44:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DEE727F4E for ; Sun, 13 Apr 2014 07:44:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE7B930407F for ; Sun, 13 Apr 2014 05:44:00 -0700 (PDT) X-ASG-Debug-ID: 1397393038-04cbb00dc5187ff0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id tsMknQpwCGARbi0R (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 13 Apr 2014 05:43:59 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZJlK-0001uL-QA; Sun, 13 Apr 2014 12:43:54 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id E25D458026D; Sun, 13 Apr 2014 08:43:53 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1397393033; bh=zGprqsHwsf3qYWB8BtMGnO4kFK4mdvOJuQqn8FIe/3M=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=yNZCYaMFhAtNRb80fElTi5Xb+lqEbyuGavWg9cM3PS7VEF9FH23AeqnnfSIH3f5kb gMWZeRV0K42c2a3YOGDsY2EtC3cfR4I8a9bHYdvmMwjay7GDBzrcVQ3RF+hT0XWaj5 sLPrIfEII1BtbSsoz86J1H6q3fX2hgrQ76HssLvQ= Date: Sun, 13 Apr 2014 08:43:53 -0400 From: Theodore Ts'o To: Christoph Hellwig Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message Message-ID: <20140413124353.GD14599@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message References: <1397343317-14669-1-git-send-email-tytso@mit.edu> <1397343317-14669-4-git-send-email-tytso@mit.edu> <20140413081738.GA5331@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140413081738.GA5331@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397393039 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.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, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4854 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, Apr 13, 2014 at 01:17:38AM -0700, Christoph Hellwig wrote: > On Sat, Apr 12, 2014 at 06:55:17PM -0400, Theodore Ts'o wrote: > > Newer kernels return EACCES instead of EPERM when modifying an acl > > fails. Update the filtering to handle this. > > > > Signed-off-by: "Theodore Ts'o" > > I've not seen this yet. What exact configuration do you use to get the > error? I was using a 32-bit kernel, using a recent Linus upstream. The bug was showing up for both ext4 and xfs, and xfstests-bld is using a very recent version of the acl package? If you're not seeing it, perhaps the most likely cause would be the fact that I was using an i386 kernel, and/or the version of the acl userspace package found in kvm-xfstests? If you want a repro, you could grab: git://git.kernel.org/pub/scm/fs/ext2/xfstests-bld.git and then building the per the README. If you don't have a Debian testing system conviently to hand, you could pull down: https://www.kernel.org/pub/linux/kernel/people/tytso/kvm-xfstests/root_fs.img.i386 ... and then update the image to have the xfstests upstream version of /root/xfstests/tests/generic/237*. Cheers, - Ted From apache@s16114807.onlinehome-server.info Sun Apr 13 09:55:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=FORGED_MUA_THEBAT_BOUN, FREEMAIL_FROM,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 0D96C7F4E for ; Sun, 13 Apr 2014 09:55:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D04CA304075 for ; Sun, 13 Apr 2014 07:55:30 -0700 (PDT) X-ASG-Debug-ID: 1397400926-04cb6c77b717fff0001-NocioJ Received: from s16114807.onlinehome-server.info (s16114807.onlinehome-server.info [87.106.128.159]) by cuda.sgi.com with ESMTP id akRNMMJBgENlxZOj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 13 Apr 2014 07:55:27 -0700 (PDT) X-Barracuda-Envelope-From: apache@s16114807.onlinehome-server.info X-Barracuda-Apparent-Source-IP: 87.106.128.159 Received: by s16114807.onlinehome-server.info (Postfix, from userid 502) id 6C67C166C; Sun, 13 Apr 2014 16:00:44 +0100 (BST) To: , , , , , , , , , , , , , , Subject: =?windows-1251?B?yuvo7/HgIKvA7fLo9fDg77s6IOH78fLw5eUg?= =?windows-1251?B?7vIg9fDg7+Ag6Ofh4OLo8vzx/yDt5eLu5+zu?= =?windows-1251?B?5u3uISA=?= X-PHP-Originating-Script: 10000:mailout.php X-ASG-Orig-Subj: =?windows-1251?B?yuvo7/HgIKvA7fLo9fDg77s6IOH78fLw5eUg?= =?windows-1251?B?7vIg9fDg7+Ag6Ofh4OLo8vzx/yDt5eLu5+zu?= =?windows-1251?B?5u3uISA=?= X-Mailer: The Bat! (v3.65.00) From: =?windows-1251?B?1dDAz9PNxdIu0NM=?= Reply-To: =?windows-1251?B?1dDAz9PNxdIu0NM=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1AC9_01CF5749.E9601110" Message-Id: <20140413150044.6C67C166C@s16114807.onlinehome-server.info> Date: Sun, 13 Apr 2014 16:00:44 +0100 (BST) X-Barracuda-Connect: s16114807.onlinehome-server.info[87.106.128.159] X-Barracuda-Start-Time: 1397400927 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: allderm.us 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA584 Custom Rule SA584 ------=_NextPart_000_1AC9_01CF5749.E9601110 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=EE=F7=F3=E2=F1=F2=E2=F3=E9=F2=E5 =F3=E4=EE=E2=EE=EB=FC=F1=F2=E2=E8=E5= =EE=F2 =F1=ED=E0 =E2=EC=E5=F1=F2=E5 =F1 =EA=EB=E8=EF=F1=EE=E9 =AB=C0=ED=F2= =E8=F5=F0=E0=EF=BB. http://allderm.us/wdyclhu.php=20 ------=_NextPart_000_1AC9_01CF5749.E9601110 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=EE=F7=F3=E2=F1=F2=E2=F3=E9=F2=E5 =F3=E4=EE=E2=EE=EB=FC=F1=F2=E2=E8= =E5 =EE=F2 =F1=ED=E0 =E2=EC=E5=F1=F2=E5 =F1 =EA=EB=E8=EF=F1=EE=E9 =AB=C0=ED= =F2=E8=F5=F0=E0=EF=BB. =CD=C5=D2=D5=D0=C0=CF=D3.=D0=D3=20
------=_NextPart_000_1AC9_01CF5749.E9601110-- From david@fromorbit.com Sun Apr 13 18:40:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 60C8D7F4E for ; Sun, 13 Apr 2014 18:40:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3CE4AC004 for ; Sun, 13 Apr 2014 16:40:07 -0700 (PDT) X-ASG-Debug-ID: 1397432401-04bdf07dcc1a1760001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id dOsHKWMb1E9FCqwL for ; Sun, 13 Apr 2014 16:40: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: Ao1TACEfS1N5LEcvPGdsb2JhbABZDoJ4g1CFC7VxhV2BGRcDAQEBATg1giUBAQEEOhwjEAgDGAklDwUlAwcaE4d7yloXFo5YB4MkgRQEmGCKZYpQUis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 09:10:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZU0E-00071P-6V; Mon, 14 Apr 2014 09:39:58 +1000 Date: Mon, 14 Apr 2014 09:39:58 +1000 From: Dave Chinner To: Theodore Ts'o Cc: Lukas Czerner , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: <20140413233958.GB27694@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> <20140412135906.GC13837@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140412135906.GC13837@thunk.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: 1397432402 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 12, 2014 at 09:59:06AM -0400, Theodore Ts'o wrote: > On Fri, Apr 11, 2014 at 08:57:44PM +0200, Lukas Czerner wrote: > > Currently in do_fallocate in collapse range case we're checking whether > > offset + len is not bigger than i_size. However there is nothing which > > would prevent i_size from changing so the check is pointless. It should > > be done in the file system itself and the file system needs to make sure > > that i_size is not going to change. > > > > As it is now we can easily crash kernel by having two processes doing > > truncate and fallocate collapse range at the same time. This can be > > reproduced on ext4 and it is theoretically possible on xfs even though I > > was not able to trigger it with this simple test. > > > > This commit removes the check from do_fallocate and adds it to the file > > system. > > > > Signed-off-by: Lukas Czerner > > --- > > fs/ext4/extents.c | 11 +++++++++-- > > fs/open.c | 8 -------- > > fs/xfs/xfs_file.c | 10 +++++++++- > > 3 files changed, 18 insertions(+), 11 deletions(-) > > Looks good to me. Do the xfs folks mind if I carry this in the ext4 > tree and push it to Linus shortly after -rc1? If so, please send me > an ack'ed by. No, go ahead. I was going to do the same thing, anyway, if nobody else beat me to it... Acked-by: Dave Chinner Cheers, Dave -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 19:14:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 401337F4E for ; Sun, 13 Apr 2014 19:14:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 193488F8037 for ; Sun, 13 Apr 2014 17:14:14 -0700 (PDT) X-ASG-Debug-ID: 1397434452-04cbb00dc31a5900001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tLYOyve8YGK8c9yz for ; Sun, 13 Apr 2014 17:14:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtpOAFsnS1N5LEcvPGdsb2JhbABaDoJ4g1CFC7VxhV2BHBcDAQEBATg1giUBAQEEOhwjEAgDGAklDwUlAwcaE4d7ynQXFo5YB4MkgRQEmGCVNVIr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 09:44:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZUXI-000752-Hh; Mon, 14 Apr 2014 10:14:08 +1000 Date: Mon, 14 Apr 2014 10:14:08 +1000 From: Dave Chinner To: Theodore Ts'o Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message Message-ID: <20140414001408.GC27694@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message References: <1397343317-14669-1-git-send-email-tytso@mit.edu> <1397343317-14669-4-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397343317-14669-4-git-send-email-tytso@mit.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: 1397434452 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Sat, Apr 12, 2014 at 06:55:17PM -0400, Theodore Ts'o wrote: > Newer kernels return EACCES instead of EPERM when modifying an acl > fails. Update the filtering to handle this. > > Signed-off-by: "Theodore Ts'o" > --- > tests/generic/237 | 2 +- > tests/generic/237.out | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/tests/generic/237 b/tests/generic/237 > index 6a61ec8..b068150 100755 > --- a/tests/generic/237 > +++ b/tests/generic/237 > @@ -68,7 +68,7 @@ touch file1 > chown $acl1.$acl1 file1 > > echo "Expect to FAIL" > -$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | sed 's/^setfacl: \/.*file1: Operation not permitted$/setfacl: file1: Operation not permitted/' > +$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | sed -e 's/Permission denied/Operation not permitted/' -e 's/file1: //' -e 's,[/a-zA-Z]*setfacl: ,setfacl: ,' This is getting unweildy. Can you factor this into a local _filter_setfacl_error function of some kind? It would also help if you put a comment iterating all the different output formats it's now trying to filter out, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 19:29:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 629097F4E for ; Sun, 13 Apr 2014 19:29:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EADAFAC002 for ; Sun, 13 Apr 2014 17:29:47 -0700 (PDT) X-ASG-Debug-ID: 1397435385-04cbb00dc51a6180001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ZduODMvw3ELZjlAW for ; Sun, 13 Apr 2014 17:29:45 -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: AttOANkqS1N5LEcvPGdsb2JhbABagwaDUIULtXGFXYEcFwMBAQEBODWCJQEBAQQ6HCMQCAMOCgklDwUNGAMHGhOHaAMQxAYNhmMXFow/ghkHgySBFAEDlnOBbYx1iRIr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 09:59:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZUmN-00077A-1k; Mon, 14 Apr 2014 10:29:43 +1000 Date: Mon, 14 Apr 2014 10:29:43 +1000 From: Dave Chinner To: Eric Whitney Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH] generic: add fallocate() checks to generic/300 Message-ID: <20140414002942.GD27694@dastard> X-ASG-Orig-Subj: Re: [PATCH] generic: add fallocate() checks to generic/300 References: <20140411214307.GC10174@wallace> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140411214307.GC10174@wallace> 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: 1397435385 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4879 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, Apr 11, 2014 at 05:43:07PM -0400, Eric Whitney wrote: > Generic/300 fails when run on a test filesystem that does not support > fallocate(). It uses fio's falloc ioengine to generate part of its I/O > load and both allocates blocks and punches holes. This causes EOPNOTSUPP > failures when the test is run on indirect block-mapped ext4 filesystems > or pre-3.14 ext4 filesystems created with bigalloc. > > Verify that the test filesystem supports fallocate() before proceeding > with the test, checking for both block allocation and hole punching > capabilities. Also, delete any pre-existing test output. > > Signed-off-by: Eric Whitney Makes sense. Same for the second patch, too. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 19:49:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A14657F4E for ; Sun, 13 Apr 2014 19:49:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 882EB304032 for ; Sun, 13 Apr 2014 17:49:47 -0700 (PDT) X-ASG-Debug-ID: 1397436583-04cb6c77b719a470001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id b9tO0J02grIZ9pa5 for ; Sun, 13 Apr 2014 17:49:43 -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: Ar1QAJcvS1N5LEcvPGdsb2JhbABagwY7gxWFC6IbkX6BWIVdgR0XAwEBAQE4NYJmHCMYJDQFJQMHLYd7ywUWjlgdghgPZ4EUBJhggTeUUCs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 10:19:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZV5e-0007BU-3N; Mon, 14 Apr 2014 10:49:38 +1000 Date: Mon, 14 Apr 2014 10:49:38 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to 249cc51 Message-ID: <20140414004938.GE27694@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 249cc51 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397436583 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4880 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. This update includes tests for the new renameat2 syscall, and a bunch of fixes for the new config file format infrastructure. The new head of the master branch is commit: 249cc51 generic: add renameat2 system call number for i386 New Commits: Alexander Tsvetkov (1): [7e07c4b] generic/204: correct log size for XFS Eric Whitney (2): [2e9061f] generic/300: add fallocate() checks [f729616] generic/311: add fallocate() check Eryu Guan (1): [9f1a8e7] ext4/306: disable 64bit feature too Lukas Czerner (6): [f00a444] config: Fix SCRATCH_DEV_POOL handling [7407717] config: Unset SCRATCH_DEV when deduced from SCRATCH_DEV_POOL [e0f5daf] config: Fix setting FSTYP automatically [5138e74] config: fix specifying configuration value with equality sign [ed6d096] generic/022: Fix output file [a0e2d8e] config: Add -s option to run only specified sections Miklos Szeredi (4): [413f501] common: add infrastructure for renameat2 syscall tests [bdf2150] generic: check plain renameat2 syscall [1f98dd0] generic: check noreplace renameat2 syscall [3c9cd13] generic: check cross renameat2 syscall Theodore Ts'o (2): [dd8556c] generic/004: fix filtering of expected error message [249cc51] generic: add renameat2 system call number for i386 Wanlong Gao (1): [610e44c] check: fix wallclock wrapping problem Code Diffstat: .gitignore | 1 + README.config-sections | 30 ++++++++++++ check | 26 ++++++---- common/config | 35 +++++++++++--- common/renameat2 | 129 +++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 + src/Makefile | 3 +- src/renameat2.c | 106 ++++++++++++++++++++++++++++++++++++++++ tests/ext4/306 | 2 +- tests/generic/004 | 2 +- tests/generic/004.out | 2 +- tests/generic/022.out | 2 +- tests/generic/023 | 57 ++++++++++++++++++++++ tests/generic/023.out | 51 +++++++++++++++++++ tests/generic/024 | 64 ++++++++++++++++++++++++ tests/generic/024.out | 51 +++++++++++++++++++ tests/generic/025 | 64 ++++++++++++++++++++++++ tests/generic/025.out | 51 +++++++++++++++++++ tests/generic/204 | 4 +- tests/generic/300 | 7 +++ tests/generic/311 | 6 ++- tests/generic/group | 3 ++ 22 files changed, 672 insertions(+), 26 deletions(-) create mode 100644 common/renameat2 create mode 100644 src/renameat2.c create mode 100755 tests/generic/023 create mode 100644 tests/generic/023.out create mode 100755 tests/generic/024 create mode 100644 tests/generic/024.out create mode 100755 tests/generic/025 create mode 100644 tests/generic/025.out mode change 100644 => 100755 tests/generic/311 -- Dave Chinner david@fromorbit.com From vanrees@antonvanrees.nl Sun Apr 13 20:15:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 988077F4E for ; Sun, 13 Apr 2014 20:15:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 285D9AC002 for ; Sun, 13 Apr 2014 18:15:17 -0700 (PDT) X-ASG-Debug-ID: 1397438109-04cbb00dc41a7ce0001-NocioJ Received: from srv1.tcss.nl (srv1.tcss.nl [46.17.7.102]) by cuda.sgi.com with ESMTP id clr8wLLvS3meumC4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 13 Apr 2014 18:15:10 -0700 (PDT) X-Barracuda-Envelope-From: vanrees@antonvanrees.nl X-Barracuda-Apparent-Source-IP: 46.17.7.102 Received: from apache by srv1.tcss.nl with local (Exim 4.72) (envelope-from ) id 1WZVUC-0007IA-46; Mon, 14 Apr 2014 03:15:00 +0200 Date: Mon, 14 Apr 2014 03:15:00 +0200 Message-Id: To: , , , , , , , , , , , , , , , , , , , Subject: =?windows-1251?B?2O7q6PDz/vno5SDt7uLu8fLoOiDV8ODvIC0g?= =?windows-1251?B?8Ojx6iDx7OXw8ugg4u4g8e3lISEh?= X-PHP-Script: antonvanrees.nl/ams.php for 217.118.81.29 X-ASG-Orig-Subj: =?windows-1251?B?2O7q6PDz/vno5SDt7uLu8fLoOiDV8ODvIC0g?= =?windows-1251?B?8Ojx6iDx7OXw8ugg4u4g8e3lISEh?= From: =?windows-1251?B?0fLl7+Dt6OTg?= X-Priority: 3 (Normal) Reply-To: =?windows-1251?B?0fLl7+Dt6OTg?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_22D4_01CF57A0.7A3A51E0" X-Barracuda-Connect: srv1.tcss.nl[46.17.7.102] X-Barracuda-Start-Time: 1397438110 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.66 X-Barracuda-Spam-Status: No, SCORE=0.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA584, HTML_MESSAGE, PLING_PLING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4880 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.46 PLING_PLING Subject has lots of exclamation marks 0.20 BSF_SC0_SA584 Custom Rule SA584 ------=_NextPart_000_22D4_01CF57A0.7A3A51E0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2=ED=E5=E7=E0=EF=ED=E0=FF =F1=EC=E5=F0=F2=FC =E2=EE =F1=ED=E5. =D5=F0=E0= =EF =96 =F3=E2=E5=EB=E8=F7=E8=E2=E0=E5=F2 =F0=E8=F1=EA =F0=E0=E7=E2=E8=F2= =E8=FF =E8=ED=F4=E0=F0=EA=F2=E0 =EC=E8=EE-=EA=E0=F0=E4=E0 =E8 =E8=ED=F1=F3= =EB=FC=F2=E0, =EF=F0=EE=E2=EE=F6=E8=F0=F3=E5=F2 =F0=E0=E7=E2=E8=F2=E8=E5 = =E8 =F3=F1=F3=E3=F3=E1=EB=FF=E5=F2 =F2=E5=F7=E5=ED=E8=E5 =F1=E5=F0=E4=E5=F7= =ED=EE-=F1=EE=F1=F3=E4=E8=F1=F2=FB=F5 =E7=E0=E1=EE=EB=E5=E2=E0=ED=E8=E9: = =E0=F0=F2=E5=F0=E8=E0=EB=FC=ED=EE=E9 =E3=E8=EF=E5=F0=F2=EE=ED=E8=E8, =E8=F8= =E5=EC=E8=F7=E5=F1=EA=EE=E9 =E1=EE=EB=E5=E7=ED=E8 =F1=E5=F0=E4=F6=E0. =D5= =F0=E0=EF =E2=FB=E7=FB=E2=E0=E5=F2 =F0=E8=F1=EA =E2=ED=E5=E7=E0=EF=ED=EE=E9= =F1=EC=E5=F0=F2=E8 =E2=EE =F1=ED=E5 =EE=F2 =EE=F1=F2=E0=ED=EE=E2=EA=E8 =E4= =FB=F5=E0=ED=E8=FF. =D5=F0=E0=EF=E5=F2=FC =E2=EE =F1=ED=E5 - =F1=EC=E5=F0=F2=E5=EB=FC=ED=EE =EE= =EF=E0=F1=ED=EE! =CF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8 =F1=EC=EE=F2=F0=E8=F2=E5 =ED=E0 =F1=E0=E9= =F2=E5: =CF=C5=D0=C5=C9=D2=C8 =CD=C0 =D1=C0=C9=D2=20 ------=_NextPart_000_22D4_01CF57A0.7A3A51E0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2=ED=E5=E7=E0=EF=ED=E0=FF =F1=EC=E5=F0=F2=FC =E2=EE =F1=ED=E5. =D5= =F0=E0=EF =96=20 =F3=E2=E5=EB=E8=F7=E8=E2=E0=E5=F2 =F0=E8=F1=EA =F0=E0=E7=E2=E8=F2=E8=FF =E8= =ED=F4=E0=F0=EA=F2=E0 =EC=E8=EE-=EA=E0=F0=E4=E0 =E8 =E8=ED=F1=F3=EB=FC=F2= =E0, =EF=F0=EE=E2=EE=F6=E8=F0=F3=E5=F2 =F0=E0=E7=E2=E8=F2=E8=E5 =E8=20 =F3=F1=F3=E3=F3=E1=EB=FF=E5=F2 =F2=E5=F7=E5=ED=E8=E5 =F1=E5=F0=E4=E5=F7=ED= =EE-=F1=EE=F1=F3=E4=E8=F1=F2=FB=F5 =E7=E0=E1=EE=EB=E5=E2=E0=ED=E8=E9: =E0= =F0=F2=E5=F0=E8=E0=EB=FC=ED=EE=E9 =E3=E8=EF=E5=F0=F2=EE=ED=E8=E8,=20 =E8=F8=E5=EC=E8=F7=E5=F1=EA=EE=E9 =E1=EE=EB=E5=E7=ED=E8 =F1=E5=F0=E4=F6=E0= . =D5=F0=E0=EF =E2=FB=E7=FB=E2=E0=E5=F2 =F0=E8=F1=EA =E2=ED=E5=E7=E0=EF=ED= =EE=E9 =F1=EC=E5=F0=F2=E8 =E2=EE =F1=ED=E5 =EE=F2=20 =EE=F1=F2=E0=ED=EE=E2=EA=E8 =E4=FB=F5=E0=ED=E8=FF.
=D5=F0=E0=EF=E5=F2=FC= =E2=EE =F1=ED=E5 - =F1=EC=E5=F0=F2=E5=EB=FC=ED=EE =EE=EF=E0=F1=ED=EE!
 
=CF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8 =F1=EC=EE=F2=F0=E8=F2=E5 =ED=E0 =F1= =E0=E9=F2=E5: =CF=C5=D0= =C5=C9=D2=C8=20 =CD=C0 =D1=C0=C9=D2
------=_NextPart_000_22D4_01CF57A0.7A3A51E0-- From david@fromorbit.com Sun Apr 13 20:22:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C3B857F4E for ; Sun, 13 Apr 2014 20:22:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D2EFAC002 for ; Sun, 13 Apr 2014 18:22:40 -0700 (PDT) X-ASG-Debug-ID: 1397438558-04cb6c77b619b810001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0BcHLAnqzBFC2Tuk for ; Sun, 13 Apr 2014 18:22:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArlQANA3S1N5LEcvPGdsb2JhbABagwY7gxWFC6Ibk1aFXYEeFwMBAQEBODWCJQEBBTocIxAIGwklDwUlAwcth3vKdhcWjlgHFoMOgRQEmGCWBys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 10:52:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZVbN-0007GB-TE; Mon, 14 Apr 2014 11:22:25 +1000 Date: Mon, 14 Apr 2014 11:22:25 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to 8874560 Message-ID: <20140414012225.GF27694@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 8874560 References: <20140414004938.GE27694@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414004938.GE27694@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397438558 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4880 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 10:49:38AM +1000, Dave Chinner wrote: > Hi folks, > > The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has > just been updated. Patches often get missed, so please check if your > outstanding patches were in this update. If they have not been in > this update, please resubmit them to xfs@oss.sgi.com so they can be > picked up in the next update. > > This update includes tests for the new renameat2 syscall, and a > bunch of fixes for the new config file format infrastructure. Actaully, it's now updated to: 8874560 generic/024: fix output number because it missed a test number update in an output file again. That test doesn't run yet on XFS, so I missed it until I ran some ext4 tests... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 20:42:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AE98C7F4E for ; Sun, 13 Apr 2014 20:42:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9701F30404E for ; Sun, 13 Apr 2014 18:42:47 -0700 (PDT) X-ASG-Debug-ID: 1397439763-04cb6c77b419c390001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mVEwVUAK02xerQ31 for ; Sun, 13 Apr 2014 18:42:44 -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: AtpOAKk8S1N5LEcvPGdsb2JhbABagwaDUIULtXGFXYEeFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBQ0YAwcaE4doAxDECA2GYxcWjD+CGQeEOASWc4FtimWCEIkSKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 11:12:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZVuW-0007J1-OZ; Mon, 14 Apr 2014 11:42:12 +1000 Date: Mon, 14 Apr 2014 11:42:12 +1000 From: Dave Chinner To: Mark Tinguely Cc: XFS Filesystem Subject: Re: [PATCH] xfsprogs: fix xfs_logprint EFI entry split on log buffer Message-ID: <20140414014212.GG27694@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix xfs_logprint EFI entry split on log buffer References: <20140409210013.095709266@sgi.com> <20140409210048.859660076@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140409210048.859660076@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: 1397439763 X-Barracuda-URL: http://192.48.176.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.3.4880 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 Wed, Apr 09, 2014 at 04:00:14PM -0500, Mark Tinguely wrote: > xfs_logprint does not correctly handle EFI entries that > are split across two log buffers. xfs_efi_copy_format() > falsely interrupts the truncated size of the split entry > as being a corrupt entry. > > If the first log entry has enough information, namely the > number of extents in the entry and the identifier, then > display this information and a warning that this entry is > truncated. Otherwise, if there is not enough information in > the first log buffer, then print a message that the EFI decode > was not possible. These messages are similar to split inode > entries. > > Example of a continued entry: > Oper (336): tid: f214bdb len: 44 clientid: TRANS flags: CONTINUE > EFI: #regs: 1 num_extents: 2 id: 0xffff880804f63900 > EFI free extent data skipped (CONTINUE set, no space) > > Reported-by: Michael L. Semon > Signed-off-by: Mark Tinguely Looks fine. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 20:55:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AAEFE7F4E for ; Sun, 13 Apr 2014 20:55:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23E34AC004 for ; Sun, 13 Apr 2014 18:55:49 -0700 (PDT) X-ASG-Debug-ID: 1397440547-04cbb00dc61a94e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hZUFmaXGpWMVpBDE for ; Sun, 13 Apr 2014 18:55: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: AttOANc+S1N5LEcvPGdsb2JhbABagwaDUIULtXGFXYEeFwMBAQEBODWCJQEBAQQnExwjEAgDDgoJJQ8FJQMHGhOHe8p5FxaOWAeEOASYYIpliyIr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 11:25:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZW7c-0007L8-DJ; Mon, 14 Apr 2014 11:55:44 +1000 Date: Mon, 14 Apr 2014 11:55:44 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb Message-ID: <20140414015544.GH27694@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb References: <1397289723-26243-1-git-send-email-hch@lst.de> <1397289723-26243-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397289723-26243-3-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397440547 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 12, 2014 at 10:01:56AM +0200, Christoph Hellwig wrote: > Split xfs_bmap_btalloc_nullfb into one function for filestream allocations > and one for everything else that share a few helpers. This dramatically > simplifies the control flow. > > Signed-off-by: Christoph Hellwig Small comment below. > --- > fs/xfs/xfs_bmap.c | 200 +++++++++++++++++++++++++++++++---------------------- > 1 file changed, 117 insertions(+), 83 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 3340f0e..d5d52df 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -3517,6 +3517,67 @@ xfs_bmap_adjacent( > #undef ISVALID > } > > +static int > +xfs_bmap_longest_free_extent( > + struct xfs_trans *tp, > + xfs_agnumber_t ag, > + xfs_extlen_t *blen, > + int *notinit) > +{ > + struct xfs_mount *mp = tp->t_mountp; > + struct xfs_perag *pag; > + xfs_extlen_t longest; > + int error = 0; > + > + pag = xfs_perag_get(mp, ag); > + if (!pag->pagf_init) { > + error = xfs_alloc_pagf_init(mp, tp, ag, XFS_ALLOC_FLAG_TRYLOCK); > + if (error) > + goto out; > + > + if (!pag->pagf_init) { > + *notinit = 1; > + goto out; > + } > + } > + > + longest = xfs_alloc_longest_free_extent(mp, pag); > + if (*blen < longest) > + *blen = longest; > + > +out: > + xfs_perag_put(pag); > + return error; > +} > + > +static void > +xfs_bmap_fix_args( > + struct xfs_bmalloca *ap, > + struct xfs_alloc_arg *args, > + xfs_extlen_t *blen, > + int notinit) Not a big fan of the "fix_args" name here. What it's actually doing is setting the minimum allocation length. Also, it could return the minimum length rather than set it inside the function, and pass blen by value rather than reference as it isn't modified in the function... Other than that, it's a good cleanup. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 21:23:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0148A7F4E for ; Sun, 13 Apr 2014 21:23:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FD72AC002 for ; Sun, 13 Apr 2014 19:23:51 -0700 (PDT) X-ASG-Debug-ID: 1397442229-04cbb00dc61aa770001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XpkdgsEHtFk8DsDn for ; Sun, 13 Apr 2014 19:23:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtpOAApGS1N5LEcvPGdsb2JhbABagwaDUIULtXKFXYEeFwMBAQEBODWCJQEBAQQ6HCMQCAMOCgklDwUlAwcaE4d7yn4XFo5YB4Q4BJhglgcr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 11:53:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZWYl-0007Qe-Gs; Mon, 14 Apr 2014 12:23:47 +1000 Date: Mon, 14 Apr 2014 12:23:47 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: filestream allocator rewrite Message-ID: <20140414022347.GI27694@dastard> X-ASG-Orig-Subj: Re: filestream allocator rewrite References: <1397289723-26243-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397289723-26243-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397442229 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4882 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 12, 2014 at 10:01:54AM +0200, Christoph Hellwig wrote: > This series is a major overhaul of the filestream allocator. The main point > is to use the dcache to get the parent and avoiding to maintain a fstrm_item > for each inode that the filestream is applied to in favor of just tracking > the parent, but there's various more or less related fallout from this as well. OVerall it looks good. I'll need to do some testing on it and have a deeper look at the main use-the-dentry-cache patch, but it removes a heap of complexity and code and gets rid of the use of inode IO locks, so there's a loot to like here... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 13 21:30:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D0CC37F4E for ; Sun, 13 Apr 2014 21:30:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BFAF1304032 for ; Sun, 13 Apr 2014 19:30:24 -0700 (PDT) X-ASG-Debug-ID: 1397442622-04cb6c77b719e1e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id lIqbTH1GHQziFhEJ for ; Sun, 13 Apr 2014 19:30:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AttOAApHS1N5LEcvPGdsb2JhbABagwaDUIULtXKFXYEeFwMBAQEBODWCJQEBAQQnExwjEAgDFQMJJQ8FJQMHGhOHe8sHFxaOWAeEOASYYJYHKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Apr 2014 12:00:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZWf6-0007RZ-B9; Mon, 14 Apr 2014 12:30:20 +1000 Date: Mon, 14 Apr 2014 12:30:20 +1000 From: Dave Chinner To: Miklos Szeredi Cc: xfs@oss.sgi.com, Miklos Szeredi Subject: Re: [PATCH 2/4] renameat2 syscall: check plain rename Message-ID: <20140414023020.GJ27694@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] renameat2 syscall: check plain rename References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> <1397231517-4641-2-git-send-email-miklos@szeredi.hu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397231517-4641-2-git-send-email-miklos@szeredi.hu> 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: 1397442622 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4882 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 11, 2014 at 05:51:55PM +0200, Miklos Szeredi wrote: > From: Miklos Szeredi > > Check with zero flags. This is what rename(2) and renameat(2) now call, so > this actually tests the behavior of these syscalls as well. > > Signed-off-by: Miklos Szeredi Miklos, this test fails on XFS with the following diff: $ diff -u tests/generic/023.out /home/dave/src/xfstests-dev/results//generic/023.out.bad --- tests/generic/023.out 2014-04-14 10:44:22.000000000 +1000 +++ /home/dave/src/xfstests-dev/results//generic/023.out.bad 2014-04-14 12:00:23.000000000 +1000 @@ -18,12 +18,12 @@ samedir dire/regu -> Not a directory samedir dire/symb -> Not a directory samedir dire/dire -> none/dire. -samedir dire/tree -> Directory not empty +samedir dire/tree -> File exists samedir tree/none -> none/tree. samedir tree/regu -> Not a directory samedir tree/symb -> Not a directory samedir tree/dire -> none/tree. -samedir tree/tree -> Directory not empty +samedir tree/tree -> File exists crossdir none/none -> No such file or directory crossdir none/regu -> No such file or directory crossdir none/symb -> No such file or directory @@ -43,9 +43,9 @@ crossdir dire/regu -> Not a directory crossdir dire/symb -> Not a directory crossdir dire/dire -> none/dire. -crossdir dire/tree -> Directory not empty +crossdir dire/tree -> File exists crossdir tree/none -> none/tree. crossdir tree/regu -> Not a directory crossdir tree/symb -> Not a directory crossdir tree/dire -> none/tree. -crossdir tree/tree -> Directory not empty +crossdir tree/tree -> File exists IOWs, XFS is returning EEXIST rather than ENOTEMPTY for several of these rename tests. The rename man page says this about the errors: ENOTEMPTY or EEXIST newpath is a nonempty directory, that is, contains entries other than "." and "..". Which implies that both errors are valid and so the test should pass in either case. Can you send a patch to handle these different-but-valid error returns? Cheers, Dave. -- Dave Chinner david@fromorbit.com From banhcuoc5b@gmail.com Mon Apr 14 00:43:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLY, HTML_IMAGE_RATIO_08,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 551C67F4E for ; Mon, 14 Apr 2014 00:43:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99413AC005 for ; Sun, 13 Apr 2014 22:43:26 -0700 (PDT) X-ASG-Debug-ID: 1397454201-04cb6c77b61a4550001-NocioJ Received: from mail-pb0-f68.google.com (mail-pb0-f68.google.com [209.85.160.68]) by cuda.sgi.com with ESMTP id eA8FFDBaZwo4FeU4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 13 Apr 2014 22:43:21 -0700 (PDT) X-Barracuda-Envelope-From: banhcuoc5b@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.68 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.68] Received: by mail-pb0-f68.google.com with SMTP id jt11so4437892pbb.7 for ; Sun, 13 Apr 2014 22:43:20 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.68] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.68] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:subject:to:content-type:mime-version:date:message-id; bh=pSPh/lpdzC3AQBb577aAGZb3tTYp51qIqmufQlWU4vA=; b=mYqBvHTQP2UGdSB7g2IWzYGML+dY79xvqLMizxk7tDoXp645zz2bYzUH1lsfEibvKI 9qeuKoDSrE2O6h4JpFREEMcGA2cAgPVX/iQLJXRdGkfHAiqzoDpI3JmElbeza6DyzvB7 GwkiIl4ouejPYQ3nJ8G/eBwvzCs/wpINC0KmCCFxcJvR5eYwOs7y7A7JA/zIcvCplDhF SJkMMkbw3ZI7C4x0D/BqiDFya5s4BS/jC+vjlvqQLP7LgLonBm+ezLhWy2E9FJUo1NxU effeVWehpw5y5Y1YA12u6VJ7i9Z+CQbRi691JgpZkierMa/UYfMIKT9hSDC3E2dpWid4 0V/A== X-Received: by 10.66.221.99 with SMTP id qd3mr42411880pac.46.1397454200705; Sun, 13 Apr 2014 22:43:20 -0700 (PDT) Received: from LEO-PC ([115.72.100.187]) by mx.google.com with ESMTPSA id tu3sm75165779pab.1.2014.04.13.22.43.13 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 13 Apr 2014 22:43:19 -0700 (PDT) From: "banhcuoc5b@gmail.com" Subject: san pham danh bong - kep dinh vi To: xfs@oss.sgi.com X-ASG-Orig-Subj: san pham danh bong - kep dinh vi Content-Type: multipart/related; type="multipart\/alternative"; charset=UTF-8; boundary="P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm" MIME-Version: 1.0 Date: Mon, 14 Apr 2014 12:43:21 +0700 Message-ID: <56361287484@leo-PC> X-Barracuda-Connect: mail-pb0-f68.google.com[209.85.160.68] X-Barracuda-Start-Time: 1397454201 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.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_SA090n, DKIM_SIGNED, DKIM_VERIFIED, EXTRA_MPART_TYPE, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA090n Custom Rule SA090n This is a multi-part message in MIME format --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: multipart/alternative; boundary="iscHvWDvhc44XSWx=_HwOnUNCOjmaZ1NTv" --iscHvWDvhc44XSWx=_HwOnUNCOjmaZ1NTv Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline C=E1=BB=ACA H=C3=80NG V=E1=BA=ACT T=C6=AF =C4=90=C3=94NG TH=C3=80NH =C4=90/C: 33-35-37 Yersin, P.C=E1=BA=A7u =C3=94ng L=C3=A3nh, Q.1 - TP.= HCM =C4=90T: 08-66809163 H/P: 0982.332.848 Email: dongthanh1663@gmail.com =20 K=C3=ADnh g=E1=BB=ADi: Qu=C3=AD C=C3=B4ng Ty=20 =20 =20 C=E1=BB=ACA H=C3=80NG V=E1=BA=ACT T=C6=AF =C4=90=C3=94NG TH=C3=80NH ch= uy=C3=AAn ph=C3=A2n ph=E1=BB=91i c=C3=A1c lo=E1=BA=A1i s=E1=BA=A3n ph=E1= =BA=A9m =C4=91=C3=A1nh b=C3=B3ng v=C3=A0 m=C3=A0i m=C3=B2n trong ng=C3= =A0nh c=C3=B4ng nghi=E1=BB=87p g=E1=BB=97, b=C3=A0n gh=E1=BA=BF, gi=C3= =A0y v=C3=A0 m=C3=A1y CNC=E2=80=A6 V=E1=BB=9Bi nh=E1=BB=AFng s=E1=BA=A3n ph=E1=BA=A9m =C4=91=C3=A1nh b=C3= =B3ng, c=C3=B4ng ty ch=C3=BAng t=C3=B4i c=C3=B3 x=C6=B0=E1=BB=9Fng s=E1= =BA=A3n xu=E1=BA=A5t v=C3=A0 gia c=C3=B4ng =C4=91=C6=B0=E1=BB=A3c =C4=91= =E1=BA=B7t t=E1=BA=A1i =C4=90=E1=BB=93ng Nai v=C3=A0 chi nh=C3=A1nh t=E1= =BA=A1i B=C3=ACnh D=C6=B0=C6=A1ng .=20 C=C3=A1c s=E1=BA=A3n ph=E1=BA=A9m ch=C3=BAng t=C3=B4i cung c=E1=BA=A5p= g=E1=BB=93m:=20 - B=C3=A1nh c=C6=B0=E1=BB=9Bc th=C3=A9p v=C3=A0 inox=E2=80=A6= c=C3=A1c lo=E1=BA=A1i c=C6=B0=E1=BB=9Bc=20 v=C3=A0 s=E1=BA=A3n ph=E1=BA=A9m =C4=91=C3=A1nh b=C3=B3ng kh=C3=A1c .=20= - Linh ki=E1=BB=87n khu=C3=B4n m=E1=BA=ABu - M=C3=A1y m=C3=A0i h=C6=A1i, m=C3=A1y m=C3=A0i =C4=91i=E1=BB= =87n - B=E1=BA=A1c =C4=91=E1=BA=A1n, v=C3=B2ng bi=E2=80=A6 - K=E1=BA=B9p =C4=91=E1=BB=8Bnh v=E1=BB=8B (gi=C3=A1 k=E1=BA=B9= p)=20 - L=C6=B0=E1=BB=A1i c=C6=B0a APOLLO .FUJIYAMA. =20 =20 =20 =20 =20 =20 =20 =20 =20 =20 =20 =20 Nh=E1=BA=ADn gia c=C3=B4ng c=C3=A1c lo=E1=BA=A1i b=C3=A1nh c=C6=B0=E1=BB= =9Bc theo qui c=C3=A1ch y=C3=AAu c=E1=BA=A7u =20 M=E1=BB=8Di chi ti=E1=BA=BFt xin vui l=C3=B2ng li=C3=AAn h=E1=BB=87: C=E1=BB=ACA H=C3=80NG V=E1=BA=ACT T=C6=AF =C4=90=C3=94NG TH=C3=80NH 33-35-37 Yersin, P.C=E1=BA=A7u =C3=94ng L=C3=A3nh, Q.1 (08-66809163 skype: dongthanh163 HP: 0982.332.848 * dongthanh1663@gmail.com --iscHvWDvhc44XSWx=_HwOnUNCOjmaZ1NTv Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline CÔNG TY CP QUỐC TẾ HỒNG XIN=

 CỬA HÀNG V= ẬT TƯ ĐÔNG THÀNH

Đ/C: 33-35-37 Yersin= , P.Cầu Ông Lãnh, Q.1 - TP.HCM

ĐT: 08-66809163 = ;           &nb= sp;           &= nbsp;      H/P: 0982.332.848

Email: dongthanh1663@gmail.com

    

Kính gửi: Quí Công Ty=

    &= nbsp;           = ;   

 

CỬ= A HÀNG VẬT TƯ ĐÔNG THÀNH chuy&ecir= c;n phân phối các loại sản phẩm &= #273;ánh bóng và mài mòn trong ng&a= grave;nh công nghiệp gỗ, bàn ghế, giày và máy CNC&hellip= ;

Với những s= 843;n phẩm đánh bóng, công ty chú= ;ng tôi có xưởng sản xuất và= ; gia công được đặt tại Đ&= #7891;ng Nai và chi nhánh tại Bình Dư&= #417;ng .

Các s&= #7843;n phẩm chúng tôi cung cấp gồm:

-  =         Bá= nh cước thép và inox… các lo= 841;i cước

v= à sản phẩm đánh bóng khác= .

- &nb= sp;        Linh ki̓= 9;n khuôn mẫu

-  =         Máy m&ag= rave;i hơi, máy mài điện<= /p>

-  =         Bạc đ= ;ạn, vòng bi…

-  =         Kẹp đ&#= 7883;nh vị (giá kẹp)

-  =         Lưỡi c&= #432;a APOLLO .FUJIYAMA.

 

 

 

 

&= nbsp;

&= nbsp;

&= nbsp;

&= nbsp;

&= nbsp;

&= nbsp;

&= nbsp;

&= nbsp;

Nhn gia công các loi bánh cước theo qu= i cách y<= span style=3D"font-family: =E5=AE=8B=E4=BD=93; color: red">êu cu<= /i>

&n= bsp;

Mọi chi tiết xin vui l&ogra= ve;ng liên hệ:

CỬA HÀNG VẬT TƯ = ĐÔNG THÀNH

33-35-37 Yersin, P.Cầu Ông Lãnh, Q.1

(08-66809163  skype: dongthanh163

HP: 0982.332.848

     =  * dongthanh1663@gmail.com

--iscHvWDvhc44XSWx=_HwOnUNCOjmaZ1NTv-- --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/jpeg; name="image001.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image001.jpg" Content-ID: <1287562> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABjAGEDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD12+v7 TTbVrq+uYraBfvSSsFA/GsqHxt4XnbEWv2Dn0WYGuM+N8Ml3p+i2iMQJrtgwB6/LWPofgaBYQPLG COcVEpKIHpX/AAnHhUEj/hILDI6/vhSf8J34TH/Mw2H/AH+FctH8PtLPJth05OKmHgTSFGEhhVj3 4qPajsdIPHPhVjga/Yf9/hU//CWeH9gf+2bPaeh80VgL4V0wRmN7a3YeuBU6+HdORBGLeAKOgwKP aPsFjTk8a+GIl3Sa9YqPUzCmf8J34T/6GGw5/wCmwrNbwnpkse1rCBl9Ngpq+FNIhbctjbK3+6KP a+QWNdfGvhh2CrrtkWPQCUVKfFfh8Ak6xaADr+9FY48O6aORbW4P+6Kc2gWbRk/Z42BGOAKXtbdA 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 --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/gif; name="image003.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image003.gif" Content-ID: <1287563> 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 qScICAA7 --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/jpeg; name="image004.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image004.jpg" Content-ID: <1287564> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAB9AHcDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD06HT4 LbT7eKzsLTCooCuoUAY9cHmk+zz/APQN07/vr/7Cppb23sbCKW5lEabAAT3OK56f4gaZHK0ccFw5 X+IqAD+dK5Tub32b/qH2X5f/AGNL9m/6h9l+X/2Nco/xE3TBIdMdhju3U+2KkPju5ZTt0iReOpz/ AIU+ZE2fc6f7N/04WX5f/Y0fZv8AqH2X5f8A2Nc7b+OTKVVtNfI++d+MVftfFtpM2JonhH97qKOZ BZ9zS+zf9OFl+X/2NBt8f8w+y/L/AOxp8V7DcLuglSRfVTTt9O4te5F9n/6cLL/P/AaX7N/04WX5 f/Y1Mr/T8acGB75oDXuVvs//AE4WX5f/AGNH2f8A6cLL8v8A7GrGaTdRcNe5B9n/AOnCy/L/AOxp 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 NAFiiiigoKKKKAP/2Q== --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/jpeg; name="image005.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image005.jpg" Content-ID: <1287565> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABnAHoDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1a7uJ 1vPKjk2KEzwoPP40zzrkdbk/98L/AIUlzg6k2f8AnmKQkZ6VvFK2wiQSzk/8fLf98L/hUFpqsd7L JFb3rO0fX92Bn6cVLkBs4rBaU2fieHgCOYFCf1FJ2Cx0e64/5+G/74H+FGbj/n4b/vgUnmdCKPN7 niiwFHV9aOjQRyzPNL5jbVWNF9M96s2l617ZRXUU7hJV3AMi5FYPjIiXTYhtDYlxj6g1Z0K426Nb RtgbVx+tT1sO2hsGa4zxcH/vgU157hAS1zgAZJKrwKbuBANUdbkEekXTHn5CPz4qtALcOoPcqWgv klUd0CmpvPucf68/98CsfRYILe3JjjVMhd20deK0gcnAJx70KzWwiXz7nn/SOn+wKFuLg8/acg9w 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 RVOPUCiisqlaVT4i4U4w2P/Z --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/jpeg; name="image006.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image006.jpg" Content-ID: <1287566> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAB/AHkDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0Twxp tjN4a064ls7eSa4t0llkeJWZ3YZZiSMkkk1q/wBk6f8A8+Fr/wB+V/wqn4T/AORT0j/rzi/9BFbF Ayn/AGTp/wDz4Wv/AH5X/Cj+ydP/AOfC1/78r/hVykyPWgLlT+ydP/58LX/vyv8AhR/ZOnf8+Fr/ AN+V/wAKTUdWstLh8y7nVPRc8n6CuO1L4hOWK2FuFHZ5Ov5VnOpGG7OqhhK+If7uJ2X9k6f/AM+F r/34X/Cj+ydO/wCfC1/78r/hXmbeJfEGoORHcSsfSIYxUbL4lb5i91n/AH+ay+sJ7RbO55VKH8Sp FM9Q/snT/wDnwtf+/K/4Uf2Tp3/Pha/9+V/wry/+1PEliA0lxcxgf3uRWhZfEDU4CBdJHcL9NpoW Jj1VgllFe16bUvQ9A/snTv8Anwtf+/K/4Uf2Tp//AD4Wv/flf8KztF8Wadq+I1k8mc/8spOp+h71 u10KSkro8qpTnTlyzVmU/wCydP8A+fC1/wC/K/4Uf2Tp/wDz4Wv/AH5X/CrlFMzuUZNG0yRDHJp1 oyOMMDAvI/KvEvNuf+f27/8AAh/8a96PUV4JQNHsnhP/AJFLSP8Aryi/9BFbFY/hP/kUtI/68ov/ AEEVpXMwiTk0CHPMq1h+IvEcWjWgKAPPJwi56e5pZ9TRCTvHHbNeca3qEmo6nLI+flO0D0FYVqnJ HQ9PLsJ9Yq+9sivf6hcX07T3Mpdm7nt9KXS7JtSu1iU4QH529qqOuVIo02+k02/jmXO3OGHqK8+n aU7yPq8TzUqDVFW0PRdPtbe2VII/3SZ5wOTVzVobWxWKQu43dSME1Uh+dEmTJUjcD61g69pHibWL gGLWbeOEHKoYtu0f1r1rWXunwMpSlNuo9Totkdwg8iZJVccA8fmK5PxDpAspfPhj2xMcEA5ANbuk 6fPZW6rPObmZR80gGBVLWL1Hs5I1UMO7H+lY1opw1PSyupVhXXs9upyisyNuVirDoR2rvvB3ix7m RdNv3zJj93If4vY1wBHNPid4ZFlQkMpBBHavPp1HB6H1uMwsMTTcZb9D3OiszQdRGo6TDOTlsYb6 1p16yd1c+DnBwk4vdCHqK8Fr3o9RXgtMlHsfhP8A5FLSP+vKL/0EUutOUiNJ4T/5FLSP+vOL/wBB FZXjtrqDSpJ4Z9g6bQMH86T2GtzjdZ1R5tTS3MIVYxnc33qxySZ33HknNZ1tcTPcGWWVncnncckV fn4cSKw/CuCs+Y+pyxKmk+4+o3iD/Wnxusvs3pTiuPWuRaHv6SVjRs9X1CCzSEXTqq8Bc1IusX6O HFwxI6A8iskMRSlya2VWRxSwFJvY62LxXPc6ayXKxIAcHYMFq527vHuX54XPAFVVfHWjdk4HelOq 5DoYKnQbcUIW54oGSe9XYtMmdPNnHkRdct1P0FM8tDIBEpCA9T1NSodzoVSL0R0/hnUhYXVqrNiK bMZyeB6V3drfQXauYmyUYqynqDXj98xaFIAeVHX0rqfh3KIopzLfrPK7DeWOSB2Ga76Muh8nmtFR kqnVnfnqK8Fr3rOSK8FrpPGR7D4YYp4O0plUuRZREKOp+UVx3jbWNSuJkt1iWIKpYorbmA9+1dn4 U58I6QPWyi/9BFcr40s5YEeaALAgUqDtyzeuKmWxUdzyq3u/KuR5vyh2I5HetlWxhSOOxrL1OxEe nxSP82eQR3FO067dIFju0O0/dk9B2rmqQe6PZwGKjF+zm7djQ2sDU6TMODyPembG27uHXsRSY5rj a7H0tOTW5NvU/wAPPtS5HoQKiUZqQc1m0zpTuTQ/ZgcyrI3sDitCHVYLbi0sY0bH+sb5iKzUTPUV YSLGDwK0i2ZVIQe5JLcT3L755GcnsaTeIlBAOe1WbezmuXxDGzH16AfjVhraK0fBdJJc8n+FK1UW zkqYinSWrKFlZNqEsimRUYDjJwTU2jeF9TtdRaSB0iXd18zl/wAO9Xns5rdDe2wYvjqq7ga2/Dc1 7qd5HPewrFBAu3cRhnY+1dlKnyrU+Vx2LeIqXWx19ikkdnEsxzIB8x968Mr3oAAADpXgtbHAj2Pw n/yKWkf9eUX/AKCKd4h0v+09PaNc7x0xTfCf/IpaR/15Rf8AoIrYoA8a8S6LHDZxWrDEcbgtu9O4 FZupWjNB9piRVhZeQTjaBwBXqvibw42qxma3bEsYyseBhz71xGp6TK1ncWtzbfZnIym8/Ln61Fi7 o4XQnurjUJoY5G2IuQO1bF9KdPiWW9iIB7qOlWdG0r7FcPbwuglBG5uz+opPFs1w8ltpD2xy7Dyy eoHp7is5UoSOuhjq9D4XoV7aaC8iEtsWZTnHy0qyxiXyzMgf+6TzXVafoywWarBGu8rkbe/qPqK4 jXobafxPbJFiOQOAzAY5+lZPDJ9T0I55VS1ijbht9wDF2K/7IqxY6tpAvPsiQGSfsZjxn0resrKF tNyyKrg/PGex9q4ZUgTxPOsqHyzzgdVOetXGhGJhVzerU0tY2vEF7qy25jik8gL95FGMitTRraHU dPQK6GcJgKW+9+NaR09NWsESKa3dwuCHH3h/OsrTvDut2F+5jhSSDOfLA4H0NbKKR5lStOp8TJIX utKuBBcQjaT0TcSB3ziu18PW6fZRciFIzJzgfzpLG0mnRftFuqqBggnJrZiiSKMIihQOwFWZDu4r wWve+4rwSgaPY/Cf/IpaR/15Rf8AoIrYrI8J/wDIpaR/15xf+gitegQVVv8ATrfUrdoblAykYz3F WqKAOLn8AJbyPLp1xjf96OT+hqhq+g6sGhY2aXJtslNnDe/Neh0UAeVaXezR3qxS2c8SHkxnIZTn qKl17wrLrVyl/YGCOVCCZGBDf/rr0x7eGSRZHiRnT7rEcinBFGcKBnrgUrDOE0WO8Ns8d1aszwnY coQGpbvwBb6vKbtDLY3A6EGu7wPSjApiOP0/wZeWbKHuo5FU8kZGRXV21ultEEUdB19amooAKKKK ADuK8Er3vvXgmKBo9ft9H1bT4FtLDVoFtIhthSe0Lsi9l3BxkDp0qT7J4i/6C9j/AOADf/HK16hu ru2sbdri7njghT70kjBVH4mgDO+yeIv+gvY/+ADf/HKPsniL/oL2P/gA3/xytG1vLa+t1uLS4jnh f7skbBlP4ilubmCzgM9zKkUYIBdzgZJwP1oAzfsniL/oL2P/AIAN/wDHKPsniL/oL2P/AIAN/wDH K16KAMj7J4i/6C9j/wCADf8Axyj7J4i/6C9j/wCADf8AxytSWaOCJpZpFjjQZZ3OAB7mng5GRQBk fZPEX/QXsf8AwAb/AOOUfZPEX/QXsf8AwAb/AOOVpW91Bdoz28ySorlCyHIDA4I/CpaAMj7J4i/6 C9j/AOADf/HKPsniL/oL2P8A4AN/8crXooAyPsniL/oL2P8A4AN/8co+yeIv+gvY/wDgA3/xyrTa pD/acVgitI8isxdSNqbexPr7DnjmrtAGO1l4hdSp1q0QHjclidw+mXIz+FY3/CsND/5+dQ/7/wD/ ANauxopAFYGuxrceI/D9vMoeEzTSFGGQXWM7ePbJNb9UNW0iHVoog8ssEtvIJYZ4Ww8bYxkZ46Eg g9aYGRLJa6Vq0MOkzKpvNUC30QwQpMLNgD+HO1TWRaG/1rxJeWn29oNks0+/ylfBjfy4wAwIGMkk jk8V0A8J2q2axLeXYuRc/azebgZWlxtyeMY2nGMYxTF8H2kKKbW+vrecNKWuEkBdxIQXBJGMZAPt QBjaLearqlrb2llqJsmgsBcsxUP5srSOMEtnCDaeBzz14rrry7ez0ee8dVeSC3aUhfukhc8e1Ztz 4RsJYoYree5s0jtvsjiBwPNh/utkH35HPJrY+zQm0+yeWPI8vy9nbbjGPyoA47VY9W/4Qy+nvNTS 7jutOEuxo1UxyHB+XA+5g98nj3p19q+q6IuqwtevetHa28sLNCuY3kcoQAMZHQgH861Y/B9kttPb zXd5cJJb/ZUMkgzFFnO1cD2HJyeBVy88P2N9JdPP5hN1bpA+GxgKSykehBOc+woA5xL/AFfTPDeo JCJrcW88CWct1bLG212UNlBwcEnsOtbeiTXq6vqun3d414tqYmjkdFVgHUkj5QBjI4p6+GbVrK4t 7m5ubl7qVJZp5GG9ihBUcDAA2jjHrV6DT4bfULq9Qt5t2EEmTx8owMfnQBheJtZ1DR7+1itpImXU /wDRoBJgeRNnhz6rg8j1A9aqXep6vFHqeppqLeVpV0luLbyl2zqNm8scZydxxgjGBXQXugWOoz3E 12rytPb/AGfBbiNc5+X0OcHPsPSqsvhW1luTI13dmKR45J4N42TumMM3Gc/KM4wDigDEs50j8cW8 0Mq3LXs88M0iWqrEm1SQqvjJYbQGOTn8KlsdT1hptPvZtRMkVzqc1o1t5ShfLBkAOcZ3DaOc1q23 hO0tr6C6S7vMW07zQRFxsjL53gDHIO49enarMfh+yiitolaXbbXTXaZb+NixOfb5zQBqUUUUgP/Z --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/jpeg; name="image007.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image007.jpg" Content-ID: <1287567> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABuAHgDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDYZiSG ycelOD8cGoQ3HTjtTfMxwalMVidmyvzc4NNM6gYLdaqtNtGN3NVZZ9kjbSSVwSo9fahySAszXjqG ZVKquQWI71Gb2Vs+RwoHLk9CexqgZnkaNrqTcOqqTyMfrR50hRneRYUcEqh4BGP8RWLlcZYF1IhV 3TdhfrgkUJqUZ3B5Njdt3PGR2qnKylUFvOm7HKOwOD9KhzKkTyvEkvO0gdSPb8qm7GbcMpkRt5GO xB6ilOVODn1FY9g6KSFdojn5dxJHHUVejuv3himVVfbxj09aE7jTLfBTHY01DkYJ5HWgEjqMf1pj tscN/e4NDRoOIPUd6bk5B6VL1GKYQB+NTYliqcg80UDjoKKLEsejds9ajmkAO6mrnHao5nB5PTuK 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 ZN3M29T/2Q== --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm Content-Type: image/jpeg; name="image008.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="image008.jpg" Content-ID: <1287568> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABiAKsDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aiii gAooooArahfwaZZSXdy22NB+JPYCsDQvGSarffZp7cQeYSIWByCfQ+9V/iPIy6PbKDw03P4A1xfh ySRtZsk3HAnXAz05FZym1JI9bDYOnUw8py3PZKKKK0PJCiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKAOO+JH/IJtf8Arsf5Vx/hVd3iCyH/AE2X+ddd8SD/AMS20A/56n+Vct4PQnxH Z8f8tM/pWM/jR9Bg3bBS+Z65RRRWx8+FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAcj44kkkFvbbAYFYPKc88nAxV7RtEs7OaO5gtwCRwT2yO1c/4vuZft0nlMMiZRz6Ba2tHv3na3 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 2Q== --P8d54fIrhKcwRKpxRuXJka5eetdvc=_inm-- From hch@lst.de Mon Apr 14 02:03:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 780FA7F4E for ; Mon, 14 Apr 2014 02:03:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A475304043 for ; Mon, 14 Apr 2014 00:03:30 -0700 (PDT) X-ASG-Debug-ID: 1397459007-04cbb00dc31b3e70001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id 0YkVGOKfHGuOO9Ww (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 14 Apr 2014 00:03:29 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 033E2145DA; Mon, 14 Apr 2014 09:03:26 +0200 (CEST) Date: Mon, 14 Apr 2014 09:03:25 +0200 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb Message-ID: <20140414070325.GA22490@lst.de> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb References: <1397289723-26243-1-git-send-email-hch@lst.de> <1397289723-26243-3-git-send-email-hch@lst.de> <20140414015544.GH27694@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414015544.GH27694@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1397459008 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4888 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 11:55:44AM +1000, Dave Chinner wrote: > > +static void > > +xfs_bmap_fix_args( > > + struct xfs_bmalloca *ap, > > + struct xfs_alloc_arg *args, > > + xfs_extlen_t *blen, > > + int notinit) > > Not a big fan of the "fix_args" name here. What it's actually doing > is setting the minimum allocation length. Also, it could return the > minimum length rather than set it inside the function, and pass > blen by value rather than reference as it isn't modified in the > function... Sure. A any good suggestion for a name? From david@fromorbit.com Mon Apr 14 02:06:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFB637F4E for ; Mon, 14 Apr 2014 02:06:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8CBE2304039 for ; Mon, 14 Apr 2014 00:06:46 -0700 (PDT) X-ASG-Debug-ID: 1397459203-04bdf07dc71b1bc0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id QUyIUcqWYLvkkCgX for ; Mon, 14 Apr 2014 00:06:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArBQAPWHS1N5LEcvPGdsb2JhbABQCoMGO4MVhQuiHZF+gViGfBcDAQEBATg1gwI7JDQFJQMHLYd7mS2xcBaNfA+DAg+BewSYYJQDggQrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2014 16:36:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZayX-0007zu-PH for xfs@oss.sgi.com; Mon, 14 Apr 2014 17:06:41 +1000 Date: Mon, 14 Apr 2014 17:06:41 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: v3.2.0-rc1 tagged Message-ID: <20140414070641.GK27694@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: v3.2.0-rc1 tagged MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="k+w/mQv8wyuph6w0" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1397459204 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4888 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --k+w/mQv8wyuph6w0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: fa98503 xfsprogs: v3.2.0-rc1 release This update indicates that we are getting close to a 3.2.0 release. We are just about feature complete for CRC enabled filesystems, so it's time to push towards a full release. I haven't created tarballs for this release, just tagged the repository and updated the version and changelogs. I'll release a source tarball for an -rc2 release if we need it... At this point, I'm really aiming to have the release complete by the time that the 3.15 kernel is released, and hence make the 3.15 kernel the first kernel we fully support metadata CRCs on. This gives us about 6 weeks to finalise the xfsprogs 3.2.0 release, so testing and bug reprorts and fixes are very welcome at this point. And while this looks like lots of change leading up to a -rc1 release, the majority of them are Coverity fixes and so remove a lot of noise from the checker reports and hence will help us identify new issues a lot faster. Cheers, Dave. ---- New Commits: Dave Chinner (1): [fa98503] xfsprogs: v3.2.0-rc1 release Eric Sandeen (17): [11e0696] xfsprogs: fix various fd leaks [d0e82db] xfs_fsr: refactor fsrall_cleanup [355ac01] xfsprogs: trivial buffer frees on error paths [0284875] libxlog: fix memory leak in xlog_recover_add_to_trans [edbdb4f] libxfs: fix memory leak in xfs_dir2_node_removename [f6a8b88] xfs_quota: fix memory leak in quota_group_type() error path [04536ba] xfs_logprint: fix leak in error path of xlog_print_record() [682fa9e] libxfs: free resources in libxfs_alloc_file_space error pat= hs [90ec25e] libxfs: annotate a case fallthrough in libxfs_ialloc [04c2e8d] xfs_db: fix too-large memset value in attr code [9d473f4] xfs_quota: remove impossible tests in printpath [f8579c0] xfs_repair: address never-true tests in repair/bmap.c on 64= bit [3ddc4ae] mkfs: catch unknown format in protofile parsing [d15f7cf] xfs_db: don't use invalid index in ring_f [d0bbcbc] xfsprogs: remove write-only assignments [0337778] xfs_io: fix random pread/pwrite to honor offset [e887198] libxfs: remove never-read "offset" assignment in readbufr_m= ap & writebufr Mark Tinguely (1): [9404cb4] logprint: handle split EFI entry Code Diffstat: VERSION | 2 +- copy/xfs_copy.c | 3 +-- db/addr.c | 15 +++++++-------- db/attrset.c | 2 +- db/bmap.c | 1 - db/check.c | 5 +++-- db/convert.c | 1 - db/io.c | 4 +++- db/write.c | 2 ++ doc/CHANGES | 18 ++++++++++++++++++ fsr/xfs_fsr.c | 34 +++++++++++++++++++++------------- growfs/xfs_growfs.c | 1 - include/bitops.h | 1 - io/parent.c | 2 ++ io/pread.c | 2 +- io/pwrite.c | 2 +- io/readdir.c | 1 + libhandle/handle.c | 1 + libxfs/rdwr.c | 4 +--- libxfs/util.c | 21 ++++++++++++++++++--- libxfs/xfs_dir2_node.c | 26 +++++++++++++------------- libxlog/xfs_log_recover.c | 1 + logprint/log_misc.c | 43 ++++++++++++++++++++++++++++++++----------- logprint/log_print_all.c | 3 +-- logprint/logprint.h | 2 +- mkfs/proto.c | 18 ++++++++++++++---- mkfs/xfs_mkfs.c | 2 -- quota/path.c | 8 ++++---- quota/quot.c | 1 + quota/quota.c | 20 ++++++++++++-------- repair/attr_repair.c | 2 -- repair/bmap.c | 8 ++++---- repair/dir2.c | 3 +-- repair/phase5.c | 3 --- repair/phase6.c | 1 - repair/prefetch.c | 1 - repair/sb.c | 2 -- rtcp/xfs_rtcp.c | 2 ++ 38 files changed, 168 insertions(+), 100 deletions(-) --=20 Dave Chinner david@fromorbit.com --k+w/mQv8wyuph6w0 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTS4kBAAoJEK3oKUf0dfodMwgQAJbY6xEoD42JazhEprp7Qi+L UqcICLfQLy8R50ZqaYS8h5uEHLJpGedRJjwdqeeDAPVrgA7y67/pE0Uy14frq5Q/ J10hVEl3UobmjnHk1L3WyabdZfPLMIWjbf2ZOzlNPgKmHXR0mvFAQ5Lkvq+tftVW 3AgwnmM7JurfMKJvOUSc+5e+a6gJml90SekxwGrVFRkqxR7CCrglYYOZn/dSJuHH Iyr0Srq2ly8TzdrsTFMMCM2AHXkgHv7i5KEM0cQIIz0Sj6BVKnalIJvO9mPIPRWu CB+TcmjTFsxzKADq6/Y2aPDT26C9sxXYZWebboYC5diMZeeS6MUVbePwOXmn4tT3 C8Kfk59wU/sIINl9lGEzTTsmfPdpeydAEJKMdZIArzDwkBaZR7/BxDs9kz7P5hQv NakxtlpPxt5U65K6tSU/lYT7LZOI6U0h0wcfBCoTJWKkGZHtG+WDRrFkr0QMCmPa MHDTa8Tl4sMuJmQgRjMQwAPkO+zyxeE/n4fnGI+iCwAT72QgT9cEveE6M9elfOTu CLQI9rpYnSRLtnfFEhW2pFjlEmMDOU0Xph7CUVn23Jd3wDLpWRWcN7piAT4Dxyzw ELFdUIO3c6qfZnEX1FQ2n8iidoOEMQCHvSOOSinvFtuYwyBbn46RhCCoKMJKmxJH W3K4sqbS/ZFtlNVePARM =IkLs -----END PGP SIGNATURE----- --k+w/mQv8wyuph6w0-- From david@fromorbit.com Mon Apr 14 02:17:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC57B7F4E for ; Mon, 14 Apr 2014 02:17:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35CD3AC002 for ; Mon, 14 Apr 2014 00:17:17 -0700 (PDT) X-ASG-Debug-ID: 1397459834-04cbb00dc41b4630001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ORh4rGiydTgsGyoN for ; Mon, 14 Apr 2014 00:17: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: AqdSAIOKS1N5LEcvPGdsb2JhbABagwaDUIULtXOFXYEfFwMBAQEBODWCJQEBAQQ6HCMQCAMOCgklDwUlAwcaE4d7ywwXFo5YB4Q4BJhgimWLIis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2014 16:47:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZb8h-00081c-Cj; Mon, 14 Apr 2014 17:17:11 +1000 Date: Mon, 14 Apr 2014 17:17:11 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb Message-ID: <20140414071711.GL27694@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: split xfs_bmap_btalloc_nullfb References: <1397289723-26243-1-git-send-email-hch@lst.de> <1397289723-26243-3-git-send-email-hch@lst.de> <20140414015544.GH27694@dastard> <20140414070325.GA22490@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414070325.GA22490@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1397459834 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4888 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 09:03:25AM +0200, Christoph Hellwig wrote: > On Mon, Apr 14, 2014 at 11:55:44AM +1000, Dave Chinner wrote: > > > +static void > > > +xfs_bmap_fix_args( > > > + struct xfs_bmalloca *ap, > > > + struct xfs_alloc_arg *args, > > > + xfs_extlen_t *blen, > > > + int notinit) > > > > Not a big fan of the "fix_args" name here. What it's actually doing > > is setting the minimum allocation length. Also, it could return the > > minimum length rather than set it inside the function, and pass > > blen by value rather than reference as it isn't modified in the > > function... > > Sure. A any good suggestion for a name? xfs_bmap_select_minlen()? Cheers, Dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Mon Apr 14 02:27:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id B89D57F52; Mon, 14 Apr 2014 02:27:28 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-3.15-rc1-14826-gc9eaa44 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 38dbfb59d1175ef458d006556061adeaa8751b72 X-Git-Newrev: c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 Message-Id: <20140414072728.B89D57F52@oss.sgi.com> Date: Mon, 14 Apr 2014 02:27:25 -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 5166701 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs f182036 mm: implement ->map_pages for page cache d15e031 Merge tag 'xfs-for-linus-3.15-rc1' of git://oss.sgi.com/xfs/xfs 24e7ea3 Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 91b0abe mm + fs: store shadow entries in page cache a6cf33b Merge branch 'xfs-bug-fixes-for-3.15-3' into for-next c88547a xfs: fix directory hash ordering bug 805eeb8 xfs: extra semi-colon breaks a condition 0a64bc2 xfs_file_buffered_aio_write(): switch to generic_perform_write() 5cb6c6c generic_file_direct_write(): get rid of ppos argument fcacafd kill the 5th argument of generic_file_buffered_write() 5d826c8 new helper: readlink_copy() 02b9984 fs: push sync_filesystem() down to the file system's remount_fs() fe986f9 Merge branch 'xfs-O_TMPFILE-support' into for-next 5f44e4c Merge branch 'xfs-bug-fixes-for-3.15-2' into for-next 49ae4b9 Merge branch 'xfs-verifier-cleanup' into for-next 730357a Merge branch 'xfs-stack-fixes' into for-next b6db055 Merge branch 'xfs-collapse-range' into for-next 376ba31 xfs: Add support for FALLOC_FL_ZERO_RANGE fe4c224 xfs: inode log reservations are still too small a49935f xfs: xfs_check_page_type buffer checks need help e480a72 xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation ae687e5 xfs: use NOIO contexts for vm_map_ram ac75a1f xfs: don't leak EFSBADCRC to userspace 8d75318 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs 93a8614 xfs: fix directory inode iolock lockdep false positive a1358aa xfs: allocate xfs_da_args to reduce stack footprint f876e44 xfs: always do log forces via the workqueue ce5028c xfs: modify verifiers to differentiate CRC from other errors db9355c xfs: print useful caller information in xfs_error_report ca23f8f xfs: add xfs_verifier_error() f1dbcd7 xfs: add helper for updating checksums on xfs_bufs 5158217 xfs: add helper for verifying checksums on xfs_bufs 533b81c xfs: Use defines for CRC offsets in all cases e0d2c23 xfs: skip pointless CRC updates after verifier failures e1d8fb8 xfs: Add support FALLOC_FL_COLLAPSE_RANGE for fallocate 645ceee Merge branch 'xfs-fixes-for-3.14-rc4' of git://oss.sgi.com/xfs/xfs 0dc83bd Revert "writeback: do not sync data dirtied after sync start" 027f185 Merge remote-tracking branch 'xfs-async-aio-extend' into for-next b678573 Merge branch 'xfs-fixes-for-3.15' into for-next 5ef11eb xfs: limit superblock corruption errors to actual corruption daba542 xfs: skip verification on initial "guess" superblock read 7a01e70 xfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb 3895e51 xfs: ensure correct log item buffer alignment fe60a8a xfs: ensure correct timestamp updates from truncate 9862f62 xfs: allow appending aio writes d531d91 xfs: always use unwritten extents for direct I/O writes d311d79 fix O_SYNC|O_APPEND syncing the wrong range on write() 492185e xfs: remove XFS_TRANS_DEBUG dead code 4ae69fe xfs: return -E2BIG if hit the maximum size limits of ACLs 392c6de xfs: sanitize sb_inopblock in xfs_mount_validate_sb c6f9726 xfs: convert xfs_log_commit_cil() to void 410b11a xfs: use tr_qm_dqalloc log reservation for dquot alloc c19ec23 xfs: remove unused tr_swrite 70bbca07 xfs: use tr_growrtalloc for growing rt files ab29743 xfs: allow linkat() on O_TMPFILE files 99b6436 xfs: add O_TMPFILE support 163467d xfs: factor prid related codes into xfs_get_initial_prid() from 38dbfb59d1175ef458d006556061adeaa8751b72 (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 5166701b368caea89d57b14bf41cf39e819dad51 Merge: 0a7418f a786c06 Author: Linus Torvalds Date: Sat Apr 12 14:49:50 2014 -0700 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs Pull vfs updates from Al Viro: "The first vfs pile, with deep apologies for being very late in this window. Assorted cleanups and fixes, plus a large preparatory part of iov_iter work. There's a lot more of that, but it'll probably go into the next merge window - it *does* shape up nicely, removes a lot of boilerplate, gets rid of locking inconsistencie between aio_write and splice_write and I hope to get Kent's direct-io rewrite merged into the same queue, but some of the stuff after this point is having (mostly trivial) conflicts with the things already merged into mainline and with some I want more testing. This one passes LTP and xfstests without regressions, in addition to usual beating. BTW, readahead02 in ltp syscalls testsuite has started giving failures since "mm/readahead.c: fix readahead failure for memoryless NUMA nodes and limit readahead pages" - might be a false positive, might be a real regression..." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits) missing bits of "splice: fix racy pipe->buffers uses" cifs: fix the race in cifs_writev() ceph_sync_{,direct_}write: fix an oops on ceph_osdc_new_request() failure kill generic_file_buffered_write() ocfs2_file_aio_write(): switch to generic_perform_write() ceph_aio_write(): switch to generic_perform_write() xfs_file_buffered_aio_write(): switch to generic_perform_write() export generic_perform_write(), start getting rid of generic_file_buffer_write() generic_file_direct_write(): get rid of ppos argument btrfs_file_aio_write(): get rid of ppos kill the 5th argument of generic_file_buffered_write() kill the 4th argument of __generic_file_aio_write() lustre: don't open-code kernel_recvmsg() ocfs2: don't open-code kernel_recvmsg() drbd: don't open-code kernel_recvmsg() constify blk_rq_map_user_iov() and friends lustre: switch to kernel_sendmsg() ocfs2: don't open-code kernel_sendmsg() take iov_iter stuff to mm/iov_iter.c process_vm_access: tidy up a bit ... commit f1820361f83d556a7f0a9f629100f3825e594328 Author: Kirill A. Shutemov Date: Mon Apr 7 15:37:19 2014 -0700 mm: implement ->map_pages for page cache filemap_map_pages() is generic implementation of ->map_pages() for filesystems who uses page cache. It should be safe to use filemap_map_pages() for ->map_pages() if filesystem use filemap_fault() for ->fault(). Signed-off-by: Kirill A. Shutemov Acked-by: Linus Torvalds Cc: Mel Gorman Cc: Rik van Riel Cc: Andi Kleen Cc: Matthew Wilcox Cc: Dave Hansen Cc: Alexander Viro Cc: Dave Chinner Cc: Ning Qu Cc: Hugh Dickins Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit d15e03104eb9a4f8e244ab6ed3ca5a107e46db13 Merge: 24e7ea3 a6cf33b Author: Linus Torvalds Date: Fri Apr 4 15:50:08 2014 -0700 Merge tag 'xfs-for-linus-3.15-rc1' of git://oss.sgi.com/xfs/xfs Pull xfs update from Dave Chinner: "There are a couple of new fallocate features in this request - it was decided that it was easiest to push them through the XFS tree using topic branches and have the ext4 support be based on those branches. Hence you may see some overlap with the ext4 tree merge depending on how they including those topic branches into their tree. Other than that, there is O_TMPFILE support, some cleanups and bug fixes. The main changes in the XFS tree for 3.15-rc1 are: - O_TMPFILE support - allowing AIO+DIO writes beyond EOF - FALLOC_FL_COLLAPSE_RANGE support for fallocate syscall and XFS implementation - FALLOC_FL_ZERO_RANGE support for fallocate syscall and XFS implementation - IO verifier cleanup and rework - stack usage reduction changes - vm_map_ram NOIO context fixes to remove lockdep warings - various bug fixes and cleanups" * tag 'xfs-for-linus-3.15-rc1' of git://oss.sgi.com/xfs/xfs: (34 commits) xfs: fix directory hash ordering bug xfs: extra semi-colon breaks a condition xfs: Add support for FALLOC_FL_ZERO_RANGE fs: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate xfs: inode log reservations are still too small xfs: xfs_check_page_type buffer checks need help xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation xfs: use NOIO contexts for vm_map_ram xfs: don't leak EFSBADCRC to userspace xfs: fix directory inode iolock lockdep false positive xfs: allocate xfs_da_args to reduce stack footprint xfs: always do log forces via the workqueue xfs: modify verifiers to differentiate CRC from other errors xfs: print useful caller information in xfs_error_report xfs: add xfs_verifier_error() xfs: add helper for updating checksums on xfs_bufs xfs: add helper for verifying checksums on xfs_bufs xfs: Use defines for CRC offsets in all cases xfs: skip pointless CRC updates after verifier failures xfs: Add support FALLOC_FL_COLLAPSE_RANGE for fallocate ... commit 24e7ea3bea94fe05eae5019f5f12bcdc98fc5157 Merge: 8e343c8 ad6599a Author: Linus Torvalds Date: Fri Apr 4 15:39:39 2014 -0700 Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 updates from Ted Ts'o: "Major changes for 3.14 include support for the newly added ZERO_RANGE and COLLAPSE_RANGE fallocate operations, and scalability improvements in the jbd2 layer and in xattr handling when the extended attributes spill over into an external block. Other than that, the usual clean ups and minor bug fixes" * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (42 commits) ext4: fix premature freeing of partial clusters split across leaf blocks ext4: remove unneeded test of ret variable ext4: fix comment typo ext4: make ext4_block_zero_page_range static ext4: atomically set inode->i_flags in ext4_set_inode_flags() ext4: optimize Hurd tests when reading/writing inodes ext4: kill i_version support for Hurd-castrated file systems ext4: each filesystem creates and uses its own mb_cache fs/mbcache.c: doucple the locking of local from global data fs/mbcache.c: change block and index hash chain to hlist_bl_node ext4: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate ext4: refactor ext4_fallocate code ext4: Update inode i_size after the preallocation ext4: fix partial cluster handling for bigalloc file systems ext4: delete path dealloc code in ext4_ext_handle_uninitialized_extents ext4: only call sync_filesystm() when remounting read-only fs: push sync_filesystem() down to the file system's remount_fs() jbd2: improve error messages for inconsistent journal heads jbd2: minimize region locked by j_list_lock in jbd2_journal_forget() jbd2: minimize region locked by j_list_lock in journal_get_create_access() ... commit 91b0abe36a7b2b3b02d7500925a5f8455334f0e5 Author: Johannes Weiner Date: Thu Apr 3 14:47:49 2014 -0700 mm + fs: store shadow entries in page cache Reclaim will be leaving shadow entries in the page cache radix tree upon evicting the real page. As those pages are found from the LRU, an iput() can lead to the inode being freed concurrently. At this point, reclaim must no longer install shadow pages because the inode freeing code needs to ensure the page tree is really empty. Add an address_space flag, AS_EXITING, that the inode freeing code sets under the tree lock before doing the final truncate. Reclaim will check for this flag before installing shadow pages. Signed-off-by: Johannes Weiner Reviewed-by: Rik van Riel Reviewed-by: Minchan Kim Cc: Andrea Arcangeli Cc: Bob Liu Cc: Christoph Hellwig Cc: Dave Chinner Cc: Greg Thelen Cc: Hugh Dickins Cc: Jan Kara Cc: KOSAKI Motohiro Cc: Luigi Semenzato Cc: Mel Gorman Cc: Metin Doslu Cc: Michel Lespinasse Cc: Ozgun Erdogan Cc: Peter Zijlstra Cc: Roman Gushchin Cc: Ryan Mallon Cc: Tejun Heo Cc: Vlastimil Babka Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 0a64bc2c0474640a850febd5ac3abb8d45b32821 Author: Al Viro Date: Tue Feb 11 22:25:22 2014 -0500 xfs_file_buffered_aio_write(): switch to generic_perform_write() Signed-off-by: Al Viro commit 5cb6c6c7eb1ed24744b41fad47d9a25b72207098 Author: Al Viro Date: Tue Feb 11 20:58:20 2014 -0500 generic_file_direct_write(): get rid of ppos argument always equal to &iocb->ki_pos. Signed-off-by: Al Viro commit fcacafd269adc88f41b68cb77a3f957a66563428 Author: Al Viro Date: Sun Feb 9 13:37:49 2014 -0500 kill the 5th argument of generic_file_buffered_write() same story - it's &iocb->ki_pos in all cases Signed-off-by: Al Viro commit 5d826c847b34de6415b4f1becd88a57ff619af50 Author: Al Viro Date: Fri Mar 14 13:42:45 2014 -0400 new helper: readlink_copy() Signed-off-by: Al Viro commit 02b9984d640873b7b3809e63f81a0d7e13496886 Author: Theodore Ts'o Date: Thu Mar 13 10:14:33 2014 -0400 fs: push sync_filesystem() down to the file system's remount_fs() Previously, the no-op "mount -o mount /dev/xxx" operation when the file system is already mounted read-write causes an implied, unconditional syncfs(). This seems pretty stupid, and it's certainly documented or guaraunteed to do this, nor is it particularly useful, except in the case where the file system was mounted rw and is getting remounted read-only. However, it's possible that there might be some file systems that are actually depending on this behavior. In most file systems, it's probably fine to only call sync_filesystem() when transitioning from read-write to read-only, and there are some file systems where this is not needed at all (for example, for a pseudo-filesystem or something like romfs). Signed-off-by: "Theodore Ts'o" Cc: linux-fsdevel@vger.kernel.org Cc: Christoph Hellwig Cc: Artem Bityutskiy Cc: Adrian Hunter Cc: Evgeniy Dushistov Cc: Jan Kara Cc: OGAWA Hirofumi Cc: Anders Larsen Cc: Phillip Lougher Cc: Kees Cook Cc: Mikulas Patocka Cc: Petr Vandrovec Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Cc: codalist@coda.cs.cmu.edu Cc: linux-ext4@vger.kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net Cc: fuse-devel@lists.sourceforge.net Cc: cluster-devel@redhat.com Cc: linux-mtd@lists.infradead.org Cc: jfs-discussion@lists.sourceforge.net Cc: linux-nfs@vger.kernel.org Cc: linux-nilfs@vger.kernel.org Cc: linux-ntfs-dev@lists.sourceforge.net Cc: ocfs2-devel@oss.oracle.com Cc: reiserfs-devel@vger.kernel.org commit 8d7531825c0dc24f3f300c07fb1a2a3a00b9e89c Merge: bb7d43b14 ff57cd5 Author: Linus Torvalds Date: Thu Feb 27 10:37:22 2014 -0800 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs Pull filesystem fixes from Jan Kara: "Notification, writeback, udf, quota fixes The notification patches are (with one exception) a fallout of my fsnotify rework which went into -rc1 (I've extented LTP to cover these cornercases to avoid similar breakage in future). The UDF patch is a nasty data corruption Al has recently reported, the revert of the writeback patch is due to possibility of violating sync(2) guarantees, and a quota bug can lead to corruption of quota files in ocfs2" * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: fsnotify: Allocate overflow events with proper type fanotify: Handle overflow in case of permission events fsnotify: Fix detection whether overflow event is queued Revert "writeback: do not sync data dirtied after sync start" quota: Fix race between dqput() and dquot_scan_active() udf: Fix data corruption on file type conversion inotify: Fix reporting of cookies for inotify events commit 645ceee885facc6de60051be150ca1b06bdb9e51 Merge: 1052710 5ef11eb Author: Linus Torvalds Date: Sat Feb 22 08:26:01 2014 -0800 Merge branch 'xfs-fixes-for-3.14-rc4' of git://oss.sgi.com/xfs/xfs Pull xfs fixes from Dave Chinner: "This is the first pull request I've had to do for you, so I'm still sorting things out. The reason I'm sending this and not Ben should be obvious from the first commit below - SGI has stepped down from the XFS maintainership role. As such, I'd like to take another opportunity to thank them for their many years of effort maintaining XFS and supporting the XFS community that they developed from the ground up. So I haven't had time to work things like signed tags into my workflows yet, so this is just a repo branch I'm asking you to pull from. And yes, I named the branch -rc4 because I wanted the fixes in rc4, not because the branch was for merging into -rc3. Probably not right, either. Anyway, I should have everything sorted out by the time the next merge window comes around. If there's anything that you don't like in the pull req, feel free to flame me unmercifully. The changes are fixes for recent regressions and important thinkos in verification code: - a log vector buffer alignment issue on ia32 - timestamps on truncate got mangled - primary superblock CRC validation fixes and error message sanitisation" * 'xfs-fixes-for-3.14-rc4' of git://oss.sgi.com/xfs/xfs: xfs: limit superblock corruption errors to actual corruption xfs: skip verification on initial "guess" superblock read MAINTAINERS: SGI no longer maintaining XFS xfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb xfs: ensure correct log item buffer alignment xfs: ensure correct timestamp updates from truncate commit 0dc83bd30b0bf5410c0933cfbbf8853248eff0a9 Author: Jan Kara Date: Fri Feb 21 11:19:04 2014 +0100 Revert "writeback: do not sync data dirtied after sync start" This reverts commit c4a391b53a72d2df4ee97f96f78c1d5971b47489. Dave Chinner has reported the commit may cause some inodes to be left out from sync(2). This is because we can call redirty_tail() for some inode (which sets i_dirtied_when to current time) after sync(2) has started or similarly requeue_inode() can set i_dirtied_when to current time if writeback had to skip some pages. The real problem is in the functions clobbering i_dirtied_when but fixing that isn't trivial so revert is a safer choice for now. CC: stable@vger.kernel.org # >= 3.13 Signed-off-by: Jan Kara commit d311d79de305f1ada47cadd672e6ed1b28a949eb Author: Al Viro Date: Sun Feb 9 15:18:09 2014 -0500 fix O_SYNC|O_APPEND syncing the wrong range on write() It actually goes back to 2004 ([PATCH] Concurrent O_SYNC write support) when sync_page_range() had been introduced; generic_file_write{,v}() correctly synced pos_after_write - written .. pos_after_write - 1 but generic_file_aio_write() synced pos_before_write .. pos_before_write + written - 1 instead. Which is not the same thing with O_APPEND, obviously. A couple of years later correct variant had been killed off when everything switched to use of generic_file_aio_write(). All users of generic_file_aio_write() are affected, and the same bug has been copied into other instances of ->aio_write(). The fix is trivial; the only subtle point is that generic_write_sync() ought to be inlined to avoid calculations useless for the majority of calls. Signed-off-by: Al Viro ----------------------------------------------------------------------- Summary of changes: fs/xfs/kmem.c | 21 ++- fs/xfs/xfs_acl.c | 2 +- fs/xfs/xfs_ag.h | 6 + fs/xfs/xfs_alloc.c | 45 +++--- fs/xfs/xfs_alloc_btree.c | 16 ++- fs/xfs/xfs_aops.c | 84 ++++++----- fs/xfs/xfs_attr_leaf.c | 17 +-- fs/xfs/xfs_attr_remote.c | 15 +- fs/xfs/xfs_bmap.c | 193 +++++++++++++++++++++++++ fs/xfs/xfs_bmap.h | 15 ++ fs/xfs/xfs_bmap_btree.c | 16 +-- fs/xfs/xfs_bmap_util.c | 97 ++++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_btree.c | 14 +- fs/xfs/xfs_buf.c | 11 ++ fs/xfs/xfs_buf.h | 14 ++ fs/xfs/xfs_buf_item.c | 19 --- fs/xfs/xfs_da_btree.c | 19 +-- fs/xfs/xfs_dinode.h | 2 + fs/xfs/xfs_dir2.c | 342 +++++++++++++++++++++++++++----------------- fs/xfs/xfs_dir2_block.c | 17 +-- fs/xfs/xfs_dir2_data.c | 20 +-- fs/xfs/xfs_dir2_leaf.c | 17 +-- fs/xfs/xfs_dir2_node.c | 17 +-- fs/xfs/xfs_dquot.c | 2 +- fs/xfs/xfs_dquot_buf.c | 11 +- fs/xfs/xfs_error.c | 27 +++- fs/xfs/xfs_error.h | 1 + fs/xfs/xfs_file.c | 42 ++++-- fs/xfs/xfs_format.h | 2 + fs/xfs/xfs_ialloc.c | 36 +++-- fs/xfs/xfs_ialloc_btree.c | 16 ++- fs/xfs/xfs_inode.c | 123 +++++++++++++++- fs/xfs/xfs_inode.h | 12 ++ fs/xfs/xfs_inode_buf.c | 7 +- fs/xfs/xfs_ioctl.c | 28 +--- fs/xfs/xfs_iomap.c | 10 +- fs/xfs/xfs_iops.c | 46 ++++-- fs/xfs/xfs_linux.h | 2 + fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 74 +++++++--- fs/xfs/xfs_mount.c | 27 ++-- fs/xfs/xfs_rtalloc.c | 2 +- fs/xfs/xfs_sb.c | 23 ++- fs/xfs/xfs_sb.h | 2 + fs/xfs/xfs_shared.h | 4 +- fs/xfs/xfs_super.c | 5 +- fs/xfs/xfs_symlink.c | 9 +- fs/xfs/xfs_symlink_remote.c | 16 +-- fs/xfs/xfs_trace.h | 1 + fs/xfs/xfs_trans.c | 12 +- fs/xfs/xfs_trans_buf.c | 11 ++ fs/xfs/xfs_trans_resv.c | 82 +++++++++-- fs/xfs/xfs_trans_resv.h | 3 +- 54 files changed, 1193 insertions(+), 466 deletions(-) hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Mon Apr 14 02:35:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 4EB1D7F50; Mon, 14 Apr 2014 02:35:51 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc1-14826-gc9eaa44 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: a6cf33bc566c5fe888bfa9cf6448037c90661f67 X-Git-Newrev: c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 Message-Id: <20140414073551.4EB1D7F50@oss.sgi.com> Date: Mon, 14 Apr 2014 02:35:50 -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 5166701 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs f182036 mm: implement ->map_pages for page cache d15e031 Merge tag 'xfs-for-linus-3.15-rc1' of git://oss.sgi.com/xfs/xfs 24e7ea3 Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 91b0abe mm + fs: store shadow entries in page cache 0a64bc2 xfs_file_buffered_aio_write(): switch to generic_perform_write() 5cb6c6c generic_file_direct_write(): get rid of ppos argument fcacafd kill the 5th argument of generic_file_buffered_write() 5d826c8 new helper: readlink_copy() 02b9984 fs: push sync_filesystem() down to the file system's remount_fs() 8d75318 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs 645ceee Merge branch 'xfs-fixes-for-3.14-rc4' of git://oss.sgi.com/xfs/xfs 0dc83bd Revert "writeback: do not sync data dirtied after sync start" d311d79 fix O_SYNC|O_APPEND syncing the wrong range on write() from a6cf33bc566c5fe888bfa9cf6448037c90661f67 (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 5166701b368caea89d57b14bf41cf39e819dad51 Merge: 0a7418f a786c06 Author: Linus Torvalds Date: Sat Apr 12 14:49:50 2014 -0700 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs Pull vfs updates from Al Viro: "The first vfs pile, with deep apologies for being very late in this window. Assorted cleanups and fixes, plus a large preparatory part of iov_iter work. There's a lot more of that, but it'll probably go into the next merge window - it *does* shape up nicely, removes a lot of boilerplate, gets rid of locking inconsistencie between aio_write and splice_write and I hope to get Kent's direct-io rewrite merged into the same queue, but some of the stuff after this point is having (mostly trivial) conflicts with the things already merged into mainline and with some I want more testing. This one passes LTP and xfstests without regressions, in addition to usual beating. BTW, readahead02 in ltp syscalls testsuite has started giving failures since "mm/readahead.c: fix readahead failure for memoryless NUMA nodes and limit readahead pages" - might be a false positive, might be a real regression..." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits) missing bits of "splice: fix racy pipe->buffers uses" cifs: fix the race in cifs_writev() ceph_sync_{,direct_}write: fix an oops on ceph_osdc_new_request() failure kill generic_file_buffered_write() ocfs2_file_aio_write(): switch to generic_perform_write() ceph_aio_write(): switch to generic_perform_write() xfs_file_buffered_aio_write(): switch to generic_perform_write() export generic_perform_write(), start getting rid of generic_file_buffer_write() generic_file_direct_write(): get rid of ppos argument btrfs_file_aio_write(): get rid of ppos kill the 5th argument of generic_file_buffered_write() kill the 4th argument of __generic_file_aio_write() lustre: don't open-code kernel_recvmsg() ocfs2: don't open-code kernel_recvmsg() drbd: don't open-code kernel_recvmsg() constify blk_rq_map_user_iov() and friends lustre: switch to kernel_sendmsg() ocfs2: don't open-code kernel_sendmsg() take iov_iter stuff to mm/iov_iter.c process_vm_access: tidy up a bit ... commit f1820361f83d556a7f0a9f629100f3825e594328 Author: Kirill A. Shutemov Date: Mon Apr 7 15:37:19 2014 -0700 mm: implement ->map_pages for page cache filemap_map_pages() is generic implementation of ->map_pages() for filesystems who uses page cache. It should be safe to use filemap_map_pages() for ->map_pages() if filesystem use filemap_fault() for ->fault(). Signed-off-by: Kirill A. Shutemov Acked-by: Linus Torvalds Cc: Mel Gorman Cc: Rik van Riel Cc: Andi Kleen Cc: Matthew Wilcox Cc: Dave Hansen Cc: Alexander Viro Cc: Dave Chinner Cc: Ning Qu Cc: Hugh Dickins Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit d15e03104eb9a4f8e244ab6ed3ca5a107e46db13 Merge: 24e7ea3 a6cf33b Author: Linus Torvalds Date: Fri Apr 4 15:50:08 2014 -0700 Merge tag 'xfs-for-linus-3.15-rc1' of git://oss.sgi.com/xfs/xfs Pull xfs update from Dave Chinner: "There are a couple of new fallocate features in this request - it was decided that it was easiest to push them through the XFS tree using topic branches and have the ext4 support be based on those branches. Hence you may see some overlap with the ext4 tree merge depending on how they including those topic branches into their tree. Other than that, there is O_TMPFILE support, some cleanups and bug fixes. The main changes in the XFS tree for 3.15-rc1 are: - O_TMPFILE support - allowing AIO+DIO writes beyond EOF - FALLOC_FL_COLLAPSE_RANGE support for fallocate syscall and XFS implementation - FALLOC_FL_ZERO_RANGE support for fallocate syscall and XFS implementation - IO verifier cleanup and rework - stack usage reduction changes - vm_map_ram NOIO context fixes to remove lockdep warings - various bug fixes and cleanups" * tag 'xfs-for-linus-3.15-rc1' of git://oss.sgi.com/xfs/xfs: (34 commits) xfs: fix directory hash ordering bug xfs: extra semi-colon breaks a condition xfs: Add support for FALLOC_FL_ZERO_RANGE fs: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate xfs: inode log reservations are still too small xfs: xfs_check_page_type buffer checks need help xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation xfs: use NOIO contexts for vm_map_ram xfs: don't leak EFSBADCRC to userspace xfs: fix directory inode iolock lockdep false positive xfs: allocate xfs_da_args to reduce stack footprint xfs: always do log forces via the workqueue xfs: modify verifiers to differentiate CRC from other errors xfs: print useful caller information in xfs_error_report xfs: add xfs_verifier_error() xfs: add helper for updating checksums on xfs_bufs xfs: add helper for verifying checksums on xfs_bufs xfs: Use defines for CRC offsets in all cases xfs: skip pointless CRC updates after verifier failures xfs: Add support FALLOC_FL_COLLAPSE_RANGE for fallocate ... commit 24e7ea3bea94fe05eae5019f5f12bcdc98fc5157 Merge: 8e343c8 ad6599a Author: Linus Torvalds Date: Fri Apr 4 15:39:39 2014 -0700 Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 updates from Ted Ts'o: "Major changes for 3.14 include support for the newly added ZERO_RANGE and COLLAPSE_RANGE fallocate operations, and scalability improvements in the jbd2 layer and in xattr handling when the extended attributes spill over into an external block. Other than that, the usual clean ups and minor bug fixes" * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (42 commits) ext4: fix premature freeing of partial clusters split across leaf blocks ext4: remove unneeded test of ret variable ext4: fix comment typo ext4: make ext4_block_zero_page_range static ext4: atomically set inode->i_flags in ext4_set_inode_flags() ext4: optimize Hurd tests when reading/writing inodes ext4: kill i_version support for Hurd-castrated file systems ext4: each filesystem creates and uses its own mb_cache fs/mbcache.c: doucple the locking of local from global data fs/mbcache.c: change block and index hash chain to hlist_bl_node ext4: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate ext4: refactor ext4_fallocate code ext4: Update inode i_size after the preallocation ext4: fix partial cluster handling for bigalloc file systems ext4: delete path dealloc code in ext4_ext_handle_uninitialized_extents ext4: only call sync_filesystm() when remounting read-only fs: push sync_filesystem() down to the file system's remount_fs() jbd2: improve error messages for inconsistent journal heads jbd2: minimize region locked by j_list_lock in jbd2_journal_forget() jbd2: minimize region locked by j_list_lock in journal_get_create_access() ... commit 91b0abe36a7b2b3b02d7500925a5f8455334f0e5 Author: Johannes Weiner Date: Thu Apr 3 14:47:49 2014 -0700 mm + fs: store shadow entries in page cache Reclaim will be leaving shadow entries in the page cache radix tree upon evicting the real page. As those pages are found from the LRU, an iput() can lead to the inode being freed concurrently. At this point, reclaim must no longer install shadow pages because the inode freeing code needs to ensure the page tree is really empty. Add an address_space flag, AS_EXITING, that the inode freeing code sets under the tree lock before doing the final truncate. Reclaim will check for this flag before installing shadow pages. Signed-off-by: Johannes Weiner Reviewed-by: Rik van Riel Reviewed-by: Minchan Kim Cc: Andrea Arcangeli Cc: Bob Liu Cc: Christoph Hellwig Cc: Dave Chinner Cc: Greg Thelen Cc: Hugh Dickins Cc: Jan Kara Cc: KOSAKI Motohiro Cc: Luigi Semenzato Cc: Mel Gorman Cc: Metin Doslu Cc: Michel Lespinasse Cc: Ozgun Erdogan Cc: Peter Zijlstra Cc: Roman Gushchin Cc: Ryan Mallon Cc: Tejun Heo Cc: Vlastimil Babka Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 0a64bc2c0474640a850febd5ac3abb8d45b32821 Author: Al Viro Date: Tue Feb 11 22:25:22 2014 -0500 xfs_file_buffered_aio_write(): switch to generic_perform_write() Signed-off-by: Al Viro commit 5cb6c6c7eb1ed24744b41fad47d9a25b72207098 Author: Al Viro Date: Tue Feb 11 20:58:20 2014 -0500 generic_file_direct_write(): get rid of ppos argument always equal to &iocb->ki_pos. Signed-off-by: Al Viro commit fcacafd269adc88f41b68cb77a3f957a66563428 Author: Al Viro Date: Sun Feb 9 13:37:49 2014 -0500 kill the 5th argument of generic_file_buffered_write() same story - it's &iocb->ki_pos in all cases Signed-off-by: Al Viro commit 5d826c847b34de6415b4f1becd88a57ff619af50 Author: Al Viro Date: Fri Mar 14 13:42:45 2014 -0400 new helper: readlink_copy() Signed-off-by: Al Viro commit 02b9984d640873b7b3809e63f81a0d7e13496886 Author: Theodore Ts'o Date: Thu Mar 13 10:14:33 2014 -0400 fs: push sync_filesystem() down to the file system's remount_fs() Previously, the no-op "mount -o mount /dev/xxx" operation when the file system is already mounted read-write causes an implied, unconditional syncfs(). This seems pretty stupid, and it's certainly documented or guaraunteed to do this, nor is it particularly useful, except in the case where the file system was mounted rw and is getting remounted read-only. However, it's possible that there might be some file systems that are actually depending on this behavior. In most file systems, it's probably fine to only call sync_filesystem() when transitioning from read-write to read-only, and there are some file systems where this is not needed at all (for example, for a pseudo-filesystem or something like romfs). Signed-off-by: "Theodore Ts'o" Cc: linux-fsdevel@vger.kernel.org Cc: Christoph Hellwig Cc: Artem Bityutskiy Cc: Adrian Hunter Cc: Evgeniy Dushistov Cc: Jan Kara Cc: OGAWA Hirofumi Cc: Anders Larsen Cc: Phillip Lougher Cc: Kees Cook Cc: Mikulas Patocka Cc: Petr Vandrovec Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Cc: codalist@coda.cs.cmu.edu Cc: linux-ext4@vger.kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net Cc: fuse-devel@lists.sourceforge.net Cc: cluster-devel@redhat.com Cc: linux-mtd@lists.infradead.org Cc: jfs-discussion@lists.sourceforge.net Cc: linux-nfs@vger.kernel.org Cc: linux-nilfs@vger.kernel.org Cc: linux-ntfs-dev@lists.sourceforge.net Cc: ocfs2-devel@oss.oracle.com Cc: reiserfs-devel@vger.kernel.org commit 8d7531825c0dc24f3f300c07fb1a2a3a00b9e89c Merge: bb7d43b14 ff57cd5 Author: Linus Torvalds Date: Thu Feb 27 10:37:22 2014 -0800 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs Pull filesystem fixes from Jan Kara: "Notification, writeback, udf, quota fixes The notification patches are (with one exception) a fallout of my fsnotify rework which went into -rc1 (I've extented LTP to cover these cornercases to avoid similar breakage in future). The UDF patch is a nasty data corruption Al has recently reported, the revert of the writeback patch is due to possibility of violating sync(2) guarantees, and a quota bug can lead to corruption of quota files in ocfs2" * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: fsnotify: Allocate overflow events with proper type fanotify: Handle overflow in case of permission events fsnotify: Fix detection whether overflow event is queued Revert "writeback: do not sync data dirtied after sync start" quota: Fix race between dqput() and dquot_scan_active() udf: Fix data corruption on file type conversion inotify: Fix reporting of cookies for inotify events commit 645ceee885facc6de60051be150ca1b06bdb9e51 Merge: 1052710 5ef11eb Author: Linus Torvalds Date: Sat Feb 22 08:26:01 2014 -0800 Merge branch 'xfs-fixes-for-3.14-rc4' of git://oss.sgi.com/xfs/xfs Pull xfs fixes from Dave Chinner: "This is the first pull request I've had to do for you, so I'm still sorting things out. The reason I'm sending this and not Ben should be obvious from the first commit below - SGI has stepped down from the XFS maintainership role. As such, I'd like to take another opportunity to thank them for their many years of effort maintaining XFS and supporting the XFS community that they developed from the ground up. So I haven't had time to work things like signed tags into my workflows yet, so this is just a repo branch I'm asking you to pull from. And yes, I named the branch -rc4 because I wanted the fixes in rc4, not because the branch was for merging into -rc3. Probably not right, either. Anyway, I should have everything sorted out by the time the next merge window comes around. If there's anything that you don't like in the pull req, feel free to flame me unmercifully. The changes are fixes for recent regressions and important thinkos in verification code: - a log vector buffer alignment issue on ia32 - timestamps on truncate got mangled - primary superblock CRC validation fixes and error message sanitisation" * 'xfs-fixes-for-3.14-rc4' of git://oss.sgi.com/xfs/xfs: xfs: limit superblock corruption errors to actual corruption xfs: skip verification on initial "guess" superblock read MAINTAINERS: SGI no longer maintaining XFS xfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb xfs: ensure correct log item buffer alignment xfs: ensure correct timestamp updates from truncate commit 0dc83bd30b0bf5410c0933cfbbf8853248eff0a9 Author: Jan Kara Date: Fri Feb 21 11:19:04 2014 +0100 Revert "writeback: do not sync data dirtied after sync start" This reverts commit c4a391b53a72d2df4ee97f96f78c1d5971b47489. Dave Chinner has reported the commit may cause some inodes to be left out from sync(2). This is because we can call redirty_tail() for some inode (which sets i_dirtied_when to current time) after sync(2) has started or similarly requeue_inode() can set i_dirtied_when to current time if writeback had to skip some pages. The real problem is in the functions clobbering i_dirtied_when but fixing that isn't trivial so revert is a safer choice for now. CC: stable@vger.kernel.org # >= 3.13 Signed-off-by: Jan Kara commit d311d79de305f1ada47cadd672e6ed1b28a949eb Author: Al Viro Date: Sun Feb 9 15:18:09 2014 -0500 fix O_SYNC|O_APPEND syncing the wrong range on write() It actually goes back to 2004 ([PATCH] Concurrent O_SYNC write support) when sync_page_range() had been introduced; generic_file_write{,v}() correctly synced pos_after_write - written .. pos_after_write - 1 but generic_file_aio_write() synced pos_before_write .. pos_before_write + written - 1 instead. Which is not the same thing with O_APPEND, obviously. A couple of years later correct variant had been killed off when everything switched to use of generic_file_aio_write(). All users of generic_file_aio_write() are affected, and the same bug has been copied into other instances of ->aio_write(). The fix is trivial; the only subtle point is that generic_write_sync() ought to be inlined to avoid calculations useless for the majority of calls. Signed-off-by: Al Viro ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_file.c | 16 +++++++++------- fs/xfs/xfs_ioctl.c | 28 +--------------------------- fs/xfs/xfs_super.c | 5 +++-- 3 files changed, 13 insertions(+), 36 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Mon Apr 14 03:13:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9C2157F4E for ; Mon, 14 Apr 2014 03:13:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D47DAC002 for ; Mon, 14 Apr 2014 01:13:12 -0700 (PDT) X-ASG-Debug-ID: 1397463190-04bdf07dca1b4970001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id MvfsaoAcRSriaTU3 for ; Mon, 14 Apr 2014 01:13:11 -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: AqlSAGmXS1N5LEcvPGdsb2JhbABagwaDUIULtXOFXYEfFwMBAQEBODWCJQEBAQQ6HCMQCAMOBwMJJQ8FJQMHGhOHe8p7FxaOWAeDJIEUBJhgimWLIis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2014 17:43:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZc0p-0008Ee-RZ; Mon, 14 Apr 2014 18:13:07 +1000 Date: Mon, 14 Apr 2014 18:13:07 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure Message-ID: <20140414081307.GA31578@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure References: <1397106053-7489-1-git-send-email-david@fromorbit.com> <1397106053-7489-4-git-send-email-david@fromorbit.com> <20140410103555.GF17641@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410103555.GF17641@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1397463190 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4889 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 03:35:55AM -0700, Christoph Hellwig wrote: > On Thu, Apr 10, 2014 at 03:00:50PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Similar to the write_begin problem, xfs-vm_write_end will truncate > > back to the old EOF, potentially removing page cache from over the > > top of delalloc blocks with valid data in them. Fix this by > > truncating back to just the start of the failed write. > > > > Signed-off-by: Dave Chinner > > Looks good, > > Reviewed-by: Christoph Hellwig > > Any reason you used max_t in the previous one, and opencode it here? No, just made the changes at different times. I'll fix them both to use max_t.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 14 03:21:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 184167F4E for ; Mon, 14 Apr 2014 03:21:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C888AC002 for ; Mon, 14 Apr 2014 01:21:08 -0700 (PDT) X-ASG-Debug-ID: 1397463665-04bdf07dcc1b5000001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id a1L4UQLgfEbgaRd1 for ; Mon, 14 Apr 2014 01:21:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Akk/AIaZS1N5LEcvPGdsb2JhbABSCIMGO4MVuSaBWIVdgR8XAwEBAQE4NYIlAQEBBAEBASQLASMYCxAIAQIVAwklDwUTEgMHLYd7Dowevm0WjFuBJ1YHgySBFASYYJYHKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2014 17:51:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZc8V-0008GF-Nu; Mon, 14 Apr 2014 18:21:03 +1000 Date: Mon, 14 Apr 2014 18:21:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: bob.mastors@solidfire.com, snitzer@redhat.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-ID: <20140414082103.GB31578@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1397104955-7247-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: 1397463665 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ping? On Thu, Apr 10, 2014 at 02:42:35PM +1000, Dave Chinner wrote: > From: Dave Chinner > > And interesting situation can occur if a log IO error occurs during > the unmount of a filesystem. The cases reported have the same > signature - the update of the superblock counters fails due to a log > write IO error: > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > XFS (dm-16): xfs_log_force: error 5 returned. > XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > It can be seen that the last line of output contains a corrupt > device name - this is because the log and xfs_mount structures have > already been freed by the time this message is printed. A kernel > oops closely follows. > > The issue is that the shutdown is occurring in a separate IO > completion thread to the unmount. Once the shutdown processing has > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > log shutdown code wakes anyone waiting on a log force so they can > process the shutdown error. This wakes up the unmount code that > is doing a synchronous transaction to update the superblock > counters. > > The unmount path now sees all the iclogs are marked with > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > it does, there will not be a wakeup trigger for it and we will hang > the unmount if we do. Hence the unmount runs through all the > remaining code and frees all the filesystem structures while the > xlog_iodone() is still processing the shutdown. When the log > shutdown processing completes, xfs_do_force_shutdown() emits the > "Please umount the filesystem and rectify the problem(s)" message, > and xlog_iodone() then aborts all the objects attached to the iclog. > An iclog that has already been freed.... > > The real issue here is that there is no serialisation point between > the log IO and the unmount. We have serialisations points for log > writes, log forces, reservations, etc, but we don't actually have > any code that wakes for log IO to fully complete. We do that for all > other types of object, so why not iclogbufs? > > Well, it turns out that we can easily do this. We've got xfs_buf > handles, and that's what everyone else uses for IO serialisation. > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > release the lock in xlog_iodone() when we are finished with the > buffer. That way before we tear down the iclog, we can lock and > unlock the buffer to ensure IO completion has finished completely > before we tear it down. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 44 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 8497a00..08624dc 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1181,11 +1181,14 @@ xlog_iodone(xfs_buf_t *bp) > /* log I/O is always issued ASYNC */ > ASSERT(XFS_BUF_ISASYNC(bp)); > xlog_state_done_syncing(iclog, aborted); > + > /* > - * do not reference the buffer (bp) here as we could race > - * with it being freed after writing the unmount record to the > - * log. > + * drop the buffer lock now that we are done. Nothing references > + * the buffer after this, so an unmount waiting on this lock can now > + * tear it down safely. As such, it is unsafe to reference the buffer > + * (bp) after the unlock as we could race with it being freed. > */ > + xfs_buf_unlock(bp); > } > > /* > @@ -1368,8 +1371,16 @@ xlog_alloc_log( > bp = xfs_buf_alloc(mp->m_logdev_targp, 0, BTOBB(log->l_iclog_size), 0); > if (!bp) > goto out_free_log; > - bp->b_iodone = xlog_iodone; > + > + /* > + * The iclogbuf buffer locks are held over IO but we are not going to do > + * IO yet. Hence unlock the buffer so that the log IO path can grab it > + * when appropriately. > + */ > ASSERT(xfs_buf_islocked(bp)); > + xfs_buf_unlock(bp); > + > + bp->b_iodone = xlog_iodone; > log->l_xbuf = bp; > > spin_lock_init(&log->l_icloglock); > @@ -1398,6 +1409,9 @@ xlog_alloc_log( > if (!bp) > goto out_free_iclog; > > + ASSERT(xfs_buf_islocked(bp)); > + xfs_buf_unlock(bp); > + > bp->b_iodone = xlog_iodone; > iclog->ic_bp = bp; > iclog->ic_data = bp->b_addr; > @@ -1422,7 +1436,6 @@ xlog_alloc_log( > iclog->ic_callback_tail = &(iclog->ic_callback); > iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize; > > - ASSERT(xfs_buf_islocked(iclog->ic_bp)); > init_waitqueue_head(&iclog->ic_force_wait); > init_waitqueue_head(&iclog->ic_write_wait); > > @@ -1631,6 +1644,12 @@ xlog_cksum( > * we transition the iclogs to IOERROR state *after* flushing all existing > * iclogs to disk. This is because we don't want anymore new transactions to be > * started or completed afterwards. > + * > + * We lock the iclogbufs here so that we can serialise against IO completion > + * during unmount. We might be processing a shutdown triggered during unmount, > + * and that can occur asynchronously to the unmount thread, and hence we need to > + * ensure that completes before tearing down the iclogbufs. Hence we need to > + * hold the buffer lock across the log IO to acheive that. > */ > STATIC int > xlog_bdstrat( > @@ -1638,6 +1657,7 @@ xlog_bdstrat( > { > struct xlog_in_core *iclog = bp->b_fspriv; > > + xfs_buf_lock(bp); > if (iclog->ic_state & XLOG_STATE_IOERROR) { > xfs_buf_ioerror(bp, EIO); > xfs_buf_stale(bp); > @@ -1645,7 +1665,8 @@ xlog_bdstrat( > /* > * It would seem logical to return EIO here, but we rely on > * the log state machine to propagate I/O errors instead of > - * doing it here. > + * doing it here. Similarly, IO completion will unlock the > + * buffer, so we don't do it here. > */ > return 0; > } > @@ -1847,14 +1868,28 @@ xlog_dealloc_log( > xlog_cil_destroy(log); > > /* > - * always need to ensure that the extra buffer does not point to memory > - * owned by another log buffer before we free it. > + * Cycle all the iclogbuf locks to make sure all log IO completion > + * is done before we tear down these buffers. > */ > + iclog = log->l_iclog; > + for (i = 0; i < log->l_iclog_bufs; i++) { > + xfs_buf_lock(iclog->ic_bp); > + xfs_buf_unlock(iclog->ic_bp); > + iclog = iclog->ic_next; > + } > + > + /* > + * Always need to ensure that the extra buffer does not point to memory > + * owned by another log buffer before we free it. Also, cycle the lock > + * first to ensure we've completed IO on it. > + */ > + xfs_buf_lock(log->l_xbuf); > + xfs_buf_unlock(log->l_xbuf); > xfs_buf_set_empty(log->l_xbuf, BTOBB(log->l_iclog_size)); > xfs_buf_free(log->l_xbuf); > > iclog = log->l_iclog; > - for (i=0; il_iclog_bufs; i++) { > + for (i = 0; i < log->l_iclog_bufs; i++) { > xfs_buf_free(iclog->ic_bp); > next_iclog = iclog->ic_next; > kmem_free(iclog); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Dave Chinner david@fromorbit.com From www-data@pro2112.server4you.de Mon Apr 14 03:26:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 888917F4E for ; Mon, 14 Apr 2014 03:26:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11D3FAC004 for ; Mon, 14 Apr 2014 01:26:35 -0700 (PDT) X-ASG-Debug-ID: 1397463991-04cb6c77b61aaaf0001-NocioJ Received: from pro2112.server4you.de (pro2112.server4you.de [188.138.109.182]) by cuda.sgi.com with ESMTP id 2UHyI6WRtFhMbIy1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 14 Apr 2014 01:26:32 -0700 (PDT) X-Barracuda-Envelope-From: www-data@pro2112.server4you.de X-Barracuda-Apparent-Source-IP: 188.138.109.182 Received: by pro2112.server4you.de (Postfix, from userid 33) id 9CFAD42C3D57; Mon, 14 Apr 2014 10:26:31 +0200 (CEST) To: , , , , , , , , , , , , , , , , , , , Subject: =?windows-1251?B?y+Xy4P754P8g9OX/OiDo4/Dz+OrgLCDh6+Dj?= =?windows-1251?B?7uTg8P8g6u7y7vDu6SDk5fLoIOLl8P/yIOIg?= =?windows-1251?B?4u7r+OXh8fLi7iE=?= X-PHP-Originating-Script: 10011:xmailer.php X-ASG-Orig-Subj: =?windows-1251?B?y+Xy4P754P8g9OX/OiDo4/Dz+OrgLCDh6+Dj?= =?windows-1251?B?7uTg8P8g6u7y7vDu6SDk5fLoIOLl8P/yIOIg?= =?windows-1251?B?4u7r+OXh8fLi7iE=?= From: =?windows-1251?B?wuDw9O7r7uzl6Q==?= Reply-To: =?windows-1251?B?wuDw9O7r7uzl6Q==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_246D_01CF57DC.C2912EF0" Message-Id: <20140414082631.9CFAD42C3D57@pro2112.server4you.de> Date: Mon, 14 Apr 2014 10:26:31 +0200 (CEST) X-Barracuda-Connect: pro2112.server4you.de[188.138.109.182] X-Barracuda-Start-Time: 1397463992 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.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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA584 Custom Rule SA584 ------=_NextPart_000_246D_01CF57DC.C2912EF0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CB=E5=F2=E0=FE=F9=E0=FF =F4=E5=FF: =F1=E8=EC=EF=E0=F2=E8=F7=ED=E0=FF =F4= =E5=FF, =EA=EE=F2=EE=F0=E0=FF =F1=F2=E0=ED=E5=F2 =EF=EE=E4=F0=F3=E6=EA=EE= =E9 =E4=EB=FF =E2=E0=F8=E5=E9 =E4=EE=F7=E5=ED=FC=EA=E8! [=EF=E5=F0=E5=E9=F2= =E8 =E2 =E8=ED=F2=E5=F0=ED=E5=F2-=EC=E0=E3=E0=E7=E8=ED]=20 ------=_NextPart_000_246D_01CF57DC.C2912EF0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CB=E5=F2=E0=FE=F9=E0=FF =F4=E5=FF: =F1=E8=EC=EF=E0=F2= =E8=F7=ED=E0=FF =F4=E5=FF, =EA=EE=F2=EE=F0=E0=FF =F1=F2=E0=ED=E5=F2 =EF=EE= =E4=F0=F3=E6=EA=EE=E9 =E4=EB=FF =E2=E0=F8=E5=E9 =E4=EE=F7=E5=ED=FC=EA=E8!= [=EF=E5=F0=E5=E9=F2=E8 =E2= =E8=ED=F2=E5=F0=ED=E5=F2-=EC=E0=E3=E0=E7=E8=ED]=20
------=_NextPart_000_246D_01CF57DC.C2912EF0-- From david@fromorbit.com Mon Apr 14 04:46:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4EE887F4E for ; Mon, 14 Apr 2014 04:46:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3DDE830404E for ; Mon, 14 Apr 2014 02:46:39 -0700 (PDT) X-ASG-Debug-ID: 1397468797-04cbb00dc41bac90001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Tc2CGm6oD5jx3uxK for ; Mon, 14 Apr 2014 02:46:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0/AK6tS1N5LEcvPGdsb2JhbABagwY7gxWnK5NWhV2BIBcDAQEBATg1giUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOHew7KfhcWjFuBfQeDJIEUBJhglgcr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Apr 2014 19:16:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZdTE-00006v-GM; Mon, 14 Apr 2014 19:46:32 +1000 Date: Mon, 14 Apr 2014 19:46:32 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/11] xfs: introduce the free inode btree Message-ID: <20140414094632.GC31578@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 00/11] xfs: introduce the free inode btree References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146116-42546-1-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: 1397468797 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4891 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 10, 2014 at 12:08:25PM -0400, Brian Foster wrote: > Hi all, > > This is a minor rebase of the finobt series on the latest for-next > branch. The previous version (v4) is here: > > http://oss.sgi.com/archives/xfs/2014-02/msg00763.html > > The most recent series with review feedback is v3: > > http://oss.sgi.com/archives/xfs/2014-02/msg00121.html > > Brian I've just had a look at this series, and I haven't found anything to complain about apart from a couple of stray whitespaces that I fixed. I'm going to run it through some finobt=0 test runs until i get a chance to look at the userspace patches. If I don't notice anything in the next couple of days, I'll merge the topic branch into the main tree.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From miklos@szeredi.hu Mon Apr 14 05:49:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3F4067F4E for ; Mon, 14 Apr 2014 05:49:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28CAA304043 for ; Mon, 14 Apr 2014 03:49:57 -0700 (PDT) X-ASG-Debug-ID: 1397472594-04cbb00dc41be270001-NocioJ Received: from mail-ee0-f53.google.com (mail-ee0-f53.google.com [74.125.83.53]) by cuda.sgi.com with ESMTP id bjgxOqJ1CfabMNQp (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 14 Apr 2014 03:49:55 -0700 (PDT) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 74.125.83.53 Received: by mail-ee0-f53.google.com with SMTP id b57so6410434eek.40 for ; Mon, 14 Apr 2014 03:49:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=date:from:to:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=/NNMo4NbB7JhwwV+O1LhmXNQ1P5OVTG/FCU/r8vxOUo=; b=JLo/WDW7NNUbvyU9aoAqX+JDa8feDuxoKXASIEi0RtzRegYc5DtJ3cA4Yez/QKjeBg gZL6tjTqrVZSodHcO45ilirpu8hlECfqaM+34iu6UpIqLTS1It7/vs69r3deOUliokml UIh7hPTUNgNyYblEFlYbH9mtj6mdH5T6XBSBI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-type:content-disposition:user-agent; bh=/NNMo4NbB7JhwwV+O1LhmXNQ1P5OVTG/FCU/r8vxOUo=; b=ZeyYvtexY6SU79FgAqJUy3CslG3Ngvlitm03zj+k5zY1XyUwvqchpwbpkuMnih9m9K RNe83pcsD0T7QfXJz3hP03xhD+QLQMTNrxlPBWG9EbbFwnIJIK+SwXoO/m9QXAg2wPQx 4N0WiePaNRKSniDHnC371eJ4/A1po12FSnQJT68DW9i8oGPjeyBBl8w9KcFWUJh+NsWc Pl/hMIgjKfTydn0jCIQ9q1wRXmZBErYiaYZ8DGD7V6khz1EZ+tORA0Y61ozfgu+MZO76 HTq0XcainFjQaGP93itKLHAp7Tf4uCw8XnvP9wEDuyaeX/h1saMAnc9b8zL89T/PXYhs k0/A== X-Gm-Message-State: ALoCoQmopGjzrRoU8D32tUN0PnMv+HEJZ+V8+KIVWpdQ8fd85gQI8mB9eQOK3eKMe/udbb8lTjif X-Received: by 10.15.54.137 with SMTP id t9mr50996020eew.39.1397472594348; Mon, 14 Apr 2014 03:49:54 -0700 (PDT) Received: from tucsk.piliscsaba.szeredi.hu (2E8B5005.mobile.pool.telekom.hu. [46.139.80.5]) by mx.google.com with ESMTPSA id u46sm40109031eel.1.2014.04.14.03.49.52 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Apr 2014 03:49:53 -0700 (PDT) Date: Mon, 14 Apr 2014 12:49:53 +0200 From: Miklos Szeredi To: xfs@oss.sgi.com Subject: [xfstests PATCH] renameat2 syscall: turn EEXIST into ENOTEMPTY Message-ID: <20140414104953.GE10187@tucsk.piliscsaba.szeredi.hu> X-ASG-Orig-Subj: [xfstests PATCH] renameat2 syscall: turn EEXIST into ENOTEMPTY MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-ee0-f53.google.com[74.125.83.53] X-Barracuda-Start-Time: 1397472595 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Miklos Szeredi XFS is returning EEXIST rather than ENOTEMPTY for several of these rename tests. The rename man page says this about the errors: ENOTEMPTY or EEXIST newpath is a nonempty directory, that is, contains entries other than "." and "..". Which implies that both errors are valid and so the test should pass in either case. Signed-off-by: Miklos Szeredi --- src/renameat2.c | 9 +++++++++ 1 file changed, 9 insertions(+) --- a/src/renameat2.c +++ b/src/renameat2.c @@ -88,6 +88,15 @@ int main(int argc, char *argv[]) else return 0; } + /* + * Turn EEXIST into ENOTEMPTY. E.g. XFS uses EEXIST, and that + * is also accepted by the standards. + * + * This applies only to plain rename (flags == 0). + */ + if (!flags && errno == EEXIST) + errno = ENOTEMPTY; + perror(""); return 1; } From sandeen@sandeen.net Mon Apr 14 09:45:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6A1167F4E for ; Mon, 14 Apr 2014 09:45:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4B15AC003 for ; Mon, 14 Apr 2014 07:45:07 -0700 (PDT) X-ASG-Debug-ID: 1397486705-04cbb00dc61ce5e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id aCr8FpxzYEyDdafk for ; Mon, 14 Apr 2014 07:45:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 56C1D63C5FD4 for ; Mon, 14 Apr 2014 09:45:05 -0500 (CDT) Message-ID: <534BF472.8030908@sandeen.net> Date: Mon, 14 Apr 2014 09:45:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/2] xfsprogs: 2 quick coverity fixes X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH 0/2] xfsprogs: 2 quick coverity fixes 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: 1397486705 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4898 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The last round introduced 2 new warnings, trivial patches to fix follow. From sandeen@sandeen.net Mon Apr 14 09:46:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AADDF7F4E for ; Mon, 14 Apr 2014 09:46:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 404BCAC003 for ; Mon, 14 Apr 2014 07:46:36 -0700 (PDT) X-ASG-Debug-ID: 1397486796-04cb6c77b61c1fb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id gim97ALNjxZBlHVZ for ; Mon, 14 Apr 2014 07:46:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CDE9363C5FC4; Mon, 14 Apr 2014 09:46:35 -0500 (CDT) Message-ID: <534BF4CD.1080702@sandeen.net> Date: Mon, 14 Apr 2014 09:46:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss , Mark Tinguely Subject: [PATCH 1/2] xfs_logprint: Fix error handling in xlog_print_trans_efi References: <534BF472.8030908@sandeen.net> X-ASG-Orig-Subj: [PATCH 1/2] xfs_logprint: Fix error handling in xlog_print_trans_efi In-Reply-To: <534BF472.8030908@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397486796 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4898 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- A recent change to xlog_print_trans_efi() led to a leaked "src_f" on this error return. Signed-off-by: Eric Sandeen --- diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 928f60a..d482cf3 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -482,7 +482,7 @@ xlog_print_trans_efi( uint src_len, int continued) { - xfs_efi_log_format_t *src_f, *f; + xfs_efi_log_format_t *src_f, *f = NULL; uint dst_len; xfs_extent_t *ex; int i; @@ -505,7 +505,8 @@ xlog_print_trans_efi( if (continued && src_len < core_size) { printf(_("EFI: Not enough data to decode further\n")); - return 1; + error = 1; + goto error; } if ((f = (xfs_efi_log_format_t *)malloc(dst_len)) == NULL) { From sandeen@sandeen.net Mon Apr 14 09:48:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 81E787F4E for ; Mon, 14 Apr 2014 09:48:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5E7F38F8049 for ; Mon, 14 Apr 2014 07:48:30 -0700 (PDT) X-ASG-Debug-ID: 1397486907-04bdf07dca1ccf80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id U1b5XZwKEtn64IGD for ; Mon, 14 Apr 2014 07:48:27 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6A4D063C5FC4 for ; Mon, 14 Apr 2014 09:48:27 -0500 (CDT) Message-ID: <534BF53C.4000706@sandeen.net> Date: Mon, 14 Apr 2014 09:48:28 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: Re: [PATCH 2/2] mkfs.xfs: prevent close(-1) on protofile error path References: <534BF472.8030908@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 2/2] mkfs.xfs: prevent close(-1) on protofile error path In-Reply-To: <534BF472.8030908@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397486907 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4898 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- My previous cleanups introduced this; in the case where fd=open() failed, the out_fail: path would try to close(-1). Signed-off-by: Eric Sandeen --- diff --git a/mkfs/proto.c b/mkfs/proto.c index 308325b..5a47e27 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -84,7 +84,8 @@ setup_proto( return buf; out_fail: - close(fd); + if (fd >= 0) + close(fd); free(buf); exit(1); } From tinguely@sgi.com Mon Apr 14 09:54:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 4A56129DF7 for ; Mon, 14 Apr 2014 09:54:26 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1463E304067; Mon, 14 Apr 2014 07:54:22 -0700 (PDT) Message-ID: <534BF6A0.2070202@sgi.com> Date: Mon, 14 Apr 2014 09:54:24 -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 1/2] xfs_logprint: Fix error handling in xlog_print_trans_efi References: <534BF472.8030908@sandeen.net> <534BF4CD.1080702@sandeen.net> In-Reply-To: <534BF4CD.1080702@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/14/14 09:46, Eric Sandeen wrote: > A recent change to xlog_print_trans_efi() led to a leaked > "src_f" on this error return. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/logprint/log_misc.c b/logprint/log_misc.c > index 928f60a..d482cf3 100644 > --- a/logprint/log_misc.c > +++ b/logprint/log_misc.c > @@ -482,7 +482,7 @@ xlog_print_trans_efi( > uint src_len, > int continued) > { > - xfs_efi_log_format_t *src_f, *f; > + xfs_efi_log_format_t *src_f, *f = NULL; > uint dst_len; > xfs_extent_t *ex; > int i; > @@ -505,7 +505,8 @@ xlog_print_trans_efi( > > if (continued&& src_len< core_size) { > printf(_("EFI: Not enough data to decode further\n")); > - return 1; > + error = 1; > + goto error; > } > > if ((f = (xfs_efi_log_format_t *)malloc(dst_len)) == NULL) { > Looks good. Thank-you Eric and Coverity. Reviewed-by: Mark Tinguely From tinguely@sgi.com Mon Apr 14 10:02:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7F0DD29DF7 for ; Mon, 14 Apr 2014 10:02:00 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B8EA8F8040; Mon, 14 Apr 2014 08:01:57 -0700 (PDT) Message-ID: <534BF866.4020007@sgi.com> Date: Mon, 14 Apr 2014 10:01: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: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH 2/2] mkfs.xfs: prevent close(-1) on protofile error path References: <534BF472.8030908@sandeen.net> <534BF53C.4000706@sandeen.net> In-Reply-To: <534BF53C.4000706@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/14/14 09:48, Eric Sandeen wrote: > My previous cleanups introduced this; in the case where > fd=open() failed, the out_fail: path would try to close(-1). > > Signed-off-by: Eric Sandeen > --- > > diff --git a/mkfs/proto.c b/mkfs/proto.c > index 308325b..5a47e27 100644 > --- a/mkfs/proto.c > +++ b/mkfs/proto.c > @@ -84,7 +84,8 @@ setup_proto( > return buf; > > out_fail: > - close(fd); > + if (fd>= 0) > + close(fd); > free(buf); > exit(1); > } > I would have bypassed the close with a new open error goto, but this does the trick as well. Reviewed-by: Mark Tinguely From bfoster@redhat.com Mon Apr 14 11:43:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E23D17F37 for ; Mon, 14 Apr 2014 11:43:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA1BC8F8035 for ; Mon, 14 Apr 2014 09:43:16 -0700 (PDT) X-ASG-Debug-ID: 1397493795-04cb6c77b51ca100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WKT4iwLxgs3aiaVC for ; Mon, 14 Apr 2014 09:43:16 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3EGhFcS004366 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 14 Apr 2014 12:43:15 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3EGhFmt007950 for ; Mon, 14 Apr 2014 12:43:15 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6A47112017D; Mon, 14 Apr 2014 12:43:14 -0400 (EDT) Date: Mon, 14 Apr 2014 12:43:14 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: xfs readdir hang on for-next (3.15.0-rc1) Message-ID: <20140414164313.GA62307@bfoster.bfoster> X-ASG-Orig-Subj: xfs readdir hang on for-next (3.15.0-rc1) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397493795 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is a heads up that I'm seeing a blatant readdir hang on the current for-next with selinux enabled. To reproduce, I format a clean fs, mount and attempt an ls. The problem does not occur with selinux disabled, if I back out the following commit: 40194ecc6d78 xfs: reinstate the ilock in xfs_readdir ... or if I remove the locking around xfs_attr_get(), so I suspect this is another instance of a recursive deadlock. I'm getting no output whatsoever in order to confirm this and it also leads to a complete system lockup. It's also interesting that this hasn't been observed until now, given the above commit was introduced in 3.14. So the above commit doesn't appear to be the most recent change that triggers this. I reproduced on the latest linus tree and do not reproduce on 3.14, so I'm trying to do a bisect to find out what else might have changed to trigger this. Brian From a.m.k.yassiin@g.pl Mon Apr 14 13:34:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=URG_BIZ 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 DB6417F37 for ; Mon, 14 Apr 2014 13:34:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C4ACA8F8037 for ; Mon, 14 Apr 2014 11:34:14 -0700 (PDT) X-ASG-Debug-ID: 1397500452-04cb6c2439030b0001-NocioJ Received: from mail.vps.com ([138.91.226.247]) by cuda.sgi.com with ESMTP id fZHDM1brDvhqtjwv for ; Mon, 14 Apr 2014 11:34:13 -0700 (PDT) X-Barracuda-Envelope-From: a.m.k.yassiin@g.pl X-Barracuda-Apparent-Source-IP: 138.91.226.247 Received: from [138.91.226.247] (localhost [IPv6:::1]) by mail.vps.com (Postfix) with ESMTP id 9A4FF40DD1; Mon, 14 Apr 2014 14:09:38 -0400 (EDT) Received: from 94.202.194.54 (SquirrelMail authenticated user admin) by 138.91.226.247 with HTTP; Mon, 14 Apr 2014 14:09:39 -0400 Message-ID: <2254661b9b5eb984e68f7cc9d8b1e958.squirrel@138.91.226.247> Date: Mon, 14 Apr 2014 14:09:39 -0400 Subject: Interesting deal From: "A.M.K.Yassin" X-ASG-Orig-Subj: Interesting deal Reply-To: a.m.k.yasin@g.pl User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20140414140939_15623" X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[138.91.226.247] X-Barracuda-Start-Time: 1397500452 X-Barracuda-URL: http://192.48.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.27 X-Barracuda-Spam-Status: No, SCORE=2.27 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC2_MV0291, RDNS_NONE, URG_BIZ X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4905 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.67 URG_BIZ BODY: Contains urgent matter 1.50 BSF_SC2_MV0291 Custom rule MV0291 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS ------=_20140414140939_15623 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Greeting, My name is Mr. A. M. Yassin, I live and work in Abu Dhabi UAE. I have an urgent business which I believe will interest you. Find the enclose for details. For any reason you cannot open that attachment, please let me know so that I can resend it in the body of the mail, thank you. I wait for your response, Thank you. Regards A. M. Yassin ------=_20140414140939_15623 Content-Type: application/pdf; name="For your interest.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="For your interest.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlbi1VUykgPj4NCmVuZG9iag0KMiAwIG9iag0KPDwvVHlwZS9QYWdlcy9Db3VudCAxL0tpZHNb IDMgMCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL1Jl c291cmNlczw8L0ZvbnQ8PC9GMSA1IDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyA3IDAgUj4+L1Byb2NT ZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXSA+Pi9NZWRpYUJveFsgMCAwIDYxMiA3 OTJdIC9Db250ZW50cyA0IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1Mv RGV2aWNlUkdCPj4vVGFicy9TPj4NCmVuZG9iag0KNCAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVj b2RlL0xlbmd0aCAzNjQxPj4NCnN0cmVhbQ0KeJyNWm2P28YR/m7A/2E/tKgE6Gi+iKTYfum5ds5x 6iSIZRRB0g/UkToRR+3KJHVK/33nZXfJlbPHQ5BE0pHLmWdnnnlmlm+3r1+9+S4SUSy2+9evIhHC P5HI4yCM1yIPiyDaiO0RLrr7nIuH/vWrUDzgf+5ev/ptcdct00W9XNO/Q7O8SRZyeVMsHpZRuOiX /xXbj69fvYdHvN2Oa0fRJkg307V/WwjftXEU5C+7VJucFWmQvPTaTYSW8LXfL6MEbgDrS3DmKEr4 nC/eLnP6Lh/FT/h9v19mi+a+Rlc70Uhxu7zJFruzeHco4S+7ZiUOdbe8YUjwgi+yGfBq/F6JW0QM F9yJ90cALF50JTxiqPsAnhdttBlswqVbJgu8G35q5MNyQwt2NS7/gJd0Ve9zMQ3jIL1ycVCilHOY ZHmQmxvU6aTQhuEsaXPRlGjxv2UckiVHsoy/KkTOopMxksOhHMSlaVu8WewIEkJTNEf86VjLvgZA +E8S/7NvBjEgLkrs1HAQai/OhE2hoQGcb9LFE63lcWW9Tsn3qSs7E6YSLe/xCTUuRDDewxYctAtz +KRJUJhFe3WslSQPYNERHHXGpTqB66qzHDraWgaKHgKoAkTDgVDtxe7cc/KggX0vKGAoMGRf4iKY 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 Gk6MEvNqEEhYHNKo4wmHD2Pb5DtBWqNwntp9OTRMDrZRoKHJpPW+OqjnUw4KB90YUtdOr6qJo/F8 DrkoDmx7Y6ZWjmg7Umsi9RAaKkkJ308tCkMykg4NoLvAl4A2lufMkLrxS6SQJNLUAOdoBKijF9uf 4CsdbvER//t//YKb8H4biP9YD2E32xb6f6jsdO6HeTPjdlRsgul0i2rXUDZtr0/VzZzsSslrctIN L44bRrwoL+iciZHDCLPp6S/oMWTApnAsoqf0JyV7m67e6U0CqraInNt/5kNQOzOiHTJzoNP0yNgV ddStX3E1VfsjAPP354SqQRWEfD5hx+AYPAZj2SRjGvnPsZEITj4OiVJ6/WW64tzDc3yN4WWXprlN uw9YoJ7sm3tC8isGdv+rcixp06p/h/N8YI9dW/d9IG7l0Nw3p8mxpClzUTH2fBgSFCIPOia4z8Cd rr1z8CIO0sKxec69dRK8UANEcRFcH0X1ZBZOvPUrmCvfHiV0xjNdY+5xUfri7Qwju523wafgV8M3 +k1CH1wRdF7Fxrl9+qT/A232FKUNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBl L0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YxL0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9t YW4vRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDYgMCBSL0ZpcnN0Q2hh ciAzMi9MYXN0Q2hhciAxMjEvV2lkdGhzIDkgMCBSPj4NCmVuZG9iag0KNiAwIG9iag0KPDwvVHlw ZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9UaW1lcyMyME5ldyMyMFJvbWFuL0ZsYWdzIDMyL0l0 YWxpY0FuZ2xlIDAvQXNjZW50IDg5MS9EZXNjZW50IC0yMTYvQ2FwSGVpZ2h0IDY5My9BdmdXaWR0 aCA0MDEvTWF4V2lkdGggMjU2OC9Gb250V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9MZWFkaW5nIDQy L1N0ZW1WIDQwL0ZvbnRCQm94WyAtNTY4IC0yMTYgMjAwMCA2OTNdID4+DQplbmRvYmoNCjcgMCBv YmoNCjw8L1R5cGUvRXh0R1N0YXRlL0JNL05vcm1hbC9jYSAxPj4NCmVuZG9iag0KOCAwIG9iag0K PDwvQXV0aG9yKHVzZXIpIC9DcmVhdG9yKP7/AE0AaQBjAHIAbwBzAG8AZgB0AK4AIABXAG8AcgBk ACAAMgAwADEAMCkgL0NyZWF0aW9uRGF0ZShEOjIwMTQwNDA4MTIyNTE2KzA0JzAwJykgL01vZERh dGUoRDoyMDE0MDQwODEyMjUxNiswNCcwMCcpIC9Qcm9kdWNlcij+/wBNAGkAYwByAG8AcwBvAGYA dACuACAAVwBvAHIAZAAgADIAMAAxADApID4+DQplbmRvYmoNCjkgMCBvYmoNClsgMjUwIDAgMCAw IDUwMCA4MzMgMCAxODAgMzMzIDMzMyAwIDAgMjUwIDMzMyAyNTAgMjc4IDUwMCA1MDAgNTAwIDAg MCA1MDAgNTAwIDUwMCAwIDAgMjc4IDI3OCAwIDAgMCAwIDkyMSA3MjIgNjY3IDY2NyA3MjIgNjEx IDU1NiA3MjIgNzIyIDMzMyAzODkgNzIyIDYxMSA4ODkgNzIyIDcyMiA1NTYgMCA2NjcgNTU2IDYx MSA3MjIgMCA5NDQgMCA3MjIgMCAwIDAgMCAwIDAgMCA0NDQgNTAwIDQ0NCA1MDAgNDQ0IDMzMyA1 MDAgNTAwIDI3OCAwIDUwMCAyNzggNzc4IDUwMCA1MDAgNTAwIDUwMCAzMzMgMzg5IDI3OCA1MDAg NTAwIDcyMiA1MDAgNTAwXSANCmVuZG9iag0KMTAgMCBvYmoNCjw8L1R5cGUvWFJlZi9TaXplIDEw L1dbIDEgNCAyXSAvUm9vdCAxIDAgUi9JbmZvIDggMCBSL0lEWzxDMzdGMjk3M0IzMUQ5NTRFQjA4 RDE0NTQ0RTNGNEFENz48QzM3RjI5NzNCMzFEOTU0RUIwOEQxNDU0NEUzRjRBRDc+XSAvRmlsdGVy L0ZsYXRlRGVjb2RlL0xlbmd0aCA0OD4+DQpzdHJlYW0NCnicY2AAgv//GYGkIAMDiPKDUG1girEE TPH/AFMCS8CU4CQIdRxMCS1gYAAABSQHSg0KZW5kc3RyZWFtDQplbmRvYmoNCnhyZWYNCjAgMTEN CjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDAwMDAxNyAwMDAwMCBuDQowMDAwMDAwMDc4IDAwMDAw IG4NCjAwMDAwMDAxMzQgMDAwMDAgbg0KMDAwMDAwMDM3MiAwMDAwMCBuDQowMDAwMDA0MDg4IDAw MDAwIG4NCjAwMDAwMDQyNjAgMDAwMDAgbg0KMDAwMDAwNDQ5OCAwMDAwMCBuDQowMDAwMDA0NTUx IDAwMDAwIG4NCjAwMDAwMDQ3NjggMDAwMDAgbg0KMDAwMDAwNTEwMCAwMDAwMCBuDQp0cmFpbGVy DQo8PC9TaXplIDExL1Jvb3QgMSAwIFIvSW5mbyA4IDAgUi9JRFs8QzM3RjI5NzNCMzFEOTU0RUIw OEQxNDU0NEUzRjRBRDc+PEMzN0YyOTczQjMxRDk1NEVCMDhEMTQ1NDRFM0Y0QUQ3Pl0gPj4NCnN0 YXJ0eHJlZg0KNTM0Nw0KJSVFT0YNCnhyZWYNCjAgMA0KdHJhaWxlcg0KPDwvU2l6ZSAxMS9Sb290 IDEgMCBSL0luZm8gOCAwIFIvSURbPEMzN0YyOTczQjMxRDk1NEVCMDhEMTQ1NDRFM0Y0QUQ3PjxD MzdGMjk3M0IzMUQ5NTRFQjA4RDE0NTQ0RTNGNEFENz5dIC9QcmV2IDUzNDcvWFJlZlN0bSA1MTAw Pj4NCnN0YXJ0eHJlZg0KNTcyMg0KJSVFT0Y= ------=_20140414140939_15623-- From bfoster@redhat.com Mon Apr 14 14:09:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4606D7F37 for ; Mon, 14 Apr 2014 14:09:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E01330404E for ; Mon, 14 Apr 2014 12:09:06 -0700 (PDT) X-ASG-Debug-ID: 1397502545-04cbb06e9a05640001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tyRBhrvsOOslFHz1 for ; Mon, 14 Apr 2014 12:09:05 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3EJ8bxe021851 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 14 Apr 2014 15:08:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3EJ8b83004091; Mon, 14 Apr 2014 15:08:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 683AB12017D; Mon, 14 Apr 2014 15:08:36 -0400 (EDT) Date: Mon, 14 Apr 2014 15:08:36 -0400 From: Brian Foster To: xfs@oss.sgi.com Cc: Peter Zijlstra Subject: Re: xfs readdir hang on for-next (3.15.0-rc1) Message-ID: <20140414190834.GB62307@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs readdir hang on for-next (3.15.0-rc1) References: <20140414164313.GA62307@bfoster.bfoster> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="zx4FCpZtqtKETZ7O" Content-Disposition: inline In-Reply-To: <20140414164313.GA62307@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397502545 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --zx4FCpZtqtKETZ7O Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Apr 14, 2014 at 12:43:14PM -0400, Brian Foster wrote: > Hi all, > > This is a heads up that I'm seeing a blatant readdir hang on the current > for-next with selinux enabled. To reproduce, I format a clean fs, mount > and attempt an ls. > > The problem does not occur with selinux disabled, if I back out the > following commit: > > 40194ecc6d78 xfs: reinstate the ilock in xfs_readdir > > ... or if I remove the locking around xfs_attr_get(), so I suspect this > is another instance of a recursive deadlock. I'm getting no output > whatsoever in order to confirm this and it also leads to a complete > system lockup. It's also interesting that this hasn't been observed > until now, given the above commit was introduced in 3.14. So the above > commit doesn't appear to be the most recent change that triggers this. > > I reproduced on the latest linus tree and do not reproduce on 3.14, so > I'm trying to do a bisect to find out what else might have changed to > trigger this. > This bisected down to: commit 6f008e72cd111a119b5d8de8c5438d892aae99eb Author: Peter Zijlstra Date: Wed Mar 12 13:24:42 2014 +0100 locking/mutex: Fix debug checks ... ... which suggests something down in the mutex debug code. Indeed, the problem no longer occurs if I disable kernel debug in my .config. What is also interesting is that it didn't return when I reenable DEBUG_KERNEL and DEBUG_MUTEXES alone. It does return when I start to enable some of the other lock debugging options. FWIW, I also cleared out my tree and rebuilt from scratch just to be sure that I didn't have anything stale/broken lying around. Peter, Any insight on this? I reproduce on a 4xcpu x86-64 vm, 4GB RAM and a 20GB partition on a virtio disk: mkfs.xfs -f /dev/vdb1 mount /dev/vdb1 /mnt ls /mnt/ Note again that SELinux being enabled appears to be a factor. The kernel .config is attached. Thanks. Brian > Brian > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --zx4FCpZtqtKETZ7O Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=config # # Automatically generated file; DO NOT EDIT. # Linux/x86 3.15.0-rc1 Kernel Configuration # CONFIG_64BIT=y CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_MMU=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_X86_HT=y CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11" CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_FHANDLE=y CONFIG_USELIB=y CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_IRQ_DOMAIN=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # # CONFIG_TICK_CPU_ACCOUNTING is not set # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_PREEMPT_RCU is not set CONFIG_RCU_STALL_COMMON=y # CONFIG_RCU_USER_QS is not set CONFIG_RCU_FANOUT=64 CONFIG_RCU_FANOUT_LEAF=16 # CONFIG_RCU_FANOUT_EXACT is not set # CONFIG_RCU_FAST_NO_HZ is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_RCU_NOCB_CPU is not set CONFIG_IKCONFIG=m # CONFIG_IKCONFIG_PROC is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_ARCH_WANTS_PROT_NUMA_PROT_NONE=y CONFIG_ARCH_USES_NUMA_PROT_NONE=y CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y CONFIG_NUMA_BALANCING=y CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y CONFIG_RESOURCE_COUNTERS=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_SWAP_ENABLED=y CONFIG_MEMCG_KMEM=y CONFIG_CGROUP_HUGETLB=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y CONFIG_RT_GROUP_SCHED=y CONFIG_BLK_CGROUP=y CONFIG_DEBUG_BLK_CGROUP=y # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_SCHED_AUTOGROUP=y CONFIG_MM_OWNER=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_ANON_INODES=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_PCSPKR_PLATFORM=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_PCI_QUIRKS=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y CONFIG_SLUB_CPU_PARTIAL=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y # CONFIG_OPROFILE is not set CONFIG_HAVE_OPROFILE=y CONFIG_OPROFILE_NMI_TIMER=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y CONFIG_OPTPROBES=y CONFIG_KPROBES_ON_FTRACE=y CONFIG_UPROBES=y # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_KRETPROBES=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_ATTRS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y CONFIG_HAVE_PERF_EVENTS_NMI=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR is not set CONFIG_CC_STACKPROTECTOR_NONE=y # CONFIG_CC_STACKPROTECTOR_REGULAR is not set # CONFIG_CC_STACKPROTECTOR_STRONG is not set CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set CONFIG_STOP_MACHINE=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set CONFIG_AIX_PARTITION=y CONFIG_OSF_PARTITION=y CONFIG_AMIGA_PARTITION=y # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y CONFIG_LDM_PARTITION=y # CONFIG_LDM_DEBUG is not set CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y CONFIG_KARMA_PARTITION=y CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_CFQ_GROUP_IOSCHED=y # CONFIG_DEFAULT_DEADLINE is not set CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_FREEZER=y # # Processor type and features # CONFIG_ZONE_DMA=y CONFIG_SMP=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y CONFIG_X86_EXTENDED_PLATFORM=y # CONFIG_X86_NUMACHIP is not set # CONFIG_X86_VSMP is not set CONFIG_X86_UV=y CONFIG_X86_INTEL_LPSS=y CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_HYPERVISOR_GUEST=y CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_DEBUG is not set # CONFIG_PARAVIRT_SPINLOCKS is not set CONFIG_XEN=y CONFIG_XEN_DOM0=y CONFIG_XEN_PVHVM=y CONFIG_XEN_MAX_DOMAIN_MEMORY=500 CONFIG_XEN_SAVE_RESTORE=y CONFIG_XEN_DEBUG_FS=y # CONFIG_XEN_PVH is not set CONFIG_KVM_GUEST=y # CONFIG_KVM_DEBUG_FS is not set CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_PARAVIRT_CLOCK=y CONFIG_NO_BOOTMEM=y # CONFIG_MEMTEST is not set # CONFIG_MK8 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set CONFIG_GENERIC_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 CONFIG_X86_DEBUGCTLMSR=y CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y # CONFIG_GART_IOMMU is not set # CONFIG_CALGARY_IOMMU is not set CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS=8 CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set CONFIG_PREEMPT_COUNT=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y CONFIG_X86_MCE=y CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_AMD=y CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_MCE_INJECT is not set CONFIG_X86_THERMAL_VECTOR=y # CONFIG_I8K is not set CONFIG_MICROCODE=m CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y CONFIG_MICROCODE_OLD_INTERFACE=y # CONFIG_MICROCODE_INTEL_EARLY is not set # CONFIG_MICROCODE_AMD_EARLY is not set CONFIG_X86_MSR=y CONFIG_X86_CPUID=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_DIRECT_GBPAGES=y CONFIG_NUMA=y CONFIG_AMD_NUMA=y CONFIG_X86_64_ACPI_NUMA=y CONFIG_NODES_SPAN_OTHER_NODES=y # CONFIG_NUMA_EMU is not set CONFIG_NODES_SHIFT=6 CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y # CONFIG_ARCH_MEMORY_PROBE is not set CONFIG_ARCH_PROC_KCORE_TEXT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_NEED_MULTIPLE_NODES=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_HAVE_MEMBLOCK_NODE_MAP=y CONFIG_ARCH_DISCARD_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y # CONFIG_MOVABLE_NODE is not set # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG_SPARSE=y # CONFIG_MEMORY_HOTREMOVE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y CONFIG_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=1 CONFIG_BOUNCE=y CONFIG_VIRT_TO_BUS=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_CLEANCACHE=y CONFIG_FRONTSWAP=y # CONFIG_CMA is not set CONFIG_ZBUD=y CONFIG_ZSWAP=y # CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y CONFIG_X86_CHECK_BIOS_CORRUPTION=y CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y CONFIG_X86_RESERVE_LOW=64 CONFIG_MTRR=y CONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y CONFIG_ARCH_RANDOM=y CONFIG_X86_SMAP=y CONFIG_EFI=y CONFIG_EFI_STUB=y # CONFIG_EFI_MIXED is not set CONFIG_SECCOMP=y # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set CONFIG_HZ_1000=y CONFIG_HZ=1000 CONFIG_SCHED_HRTICK=y CONFIG_KEXEC=y CONFIG_CRASH_DUMP=y CONFIG_KEXEC_JUMP=y CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y CONFIG_PHYSICAL_ALIGN=0x1000000 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set # CONFIG_COMPAT_VDSO is not set # CONFIG_CMDLINE_BOOL is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y CONFIG_USE_PERCPU_NUMA_NODE_ID=y # # Power management and ACPI options # CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM_RUNTIME=y CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y CONFIG_PM_TEST_SUSPEND=y CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set CONFIG_PM_TRACE=y CONFIG_PM_TRACE_RTC=y CONFIG_PM_CLK=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_ACPI=y CONFIG_ACPI_SLEEP=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y # CONFIG_ACPI_VIDEO is not set CONFIG_ACPI_FAN=y CONFIG_ACPI_DOCK=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_HOTPLUG_CPU=y # CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set CONFIG_ACPI_THERMAL=y CONFIG_ACPI_NUMA=y # CONFIG_ACPI_CUSTOM_DSDT is not set CONFIG_ACPI_INITRD_TABLE_OVERRIDE=y CONFIG_ACPI_DEBUG=y CONFIG_ACPI_PCI_SLOT=y CONFIG_X86_PM_TIMER=y CONFIG_ACPI_CONTAINER=y CONFIG_ACPI_HOTPLUG_MEMORY=y # CONFIG_ACPI_SBS is not set CONFIG_ACPI_HED=y # CONFIG_ACPI_CUSTOM_METHOD is not set CONFIG_ACPI_BGRT=y # CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set CONFIG_ACPI_APEI=y CONFIG_ACPI_APEI_GHES=y CONFIG_ACPI_APEI_PCIEAER=y CONFIG_ACPI_APEI_MEMORY_FAILURE=y # CONFIG_ACPI_APEI_EINJ is not set # CONFIG_ACPI_APEI_ERST_DEBUG is not set # CONFIG_ACPI_EXTLOG is not set CONFIG_SFI=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y # CONFIG_CPU_FREQ_STAT is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # # x86 CPU frequency scaling drivers # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set # # shared options # # CONFIG_X86_SPEEDSTEP_LIB is not set # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set CONFIG_INTEL_IDLE=y # # Memory power savings # # CONFIG_I7300_IDLE is not set # # Bus options (PCI etc.) # CONFIG_PCI=y CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_PCI_XEN=y CONFIG_PCI_DOMAINS=y CONFIG_PCIEPORTBUS=y CONFIG_HOTPLUG_PCI_PCIE=y CONFIG_PCIEAER=y CONFIG_PCIE_ECRC=y # CONFIG_PCIEAER_INJECT is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y CONFIG_PCI_MSI=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set CONFIG_PCI_STUB=y # CONFIG_XEN_PCIDEV_FRONTEND is not set CONFIG_HT_IRQ=y CONFIG_PCI_ATS=y CONFIG_PCI_IOV=y CONFIG_PCI_PRI=y CONFIG_PCI_PASID=y CONFIG_PCI_IOAPIC=y CONFIG_PCI_LABEL=y # # PCI host controller drivers # CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y CONFIG_PCCARD=y CONFIG_PCMCIA=y CONFIG_PCMCIA_LOAD_CIS=y CONFIG_CARDBUS=y # # PC-card bridges # # CONFIG_YENTA is not set # CONFIG_PD6729 is not set # CONFIG_I82092 is not set CONFIG_HOTPLUG_PCI=y CONFIG_HOTPLUG_PCI_ACPI=y # CONFIG_HOTPLUG_PCI_ACPI_IBM is not set # CONFIG_HOTPLUG_PCI_CPCI is not set # CONFIG_HOTPLUG_PCI_SHPC is not set # CONFIG_RAPIDIO is not set # CONFIG_X86_SYSFB is not set # # Executable file formats / Emulations # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set # CONFIG_BINFMT_MISC is not set CONFIG_COREDUMP=y CONFIG_IA32_EMULATION=y # CONFIG_IA32_AOUT is not set # CONFIG_X86_X32 is not set CONFIG_COMPAT=y CONFIG_COMPAT_FOR_U64_ALIGNMENT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y CONFIG_X86_DEV_DMA_OPS=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y CONFIG_XFRM_SUB_POLICY=y CONFIG_XFRM_MIGRATE=y CONFIG_XFRM_STATISTICS=y # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set # CONFIG_NET_IP_TUNNEL is not set CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set CONFIG_INET_LRO=y # CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set # CONFIG_TCP_CONG_HTCP is not set # CONFIG_TCP_CONG_HSTCP is not set # CONFIG_TCP_CONG_HYBLA is not set # CONFIG_TCP_CONG_VEGAS is not set # CONFIG_TCP_CONG_SCALABLE is not set # CONFIG_TCP_CONG_LP is not set # CONFIG_TCP_CONG_VENO is not set # CONFIG_TCP_CONG_YEAH is not set # CONFIG_TCP_CONG_ILLINOIS is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" CONFIG_TCP_MD5SIG=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set CONFIG_IPV6_MIP6=y # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set # CONFIG_IPV6_SIT is not set # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_GRE is not set CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y CONFIG_NETLABEL=y CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y CONFIG_NETWORK_PHY_TIMESTAMPING=y CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set CONFIG_NF_CONNTRACK_TIMESTAMP=y # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set # CONFIG_NF_CONNTRACK_FTP is not set # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set # CONFIG_NF_CONNTRACK_TFTP is not set # CONFIG_NF_CT_NETLINK is not set # CONFIG_NF_CT_NETLINK_TIMEOUT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y # CONFIG_NF_NAT_AMANDA is not set # CONFIG_NF_NAT_FTP is not set # CONFIG_NF_NAT_IRC is not set # CONFIG_NF_NAT_SIP is not set # CONFIG_NF_NAT_TFTP is not set # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # CONFIG_NETFILTER_XT_CONNMARK is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_CONNSECMARK is not set # CONFIG_NETFILTER_XT_TARGET_CT is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TRACE is not set # CONFIG_NETFILTER_XT_TARGET_SECMARK is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set # CONFIG_IP_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_CONNTRACK_PROC_COMPAT is not set CONFIG_IP_NF_IPTABLES=y # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y # CONFIG_IP_NF_TARGET_SYNPROXY is not set # CONFIG_IP_NF_TARGET_ULOG is not set CONFIG_NF_NAT_IPV4=m # CONFIG_IP_NF_TARGET_MASQUERADE is not set # CONFIG_IP_NF_TARGET_NETMAP is not set # CONFIG_IP_NF_TARGET_REDIRECT is not set # CONFIG_NF_NAT_PPTP is not set # CONFIG_NF_NAT_H323 is not set CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set CONFIG_IP_NF_RAW=m CONFIG_IP_NF_SECURITY=m # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set CONFIG_IP6_NF_MATCH_RPFILTER=m # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m CONFIG_IP6_NF_SECURITY=m CONFIG_NF_NAT_IPV6=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m CONFIG_BRIDGE_EBT_T_FILTER=m CONFIG_BRIDGE_EBT_T_NAT=m # CONFIG_BRIDGE_EBT_802_3 is not set # CONFIG_BRIDGE_EBT_AMONG is not set # CONFIG_BRIDGE_EBT_ARP is not set # CONFIG_BRIDGE_EBT_IP is not set # CONFIG_BRIDGE_EBT_IP6 is not set # CONFIG_BRIDGE_EBT_LIMIT is not set # CONFIG_BRIDGE_EBT_MARK is not set # CONFIG_BRIDGE_EBT_PKTTYPE is not set # CONFIG_BRIDGE_EBT_STP is not set # CONFIG_BRIDGE_EBT_VLAN is not set # CONFIG_BRIDGE_EBT_ARPREPLY is not set # CONFIG_BRIDGE_EBT_DNAT is not set # CONFIG_BRIDGE_EBT_MARK_T is not set # CONFIG_BRIDGE_EBT_REDIRECT is not set # CONFIG_BRIDGE_EBT_SNAT is not set # CONFIG_BRIDGE_EBT_LOG is not set # CONFIG_BRIDGE_EBT_ULOG is not set # CONFIG_BRIDGE_EBT_NFLOG is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_HAVE_NET_DSA=y # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_INGRESS is not set # CONFIG_NET_SCH_PLUG is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=y # CONFIG_NET_CLS_BPF is not set CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 # CONFIG_NET_EMATCH_CMP is not set # CONFIG_NET_EMATCH_NBYTE is not set # CONFIG_NET_EMATCH_U32 is not set # CONFIG_NET_EMATCH_META is not set # CONFIG_NET_EMATCH_TEXT is not set CONFIG_NET_CLS_ACT=y # CONFIG_NET_ACT_POLICE is not set # CONFIG_NET_ACT_GACT is not set # CONFIG_NET_ACT_MIRRED is not set # CONFIG_NET_ACT_IPT is not set # CONFIG_NET_ACT_NAT is not set # CONFIG_NET_ACT_PEDIT is not set # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set # CONFIG_NET_ACT_CSUM is not set CONFIG_NET_SCH_FIFO=y CONFIG_DCB=y # CONFIG_DNS_RESOLVER is not set # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set CONFIG_NETLINK_MMAP=y # CONFIG_NETLINK_DIAG is not set # CONFIG_NET_MPLS_GSO is not set # CONFIG_HSR is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y # CONFIG_CGROUP_NET_PRIO is not set CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y CONFIG_BPF_JIT=y CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_TCPPROBE is not set CONFIG_NET_DROP_MONITOR=y CONFIG_HAMRADIO=y # # Packet Radio protocols # # CONFIG_AX25 is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_CFG80211=m # CONFIG_NL80211_TESTMODE is not set # CONFIG_CFG80211_DEVELOPER_WARNINGS is not set # CONFIG_CFG80211_REG_DEBUG is not set CONFIG_CFG80211_DEFAULT_PS=y CONFIG_CFG80211_DEBUGFS=y # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_WEXT=y # CONFIG_LIB80211 is not set # CONFIG_MAC80211 is not set # CONFIG_WIMAX is not set CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_RFKILL_GPIO is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set CONFIG_HAVE_BPF_JIT=y # # Device Drivers # # # Generic Driver Options # CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_FIRMWARE_IN_KERNEL is not set CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set CONFIG_SYS_HYPERVISOR=y # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_DMA_SHARED_BUFFER=y # # Bus devices # CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # CONFIG_MTD is not set CONFIG_PARPORT=m CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y CONFIG_PARPORT_PC=m # CONFIG_PARPORT_SERIAL is not set # CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set # CONFIG_PARPORT_PC_PCMCIA is not set # CONFIG_PARPORT_GSC is not set # CONFIG_PARPORT_AX88796 is not set CONFIG_PARPORT_1284=y CONFIG_PNP=y # CONFIG_PNP_DEBUG_MESSAGES is not set # # Protocols # CONFIG_PNPACPI=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set # CONFIG_BLK_DEV_FD is not set # CONFIG_PARIDE is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_NVME is not set # CONFIG_BLK_DEV_SKD is not set # CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_RAM is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_XEN_BLKDEV_FRONTEND is not set # CONFIG_XEN_BLKDEV_BACKEND is not set CONFIG_VIRTIO_BLK=m # CONFIG_BLK_DEV_HD is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set # # Misc devices # # CONFIG_SENSORS_LIS3LV02D is not set # CONFIG_AD525X_DPOT is not set # CONFIG_ATMEL_PWM is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ATMEL_SSC is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_SGI_XP is not set # CONFIG_HP_ILO is not set # CONFIG_SGI_GRU is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1780 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_VMWARE_BALLOON is not set # CONFIG_BMP085_I2C is not set # CONFIG_PCH_PHUB is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_SRAM is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_I2C is not set # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # CONFIG_INTEL_MEI is not set # CONFIG_INTEL_MEI_ME is not set # CONFIG_INTEL_MEI_TXE is not set # CONFIG_VMWARE_VMCI is not set # # Intel MIC Host Driver # # CONFIG_INTEL_MIC_HOST is not set # # Intel MIC Card Driver # # CONFIG_INTEL_MIC_CARD is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set CONFIG_HAVE_IDE=y # CONFIG_IDE is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_TGT is not set # CONFIG_SCSI_NETLINK is not set CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_SCSI_BNX2X_FCOE is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set CONFIG_MEGARAID_NEWGEN=y # CONFIG_MEGARAID_MM is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_VMWARE_PVSCSI is not set # CONFIG_LIBFC is not set # CONFIG_LIBFCOE is not set # CONFIG_FCOE is not set # CONFIG_FCOE_FNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_PPA is not set # CONFIG_SCSI_IMM is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_FC is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_LPFC is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set CONFIG_SCSI_DEBUG=m # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_SRP is not set # CONFIG_SCSI_BFA_FC is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_CHELSIO_FCOE is not set # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set CONFIG_SCSI_DH=y # CONFIG_SCSI_DH_RDAC is not set # CONFIG_SCSI_DH_HP_SW is not set # CONFIG_SCSI_DH_EMC is not set # CONFIG_SCSI_DH_ALUA is not set # CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_ATA=y # CONFIG_ATA_NONSTANDARD is not set CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_ACPI=y # CONFIG_SATA_ZPODD is not set CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # CONFIG_SATA_AHCI=y # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # CONFIG_ATA_PIIX=y # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_PCMCIA is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # CONFIG_PATA_ACPI=m CONFIG_ATA_GENERIC=m # CONFIG_PATA_LEGACY is not set CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_AUTODETECT=y # CONFIG_MD_LINEAR is not set # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID10 is not set # CONFIG_MD_RAID456 is not set # CONFIG_MD_MULTIPATH is not set # CONFIG_MD_FAULTY is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=y CONFIG_DM_DEBUG=y CONFIG_DM_BUFIO=y # CONFIG_DM_CRYPT is not set CONFIG_DM_SNAPSHOT=y # CONFIG_DM_THIN_PROVISIONING is not set # CONFIG_DM_CACHE is not set # CONFIG_DM_ERA is not set CONFIG_DM_MIRROR=y # CONFIG_DM_LOG_USERSPACE is not set # CONFIG_DM_RAID is not set CONFIG_DM_ZERO=y # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set CONFIG_DM_UEVENT=y # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_TARGET_CORE is not set CONFIG_FUSION=y # CONFIG_FUSION_SPI is not set # CONFIG_FUSION_FC is not set # CONFIG_FUSION_SAS is not set CONFIG_FUSION_MAX_SGE=40 CONFIG_FUSION_LOGGING=y # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # CONFIG_I2O is not set CONFIG_MACINTOSH_DRIVERS=y CONFIG_MAC_EMUMOUSEBTN=y CONFIG_NETDEVICES=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set CONFIG_NET_FC=y # CONFIG_IFB is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_VXLAN is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_TUN is not set # CONFIG_VETH is not set CONFIG_VIRTIO_NET=m # CONFIG_NLMON is not set # CONFIG_ARCNET is not set # # CAIF transport drivers # # CONFIG_VHOST_NET is not set # # Distributed Switch Architecture drivers # # CONFIG_NET_DSA_MV88E6XXX is not set # CONFIG_NET_DSA_MV88E6060 is not set # CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set # CONFIG_NET_DSA_MV88E6131 is not set # CONFIG_NET_DSA_MV88E6123_61_65 is not set CONFIG_ETHERNET=y CONFIG_NET_VENDOR_3COM=y # CONFIG_PCMCIA_3C574 is not set # CONFIG_PCMCIA_3C589 is not set # CONFIG_VORTEX is not set # CONFIG_TYPHOON is not set CONFIG_NET_VENDOR_ADAPTEC=y # CONFIG_ADAPTEC_STARFIRE is not set CONFIG_NET_VENDOR_ALTEON=y # CONFIG_ACENIC is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMD=y # CONFIG_AMD8111_ETH is not set # CONFIG_PCNET32 is not set # CONFIG_PCMCIA_NMCLAN is not set CONFIG_NET_VENDOR_ARC=y CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set CONFIG_NET_CADENCE=y # CONFIG_ARM_AT91_ETHER is not set # CONFIG_MACB is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set # CONFIG_BNX2 is not set # CONFIG_CNIC is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2X is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA is not set # CONFIG_NET_CALXEDA_XGMAC is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y CONFIG_NET_TULIP=y # CONFIG_DE2104X is not set # CONFIG_TULIP is not set # CONFIG_DE4X5 is not set # CONFIG_WINBOND_840 is not set # CONFIG_DM9102 is not set # CONFIG_ULI526X is not set # CONFIG_PCMCIA_XIRCOM is not set CONFIG_NET_VENDOR_DLINK=y # CONFIG_DL2K is not set # CONFIG_SUNDANCE is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set CONFIG_NET_VENDOR_EXAR=y # CONFIG_S2IO is not set # CONFIG_VXGE is not set # CONFIG_NET_VENDOR_FUJITSU is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_NET_VENDOR_I825XX is not set # CONFIG_IP1000 is not set # CONFIG_JME is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX4_CORE is not set # CONFIG_MLX5_CORE is not set CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8851_MLL is not set # CONFIG_KSZ884X_PCI is not set CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set CONFIG_NET_VENDOR_NATSEMI=y # CONFIG_NATSEMI is not set # CONFIG_NS83820 is not set CONFIG_NET_VENDOR_8390=y # CONFIG_PCMCIA_AXNET is not set # CONFIG_NE2K_PCI is not set # CONFIG_PCMCIA_PCNET is not set CONFIG_NET_VENDOR_NVIDIA=y # CONFIG_FORCEDETH is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_PCH_GBE is not set # CONFIG_ETHOC is not set CONFIG_NET_PACKET_ENGINE=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_QLGE is not set # CONFIG_NETXEN_NIC is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_ATP is not set # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set # CONFIG_SH_ETH is not set CONFIG_NET_VENDOR_RDC=y # CONFIG_R6040 is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set CONFIG_NET_VENDOR_SILAN=y # CONFIG_SC92031 is not set CONFIG_NET_VENDOR_SIS=y # CONFIG_SIS900 is not set # CONFIG_SIS190 is not set # CONFIG_SFC is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_PCMCIA_SMC91C92 is not set # CONFIG_EPIC100 is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set CONFIG_NET_VENDOR_STMICRO=y # CONFIG_STMMAC_ETH is not set CONFIG_NET_VENDOR_SUN=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_CASSINI is not set # CONFIG_NIU is not set CONFIG_NET_VENDOR_TEHUTI=y # CONFIG_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TLAN is not set CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set CONFIG_NET_VENDOR_WIZNET=y # CONFIG_WIZNET_W5100 is not set # CONFIG_WIZNET_W5300 is not set CONFIG_NET_VENDOR_XIRCOM=y # CONFIG_PCMCIA_XIRC2PS is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set CONFIG_PHYLIB=y # # MII PHY device drivers # # CONFIG_AT803X_PHY is not set # CONFIG_AMD_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_SMSC_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_ICPLUS_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_STE10XP is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_MICREL_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_MDIO_BITBANG is not set # CONFIG_PLIP is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set # # USB Network Adapters # # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_RTL8152 is not set # CONFIG_USB_USBNET is not set # CONFIG_USB_HSO is not set # CONFIG_USB_IPHETH is not set CONFIG_WLAN=y # CONFIG_PCMCIA_RAYCS is not set # CONFIG_AIRO is not set # CONFIG_ATMEL is not set # CONFIG_AIRO_CS is not set # CONFIG_PCMCIA_WL3501 is not set # CONFIG_PRISM54 is not set # CONFIG_USB_ZD1201 is not set # CONFIG_USB_NET_RNDIS_WLAN is not set # CONFIG_ATH_CARDS is not set # CONFIG_BRCMFMAC is not set # CONFIG_HOSTAP is not set # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_LIBERTAS is not set # CONFIG_HERMES is not set # CONFIG_WL_TI is not set # CONFIG_MWIFIEX is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_XEN_NETDEV_FRONTEND is not set # CONFIG_XEN_NETDEV_BACKEND is not set # CONFIG_VMXNET3 is not set CONFIG_ISDN=y # CONFIG_ISDN_I4L is not set # CONFIG_ISDN_CAPI is not set # CONFIG_ISDN_DRV_GIGASET is not set # CONFIG_HYSDN is not set # CONFIG_MISDN is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_FF_MEMLESS=y # CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_LIFEBOOK=y CONFIG_MOUSE_PS2_TRACKPOINT=y CONFIG_MOUSE_PS2_ELANTECH=y CONFIG_MOUSE_PS2_SENTELIC=y # CONFIG_MOUSE_PS2_TOUCHKIT is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set # CONFIG_JOYSTICK_ADI is not set # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set # CONFIG_JOYSTICK_GRIP_MP is not set # CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set # CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set # CONFIG_JOYSTICK_TWIDJOY is not set # CONFIG_JOYSTICK_ZHENHUA is not set # CONFIG_JOYSTICK_DB9 is not set # CONFIG_JOYSTICK_GAMECON is not set # CONFIG_JOYSTICK_TURBOGRAFX is not set # CONFIG_JOYSTICK_AS5011 is not set # CONFIG_JOYSTICK_JOYDUMP is not set # CONFIG_JOYSTICK_XPAD is not set # CONFIG_JOYSTICK_WALKERA0701 is not set CONFIG_INPUT_TABLET=y # CONFIG_TABLET_USB_ACECAD is not set # CONFIG_TABLET_USB_AIPTEK is not set # CONFIG_TABLET_USB_GTCO is not set # CONFIG_TABLET_USB_HANWANG is not set # CONFIG_TABLET_USB_KBTAB is not set # CONFIG_TABLET_USB_WACOM is not set CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_W90X900 is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_SUR40 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_PCSPKR is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_APANEL is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_ATLAS_BTNS is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y # CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y CONFIG_SERIO_RAW=m # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_GAMEPORT is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_NONSTANDARD=y # CONFIG_ROCKETPORT is not set # CONFIG_CYCLADES is not set # CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_SMARTIO is not set # CONFIG_SYNCLINK is not set # CONFIG_SYNCLINKMP is not set # CONFIG_SYNCLINK_GT is not set # CONFIG_NOZOMI is not set # CONFIG_ISI is not set # CONFIG_N_HDLC is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set # CONFIG_DEVKMEM is not set # # Serial drivers # CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_PNP=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCI=y # CONFIG_SERIAL_8250_CS is not set CONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set CONFIG_SERIAL_8250_RSA=y # CONFIG_SERIAL_8250_DW is not set # # Non-8250 serial port support # # CONFIG_SERIAL_MFD_HSU is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_TIMBERDALE is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_PCH_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_PRINTER is not set CONFIG_PPDEV=m CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y CONFIG_HVC_XEN_FRONTEND=y CONFIG_VIRTIO_CONSOLE=m # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_INTEL is not set # CONFIG_HW_RANDOM_AMD is not set # CONFIG_HW_RANDOM_ATMEL is not set # CONFIG_HW_RANDOM_VIA is not set # CONFIG_HW_RANDOM_VIRTIO is not set # CONFIG_HW_RANDOM_EXYNOS is not set CONFIG_NVRAM=y # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # # PCMCIA character devices # # CONFIG_SYNCLINK_CS is not set # CONFIG_CARDMAN_4000 is not set # CONFIG_CARDMAN_4040 is not set # CONFIG_IPWIRELESS is not set # CONFIG_MWAVE is not set CONFIG_RAW_DRIVER=y CONFIG_MAX_RAW_DEVS=8192 CONFIG_HPET=y # CONFIG_HPET_MMAP is not set # CONFIG_HANGCHECK_TIMER is not set # CONFIG_UV_MMTIMER is not set # CONFIG_TCG_TPM is not set # CONFIG_TELCLOCK is not set CONFIG_DEVPORT=y CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y # CONFIG_I2C_CHARDEV is not set # CONFIG_I2C_MUX is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=m # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_ISMT is not set CONFIG_I2C_PIIX4=m # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # ACPI drivers # # CONFIG_I2C_SCMI is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EG20T is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_SPI is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set # # PPS support # # CONFIG_PPS is not set # # PPS generators support # # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set # CONFIG_DP83640_PHY is not set # CONFIG_PTP_1588_CLOCK_PCH is not set CONFIG_PINCTRL=y # # Pin controllers # # CONFIG_PINMUX is not set # CONFIG_PINCONF is not set # CONFIG_DEBUG_PINCTRL is not set CONFIG_PINCTRL_BAYTRAIL=y CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_GPIOLIB=y CONFIG_GPIO_DEVRES=y CONFIG_GPIO_ACPI=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y # # Memory mapped GPIO drivers: # # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_IT8761E is not set # CONFIG_GPIO_F7188X is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_SCH is not set # CONFIG_GPIO_ICH is not set # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_LYNXPOINT is not set # # I2C GPIO expanders: # # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_ADP5588 is not set # # PCI GPIO expanders: # # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_INTEL_MID is not set # CONFIG_GPIO_PCH is not set # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_RDC321X is not set # # SPI GPIO expanders: # # # AC97 GPIO expanders: # # # LPC GPIO expanders: # # # MODULbus GPIO expanders: # # # USB GPIO expanders: # # CONFIG_W1 is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27x00 is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_SMB347 is not set CONFIG_POWER_RESET=y # CONFIG_POWER_AVS is not set CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ABITUGURU3 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_K8TEMP is not set # CONFIG_SENSORS_K10TEMP is not set # CONFIG_SENSORS_FAM15H_POWER is not set # CONFIG_SENSORS_APPLESMC is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FSCHMD is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_CORETEMP is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_HTU21 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VIA_CPUTEMP is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set # # ACPI drivers # # CONFIG_SENSORS_ACPI_POWER is not set # CONFIG_SENSORS_ATK0110 is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_USER_SPACE=y # CONFIG_THERMAL_EMULATION is not set # CONFIG_INTEL_POWERCLAMP is not set # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_ACPI_INT3403_THERMAL is not set # # Texas Instruments thermal drivers # CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_F71808E_WDT is not set # CONFIG_SP5100_TCO is not set # CONFIG_SBC_FITPC2_WATCHDOG is not set # CONFIG_EUROTECH_WDT is not set # CONFIG_IB700_WDT is not set # CONFIG_IBMASR is not set # CONFIG_WAFER_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_IE6XX_WDT is not set # CONFIG_ITCO_WDT is not set # CONFIG_IT8712F_WDT is not set # CONFIG_IT87_WDT is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_SC1200_WDT is not set # CONFIG_PC87413_WDT is not set # CONFIG_NV_TCO is not set # CONFIG_60XX_WDT is not set # CONFIG_SBC8360_WDT is not set # CONFIG_CPU5_WDT is not set # CONFIG_SMSC_SCH311X_WDT is not set # CONFIG_SMSC37B787_WDT is not set # CONFIG_VIA_WDT is not set # CONFIG_W83627HF_WDT is not set # CONFIG_W83697HF_WDT is not set # CONFIG_W83697UG_WDT is not set # CONFIG_W83877F_WDT is not set # CONFIG_W83977F_WDT is not set # CONFIG_MACHZ_WDT is not set # CONFIG_SBC_EPX_C3_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set # CONFIG_XEN_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # # CONFIG_MFD_CORE is not set # CONFIG_MFD_CS5535 is not set # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RTSX_PCI is not set # CONFIG_MFD_RTSX_USB is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_SYSCON is not set # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS65912 is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TIMBERDALE is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_REGULATOR is not set # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # CONFIG_AGP=y CONFIG_AGP_AMD64=y CONFIG_AGP_INTEL=y CONFIG_AGP_SIS=y CONFIG_AGP_VIA=y CONFIG_INTEL_GTT=y CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 CONFIG_VGA_SWITCHEROO=y CONFIG_DRM=m CONFIG_DRM_KMS_HELPER=m CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_TTM=m # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_TDFX is not set # CONFIG_DRM_R128 is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_I810 is not set # CONFIG_DRM_I915 is not set # CONFIG_DRM_MGA is not set # CONFIG_DRM_SIS is not set # CONFIG_DRM_VIA is not set # CONFIG_DRM_SAVAGE is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_GMA500 is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set CONFIG_DRM_QXL=m # CONFIG_DRM_BOCHS is not set # CONFIG_DRM_PTN3460 is not set # CONFIG_VGASTATE is not set CONFIG_HDMI=y CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set # CONFIG_FB_DDC is not set CONFIG_FB_BOOT_VESA_SUPPORT=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=y CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_BACKLIGHT is not set # CONFIG_FB_MODE_HELPERS is not set CONFIG_FB_TILEBLITTING=y # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ARC is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_UVESA is not set CONFIG_FB_VESA=y CONFIG_FB_EFI=y # CONFIG_FB_N411 is not set # CONFIG_FB_HGA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_LE80578 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_VIA is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_GOLDFISH is not set # CONFIG_FB_VIRTUAL is not set CONFIG_XEN_FBDEV_FRONTEND=y # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_EXYNOS_VIDEO is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_GENERIC is not set # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_SAHARA is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_VGACON_SOFT_SCROLLBACK=y CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y CONFIG_SOUND=m CONFIG_SOUND_OSS_CORE=y CONFIG_SOUND_OSS_CORE_PRECLAIM=y CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_JACK=y CONFIG_SND_SEQUENCER=m # CONFIG_SND_SEQ_DUMMY is not set CONFIG_SND_OSSEMUL=y # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set CONFIG_SND_SEQUENCER_OSS=y # CONFIG_SND_HRTIMER is not set CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set CONFIG_SND_VERBOSE_PROCFS=y CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_DEBUG=y # CONFIG_SND_DEBUG_VERBOSE is not set CONFIG_SND_PCM_XRUN_DEBUG=y CONFIG_SND_VMASTER=y CONFIG_SND_KCTL_JACK=y CONFIG_SND_DMA_SGBUF=y # CONFIG_SND_RAWMIDI_SEQ is not set # CONFIG_SND_OPL3_LIB_SEQ is not set # CONFIG_SND_OPL4_LIB_SEQ is not set # CONFIG_SND_SBAWE_SEQ is not set # CONFIG_SND_EMU10K1_SEQ is not set CONFIG_SND_DRIVERS=y # CONFIG_SND_PCSP is not set # CONFIG_SND_DUMMY is not set # CONFIG_SND_ALOOP is not set # CONFIG_SND_VIRMIDI is not set # CONFIG_SND_MTPAV is not set # CONFIG_SND_MTS64 is not set # CONFIG_SND_SERIAL_U16550 is not set # CONFIG_SND_MPU401 is not set # CONFIG_SND_PORTMAN2X4 is not set CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set # CONFIG_SND_ALS4000 is not set # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ASIHPI is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_ATIIXP_MODEM is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AW2 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CA0106 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_OXYGEN is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CTXFI is not set # CONFIG_SND_DARLA20 is not set # CONFIG_SND_GINA20 is not set # CONFIG_SND_LAYLA20 is not set # CONFIG_SND_DARLA24 is not set # CONFIG_SND_GINA24 is not set # CONFIG_SND_LAYLA24 is not set # CONFIG_SND_MONA is not set # CONFIG_SND_MIA is not set # CONFIG_SND_ECHO3G is not set # CONFIG_SND_INDIGO is not set # CONFIG_SND_INDIGOIO is not set # CONFIG_SND_INDIGODJ is not set # CONFIG_SND_INDIGOIOX is not set # CONFIG_SND_INDIGODJX is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_EMU10K1X is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_HDSPM is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set # CONFIG_SND_INTEL8X0 is not set # CONFIG_SND_INTEL8X0M is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_LOLA is not set # CONFIG_SND_LX6464ES is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_PCXHR is not set # CONFIG_SND_RIPTIDE is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VIA82XX_MODEM is not set # CONFIG_SND_VIRTUOSO is not set # CONFIG_SND_VX222 is not set # CONFIG_SND_YMFPCI is not set # # HD-Audio # CONFIG_SND_HDA=m CONFIG_SND_HDA_INTEL=m CONFIG_SND_HDA_PREALLOC_SIZE=4096 CONFIG_SND_HDA_HWDEP=y CONFIG_SND_HDA_RECONFIG=y CONFIG_SND_HDA_INPUT_BEEP=y CONFIG_SND_HDA_INPUT_BEEP_MODE=0 CONFIG_SND_HDA_INPUT_JACK=y CONFIG_SND_HDA_PATCH_LOADER=y # CONFIG_SND_HDA_CODEC_REALTEK is not set # CONFIG_SND_HDA_CODEC_ANALOG is not set # CONFIG_SND_HDA_CODEC_SIGMATEL is not set # CONFIG_SND_HDA_CODEC_VIA is not set # CONFIG_SND_HDA_CODEC_HDMI is not set # CONFIG_SND_HDA_CODEC_CIRRUS is not set # CONFIG_SND_HDA_CODEC_CONEXANT is not set # CONFIG_SND_HDA_CODEC_CA0110 is not set # CONFIG_SND_HDA_CODEC_CA0132 is not set # CONFIG_SND_HDA_CODEC_CMEDIA is not set # CONFIG_SND_HDA_CODEC_SI3054 is not set # CONFIG_SND_HDA_GENERIC is not set CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 CONFIG_SND_USB=y # CONFIG_SND_USB_AUDIO is not set # CONFIG_SND_USB_UA101 is not set # CONFIG_SND_USB_USX2Y is not set # CONFIG_SND_USB_CAIAQ is not set # CONFIG_SND_USB_US122L is not set # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_USB_HIFACE is not set # CONFIG_SND_PCMCIA is not set # CONFIG_SND_SOC is not set # CONFIG_SOUND_PRIME is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y # CONFIG_UHID is not set CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set CONFIG_HID_BELKIN=y CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_PRODIKEYS is not set # CONFIG_HID_CP2112 is not set CONFIG_HID_CYPRESS=y # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_HOLTEK is not set # CONFIG_HID_HUION is not set # CONFIG_HID_KEYTOUCH is not set # CONFIG_HID_KYE is not set # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO_TPKBD is not set CONFIG_HID_LOGITECH=y # CONFIG_HID_LOGITECH_DJ is not set CONFIG_LOGITECH_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y CONFIG_LOGIWHEELS_FF=y CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y # CONFIG_HID_MULTITOUCH is not set CONFIG_HID_NTRIG=y # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # # USB HID support # CONFIG_USB_HID=y CONFIG_HID_PID=y CONFIG_USB_HIDDEV=y # # I2C HID support # # CONFIG_I2C_HID is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y # CONFIG_USB_DEBUG is not set CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set CONFIG_USB_MON=y # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_PCI=y # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1760_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FUSBH200_HCD is not set # CONFIG_USB_FOTG210_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y # CONFIG_USB_OHCI_HCD_PLATFORM is not set CONFIG_USB_UHCI_HCD=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # # CONFIG_USB_STORAGE is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # # USB port drivers # # CONFIG_USB_USS720 is not set CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set # CONFIG_USB_SERIAL_CP210X is not set # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set # CONFIG_USB_SERIAL_FTDI_SIO is not set # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_ZTE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HSIC_USB3503 is not set # # USB Physical Layer drivers # # CONFIG_USB_PHY is not set # CONFIG_USB_OTG_FSM is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_SAMSUNG_USB2PHY is not set # CONFIG_SAMSUNG_USB3PHY is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_RCAR_PHY is not set # CONFIG_USB_GADGET is not set # CONFIG_UWB is not set # CONFIG_MMC is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # # LED drivers # # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_CLEVO_MAIL is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_PCA9685 is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_INTEL_SS4200 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_LM355x is not set # CONFIG_LEDS_BLINKM is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set CONFIG_ACCESSIBILITY=y CONFIG_A11Y_BRAILLE_CONSOLE=y # CONFIG_INFINIBAND is not set CONFIG_EDAC=y CONFIG_EDAC_LEGACY_SYSFS=y # CONFIG_EDAC_DEBUG is not set # CONFIG_EDAC_DECODE_MCE is not set # CONFIG_EDAC_MM_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y # CONFIG_RTC_SYSTOHC is not set CONFIG_RTC_HCTOSYS_DEVICE="rtc0" # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_ISL12057 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # SPI RTC drivers # # # Platform RTC drivers # CONFIG_RTC_DRV_CMOS=y # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_DS2404 is not set # # on-CPU RTC drivers # # CONFIG_RTC_DRV_MOXART is not set # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y CONFIG_DMADEVICES_DEBUG=y CONFIG_DMADEVICES_VDEBUG=y # # DMA Devices # # CONFIG_INTEL_MID_DMAC is not set # CONFIG_INTEL_IOATDMA is not set # CONFIG_DW_DMAC_CORE is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set # CONFIG_TIMB_DMA is not set # CONFIG_PCH_DMA is not set CONFIG_DMA_ACPI=y CONFIG_AUXDISPLAY=y # CONFIG_KS0108 is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO=m # # Virtio drivers # CONFIG_VIRTIO_PCI=m CONFIG_VIRTIO_BALLOON=m # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # # CONFIG_HYPERV is not set # # Xen driver support # CONFIG_XEN_BALLOON=y CONFIG_XEN_SELFBALLOONING=y # CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set CONFIG_XEN_SCRUB_PAGES=y # CONFIG_XEN_DEV_EVTCHN is not set CONFIG_XEN_BACKEND=y # CONFIG_XENFS is not set CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_XENBUS_FRONTEND=y # CONFIG_XEN_GNTDEV is not set # CONFIG_XEN_GRANT_DEV_ALLOC is not set CONFIG_SWIOTLB_XEN=y CONFIG_XEN_TMEM=m # CONFIG_XEN_PCIDEV_BACKEND is not set CONFIG_XEN_PRIVCMD=m # CONFIG_XEN_ACPI_PROCESSOR is not set # CONFIG_XEN_MCE_LOG is not set CONFIG_XEN_HAVE_PVMMU=y CONFIG_STAGING=y # CONFIG_ET131X is not set # CONFIG_SLICOSS is not set # CONFIG_USBIP_CORE is not set # CONFIG_PRISM2_USB is not set # CONFIG_COMEDI is not set # CONFIG_PANEL is not set # CONFIG_R8187SE is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_R8712U is not set # CONFIG_R8188EU is not set # CONFIG_R8723AU is not set # CONFIG_RTS5139 is not set # CONFIG_RTS5208 is not set # CONFIG_TRANZPORT is not set # CONFIG_IDE_PHISON is not set # CONFIG_LINE6_USB is not set # CONFIG_USB_SERIAL_QUATECH2 is not set # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set # CONFIG_DX_SEP is not set # CONFIG_WLAGS49_H2 is not set # CONFIG_WLAGS49_H25 is not set # CONFIG_CRYSTALHD is not set # CONFIG_FB_XGI is not set # CONFIG_ACPI_QUICKSTART is not set # CONFIG_USB_ENESTORAGE is not set # CONFIG_BCM_WIMAX is not set # CONFIG_FT1000 is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set CONFIG_STAGING_MEDIA=y # # Android # # CONFIG_ANDROID is not set # CONFIG_USB_WPAN_HCD is not set # CONFIG_WIMAX_GDM72XX is not set # CONFIG_LTE_GDM724X is not set # CONFIG_NET_VENDOR_SILICOM is not set # CONFIG_CED1401 is not set # CONFIG_DGRP is not set # CONFIG_LUSTRE_FS is not set # CONFIG_XILLYBUS is not set # CONFIG_DGNC is not set # CONFIG_DGAP is not set # CONFIG_GS_FPGABOOT is not set CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_ACERHDF is not set # CONFIG_ASUS_LAPTOP is not set # CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_AMILO_RFKILL is not set # CONFIG_HP_ACCEL is not set # CONFIG_HP_WIRELESS is not set # CONFIG_MSI_LAPTOP is not set # CONFIG_PANASONIC_LAPTOP is not set # CONFIG_COMPAL_LAPTOP is not set # CONFIG_SONY_LAPTOP is not set # CONFIG_IDEAPAD_LAPTOP is not set # CONFIG_THINKPAD_ACPI is not set # CONFIG_SENSORS_HDAPS is not set # CONFIG_INTEL_MENLOW is not set # CONFIG_EEEPC_LAPTOP is not set # CONFIG_ACPI_WMI is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_TOSHIBA_BT_RFKILL is not set # CONFIG_ACPI_CMPC is not set # CONFIG_INTEL_IPS is not set # CONFIG_IBM_RTL is not set # CONFIG_XO15_EBOOK is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_INTEL_OAKTRAIL is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_APPLE_GMUX is not set # CONFIG_INTEL_RST is not set CONFIG_INTEL_SMARTCONNECT=y # CONFIG_PVPANIC is not set CONFIG_CHROME_PLATFORMS=y # CONFIG_CHROMEOS_LAPTOP is not set # CONFIG_CHROMEOS_PSTORE is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # # CONFIG_COMMON_CLK_SI5351 is not set # # Hardware Spinlock drivers # CONFIG_CLKEVT_I8253=y CONFIG_I8253_LOCK=y CONFIG_CLKBLD_I8253=y # CONFIG_SH_TIMER_CMT is not set # CONFIG_SH_TIMER_MTU2 is not set # CONFIG_SH_TIMER_TMU is not set # CONFIG_EM_TIMER_STI is not set # CONFIG_MAILBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y CONFIG_AMD_IOMMU=y CONFIG_AMD_IOMMU_STATS=y # CONFIG_AMD_IOMMU_V2 is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set CONFIG_INTEL_IOMMU_FLOPPY_WA=y CONFIG_IRQ_REMAP=y # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # # CONFIG_PM_DEVFREQ is not set # CONFIG_EXTCON is not set # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set # CONFIG_VME_BUS is not set # CONFIG_PWM is not set # CONFIG_IPACK_BUS is not set CONFIG_RESET_CONTROLLER=y # CONFIG_FMC is not set # # PHY Subsystem # # CONFIG_GENERIC_PHY is not set # CONFIG_OMAP_CONTROL_PHY is not set # CONFIG_PHY_SAMSUNG_USB2 is not set # CONFIG_POWERCAP is not set # CONFIG_MCB is not set # # Firmware Drivers # # CONFIG_EDD is not set CONFIG_FIRMWARE_MEMMAP=y # CONFIG_DELL_RBU is not set # CONFIG_DCDBAS is not set CONFIG_DMIID=y CONFIG_DMI_SYSFS=y CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y CONFIG_ISCSI_IBFT_FIND=y # CONFIG_ISCSI_IBFT is not set # CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_VARS=y CONFIG_EFI_VARS_PSTORE=y CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y CONFIG_EFI_RUNTIME_MAP=y CONFIG_UEFI_CPER=y # # File systems # CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT23=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y CONFIG_EXT4_DEBUG=y CONFIG_JBD2=y CONFIG_JBD2_DEBUG=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_XFS_FS=m CONFIG_XFS_QUOTA=y CONFIG_XFS_POSIX_ACL=y # CONFIG_XFS_RT is not set CONFIG_XFS_WARN=y # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_FILE_LOCKING=y CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y # CONFIG_PRINT_QUOTA_WARNING is not set CONFIG_QUOTA_DEBUG=y CONFIG_QUOTA_TREE=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_QUOTACTL_COMPAT=y CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=m # CONFIG_CUSE is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_VMCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y # CONFIG_PSTORE_CONSOLE is not set # CONFIG_PSTORE_FTRACE is not set # CONFIG_PSTORE_RAM is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_F2FS_FS is not set CONFIG_EFIVAR_FS=y CONFIG_NETWORK_FILESYSTEMS=y # CONFIG_NFS_FS is not set CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_NFSD_V4_SECURITY_LABEL=y # CONFIG_NFSD_FAULT_INJECTION is not set CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_SUNRPC_DEBUG=y # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Kernel hacking # CONFIG_TRACE_IRQFLAGS_SUPPORT=y # # printk and dmesg options # CONFIG_PRINTK_TIME=y CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # # CONFIG_DEBUG_INFO is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set CONFIG_UNUSED_SYMBOLS=y CONFIG_DEBUG_FS=y CONFIG_HEADERS_CHECK=y # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0 CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_DEBUG_OBJECTS is not set CONFIG_SLUB_DEBUG_ON=y # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_HAVE_DEBUG_STACKOVERFLOW=y # CONFIG_DEBUG_STACKOVERFLOW is not set CONFIG_HAVE_ARCH_KMEMCHECK=y # CONFIG_DEBUG_SHIRQ is not set # # Debug Lockups and Hangs # # CONFIG_LOCKUP_DETECTOR is not set # CONFIG_DETECT_HUNG_TASK is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_SCHED_DEBUG=y # CONFIG_SCHEDSTATS is not set # CONFIG_TIMER_STATS is not set # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_RT_MUTEXES=y CONFIG_DEBUG_PI_LIST=y # CONFIG_RT_MUTEX_TESTER is not set CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y CONFIG_LOCKDEP=y CONFIG_LOCK_STAT=y # CONFIG_DEBUG_LOCKDEP is not set CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set CONFIG_TRACE_IRQFLAGS=y CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_LIST=y CONFIG_DEBUG_SG=y CONFIG_DEBUG_NOTIFIERS=y CONFIG_DEBUG_CREDENTIALS=y # # RCU Debugging # # CONFIG_PROVE_RCU is not set CONFIG_SPARSE_RCU_POINTER=y # CONFIG_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_RCU_CPU_STALL_INFO is not set # CONFIG_RCU_TRACE is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_IRQSOFF_TRACER is not set CONFIG_SCHED_TRACER=y CONFIG_FTRACE_SYSCALLS=y CONFIG_TRACER_SNAPSHOT=y # CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_STACK_TRACER=y CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENT=y CONFIG_UPROBE_EVENT=y CONFIG_PROBE_EVENTS=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_FUNCTION_PROFILER=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set CONFIG_MMIOTRACE=y # CONFIG_MMIOTRACE_TEST is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # # Runtime Testing # # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set # CONFIG_KPROBES_SANITY_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set CONFIG_ATOMIC64_SELFTEST=y # CONFIG_TEST_STRING_HELPERS is not set CONFIG_TEST_KSTRTOX=y CONFIG_PROVIDE_OHCI1394_DMA_INIT=y CONFIG_BUILD_DOCSRC=y CONFIG_DMA_API_DEBUG=y # CONFIG_TEST_MODULE is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_STRICT_DEVMEM=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK_DBGP=y CONFIG_EARLY_PRINTK_EFI=y # CONFIG_X86_PTDUMP is not set CONFIG_DEBUG_RODATA=y CONFIG_DEBUG_RODATA_TEST=y CONFIG_DEBUG_SET_MODULE_RONX=y # CONFIG_DEBUG_NX_TEST is not set CONFIG_DOUBLEFAULT=y # CONFIG_DEBUG_TLBFLUSH is not set # CONFIG_IOMMU_STRESS is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set CONFIG_IO_DELAY_TYPE_0X80=0 CONFIG_IO_DELAY_TYPE_0XED=1 CONFIG_IO_DELAY_TYPE_UDELAY=2 CONFIG_IO_DELAY_TYPE_NONE=3 CONFIG_IO_DELAY_0X80=y # CONFIG_IO_DELAY_0XED is not set # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set CONFIG_DEFAULT_IO_DELAY_TYPE=0 # CONFIG_DEBUG_BOOT_PARAMS is not set # CONFIG_CPA_DEBUG is not set CONFIG_OPTIMIZE_INLINING=y # CONFIG_DEBUG_NMI_SELFTEST is not set # CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set # # Security options # CONFIG_KEYS=y CONFIG_PERSISTENT_KEYRINGS=y CONFIG_BIG_KEYS=y # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEYS_DEBUG_PROC_KEYS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_NETWORK_XFRM=y # CONFIG_SECURITY_PATH is not set CONFIG_INTEL_TXT=y CONFIG_LSM_MMAP_MIN_ADDR=65536 CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # CONFIG_SECURITY_APPARMOR is not set # CONFIG_SECURITY_YAMA is not set # CONFIG_IMA is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_SELINUX=y # CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_DEFAULT_SECURITY="selinux" CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set CONFIG_CRYPTO_GF128MUL=y # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=y # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_ABLK_HELPER=y CONFIG_CRYPTO_GLUE_HELPER_X86=y # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set CONFIG_CRYPTO_SEQIV=y # # Block modes # CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y CONFIG_CRYPTO_LRW=y # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y # # Hash modes # # CONFIG_CRYPTO_CMAC is not set CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32C_INTEL is not set # CONFIG_CRYPTO_CRC32 is not set # CONFIG_CRYPTO_CRC32_PCLMUL is not set CONFIG_CRYPTO_CRCT10DIF=y # CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set # CONFIG_CRYPTO_GHASH is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y # CONFIG_CRYPTO_SHA1_SSSE3 is not set # CONFIG_CRYPTO_SHA256_SSSE3 is not set # CONFIG_CRYPTO_SHA512_SSSE3 is not set CONFIG_CRYPTO_SHA256=y # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_BLOWFISH_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAMELLIA_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set # CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set # CONFIG_CRYPTO_DES is not set # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_X86_64 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_X86_64 is not set # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set # CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set # # Compression # # CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_ZLIB is not set CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_PADLOCK is not set # CONFIG_CRYPTO_DEV_CCP is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_PUBLIC_KEY_ALGO_RSA=y CONFIG_X509_CERTIFICATE_PARSER=y CONFIG_HAVE_KVM=y CONFIG_VIRTUALIZATION=y # CONFIG_KVM is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_PERCPU_RWSEM=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y CONFIG_CRC_T10DIF=y # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set # CONFIG_RANDOM32_SELFTEST is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_NLATTR=y CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_AVERAGE=y CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set CONFIG_MPILIB=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y --zx4FCpZtqtKETZ7O-- From bfoster@redhat.com Mon Apr 14 14:28:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D3AEB7F37 for ; Mon, 14 Apr 2014 14:28:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51885AC003 for ; Mon, 14 Apr 2014 12:28:35 -0700 (PDT) X-ASG-Debug-ID: 1397503714-04cb6c243806790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0yI5r5w4Hn9GyOKN for ; Mon, 14 Apr 2014 12:28:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3EJSQ6d010332 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 14 Apr 2014 15:28:26 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3EJSPhY014424; Mon, 14 Apr 2014 15:28:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C6AB112017D; Mon, 14 Apr 2014 15:28:24 -0400 (EDT) Date: Mon, 14 Apr 2014 15:28:24 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, bob.mastors@solidfire.com, snitzer@redhat.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-ID: <20140414192824.GC62307@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1397104955-7247-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397503715 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 10, 2014 at 02:42:35PM +1000, Dave Chinner wrote: > From: Dave Chinner > > And interesting situation can occur if a log IO error occurs during > the unmount of a filesystem. The cases reported have the same > signature - the update of the superblock counters fails due to a log > write IO error: > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > XFS (dm-16): xfs_log_force: error 5 returned. > XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > It can be seen that the last line of output contains a corrupt > device name - this is because the log and xfs_mount structures have > already been freed by the time this message is printed. A kernel > oops closely follows. > > The issue is that the shutdown is occurring in a separate IO > completion thread to the unmount. Once the shutdown processing has > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > log shutdown code wakes anyone waiting on a log force so they can > process the shutdown error. This wakes up the unmount code that > is doing a synchronous transaction to update the superblock > counters. > > The unmount path now sees all the iclogs are marked with > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > it does, there will not be a wakeup trigger for it and we will hang > the unmount if we do. Hence the unmount runs through all the > remaining code and frees all the filesystem structures while the > xlog_iodone() is still processing the shutdown. When the log > shutdown processing completes, xfs_do_force_shutdown() emits the > "Please umount the filesystem and rectify the problem(s)" message, > and xlog_iodone() then aborts all the objects attached to the iclog. > An iclog that has already been freed.... > > The real issue here is that there is no serialisation point between > the log IO and the unmount. We have serialisations points for log > writes, log forces, reservations, etc, but we don't actually have > any code that wakes for log IO to fully complete. We do that for all > other types of object, so why not iclogbufs? > > Well, it turns out that we can easily do this. We've got xfs_buf > handles, and that's what everyone else uses for IO serialisation. > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > release the lock in xlog_iodone() when we are finished with the > buffer. That way before we tear down the iclog, we can lock and > unlock the buffer to ensure IO completion has finished completely > before we tear it down. > Thanks for the write up... > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 44 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 8497a00..08624dc 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1181,11 +1181,14 @@ xlog_iodone(xfs_buf_t *bp) > /* log I/O is always issued ASYNC */ > ASSERT(XFS_BUF_ISASYNC(bp)); > xlog_state_done_syncing(iclog, aborted); > + > /* > - * do not reference the buffer (bp) here as we could race > - * with it being freed after writing the unmount record to the > - * log. > + * drop the buffer lock now that we are done. Nothing references > + * the buffer after this, so an unmount waiting on this lock can now > + * tear it down safely. As such, it is unsafe to reference the buffer > + * (bp) after the unlock as we could race with it being freed. > */ > + xfs_buf_unlock(bp); > } > > /* > @@ -1368,8 +1371,16 @@ xlog_alloc_log( > bp = xfs_buf_alloc(mp->m_logdev_targp, 0, BTOBB(log->l_iclog_size), 0); > if (!bp) > goto out_free_log; > - bp->b_iodone = xlog_iodone; > + > + /* > + * The iclogbuf buffer locks are held over IO but we are not going to do > + * IO yet. Hence unlock the buffer so that the log IO path can grab it > + * when appropriately. > + */ > ASSERT(xfs_buf_islocked(bp)); > + xfs_buf_unlock(bp); > + > + bp->b_iodone = xlog_iodone; > log->l_xbuf = bp; > > spin_lock_init(&log->l_icloglock); > @@ -1398,6 +1409,9 @@ xlog_alloc_log( > if (!bp) > goto out_free_iclog; > > + ASSERT(xfs_buf_islocked(bp)); > + xfs_buf_unlock(bp); > + > bp->b_iodone = xlog_iodone; > iclog->ic_bp = bp; > iclog->ic_data = bp->b_addr; > @@ -1422,7 +1436,6 @@ xlog_alloc_log( > iclog->ic_callback_tail = &(iclog->ic_callback); > iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize; > > - ASSERT(xfs_buf_islocked(iclog->ic_bp)); > init_waitqueue_head(&iclog->ic_force_wait); > init_waitqueue_head(&iclog->ic_write_wait); > > @@ -1631,6 +1644,12 @@ xlog_cksum( > * we transition the iclogs to IOERROR state *after* flushing all existing > * iclogs to disk. This is because we don't want anymore new transactions to be > * started or completed afterwards. > + * > + * We lock the iclogbufs here so that we can serialise against IO completion > + * during unmount. We might be processing a shutdown triggered during unmount, > + * and that can occur asynchronously to the unmount thread, and hence we need to > + * ensure that completes before tearing down the iclogbufs. Hence we need to > + * hold the buffer lock across the log IO to acheive that. > */ > STATIC int > xlog_bdstrat( > @@ -1638,6 +1657,7 @@ xlog_bdstrat( > { > struct xlog_in_core *iclog = bp->b_fspriv; > > + xfs_buf_lock(bp); > if (iclog->ic_state & XLOG_STATE_IOERROR) { > xfs_buf_ioerror(bp, EIO); > xfs_buf_stale(bp); > @@ -1645,7 +1665,8 @@ xlog_bdstrat( > /* > * It would seem logical to return EIO here, but we rely on > * the log state machine to propagate I/O errors instead of > - * doing it here. > + * doing it here. Similarly, IO completion will unlock the > + * buffer, so we don't do it here. > */ > return 0; > } > @@ -1847,14 +1868,28 @@ xlog_dealloc_log( > xlog_cil_destroy(log); > > /* > - * always need to ensure that the extra buffer does not point to memory > - * owned by another log buffer before we free it. > + * Cycle all the iclogbuf locks to make sure all log IO completion > + * is done before we tear down these buffers. > */ > + iclog = log->l_iclog; > + for (i = 0; i < log->l_iclog_bufs; i++) { > + xfs_buf_lock(iclog->ic_bp); > + xfs_buf_unlock(iclog->ic_bp); > + iclog = iclog->ic_next; > + } > + > + /* > + * Always need to ensure that the extra buffer does not point to memory > + * owned by another log buffer before we free it. Also, cycle the lock > + * first to ensure we've completed IO on it. > + */ > + xfs_buf_lock(log->l_xbuf); > + xfs_buf_unlock(log->l_xbuf); > xfs_buf_set_empty(log->l_xbuf, BTOBB(log->l_iclog_size)); > xfs_buf_free(log->l_xbuf); > > iclog = log->l_iclog; > - for (i=0; il_iclog_bufs; i++) { > + for (i = 0; i < log->l_iclog_bufs; i++) { > xfs_buf_free(iclog->ic_bp); > next_iclog = iclog->ic_next; > kmem_free(iclog); On reading the code, my initial thought was that the source of this is the xlog_state_do_callback() call down in the shutdown path, when invoked from the log I/O completion handler. I think you pointed out in your previous reply that even if we were to make that call selective (e.g., based on whether the shutdown is due to a log error and thus we can expect xlog_state_do_callback() to be invoked), we still access relevant data structures after the ic_force_wait wait_queue is woken. Therefore, there would still be a race even if we bypassed the call from within the shutdown path in this particular case. The logic seems sane to me. I don't notice any issues. But my only question is why the use of locking, as opposed to wiring up use of b_iowait or something into the log I/O handler? I ask because it looks just a _bit_ funny to see the lock/unlock cycles used purely as a serialization mechanism. Do we use this kind of pattern in other places? I guess on the other hand you could argue it protects the I/O in progress, and yet another wait_queue in this codepath might be overkill (so I like the use of an existing mechanism from that standpoint). Brian > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From peterz@infradead.org Mon Apr 14 15:57:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A16097F37 for ; Mon, 14 Apr 2014 15:57:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29CFCAC003 for ; Mon, 14 Apr 2014 13:57:42 -0700 (PDT) X-ASG-Debug-ID: 1397509059-04cb6c24360bf20001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id gmdXVuogpRCOqKs9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 14 Apr 2014 13:57:39 -0700 (PDT) X-Barracuda-Envelope-From: peterz@infradead.org X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from dhcp-077-248-225-117.chello.nl ([77.248.225.117] helo=laptop) by merlin.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WZnwg-00012c-KR; Mon, 14 Apr 2014 20:57:38 +0000 Received: by laptop (Postfix, from userid 1000) id 6CFB910882768; Mon, 14 Apr 2014 22:57:37 +0200 (CEST) Date: Mon, 14 Apr 2014 22:57:37 +0200 From: Peter Zijlstra To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: xfs readdir hang on for-next (3.15.0-rc1) Message-ID: <20140414205737.GI26782@laptop.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: xfs readdir hang on for-next (3.15.0-rc1) References: <20140414164313.GA62307@bfoster.bfoster> <20140414190834.GB62307@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414190834.GB62307@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1397509059 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 03:08:36PM -0400, Brian Foster wrote: > On Mon, Apr 14, 2014 at 12:43:14PM -0400, Brian Foster wrote: > > Hi all, > > > > This is a heads up that I'm seeing a blatant readdir hang on the current > > for-next with selinux enabled. To reproduce, I format a clean fs, mount > > and attempt an ls. > > > > The problem does not occur with selinux disabled, if I back out the > > following commit: > > > > 40194ecc6d78 xfs: reinstate the ilock in xfs_readdir > > > > ... or if I remove the locking around xfs_attr_get(), so I suspect this > > is another instance of a recursive deadlock. I'm getting no output > > whatsoever in order to confirm this and it also leads to a complete > > system lockup. It's also interesting that this hasn't been observed > > until now, given the above commit was introduced in 3.14. So the above > > commit doesn't appear to be the most recent change that triggers this. > > > > I reproduced on the latest linus tree and do not reproduce on 3.14, so > > I'm trying to do a bisect to find out what else might have changed to > > trigger this. > > > > This bisected down to: > > commit 6f008e72cd111a119b5d8de8c5438d892aae99eb > Author: Peter Zijlstra > Date: Wed Mar 12 13:24:42 2014 +0100 > > locking/mutex: Fix debug checks > ... > > ... which suggests something down in the mutex debug code. Indeed, the > problem no longer occurs if I disable kernel debug in my .config. What > is also interesting is that it didn't return when I reenable > DEBUG_KERNEL and DEBUG_MUTEXES alone. It does return when I start to > enable some of the other lock debugging options. FWIW, I also cleared > out my tree and rebuilt from scratch just to be sure that I didn't have > anything stale/broken lying around. > > Peter, > > Any insight on this? http://lkml.kernel.org/r/tip-a227960fe0cafcc229a8d6bb8b454a3a0b33719d@git.kernel.org That will make the kernel continue after the lockdep splat. I too see it on some of my XFS using machines. From mlsemon35@gmail.com Mon Apr 14 16:47:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 82C5C7F37 for ; Mon, 14 Apr 2014 16:47:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 403A4AC006 for ; Mon, 14 Apr 2014 14:47:39 -0700 (PDT) X-ASG-Debug-ID: 1397512057-04cbb06e9d10360001-NocioJ Received: from mail-yh0-f53.google.com (mail-yh0-f53.google.com [209.85.213.53]) by cuda.sgi.com with ESMTP id eJExjrmxtDCZ2iFA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 14 Apr 2014 14:47:37 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.53] Received: by mail-yh0-f53.google.com with SMTP id i57so7033036yha.40 for ; Mon, 14 Apr 2014 14:47:36 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=1V7yQgxUwOXck0+YRp38ub9eHBJrtkp0Z0jF9b5M1X8=; b=yXUhxR5VtuYuNgKE21N44JTSMrPCCe7H5mJ+ZyVRsKoA5xeOlT2+4noaHcP87pRDAb T1kb67IHpK6ebt9b5n2VDH+D2OAQHHao4NqJiGnGLmeyAaXvcV2dR/vdIr9sqXF/Kct+ MhgGXK2kIkOqB27vi2fXWXnHzPweci4h68A4dIf+j0aNUQFIkjxl4GKXB9+G0nga6LRJ x0OPtOhBYh5YVLSRaWZ+5y/HpO1KrFzQ/2XxyHN0DZaiP15DcpQdTmxsSxndL6qX5l3Z kWw4kBT//7O3NexnDL4JFACnSJCmD4EqBoGUwR8Id2sX/BuTSGgEIwrsRg7FlG55cn4O sJIA== X-Received: by 10.236.92.210 with SMTP id j58mr62349411yhf.5.1397512056884; Mon, 14 Apr 2014 14:47:36 -0700 (PDT) Received: from bpserver.ds (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id s26sm28523540yhg.4.2014.04.14.14.47.36 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Apr 2014 14:47:36 -0700 (PDT) Date: Mon, 14 Apr 2014 17:47:30 -0400 (EDT) From: "Michael L. Semon" To: xfs@oss.sgi.com cc: Brian Foster Subject: Re: xfs readdir hang on for-next (3.15.0-rc1) In-Reply-To: <20140414205737.GI26782@laptop.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: xfs readdir hang on for-next (3.15.0-rc1) Message-ID: References: <20140414164313.GA62307@bfoster.bfoster> <20140414190834.GB62307@bfoster.bfoster> <20140414205737.GI26782@laptop.programming.kicks-ass.net> User-Agent: Alpine 2.11 (LNX 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail-yh0-f53.google.com[209.85.213.53] X-Barracuda-Start-Time: 1397512057 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4912 Rule breakdown below pts rule name 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 Mon, 14 Apr 2014, Peter Zijlstra wrote: > On Mon, Apr 14, 2014 at 03:08:36PM -0400, Brian Foster wrote: > > On Mon, Apr 14, 2014 at 12:43:14PM -0400, Brian Foster wrote: > > > Hi all, > > > > > > This is a heads up that I'm seeing a blatant readdir hang on the current > > > for-next with selinux enabled. To reproduce, I format a clean fs, mount > > > and attempt an ls. > > > > > > The problem does not occur with selinux disabled, if I back out the > > > following commit: > > > > > > 40194ecc6d78 xfs: reinstate the ilock in xfs_readdir > > > > > > ... or if I remove the locking around xfs_attr_get(), so I suspect this > > > is another instance of a recursive deadlock. I'm getting no output > > > whatsoever in order to confirm this and it also leads to a complete > > > system lockup. It's also interesting that this hasn't been observed > > > until now, given the above commit was introduced in 3.14. So the above > > > commit doesn't appear to be the most recent change that triggers this. > > > > > > I reproduced on the latest linus tree and do not reproduce on 3.14, so > > > I'm trying to do a bisect to find out what else might have changed to > > > trigger this. > > > > > > > This bisected down to: > > > > commit 6f008e72cd111a119b5d8de8c5438d892aae99eb > > Author: Peter Zijlstra > > Date: Wed Mar 12 13:24:42 2014 +0100 > > > > locking/mutex: Fix debug checks > > ... > > > > ... which suggests something down in the mutex debug code. Indeed, the > > problem no longer occurs if I disable kernel debug in my .config. What > > is also interesting is that it didn't return when I reenable > > DEBUG_KERNEL and DEBUG_MUTEXES alone. It does return when I start to > > enable some of the other lock debugging options. FWIW, I also cleared > > out my tree and rebuilt from scratch just to be sure that I didn't have > > anything stale/broken lying around. > > > > Peter, > > > > Any insight on this? > > http://lkml.kernel.org/r/tip-a227960fe0cafcc229a8d6bb8b454a3a0b33719d@git.kernel.org > > That will make the kernel continue after the lockdep splat. I too see it > on some of my XFS using machines. It can happen on JFS, too, but my trusty "untar a system backup until a splat happens" test barely worked for the merge-window kernel. Therefore, I used xfstests generic/113 on XFS (kernel + xfs-oss/for-next) to cause this situation. The patch above has been through xfstests on both v4- and v5-superblock XFS, solving any new lockdep issues down here on x86. Sorry to not report it here, therefore costing you time in doing a bisect. The second lockdep splat I got after kernel 3.14 wasn't XFS, and so I treated it as a non-XFS issue. Good luck! Michael From bfoster@redhat.com Mon Apr 14 17:06:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6BDC07F37 for ; Mon, 14 Apr 2014 17:06:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CBE78F8039 for ; Mon, 14 Apr 2014 15:06:41 -0700 (PDT) X-ASG-Debug-ID: 1397513199-04bdf0455411200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jgwyWqsY0BDos9wp for ; Mon, 14 Apr 2014 15:06:40 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3EM6Hq3003535 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 14 Apr 2014 18:06:17 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3EM6Hq6013913; Mon, 14 Apr 2014 18:06:17 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9784512017D; Mon, 14 Apr 2014 18:06:16 -0400 (EDT) Date: Mon, 14 Apr 2014 18:06:16 -0400 From: Brian Foster To: Peter Zijlstra Cc: xfs@oss.sgi.com Subject: Re: xfs readdir hang on for-next (3.15.0-rc1) Message-ID: <20140414220616.GA57010@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs readdir hang on for-next (3.15.0-rc1) References: <20140414164313.GA62307@bfoster.bfoster> <20140414190834.GB62307@bfoster.bfoster> <20140414205737.GI26782@laptop.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414205737.GI26782@laptop.programming.kicks-ass.net> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397513200 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 14, 2014 at 10:57:37PM +0200, Peter Zijlstra wrote: > On Mon, Apr 14, 2014 at 03:08:36PM -0400, Brian Foster wrote: > > On Mon, Apr 14, 2014 at 12:43:14PM -0400, Brian Foster wrote: > > > Hi all, > > > > > > This is a heads up that I'm seeing a blatant readdir hang on the current > > > for-next with selinux enabled. To reproduce, I format a clean fs, mount > > > and attempt an ls. > > > > > > The problem does not occur with selinux disabled, if I back out the > > > following commit: > > > > > > 40194ecc6d78 xfs: reinstate the ilock in xfs_readdir > > > > > > ... or if I remove the locking around xfs_attr_get(), so I suspect this > > > is another instance of a recursive deadlock. I'm getting no output > > > whatsoever in order to confirm this and it also leads to a complete > > > system lockup. It's also interesting that this hasn't been observed > > > until now, given the above commit was introduced in 3.14. So the above > > > commit doesn't appear to be the most recent change that triggers this. > > > > > > I reproduced on the latest linus tree and do not reproduce on 3.14, so > > > I'm trying to do a bisect to find out what else might have changed to > > > trigger this. > > > > > > > This bisected down to: > > > > commit 6f008e72cd111a119b5d8de8c5438d892aae99eb > > Author: Peter Zijlstra > > Date: Wed Mar 12 13:24:42 2014 +0100 > > > > locking/mutex: Fix debug checks > > ... > > > > ... which suggests something down in the mutex debug code. Indeed, the > > problem no longer occurs if I disable kernel debug in my .config. What > > is also interesting is that it didn't return when I reenable > > DEBUG_KERNEL and DEBUG_MUTEXES alone. It does return when I start to > > enable some of the other lock debugging options. FWIW, I also cleared > > out my tree and rebuilt from scratch just to be sure that I didn't have > > anything stale/broken lying around. > > > > Peter, > > > > Any insight on this? > > http://lkml.kernel.org/r/tip-a227960fe0cafcc229a8d6bb8b454a3a0b33719d@git.kernel.org > > That will make the kernel continue after the lockdep splat. I too see it > on some of my XFS using machines. > > That fixes the problem for me. Thanks! Brian From me@localhost.com Mon Apr 14 19:36:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_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 836FB7F37 for ; Mon, 14 Apr 2014 19:36:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 729C7304032 for ; Mon, 14 Apr 2014 17:36:39 -0700 (PDT) X-ASG-Debug-ID: 1397522193-04cbb06e9a1a8f0001-NocioJ Received: from mail.puentesdellitoral.com.ar (mail.puentesdellitoral.com.ar [200.47.46.117]) by cuda.sgi.com with ESMTP id q0HMEGhDRwHzYExl (version=SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 14 Apr 2014 17:36:35 -0700 (PDT) X-Barracuda-Envelope-From: me@localhost.com X-Barracuda-Apparent-Source-IP: 200.47.46.117 Received: from crv81903 ([127.0.0.1]) by mail.puentesdellitoral.com.ar (IceWarp 9.4.1) with SMTP id BEZ88326 for ; Mon, 14 Apr 2014 21:36:26 -0300 Date: Mon, 14 Apr 2014 21:36:26 -0300 Subject: Pour revenir a votre compte Apple, vous devrez confirmer votre compte To: xfs@oss.sgi.com X-ASG-Orig-Subj: Pour revenir a votre compte Apple, vous devrez confirmer votre compte From: Apple MIME-Version: 1.0 Content-Type: text/html Message-ID: <136690d14fd374981c275f24839d72e7@service.fr> X-Barracuda-Connect: mail.puentesdellitoral.com.ar[200.47.46.117] X-Barracuda-Start-Time: 1397522195 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: avvocatoabbate.it X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4917 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
Cher client d'Apple,

Pour revenir à votre compte Apple, vous devrez confirmer votre compte. C'est facile: Cliquez sur le lien ci-dessous pour ouvrir une fenêtre de navigateur sécurisé. Confirmez que vous êtes le titulaire du compte et suivez les instructions. .

Mettre à jour maintenant >

Apres que vous termine votre compte sera confirmée, nous le faire savoir tout de suite. Rapport, il est important car il nous permet d'empêcher les fraudeurs de voler vos informations. Cordialement, apple .


From tytso@thunk.org Mon Apr 14 21:08:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14DDE7F37 for ; Mon, 14 Apr 2014 21:08:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9F10CAC002 for ; Mon, 14 Apr 2014 19:08:41 -0700 (PDT) X-ASG-Debug-ID: 1397527719-04cbb06e9c209b0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 3AJtAdNSkf0GOJWI (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 14 Apr 2014 19:08:39 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZsnd-0005C5-73; Tue, 15 Apr 2014 02:08:37 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 655BA580287; Mon, 14 Apr 2014 22:08:36 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397527716; bh=AcWYh+tXkVXDE6FaucaYIh2GuU0kKw1dpFR8IzusUlo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=xdFRlU4kgX4TmgWDIlqp48QndmIQzvkX3VSA60yyju6vmh9wVYbuIbpF8NcKk8iZV tY+8PjdikO1sLO2RrIpL5A3X8ELQttuXpB2EHakkqgLXNh2BKMkYh8GcStUh5w3372 Oa0BrrogkG+saaGkSf9ZEx1OSEdHs4axybPR/TXI= Date: Mon, 14 Apr 2014 22:08:36 -0400 From: Theodore Ts'o To: Dave Chinner Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message Message-ID: <20140415020836.GB21827@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] generic/237: fix filtering for expected failure message References: <1397343317-14669-1-git-send-email-tytso@mit.edu> <1397343317-14669-4-git-send-email-tytso@mit.edu> <20140414001408.GC27694@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414001408.GC27694@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397527719 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4919 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 After looking at this more closely, this patch isn't needed. It was a configuration screw up on my end. - Ted From david@fromorbit.com Mon Apr 14 21:16:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E33BE7F37 for ; Mon, 14 Apr 2014 21:16:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5BEF0AC002 for ; Mon, 14 Apr 2014 19:16:08 -0700 (PDT) X-ASG-Debug-ID: 1397528165-04cb6c24391f2b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Unk5U2NBL1lvmAeE for ; Mon, 14 Apr 2014 19:16: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: ArZhAB+WTFN5LEcvPGdsb2JhbABRCIMGg1CFC7tlgR4XAwEBAQE4NYIlAQEBAwEnCwEjIwULCAECDgcDCSUPBSUDBxoTh3QHjHi/DhcWjgJWB4MkgRQBA5hglgcr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 15 Apr 2014 11:45:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WZsuY-0002k8-Nz; Tue, 15 Apr 2014 12:15:46 +1000 Date: Tue, 15 Apr 2014 12:15:46 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, bob.mastors@solidfire.com, snitzer@redhat.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-ID: <20140415021546.GD31578@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> <20140414192824.GC62307@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140414192824.GC62307@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1397528165 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4919 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 03:28:24PM -0400, Brian Foster wrote: > On Thu, Apr 10, 2014 at 02:42:35PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > And interesting situation can occur if a log IO error occurs during > > the unmount of a filesystem. The cases reported have the same > > signature - the update of the superblock counters fails due to a log > > write IO error: > > > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > > XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > > XFS (dm-16): xfs_log_force: error 5 returned. > > XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > > > It can be seen that the last line of output contains a corrupt > > device name - this is because the log and xfs_mount structures have > > already been freed by the time this message is printed. A kernel > > oops closely follows. > > > > The issue is that the shutdown is occurring in a separate IO > > completion thread to the unmount. Once the shutdown processing has > > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > > log shutdown code wakes anyone waiting on a log force so they can > > process the shutdown error. This wakes up the unmount code that > > is doing a synchronous transaction to update the superblock > > counters. > > > > The unmount path now sees all the iclogs are marked with > > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > > it does, there will not be a wakeup trigger for it and we will hang > > the unmount if we do. Hence the unmount runs through all the > > remaining code and frees all the filesystem structures while the > > xlog_iodone() is still processing the shutdown. When the log > > shutdown processing completes, xfs_do_force_shutdown() emits the > > "Please umount the filesystem and rectify the problem(s)" message, > > and xlog_iodone() then aborts all the objects attached to the iclog. > > An iclog that has already been freed.... > > > > The real issue here is that there is no serialisation point between > > the log IO and the unmount. We have serialisations points for log > > writes, log forces, reservations, etc, but we don't actually have > > any code that wakes for log IO to fully complete. We do that for all > > other types of object, so why not iclogbufs? > > > > Well, it turns out that we can easily do this. We've got xfs_buf > > handles, and that's what everyone else uses for IO serialisation. > > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > > release the lock in xlog_iodone() when we are finished with the > > buffer. That way before we tear down the iclog, we can lock and > > unlock the buffer to ensure IO completion has finished completely > > before we tear it down. > > > > Thanks for the write up... ..... > On reading the code, my initial thought was that the source of this is > the xlog_state_do_callback() call down in the shutdown path, when > invoked from the log I/O completion handler. I think you pointed out in > your previous reply that even if we were to make that call selective > (e.g., based on whether the shutdown is due to a log error and thus we > can expect xlog_state_do_callback() to be invoked), we still access > relevant data structures after the ic_force_wait wait_queue is woken. > Therefore, there would still be a race even if we bypassed the call from > within the shutdown path in this particular case. > > The logic seems sane to me. I don't notice any issues. But my only > question is why the use of locking, as opposed to wiring up use of > b_iowait or something into the log I/O handler? Log IO is issued B_ASYNC, so the buffer IO completion handlers do not issue wakeups to b_iowait waiters. And the iclogbufs are uncached buffers, so we can't use the buffer cache waiting mechanisms to wait for them, either. > I ask because it looks > just a _bit_ funny to see the lock/unlock cycles used purely as a > serialization mechanism. Do we use this kind of pattern in other places? Yes, in xfs_log_quiesce(), to wait on the superblock buffer IO because: /* * The superblock buffer is uncached and while xfs_ail_push_all_sync() * will push it, xfs_wait_buftarg() will not wait for it. Further, * xfs_buf_iowait() cannot be used because it was pushed with the * XBF_ASYNC flag set, so we need to use a lock/unlock pair to wait for * the IO to complete. */ Which is exactly the same situation as the iclogbufs - uncached buffers, B_ASYNC IO.... > I guess on the other hand you could argue it protects the I/O in > progress, and yet another wait_queue in this codepath might be overkill > (so I like the use of an existing mechanism from that standpoint). Mostly I figured that we already have the same IO wait mechanism in the log shutdown path for other buffers, so it seemed silly to add waitqueues and other infrastructure for something that could be handled very easily. It also makes the iclogs look like every other buffer in the filesystem in that the buffer lock is held over IO. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Mon Apr 14 21:52:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 90B267F37 for ; Mon, 14 Apr 2014 21:52:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67E328F8033 for ; Mon, 14 Apr 2014 19:52:07 -0700 (PDT) X-ASG-Debug-ID: 1397530325-04cb6c243721170001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id e27A8qS3lh3u7yRm (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 14 Apr 2014 19:52:05 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WZtTg-0005DX-Rw; Tue, 15 Apr 2014 02:52:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C40F4580287; Mon, 14 Apr 2014 22:52:03 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397530323; bh=KMnYV41DAHVFHERyW6nTVP6QiBcFxdsNwb130Ok0I2M=; h=From:To:Cc:Subject:Date:From; b=RzKGzKB4GCO9eFcy2rWrZDME/HpqmRvapANoIjOvYGcJeElfMsODLTf/q32d24lwk 3djoXtl3ukdc0h/EKZKv84yLs29TQ+RFmChZC407lYvBluwqH1VhA7rODiadhK7TDq 1T6PZvhMXo7dH51XqyU3W6HG+Nn1QZw1Mqy62tdk= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o Subject: [PATCH] check: add support for an external test expunging file Date: Mon, 14 Apr 2014 22:52:00 -0400 X-ASG-Orig-Subj: [PATCH] check: add support for an external test expunging file Message-Id: <1397530320-20579-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397530325 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Currently the -X option is intended to specify a set of expunging files which are stored in each test/* subdirectory. As described in the commit description for 0b1e8abd4, in order to exclude the test generic/280, the -X option is used as follows: $ cat tests/generic/3.0-stable-avoid 280 $ sudo ./check -X 3.0-stable-avoid generic/280 However, it is sometimes useful to store the set of expunged tests in a single file, outside of tests/* subdirectories. This commit allows the following: $ cat /root/conf/data_journal.exclude generic/068 ext4/301 $ sudo ./check -X /root/conf/data_journal.exclude -g auto If the argument to the -X option is a pathname (that is, includes a '/' character), treat it as the latter case. If it the argument to the -X option is just a bare filename (that is, does not include '/' character), treat it as the former. Signed-off-by: "Theodore Ts'o" --- check | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/check b/check index e7ace63..791a386 100755 --- a/check +++ b/check @@ -215,12 +215,22 @@ while [ $# -gt 0 ]; do ;; -X) xfile=$2; shift ; - for d in $SRC_GROUPS $FSTYP; do - [ -f $SRC_DIR/$d/$xfile ] || continue - for f in `cat $SRC_DIR/$d/$xfile`; do - echo $d/$f >> $tmp.xlist + case "$xfile" in + */*) if [ -f "$xfile" ]; then + cat "$xfile" >> $tmp.xlist + else + echo "Exclusion file $xfile not found" + exit 1 + fi + ;; + *) for d in $SRC_GROUPS $FSTYP; do + [ -f $SRC_DIR/$d/$xfile ] || continue + for f in `cat $SRC_DIR/$d/$xfile`; do + echo $d/$f >> $tmp.xlist + done done - done + ;; + esac ;; -s) RUN_SECTION="$RUN_SECTION $2"; shift ;; -l) diff="diff" ;; -- 1.9.0 From taremak@s1.mbsrv.net Mon Apr 14 22:02:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=FORGED_HOTMAIL_RCVD2, FORGED_MUA_THEBAT_BOUN,FREEMAIL_FROM,FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 049A37F37 for ; Mon, 14 Apr 2014 22:02:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2C178F8033 for ; Mon, 14 Apr 2014 20:02:17 -0700 (PDT) X-ASG-Debug-ID: 1397530932-04cb6c243621930001-NocioJ Received: from s1.mbsrv.net (mbsrv.jp [211.10.17.41]) by cuda.sgi.com with ESMTP id wsqTg4thw6lMgJTO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 14 Apr 2014 20:02:13 -0700 (PDT) X-Barracuda-Envelope-From: taremak@s1.mbsrv.net X-Barracuda-Apparent-Source-IP: 211.10.17.41 Received: from taremak by s1.mbsrv.net with local (Exim 4.80.1) (envelope-from ) id 1WZtdB-0006ep-6g; Tue, 15 Apr 2014 12:01:53 +0900 To: , , , , , , , , , , , , , , , , , , , Subject: =?windows-1251?B?yuvo7/HgIMDt8uj18ODvIO/u7O7m5fIg4uDs?= =?windows-1251?B?IOgg4uD46Owg8O7k7fvsIO7h8OXx8ugg5+Tu?= =?windows-1251?B?8O7i++kg8e7tLg==?= From: Gcerra1973@hotmail.com X-ASG-Orig-Subj: =?windows-1251?B?yuvo7/HgIMDt8uj18ODvIO/u7O7m5fIg4uDs?= =?windows-1251?B?IOgg4uD46Owg8O7k7fvsIO7h8OXx8ugg5+Tu?= =?windows-1251?B?8O7i++kg8e7tLg==?= X-Mailer: The Bat! (v4.98.88) Reply-To: Gcerra1973@hotmail.com MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="--------81CCFFF9CAFBD6317" Message-Id: Date: Tue, 15 Apr 2014 12:01:53 +0900 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - s1.mbsrv.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [32560 32002] / [47 12] X-AntiAbuse: Sender Address Domain - s1.mbsrv.net X-Get-Message-Sender-Via: s1.mbsrv.net: authenticated_id: taremak/only user confirmed/virtual account not confirmed X-Source: /usr/bin/php5.2 X-Source-Args: /usr/bin/php /home/taremak/public_html/apron-factory.com/fjykpix.php X-Source-Dir: taremak.com:/public_html/apron-factory.com X-Barracuda-Connect: mbsrv.jp[211.10.17.41] X-Barracuda-Start-Time: 1397530933 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.32 X-Barracuda-Spam-Status: No, SCORE=1.32 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, FORGED_HOTMAIL_RCVD2, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA074b Custom Rule SA074b ----------81CCFFF9CAFBD6317 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D5=F0=E0=EF =96 =FD=F2=EE =EF=F0=EE=E1=EB=E5=EC=E0, =F1=EF=EE=F1=EE=E1=ED= =E0=FF =ED=E0=ED=E5=F1=F2=E8 =E2=F0=E5=E4 =E7=E4=EE=F0=EE=E2=FC=FE =E8 =EE= =EF=E0=F1=ED=E0=FF =E4=EB=FF =E6=E8=E7=ED=E8. =CD=EE=F7=ED=EE=E9 =F5=F0=E0= =EF =EC=EE=E6=E5=F2 =EF=F0=E8=E2=E5=F1=F2=E8 =EA =ED=E0=F0=F3=F8=E5=ED=E8= =FE =E8 =E4=E0=E6=E5 =EE=F1=F2=E0=ED=EE=E2=EA=E5 =E4=FB=F5=E0=ED=E8=FF. =CA= =F0=EE=EC=E5 =F2=EE=E3=EE, =F5=F0=E0=EF =EC=E5=F8=E0=E5=F2 =F1=EF=EE=EA=EE= =E9=ED=EE =F1=EF=E0=F2=FC =E2=E0=F8=E8=EC =E1=EB=E8=E7=EA=E8=EC. =CA=EB=E8=EF=F1=E0 =C0=ED=F2=E8=F5=F0=E0=EF- =F1=EF=EE=EA=EE=E9=ED=FB=E9 = =F1=EE=ED =E2 =EF=EE=E4=E0=F0=EE=EA=20 =C2=FB=EF=EE=EB=ED=E5=ED=E0 =E8=E7 =E0=ED=F2=E8=E0=EB=EB=E5=F0=E3=E5=ED=ED= =EE=E3=EE =EC=E5=E4=E8=F6=E8=ED=F1=EA=EE=E3=EE =F1=E8=EB=E8=EA=EE=ED=E0 =C7=E0=EA=E0=E7=E0=F2=FC =EA=EB=E8=EF=F1=F3 "=C0=ED=F2=E8=F5=F0=E0=EF" ----------81CCFFF9CAFBD6317 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D5=F0=E0=EF =96 =FD=F2=EE=20 =EF=F0=EE=E1=EB=E5=EC=E0, =F1=EF=EE=F1=EE=E1=ED=E0=FF =ED=E0=ED=E5=F1=F2=E8= =E2=F0=E5=E4 =E7=E4=EE=F0=EE=E2=FC=FE =E8 =EE=EF=E0=F1=ED=E0=FF =E4=EB=FF= =E6=E8=E7=ED=E8. =CD=EE=F7=ED=EE=E9 =F5=F0=E0=EF =EC=EE=E6=E5=F2=20 =EF=F0=E8=E2=E5=F1=F2=E8 =EA =ED=E0=F0=F3=F8=E5=ED=E8=FE =E8 =E4=E0=E6=E5= =EE=F1=F2=E0=ED=EE=E2=EA=E5 =E4=FB=F5=E0=ED=E8=FF. =CA=F0=EE=EC=E5 =F2=EE= =E3=EE, =F5=F0=E0=EF =EC=E5=F8=E0=E5=F2 =F1=EF=EE=EA=EE=E9=ED=EE=20 =F1=EF=E0=F2=FC =E2=E0=F8=E8=EC =E1=EB=E8=E7=EA=E8=EC.
 
=CA=EB=E8=EF=F1=E0 =C0=ED=F2=E8=F5=F0=E0=EF- =F1=EF=EE= =EA=EE=E9=ED=FB=E9 =F1=EE=ED =E2 =EF=EE=E4=E0=F0=EE=EA
 
=C2=FB=EF=EE=EB=ED=E5=ED=E0 =E8=E7 =E0=ED=F2=E8=E0=EB=EB=E5=F0=E3= =E5=ED=ED=EE=E3=EE =EC=E5=E4=E8=F6=E8=ED=F1=EA=EE=E3=EE =F1=E8=EB=E8=EA=EE= =ED=E0
 
 
 
----------81CCFFF9CAFBD6317-- From dave@fromorbit.com Tue Apr 15 03:25:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E0677F3F for ; Tue, 15 Apr 2014 03:25:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E1C15304059 for ; Tue, 15 Apr 2014 01:25:08 -0700 (PDT) X-ASG-Debug-ID: 1397550306-04bdf0455538b60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id FE7CZjc4PfDV0ziG for ; Tue, 15 Apr 2014 01:25:06 -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: AuZdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWDAjuBAgMHiCiaJrI0jwCEIgSjR4kfggQr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WL-6m for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Ph-5h for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/9] xfs_db, xfs_repair: improve CRC error detection Date: Tue, 15 Apr 2014 18:24:52 +1000 X-ASG-Orig-Subj: [PATCH 0/9] xfs_db, xfs_repair: improve CRC error detection Message-Id: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550306 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, After a conversion with a user on #IRC this morning, it was clear that xfs_repair and xfs_db weren't handling metadata blocks with CRC errors in them particularly well. xfs_metadump was reporting blocks with errors, but xfs_db was reporting them as having a correct CRC, which wasn't actually the case - they were unchecked, and the code saw the absence of error flags as meaning they were good. Repair had a similar problem - buffers that were prefetched never had the verifier run on them when they were read by the checking code as they were uptodate in the cache. Hence the prefetch code needed to mark the buffers as unchecked so that the code that checked the metadata ran the verifier and appropriately. This then showed up the fact that there were many places where repair was not catching the CRC error and rewriting the buffer to correct the bad CRC. This then showed up that we weren't actually handling remote attribute properly for the CRC enabled format. And so I fixed all of them. I've verified the code by manually corrupting blocks with xfs_db by writing garabges into unused regions of the blocks so that CRC errors are triggered. In each case repair detected the CRC error and took appropriate action. The CRC error was not found on a second run of xfs_repair. This really needs to be turned into a xfstest, but I haven't had time to do that yet. Any volunteers? Anyway, these fixes mean we'll definitely need a 3.2.0-rc2 release in the not too distant future. Comments, flames and testing all welcome.... -Dave. From dave@fromorbit.com Tue Apr 15 03:25:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 540A27F52 for ; Tue, 15 Apr 2014 03:25:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1CFA78F8033 for ; Tue, 15 Apr 2014 01:25:11 -0700 (PDT) X-ASG-Debug-ID: 1397550306-04bdf0455538b60003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Qo2QI2lVwlZeTFfc for ; Tue, 15 Apr 2014 01:25:09 -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: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWo8AhCIErmor Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WN-7h for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Pp-6q for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/9] db: verify buffer on type change Date: Tue, 15 Apr 2014 18:24:54 +1000 X-ASG-Orig-Subj: [PATCH 2/9] db: verify buffer on type change Message-Id: <1397550301-31883-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550309 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently when the type command is run, we simply change the type associated with the buffer, but don't verify it. This results in unchecked CRCs being displayed. Hence when changing the type, run the verifier associated with the type to determine if the buffer contents is valid or not. Signed-off-by: Dave Chinner --- db/io.c | 25 +++++++++++++++++++++++++ db/io.h | 1 + db/type.c | 9 +++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/db/io.c b/db/io.c index 387f171..1a75394 100644 --- a/db/io.c +++ b/db/io.c @@ -552,6 +552,31 @@ set_cur( ring_add(); } +void +set_iocur_type( + const typ_t *t) +{ + const struct xfs_buf_ops *ops = t ? t->bops : NULL; + struct xfs_buf *bp = iocur_top->bp; + + iocur_top->typ = t; + + /* verify the buffer if the type has one. */ + if (!bp) + return; + if (!ops) { + bp->b_ops = NULL; + bp->b_flags |= LIBXFS_B_UNCHECKED; + return; + } + if (!(bp->b_flags & LIBXFS_B_UPTODATE)) + return; + bp->b_error = 0; + bp->b_ops = ops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; +} + static void stack_help(void) { diff --git a/db/io.h b/db/io.h index 7875119..71082e6 100644 --- a/db/io.h +++ b/db/io.h @@ -62,6 +62,7 @@ extern void write_cur(void); extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); extern void ring_add(void); +extern void set_iocur_type(const struct typ *t); /* * returns -1 for unchecked, 0 for bad and 1 for good diff --git a/db/type.c b/db/type.c index 04d0d56..b29f2a4 100644 --- a/db/type.c +++ b/db/type.c @@ -162,10 +162,11 @@ type_f( if (tt == NULL) { dbprintf(_("no such type %s\n"), argv[1]); } else { - if (iocur_top->typ == NULL) { - dbprintf(_("no current object\n")); - } else { - iocur_top->typ = cur_typ = tt; + if (iocur_top->typ == NULL) + dbprintf(_("no current object\n")); + else { + cur_typ = tt; + set_iocur_type(tt); } } } -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D6ECE7F52 for ; Tue, 15 Apr 2014 03:25:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 629AFAC006 for ; Tue, 15 Apr 2014 01:25:12 -0700 (PDT) X-ASG-Debug-ID: 1397550309-04cbb06e9a39330001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id eXqSxvarsAODOSoY for ; Tue, 15 Apr 2014 01:25:10 -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: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWpMiBK5qK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WO-86 for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Pu-7I for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Date: Tue, 15 Apr 2014 18:24:55 +1000 X-ASG-Orig-Subj: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-Id: <1397550301-31883-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550309 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Prefetch currently does not do CRC validation when the IO completes due to the optimisation it performs and the fact that it does not know what the type of metadata into the buffer is supposed to be. Hence, mark all prefetched buffers as "suspect" so that when the end user tries to read it with a supplied validation function the validation is run even though the buffer was already in the cache. Signed-off-by: Dave Chinner --- include/libxfs.h | 1 + libxfs/rdwr.c | 36 +++++++++++++++++++++++++++++++----- repair/prefetch.c | 3 +++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 6bc6c94..6b1e276 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -333,6 +333,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ + LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */ }; #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 7208a2f..a8f06aa 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -718,12 +718,25 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, bp = libxfs_getbuf(btp, blkno, len); if (!bp) return NULL; - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + + /* + * if the buffer was prefetched, it is likely that it was not + * validated. Hence if we are supplied an ops function and the + * buffer is marked as unchecked, we need to validate it now. + */ + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { + bp->b_error = 0; + bp->b_ops = ops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } 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. + * Set the ops on a cache miss (i.e. first physical read) as the + * verifier may change the ops to match the type of 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*. @@ -733,8 +746,10 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, error = libxfs_readbufr(btp, blkno, bp, len, flags); if (error) bp->b_error = error; - else if (bp->b_ops) + else if (bp->b_ops) { bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } return bp; } @@ -786,6 +801,14 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, return NULL; bp->b_error = 0; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { + bp->b_ops = ops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } + return bp; + } bp->b_ops = ops; if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) return bp; @@ -793,8 +816,10 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, error = libxfs_readbufr_map(btp, bp, flags); if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; - if (bp->b_ops) + if (bp->b_ops) { bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } } #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", @@ -889,6 +914,7 @@ libxfs_writebufr(xfs_buf_t *bp) if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; } return error; } diff --git a/repair/prefetch.c b/repair/prefetch.c index 6d6d344..d794ba3 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -389,6 +389,7 @@ pf_read_inode_dirs( bp->b_ops = &xfs_inode_buf_ops; bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; if (bp->b_error) return; @@ -460,6 +461,7 @@ pf_read_discontig( pthread_mutex_unlock(&args->lock); libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); + bp->b_flags |= LIBXFS_B_UNCHECKED; libxfs_putbuf(bp); pthread_mutex_lock(&args->lock); } @@ -583,6 +585,7 @@ pf_batch_read( break; memcpy(XFS_BUF_PTR(bplist[i]), pbuf, size); bplist[i]->b_flags |= LIBXFS_B_UPTODATE; + bplist[i]->b_flags |= LIBXFS_B_UNCHECKED; len -= size; if (B_IS_INODE(XFS_BUF_PRIORITY(bplist[i]))) pf_read_inode_dirs(args, bplist[i]); -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0FE3B7F53 for ; Tue, 15 Apr 2014 03:25:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CE4518F8033 for ; Tue, 15 Apr 2014 01:25:09 -0700 (PDT) X-ASG-Debug-ID: 1397550306-04bdf0455538b60002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BYFiivc1MVwsbAA4 for ; Tue, 15 Apr 2014 01:25:08 -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: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWo8AhCIErmorgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WM-7D for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Pk-6O for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/9] db: don't claim unchecked CRCs are correct Date: Tue, 15 Apr 2014 18:24:53 +1000 X-ASG-Orig-Subj: [PATCH 1/9] db: don't claim unchecked CRCs are correct Message-Id: <1397550301-31883-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550307 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently xfs_db will claim the CRC on a structure is correct if the buffer is not marked with an error. However, buffers may have been read without a verifier, and hence have not had their CRCs validated. in this case, we shoul dreport "unchecked" rather than "correct". For example: xfs_db> fsb 0x6003f xfs_db> type dir3 xfs_db> p dhdr.hdr.magic = 0x58444433 dhdr.hdr.crc = 0x2d0f9c9d (unchecked) .... Signed-off-by: Dave Chinner --- db/fprint.c | 15 ++++++++++++++- db/io.c | 2 ++ db/io.h | 12 +++++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/db/fprint.c b/db/fprint.c index 435d984..52782e2 100644 --- a/db/fprint.c +++ b/db/fprint.c @@ -206,7 +206,20 @@ fp_crc( __int64_t val; char *ok; - ok = iocur_crc_valid() ? "correct" : "bad"; + switch (iocur_crc_valid()) { + case -1: + ok = "unchecked"; + break; + case 0: + ok = "bad"; + break; + case 1: + ok = "correct"; + break; + default: + ok = "unknown state"; + break; + } for (i = 0, bitpos = bit; i < count && !seenint(); diff --git a/db/io.c b/db/io.c index 5eb61d9..387f171 100644 --- a/db/io.c +++ b/db/io.c @@ -531,6 +531,8 @@ set_cur( return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; + if (!ops) + bp->b_flags |= LIBXFS_B_UNCHECKED; iocur_top->bb = d; iocur_top->blen = c; diff --git a/db/io.h b/db/io.h index ad39bee..7875119 100644 --- a/db/io.h +++ b/db/io.h @@ -63,10 +63,16 @@ extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); extern void ring_add(void); -static inline bool +/* + * returns -1 for unchecked, 0 for bad and 1 for good + */ +static inline int iocur_crc_valid() { - return (iocur_top->bp && - iocur_top->bp->b_error != EFSBADCRC && + if (!iocur_top->bp) + return -1; + if (iocur_top->bp->b_flags & LIBXFS_B_UNCHECKED) + return -1; + return (iocur_top->bp->b_error != EFSBADCRC && (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 778C87F52 for ; Tue, 15 Apr 2014 03:25:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4204B8F8040 for ; Tue, 15 Apr 2014 01:25:13 -0700 (PDT) X-ASG-Debug-ID: 1397550306-04bdf0455538b60004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 7Dr7ca6VFySiwoW7 for ; Tue, 15 Apr 2014 01:25:10 -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: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWpMiBK5qKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WS-A8 for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008QE-9E for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/9] repair: remove more dirv1 leftovers Date: Tue, 15 Apr 2014 18:24:59 +1000 X-ASG-Orig-Subj: [PATCH 7/9] repair: remove more dirv1 leftovers Message-Id: <1397550301-31883-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550310 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner get_bmapi() and it's children were only called by dirv1 code. There are no current callers, so remove them. Signed-off-by: Dave Chinner --- repair/dinode.c | 239 -------------------------------------------------------- repair/dinode.h | 6 -- 2 files changed, 245 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 48f17ac..b086bec 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -870,245 +870,6 @@ get_agino_buf(xfs_mount_t *mp, } /* - * these next routines return the filesystem blockno of the - * block containing the block "bno" in the file whose bmap - * tree (or extent list) is rooted by "rootblock". - * - * the next routines are utility routines for the third - * routine, get_bmapi(). - * - * NOTE: getfunc_extlist only used by dirv1 checking code - */ -static xfs_dfsbno_t -getfunc_extlist(xfs_mount_t *mp, - xfs_ino_t ino, - xfs_dinode_t *dip, - xfs_dfiloff_t bno, - int whichfork) -{ - xfs_bmbt_irec_t irec; - xfs_dfsbno_t final_fsbno = NULLDFSBNO; - xfs_bmbt_rec_t *rootblock = (xfs_bmbt_rec_t *) - XFS_DFORK_PTR(dip, whichfork); - xfs_extnum_t nextents = XFS_DFORK_NEXTENTS(dip, whichfork); - int i; - - for (i = 0; i < nextents; i++) { - libxfs_bmbt_disk_get_all(rootblock + i, &irec); - if (irec.br_startoff <= bno && - bno < irec.br_startoff + irec.br_blockcount) { - final_fsbno = bno - irec.br_startoff + irec.br_startblock; - break; - } - } - - return(final_fsbno); -} - -/* - * NOTE: getfunc_btree only used by dirv1 checking code... - */ -static xfs_dfsbno_t -getfunc_btree(xfs_mount_t *mp, - xfs_ino_t ino, - xfs_dinode_t *dip, - xfs_dfiloff_t bno, - int whichfork) -{ - int i; -#ifdef DEBUG - int prev_level; -#endif - int found; - int numrecs; - xfs_bmbt_rec_t *rec; - xfs_bmbt_irec_t irec; - xfs_bmbt_ptr_t *pp; - xfs_bmbt_key_t *key; - xfs_bmdr_key_t *rkey; - xfs_bmdr_ptr_t *rp; - xfs_dfsbno_t fsbno; - xfs_buf_t *bp; - xfs_dfsbno_t final_fsbno = NULLDFSBNO; - struct xfs_btree_block *block; - xfs_bmdr_block_t *rootblock = (xfs_bmdr_block_t *) - XFS_DFORK_PTR(dip, whichfork); - - ASSERT(rootblock->bb_level != 0); - /* - * deal with root block, it's got a slightly different - * header structure than interior nodes. We know that - * a btree should have at least 2 levels otherwise it - * would be an extent list. - */ - rkey = XFS_BMDR_KEY_ADDR(rootblock, 1); - rp = XFS_BMDR_PTR_ADDR(rootblock, 1, - xfs_bmdr_maxrecs(mp, XFS_DFORK_SIZE(dip, mp, whichfork), 1)); - found = -1; - for (i = 0; i < be16_to_cpu(rootblock->bb_numrecs) - 1; i++) { - if (be64_to_cpu(rkey[i].br_startoff) <= bno && - bno < be64_to_cpu(rkey[i + 1].br_startoff)) { - found = i; - break; - } - } - if (i == be16_to_cpu(rootblock->bb_numrecs) - 1 && - bno >= be64_to_cpu(rkey[i].br_startoff)) - found = i; - - ASSERT(found != -1); - - fsbno = be64_to_cpu(rp[found]); - - ASSERT(verify_dfsbno(mp, fsbno)); - - bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); - return(NULLDFSBNO); - } - block = XFS_BUF_TO_BLOCK(bp); - numrecs = be16_to_cpu(block->bb_numrecs); - - /* - * ok, now traverse any interior btree nodes - */ -#ifdef DEBUG - prev_level = be16_to_cpu(block->bb_level); -#endif - - while (be16_to_cpu(block->bb_level) > 0) { -#ifdef DEBUG - ASSERT(be16_to_cpu(block->bb_level) < prev_level); - - prev_level = be16_to_cpu(block->bb_level); -#endif - if (numrecs > mp->m_bmap_dmxr[1]) { - do_warn( -_("# of bmap records in inode %" PRIu64 " exceeds max (%u, max - %u)\n"), - ino, numrecs, - mp->m_bmap_dmxr[1]); - libxfs_putbuf(bp); - return(NULLDFSBNO); - } - if (verbose && numrecs < mp->m_bmap_dmnr[1]) { - do_warn( -_("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), proceeding ...\n"), - ino, numrecs, mp->m_bmap_dmnr[1]); - } - key = XFS_BMBT_KEY_ADDR(mp, block, 1); - pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - for (found = -1, i = 0; i < numrecs - 1; i++) { - if (be64_to_cpu(key[i].br_startoff) <= bno && bno < - be64_to_cpu(key[i + 1].br_startoff)) { - found = i; - break; - } - } - if (i == numrecs - 1 && bno >= be64_to_cpu(key[i].br_startoff)) - found = i; - - ASSERT(found != -1); - fsbno = be64_to_cpu(pp[found]); - - ASSERT(verify_dfsbno(mp, fsbno)); - - /* - * release current btree block and read in the - * next btree block to be traversed - */ - libxfs_putbuf(bp); - bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - do_error(_("cannot read bmap block %" PRIu64 "\n"), - fsbno); - return(NULLDFSBNO); - } - block = XFS_BUF_TO_BLOCK(bp); - numrecs = be16_to_cpu(block->bb_numrecs); - } - - /* - * current block must be a leaf block - */ - ASSERT(be16_to_cpu(block->bb_level) == 0); - if (numrecs > mp->m_bmap_dmxr[0]) { - do_warn( -_("# of bmap records in inode %" PRIu64 " greater than maximum (%u, max - %u)\n"), - ino, numrecs, mp->m_bmap_dmxr[0]); - libxfs_putbuf(bp); - return(NULLDFSBNO); - } - if (verbose && numrecs < mp->m_bmap_dmnr[0]) - do_warn( -_("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), continuing...\n"), - ino, numrecs, mp->m_bmap_dmnr[0]); - - rec = XFS_BMBT_REC_ADDR(mp, block, 1); - for (i = 0; i < numrecs; i++) { - libxfs_bmbt_disk_get_all(rec + i, &irec); - if (irec.br_startoff <= bno && - bno < irec.br_startoff + irec.br_blockcount) { - final_fsbno = bno - irec.br_startoff + - irec.br_startblock; - break; - } - } - libxfs_putbuf(bp); - - if (final_fsbno == NULLDFSBNO) - do_warn(_("could not map block %" PRIu64 "\n"), bno); - - return(final_fsbno); -} - -/* - * this could be smarter. maybe we should have an open inode - * routine that would get the inode buffer and return back - * an inode handle. I'm betting for the moment that this - * is used only by the directory and attribute checking code - * and that the avl tree find and buffer cache search are - * relatively cheap. If they're too expensive, we'll just - * have to fix this and add an inode handle to the da btree - * cursor. - * - * caller is responsible for checking doubly referenced blocks - * and references to holes - * - * NOTE: get_bmapi only used by dirv1 checking code - */ -xfs_dfsbno_t -get_bmapi(xfs_mount_t *mp, xfs_dinode_t *dino_p, - xfs_ino_t ino_num, xfs_dfiloff_t bno, int whichfork) -{ - xfs_dfsbno_t fsbno; - - switch (XFS_DFORK_FORMAT(dino_p, whichfork)) { - case XFS_DINODE_FMT_EXTENTS: - fsbno = getfunc_extlist(mp, ino_num, dino_p, bno, whichfork); - break; - case XFS_DINODE_FMT_BTREE: - fsbno = getfunc_btree(mp, ino_num, dino_p, bno, whichfork); - break; - case XFS_DINODE_FMT_LOCAL: - do_error(_("get_bmapi() called for local inode %" PRIu64 "\n"), - ino_num); - fsbno = NULLDFSBNO; - break; - default: - /* - * shouldn't happen - */ - do_error(_("bad inode format for inode %" PRIu64 "\n"), ino_num); - fsbno = NULLDFSBNO; - } - - return(fsbno); -} - -/* * higher level inode processing stuff starts here: * first, one utility routine for each type of inode */ diff --git a/repair/dinode.h b/repair/dinode.h index 5ee51ca..80f3e4e 100644 --- a/repair/dinode.h +++ b/repair/dinode.h @@ -119,12 +119,6 @@ get_agino_buf(xfs_mount_t *mp, xfs_agino_t agino, xfs_dinode_t **dipp); -xfs_dfsbno_t -get_bmapi(xfs_mount_t *mp, - xfs_dinode_t *dip, - xfs_ino_t ino_num, - xfs_dfiloff_t bno, - int whichfork ); void dinode_bmbt_translation_init(void); char * get_forkname(int whichfork); -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FB1F7F53 for ; Tue, 15 Apr 2014 03:25:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E7D8CAC007 for ; Tue, 15 Apr 2014 01:25:13 -0700 (PDT) X-ASG-Debug-ID: 1397550308-04cbb06e9d39330001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Fv6yYjqKqBBclmqQ for ; Tue, 15 Apr 2014 01:25:09 -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: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWo1/gQGEIgSuaiuBLA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WT-AZ for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008QJ-9f for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 8/9] repair: handle remote sylmlink CRC errors Date: Tue, 15 Apr 2014 18:25:00 +1000 X-ASG-Orig-Subj: [PATCH 8/9] repair: handle remote sylmlink CRC errors Message-Id: <1397550301-31883-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550308 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We can't really repair broken symlink buffer contents, but we can at least warn about it and correct the CRC error so the symlink is again readable. Signed-off-by: Dave Chinner --- repair/dinode.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index b086bec..51863c4 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1254,6 +1254,7 @@ process_symlink_remote( while (pathlen > 0) { int blk_cnt = 1; int byte_cnt; + int dirty = 0; fsbno = blkmap_get(blkmap, i); if (fsbno == NULLDFSBNO) { @@ -1284,6 +1285,12 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), lino, i, fsbno); return 1; } + if (bp->b_error == EFSBADCRC) { + do_warn( +_("Bad symlink buffer CRC block %" PRIu64 ", inode %" PRIu64 ".\n" + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); + dirty = 1; + } byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); byte_cnt = MIN(pathlen, byte_cnt); @@ -1307,7 +1314,10 @@ _("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n") offset += byte_cnt; i++; - libxfs_putbuf(bp); + if (dirty) + libxfs_writebuf(bp, 0); + else + libxfs_putbuf(bp); } return 0; } -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E0797F5E for ; Tue, 15 Apr 2014 03:25:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A7B4304066 for ; Tue, 15 Apr 2014 01:25:14 -0700 (PDT) X-ASG-Debug-ID: 1397550306-04bdf0455538b60005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id DMi2Cn0MX7Fpyje9 for ; Tue, 15 Apr 2014 01:25:12 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWo8AhCIErmor Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WR-9c for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Q9-8q for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/9] repair: report AG btree verifier errors Date: Tue, 15 Apr 2014 18:24:58 +1000 X-ASG-Orig-Subj: [PATCH 6/9] repair: report AG btree verifier errors Message-Id: <1397550301-31883-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550312 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we scan the filesystem freespace and inode maps in phase 2, we don't report CRC errors that are found. We don't really care from a repair perspective, because the trees are completely rebuilt from the ground up in phase 5, but froma checking perspective we need to inform the user that we found inconsistencies. Signed-off-by: Dave Chinner --- repair/scan.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 6c43474..75b4b70 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -82,6 +82,12 @@ scan_sbtree( do_error(_("can't read btree block %d/%d\n"), agno, root); return; } + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + do_warn(_("btree block %d/%d is suspect, error %d\n"), + agno, root, bp->b_error); + suspect = 1; + } + (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, isroot, magic, priv); libxfs_putbuf(bp); @@ -123,6 +129,7 @@ scan_lbtree( xfs_buf_t *bp; int err; int dirty = 0; + bool badcrc = false; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), XFS_FSB_TO_BB(mp, 1), 0, ops); @@ -132,14 +139,25 @@ scan_lbtree( XFS_FSB_TO_AGBNO(mp, root)); return(1); } + + /* + * only check for bad CRC here - caller will determine if there + * is a corruption or not and whether it got corrected and so needs + * writing back. CRC errors always imply we need to write the block. + */ + if (bp->b_error == EFSBADCRC) { + do_warn(_("btree block %d/%d is suspect, error %d\n"), + XFS_FSB_TO_AGNO(mp, root), + XFS_FSB_TO_AGBNO(mp, root), bp->b_error); + badcrc = true; + } + err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, type, whichfork, root, ino, tot, nex, blkmapp, bm_cursor, isroot, check_dups, &dirty, magic); - ASSERT(dirty == 0 || (dirty && !no_modify)); - - if (dirty && !no_modify) + if ((dirty || badcrc) && !no_modify) libxfs_writebuf(bp, 0); else libxfs_putbuf(bp); @@ -1066,6 +1084,9 @@ scan_freelist( do_abort(_("can't read agfl block for ag %d\n"), agno); return; } + if (agflbuf->b_error == EFSBADCRC) + do_warn(_("agfl has bad CRC for ag %d\n"), agno); + freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); i = be32_to_cpu(agf->agf_flfirst); -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 260F67F53 for ; Tue, 15 Apr 2014 03:25:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B371304067 for ; Tue, 15 Apr 2014 01:25:14 -0700 (PDT) X-ASG-Debug-ID: 1397550308-04cbb06e9d39330002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jZcbSR2RhFYKgEDD for ; Tue, 15 Apr 2014 01:25:13 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWpMiBK5qK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:06 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WU-BG for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008QO-A9 for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Date: Tue, 15 Apr 2014 18:25:01 +1000 X-ASG-Orig-Subj: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-Id: <1397550301-31883-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550313 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently the attribute code will not detect and correct errors in the attribute tree. It also fails to validate the CRCs and headers on remote attribute blocks. Ensure that all the attribute blocks are CRC checked and that the processing functions understand the correct block formats for decoding. Signed-off-by: Dave Chinner --- repair/attr_repair.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index ba85ac2..13ec90e 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -611,6 +611,8 @@ verify_da_path(xfs_mount_t *mp, ASSERT(cursor->level[this_level].dirty == 0 || (cursor->level[this_level].dirty && !no_modify)); + if (bp->b_error == EFSBADCRC) + cursor->level[this_level].dirty++; if (cursor->level[this_level].dirty && !no_modify) libxfs_writebuf(cursor->level[this_level].bp, 0); else @@ -974,6 +976,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, xfs_dfsbno_t bno; xfs_buf_t *bp; int clearit = 0, i = 0, length = 0, amountdone = 0; + int hdrsize = 0; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + hdrsize = sizeof(struct xfs_attr3_rmt_hdr); /* ASSUMPTION: valuelen is a valid number, so use it for looping */ /* Note that valuelen is not a multiple of blocksize */ @@ -986,16 +992,26 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, break; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_attr3_rmt_buf_ops); if (!bp) { do_warn( _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); clearit = 1; break; } + + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + do_warn( + _("Corrupt remote block for attributes of inode %" PRIu64 "\n"), ino); + clearit = 1; + break; + } + ASSERT(mp->m_sb.sb_blocksize == XFS_BUF_COUNT(bp)); - length = MIN(XFS_BUF_COUNT(bp), valuelen - amountdone); - memmove(value, XFS_BUF_PTR(bp), length); + + length = MIN(XFS_BUF_COUNT(bp) - hdrsize, valuelen - amountdone); + memmove(value, XFS_BUF_PTR(bp) + hdrsize, length); amountdone += length; value += length; i++; @@ -1320,13 +1336,16 @@ process_leaf_attr_level(xfs_mount_t *mp, } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_attr3_leaf_buf_ops); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), da_bno, dev_bno, ino); goto error_out; } + if (bp->b_error == EFSBADCRC) + repair++; leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); @@ -1382,9 +1401,9 @@ process_leaf_attr_level(xfs_mount_t *mp, current_hashval = greatest_hashval; - if (repair && !no_modify) + if (repair && !no_modify) libxfs_writebuf(bp, 0); - else + else libxfs_putbuf(bp); } while (da_bno != 0); @@ -1512,6 +1531,8 @@ process_longform_attr( ino); return(1); } + if (bp->b_error == EFSBADCRC) + (*repair)++; /* verify leaf block */ leaf = (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); @@ -1555,7 +1576,7 @@ process_longform_attr( 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) { + if (*repair || repairlinks) { *repair = 1; libxfs_writebuf(bp, 0); } else -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 380A07F52 for ; Tue, 15 Apr 2014 03:25:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6671AC006 for ; Tue, 15 Apr 2014 01:25:13 -0700 (PDT) X-ASG-Debug-ID: 1397550309-04cbb06e9a39330002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 6dY81LineBiLl1HW for ; Tue, 15 Apr 2014 01:25:11 -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: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWpMiBK5qKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WQ-9H for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Q4-8C for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/9] repair: detect CRC errors in AG headers Date: Tue, 15 Apr 2014 18:24:57 +1000 X-ASG-Orig-Subj: [PATCH 5/9] repair: detect CRC errors in AG headers Message-Id: <1397550301-31883-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550311 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner repair doesn't currently detect verifier errors in AG header blocks - apart from the primary superblock they are not detected. They are, fortunately, corrected in the important cases (AGF, AGI and AGFL) because these structures are rebuilt in phase 5, but if you run xfs_repair in checking mode it won't report them as bad. Signed-off-by: Dave Chinner --- repair/scan.c | 66 ++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 1744c32..6c43474 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1207,28 +1207,31 @@ scan_ag( void *arg) { struct aghdr_cnts *agcnts = arg; - xfs_agf_t *agf; - xfs_buf_t *agfbuf; + struct xfs_agf *agf; + struct xfs_buf *agfbuf = NULL; int agf_dirty = 0; - xfs_agi_t *agi; - xfs_buf_t *agibuf; + struct xfs_agi *agi; + struct xfs_buf *agibuf = NULL; int agi_dirty = 0; - xfs_sb_t *sb; - xfs_buf_t *sbbuf; + struct xfs_sb *sb = NULL; + struct xfs_buf *sbbuf = NULL; int sb_dirty = 0; int status; + char *objname = NULL; sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), 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; + objname = _("root superblock"); + goto out_free; } + if (sbbuf->b_error == EFSBADCRC || sbbuf->b_error == EFSCORRUPTED) + sb_dirty = 1; + sb = (xfs_sb_t *)calloc(BBSIZE, 1); if (!sb) { do_error(_("can't allocate memory for superblock\n")); - libxfs_putbuf(sbbuf); - return; + goto out_free; } libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); @@ -1236,23 +1239,22 @@ scan_ag( XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), 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); - free(sb); - return; + objname = _("agf block"); + goto out_free; } + if (agfbuf->b_error == EFSBADCRC || agfbuf->b_error == EFSCORRUPTED) + agf_dirty = 1; agf = XFS_BUF_TO_AGF(agfbuf); agibuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), 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); - libxfs_putbuf(sbbuf); - free(sb); - return; + objname = _("agi block"); + goto out_free; } + if (agibuf->b_error == EFSBADCRC || agibuf->b_error == EFSCORRUPTED) + agi_dirty = 1; agi = XFS_BUF_TO_AGI(agibuf); /* fix up bad ag headers */ @@ -1277,7 +1279,7 @@ scan_ag( do_warn(_("would reset bad sb for ag %d\n"), agno); } } - if (status & XR_AG_AGF) { + if (agf_dirty || status & XR_AG_AGF) { if (!no_modify) { do_warn(_("reset bad agf for ag %d\n"), agno); agf_dirty = 1; @@ -1285,7 +1287,7 @@ scan_ag( do_warn(_("would reset bad agf for ag %d\n"), agno); } } - if (status & XR_AG_AGI) { + if (agi_dirty || status & XR_AG_AGI) { if (!no_modify) { do_warn(_("reset bad agi for ag %d\n"), agno); agi_dirty = 1; @@ -1295,15 +1297,9 @@ scan_ag( } if (status && no_modify) { - libxfs_putbuf(agibuf); - libxfs_putbuf(agfbuf); - libxfs_putbuf(sbbuf); - free(sb); - do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), agno); - - return; + goto out_free; } scan_freelist(agf, agcnts); @@ -1341,6 +1337,20 @@ scan_ag( print_inode_list(i); #endif return; + +out_free: + if (sb) + free(sb); + if (agibuf) + libxfs_putbuf(agibuf); + if (agfbuf) + libxfs_putbuf(agfbuf); + if (sbbuf) + libxfs_putbuf(sbbuf); + if (objname) + do_error(_("can't get %s for ag %d\n"), objname, agno); + return; + } #define SCAN_THREADS 32 -- 1.9.0 From dave@fromorbit.com Tue Apr 15 03:25:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5F99D7F5E for ; Tue, 15 Apr 2014 03:25:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55CB98F8033 for ; Tue, 15 Apr 2014 01:25:15 -0700 (PDT) X-ASG-Debug-ID: 1397550309-04cbb06e9a39330003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Bnxg6W554uxkcGau for ; Tue, 15 Apr 2014 01:25:13 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvNdAL7rTFN5LEcvPGdsb2JhbABYgwaIW7x+FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZh3vMWpMiBK5qK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Apr 2014 17:55:06 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WZyfv-0003WP-8Z for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WZyfv-0008Pz-7g for xfs@oss.sgi.com; Tue, 15 Apr 2014 18:25:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Date: Tue, 15 Apr 2014 18:24:56 +1000 X-ASG-Orig-Subj: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Message-Id: <1397550301-31883-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1397550301-31883-1-git-send-email-david@fromorbit.com> References: <1397550301-31883-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397550312 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner repair doesn't currently verifier errors in directory blocks - they cause repair to ignore blocks and hence fail because it can't read critical blocks from the directory. Fix this by having the directory buffer read code detect a verifier error and retry the read without the verifier if the verifier has detected an error. Then pass the verifer error with the successfully read buffer back to the caller, so the caller can handle the error appropriately. In most cases, this is simply marking the directory as needing a rebuild, so once the directory entries have been checked and repaired, it will rewrite all the directory buffers (including the clean ones) and in the process recalculate all the the CRC on the directory blocks. Hence pure CRC errors in directory blocks are now handled correctly by xfs_repair. Signed-off-by: Dave Chinner --- libxfs/rdwr.c | 3 +- repair/phase6.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 90 insertions(+), 21 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index a8f06aa..314c45d 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -724,9 +724,9 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, * validated. Hence if we are supplied an ops function and the * buffer is marked as unchecked, we need to validate it now. */ + bp->b_error = 0; if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { - bp->b_error = 0; bp->b_ops = ops; bp->b_ops->verify_read(bp); bp->b_flags &= ~LIBXFS_B_UNCHECKED; @@ -741,7 +741,6 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, * 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_error = 0; bp->b_ops = ops; error = libxfs_readbufr(btp, blkno, bp, len, flags); if (error) diff --git a/repair/phase6.c b/repair/phase6.c index 0c35e1c..6c5ff53 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -125,6 +125,43 @@ typedef struct freetab { #define DIR_HASH_CK_TOTAL 6 /* + * Need to handle CRC and validation errors specially here. If + * there is a validator error, re-read without the verifier so + * that we get a buffer we can check and repair. Re-attach the + * ops to the buffer after the read so that when it is rewritten + * the CRC is recalculated. + * + * Returns a positive error on failure, 0 for success, and negative + * error if a verifier error occurred and we reread the block without + * the verifier successfully. + */ +static int +dir_read_buf( + struct xfs_inode *ip, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops) +{ + int error; + int error2; + + error = libxfs_da_read_buf(NULL, ip, bno, mappedbno, bpp, + XFS_DATA_FORK, ops); + + if (error != EFSBADCRC && error != EFSCORRUPTED) + return error; + + error2 = libxfs_da_read_buf(NULL, ip, bno, mappedbno, bpp, + XFS_DATA_FORK, NULL); + if (error2) + return error2; + + (*bpp)->b_ops = ops; + return -error; +} + +/* * Returns 0 if the name already exists (ie. a duplicate) */ static int @@ -1906,15 +1943,22 @@ longform_dir2_check_leaf( int seeval; struct xfs_dir2_leaf_entry *ents; struct xfs_dir3_icleaf_hdr leafhdr; + int error; + int fixit = 0; da_bno = mp->m_dirleafblk; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, - &xfs_dir3_leaf1_buf_ops)) { + error = dir_read_buf(ip, da_bno, -1, &bp, &xfs_dir3_leaf1_buf_ops); + if (error < 0) { + fixit++; + error = 0; + } + if (error) { do_error( - _("can't read block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); /* NOTREACHED */ } + leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents = xfs_dir3_leaf_ents_p(leaf); @@ -1951,7 +1995,7 @@ longform_dir2_check_leaf( return 1; } libxfs_putbuf(bp); - return 0; + return fixit; } /* @@ -1978,6 +2022,8 @@ longform_dir2_check_node( struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir3_icfree_hdr freehdr; __be16 *bests; + int error; + int fixit = 0; for (da_bno = mp->m_dirleafblk, next_da_bno = 0; next_da_bno != NULLFILEOFF && da_bno < mp->m_dirfreeblk; @@ -1993,11 +2039,16 @@ longform_dir2_check_node( * a node block, then we'll skip it below based on a magic * number check. */ - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK, &xfs_da3_node_buf_ops)) { + error = dir_read_buf(ip, da_bno, -1, &bp, + &xfs_da3_node_buf_ops); + if (error < 0) { + fixit++; + error = 0; + } + if (error) { do_warn( - _("can't read leaf block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read leaf block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); return 1; } leaf = bp->b_addr; @@ -2016,6 +2067,12 @@ longform_dir2_check_node( libxfs_putbuf(bp); return 1; } + + /* + * If there's a validator error, we need to ensure that we got + * the right ops on the buffer for when we write it back out. + */ + bp->b_ops = &xfs_dir3_leafn_buf_ops; if (leafhdr.count > xfs_dir3_max_leaf_ents(mp, leaf) || leafhdr.count < leafhdr.stale) { do_warn( @@ -2039,11 +2096,17 @@ longform_dir2_check_node( next_da_bno = da_bno + mp->m_dirblkfsbs - 1; 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, &xfs_dir3_free_buf_ops)) { + + error = dir_read_buf(ip, da_bno, -1, &bp, + &xfs_dir3_free_buf_ops); + if (error < 0) { + fixit++; + error = 0; + } + if (error) { do_warn( - _("can't read freespace block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read freespace block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); return 1; } free = bp->b_addr; @@ -2093,7 +2156,7 @@ longform_dir2_check_node( return 1; } } - return 0; + return fixit; } /* @@ -2148,6 +2211,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, next_da_bno != NULLFILEOFF && da_bno < mp->m_dirleafblk; da_bno = (xfs_dablk_t)next_da_bno) { const struct xfs_buf_ops *ops; + int error; next_da_bno = da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) @@ -2167,11 +2231,17 @@ longform_dir2_entry_check(xfs_mount_t *mp, ops = &xfs_dir3_block_buf_ops; else ops = &xfs_dir3_data_buf_ops; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bplist[db], - XFS_DATA_FORK, ops)) { + + error = dir_read_buf(ip, da_bno, -1, &bplist[db], ops); + if (error < 0) { + fixit++; + error = 0; + } + + if (error) { do_warn( - _("can't read data block %u for directory inode %" PRIu64 "\n"), - da_bno, ino); + _("can't read data block %u for directory inode %" PRIu64 " error %d\n"), + da_bno, ino, error); *num_illegal += 1; /* @@ -2189,7 +2259,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, irec, ino_offset, &bplist[db], hashtab, &freetab, da_bno, isblock); } - fixit = (*num_illegal != 0) || dir2_is_badino(ino) || *need_dot; + fixit |= (*num_illegal != 0) || dir2_is_badino(ino) || *need_dot; if (!dotdot_update) { /* check btree and freespace */ -- 1.9.0 From johannes.truschnigg@geizhals.at Tue Apr 15 07:23:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C7FB87F3F for ; Tue, 15 Apr 2014 07:23:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 436A5AC006 for ; Tue, 15 Apr 2014 05:23:12 -0700 (PDT) X-ASG-Debug-ID: 1397564589-04cb6c243845bf0001-NocioJ Received: from morework.geizhals.at (morework.geizhals.at [78.142.138.3]) by cuda.sgi.com with ESMTP id jrH5ynVoUm6flHhf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 05:23:10 -0700 (PDT) X-Barracuda-Envelope-From: johannes.truschnigg@geizhals.at X-Barracuda-Apparent-Source-IP: 78.142.138.3 Received: from localhost (localhost [127.0.0.1]) by morework.geizhals.at (Postfix) with ESMTP id 41B021248385 for ; Tue, 15 Apr 2014 14:23:09 +0200 (CEST) X-Virus-Scanned: amavisd-new at geizhals.at Received: from morework.geizhals.at ([127.0.0.1]) by localhost (morework.geizhals.at [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LJB7hjLeupHC; Tue, 15 Apr 2014 14:23:07 +0200 (CEST) Received: from [10.0.0.137] (unknown [10.0.0.137]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: jt) by morework.geizhals.at (Postfix) with ESMTPSA id 9B9F11248382; Tue, 15 Apr 2014 14:23:07 +0200 (CEST) Message-ID: <534D24AB.1050605@geizhals.at> Date: Tue, 15 Apr 2014 14:23:07 +0200 From: Johannes Truschnigg User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131103 Icedove/17.0.10 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md Content-Transfer-Encoding: 7bit X-Barracuda-Connect: morework.geizhals.at[78.142.138.3] X-Barracuda-Start-Time: 1397564590 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi list, we're building a postgres streaming replication slave that's supposed to pick up work if our primary pg cluster (with an all-flash FC SAN appliance as its backend store) goes down. We'll be using consumer-grade hardware for this setup, which I detail below: o 2x Intel Xeon E5-2630L (24 threads total) o 512GB DDR3 ECC RDIMM o Intel C606-based Dual 4-Port SATA/SAS HBA (PCIID 8086:1d68) o 6x Samsung 830 SSD with 512GB each, 25% reserved for HPA o Debian GNU/Linux 7.x "Wheezy" + backports kernel (3.13+) o PostgreSQL 9.0 If there's anything else that is of critical interest that I forgot to mention, hardware- or software-wise, please let me know. When benchmarking the individual SSDs with fio (using the libaio backend), the IOPS we've seen were in the 30k-35k range overall for 4K block sizes. The host will be on the receiving end of a pg9.0 streaming replication cluster setup where the master handles ~50k IOPS peak, and I'm thinking what'd be a good approach to design the local storage stack (with availability in mind) in a way that has a chance to keep up with our flash-based FC SAN. After digging through linux-raid archives, I think the most sensible approach are two-disk pairs in RAID1 that are concatenated via either LVM2 or md (leaning towards the latter, since I'd expect that to have a tad less overhead), and xfs on top of that resulting block device. That should yield roughly 1.2TB of usable space (we need a minimum of 900GB for the DB). With this setup, it should be possible to have up to 3 CPUs busy with handling I/O on the block side of things, which raises the question what'd be a sensible value to choose for xfs' Allocation Group Count/agcount. I've been trying to find information on that myself, but what I managed to dig up is, at times, so old that it seems rather outlandish today - some sources on the web (from 2003), for example, say that one AG per 4GB of underlying diskspace makes sense, which seems excessive for a 1200GB volume. I've experimented with mkfs.xfs (on top of LVM only; I don't know if it takes into account lower block layers and seen that it supposedly chooses to default to an agcount of 4, which seems insufficient given the max. bandwidth our setup should be able to provide. Apart from that, is there any kind of advice you can share for tuning xfs to run postgres (9.0 initially, but we're planning to upgrade to 9.3 or later eventually) on in 2014, especially performance-wise? Thanks, regards: - Johannes From lczerner@redhat.com Tue Apr 15 08:11:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC40A7F3F for ; Tue, 15 Apr 2014 08:11:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD4B28F8037 for ; Tue, 15 Apr 2014 06:11:07 -0700 (PDT) X-ASG-Debug-ID: 1397567463-04cb6c243648a80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id W0TY8SE0BjsAbcvN for ; Tue, 15 Apr 2014 06:11:03 -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 s3FDAfBc008193 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Apr 2014 09:10:41 -0400 Received: from dhcp-1-205.brq.redhat.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3FDAcvk025829 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 15 Apr 2014 09:10:40 -0400 Date: Tue, 15 Apr 2014 15:10:38 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate In-Reply-To: <20140412152117.GB18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> <20140412152117.GB18047@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397567463 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, 12 Apr 2014, Christoph Hellwig wrote: > Date: Sat, 12 Apr 2014 08:21:17 -0700 > From: Christoph Hellwig > To: Lukas Czerner > Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, > linux-ext4@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate > > Looks good, but the subject line is misleading, it should read something > like: > > "fs: move falloc collapse range check into the filesystem methods" > > Might also be worth mentioning that size checks for the other modes > are in the filesystems in the the long description. I'll update the description and the subject. Thanks! -Lukas > > Reviewed-by: Christoph Hellwig > From lczerner@redhat.com Tue Apr 15 08:27:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E6B47F3F for ; Tue, 15 Apr 2014 08:27:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B7648F8037 for ; Tue, 15 Apr 2014 06:27:22 -0700 (PDT) X-ASG-Debug-ID: 1397568441-04cb6c243649cb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mvWcMCUhz2nNAaik for ; Tue, 15 Apr 2014 06:27:21 -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-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 s3FDJoJ2009551 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 09:19:51 -0400 Received: from dhcp-1-205.brq.redhat.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FDJlFO031051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 15 Apr 2014 09:19:48 -0400 Date: Tue, 15 Apr 2014 15:19:47 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile In-Reply-To: <20140412152225.GC18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile Message-ID: References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-4-git-send-email-lczerner@redhat.com> <20140412152225.GC18047@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397568441 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, 12 Apr 2014, Christoph Hellwig wrote: > Date: Sat, 12 Apr 2014 08:22:25 -0700 > From: Christoph Hellwig > To: Lukas Czerner > Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, > linux-ext4@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 4/4] fs: Disallow all fallocate operation on active > swapfile > > Given that the earlier patches were about races - what protects us > from swapon racing with the check outside the filesystem locks? > That would be fairies :) This patch is obviously wrong so I'll drop it and try to think about better way of dealing with this. Thanks! -Lukas From lczerner@redhat.com Tue Apr 15 08:38:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A7F647F3F for ; Tue, 15 Apr 2014 08:38:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 95387304051 for ; Tue, 15 Apr 2014 06:38:22 -0700 (PDT) X-ASG-Debug-ID: 1397569101-04cbb06e9c4d900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YKNDJcptJthbmjdM for ; Tue, 15 Apr 2014 06:38:21 -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-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 s3FD9jIB007692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 09:09:45 -0400 Received: from dhcp-1-205.brq.redhat.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FD9hX4002495 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 15 Apr 2014 09:09:44 -0400 Date: Tue, 15 Apr 2014 15:09:42 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file In-Reply-To: <20140412151935.GA18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-2-git-send-email-lczerner@redhat.com> <20140412151935.GA18047@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397569101 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, 12 Apr 2014, Christoph Hellwig wrote: > Date: Sat, 12 Apr 2014 08:19:35 -0700 > From: Christoph Hellwig > To: Lukas Czerner > Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, > linux-ext4@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only > file > > On Fri, Apr 11, 2014 at 08:57:43PM +0200, Lukas Czerner wrote: > > /* > > - * It's not possible to punch hole or perform collapse range > > - * on append only file > > + * It's not possible to punch hole, perform collapse range > > + * or zero range on append only file > > */ > > - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) > > + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE | > > + FALLOC_FL_ZERO_RANGE) > > Might be better to make this a negative test fo the operation that is > allowed on an appen only file. That's also much better future proof. > True, it might be better to do it this way: if (mode & ~FALLOC_FL_KEEP_SIZE && IS_APPEND(inode)) this makes FALLOC_FL_NO_HIDE_STALE (reserved, not implemented) potentially not work on the append only file since it could change the content of the file. Will resend. Thanks! -Lukas From bfoster@redhat.com Tue Apr 15 09:59:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 933227F3F for ; Tue, 15 Apr 2014 09:59:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 75FD2304071 for ; Tue, 15 Apr 2014 07:59:33 -0700 (PDT) X-ASG-Debug-ID: 1397573971-04cb6c243651690001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NLdU6HEhCQPoOVuO for ; Tue, 15 Apr 2014 07:59:32 -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 s3FExTId030514 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 10:59:29 -0400 Received: from laptop.bfoster (vpn-48-211.rdu2.redhat.com [10.10.48.211]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FExSkm025833; Tue, 15 Apr 2014 10:59:29 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 0330B120AC3; Tue, 15 Apr 2014 10:59:27 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3FExPPw005298; Tue, 15 Apr 2014 10:59:25 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 15 Apr 2014 10:59:25 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, bob.mastors@solidfire.com, snitzer@redhat.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-ID: <20140415145924.GA3470@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> <20140414192824.GC62307@bfoster.bfoster> <20140415021546.GD31578@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140415021546.GD31578@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397573972 X-Barracuda-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, Apr 15, 2014 at 12:15:46PM +1000, Dave Chinner wrote: > On Mon, Apr 14, 2014 at 03:28:24PM -0400, Brian Foster wrote: > > On Thu, Apr 10, 2014 at 02:42:35PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > And interesting situation can occur if a log IO error occurs during > > > the unmount of a filesystem. The cases reported have the same > > > signature - the update of the superblock counters fails due to a log > > > write IO error: > > > > > > XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 > > > XFS (dm-16): Log I/O Error Detected. Shutting down filesystem > > > XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. > > > XFS (dm-16): xfs_log_force: error 5 returned. > > > XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) > > > > > > It can be seen that the last line of output contains a corrupt > > > device name - this is because the log and xfs_mount structures have > > > already been freed by the time this message is printed. A kernel > > > oops closely follows. > > > > > > The issue is that the shutdown is occurring in a separate IO > > > completion thread to the unmount. Once the shutdown processing has > > > started and all the iclogs are marked with XLOG_STATE_IOERROR, the > > > log shutdown code wakes anyone waiting on a log force so they can > > > process the shutdown error. This wakes up the unmount code that > > > is doing a synchronous transaction to update the superblock > > > counters. > > > > > > The unmount path now sees all the iclogs are marked with > > > XLOG_STATE_IOERROR and so never waits on them again, knowing that if > > > it does, there will not be a wakeup trigger for it and we will hang > > > the unmount if we do. Hence the unmount runs through all the > > > remaining code and frees all the filesystem structures while the > > > xlog_iodone() is still processing the shutdown. When the log > > > shutdown processing completes, xfs_do_force_shutdown() emits the > > > "Please umount the filesystem and rectify the problem(s)" message, > > > and xlog_iodone() then aborts all the objects attached to the iclog. > > > An iclog that has already been freed.... > > > > > > The real issue here is that there is no serialisation point between > > > the log IO and the unmount. We have serialisations points for log > > > writes, log forces, reservations, etc, but we don't actually have > > > any code that wakes for log IO to fully complete. We do that for all > > > other types of object, so why not iclogbufs? > > > > > > Well, it turns out that we can easily do this. We've got xfs_buf > > > handles, and that's what everyone else uses for IO serialisation. > > > i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only > > > release the lock in xlog_iodone() when we are finished with the > > > buffer. That way before we tear down the iclog, we can lock and > > > unlock the buffer to ensure IO completion has finished completely > > > before we tear it down. > > > > > > > Thanks for the write up... > ..... > > On reading the code, my initial thought was that the source of this is > > the xlog_state_do_callback() call down in the shutdown path, when > > invoked from the log I/O completion handler. I think you pointed out in > > your previous reply that even if we were to make that call selective > > (e.g., based on whether the shutdown is due to a log error and thus we > > can expect xlog_state_do_callback() to be invoked), we still access > > relevant data structures after the ic_force_wait wait_queue is woken. > > Therefore, there would still be a race even if we bypassed the call from > > within the shutdown path in this particular case. > > > > The logic seems sane to me. I don't notice any issues. But my only > > question is why the use of locking, as opposed to wiring up use of > > b_iowait or something into the log I/O handler? > > Log IO is issued B_ASYNC, so the buffer IO completion handlers do > not issue wakeups to b_iowait waiters. And the iclogbufs are > uncached buffers, so we can't use the buffer cache waiting > mechanisms to wait for them, either. > Yeah, I noticed that the completion wouldn't fire as is since it appears that doesn't occur if a b_iodone call is provided. FWIW, the thought process was more to inherit the use of b_iowait in xlog_iodone(). > > I ask because it looks > > just a _bit_ funny to see the lock/unlock cycles used purely as a > > serialization mechanism. Do we use this kind of pattern in other places? > > Yes, in xfs_log_quiesce(), to wait on the superblock buffer IO > because: > > /* > * The superblock buffer is uncached and while xfs_ail_push_all_sync() > * will push it, xfs_wait_buftarg() will not wait for it. Further, > * xfs_buf_iowait() cannot be used because it was pushed with the > * XBF_ASYNC flag set, so we need to use a lock/unlock pair to wait for > * the IO to complete. > */ > > Which is exactly the same situation as the iclogbufs - uncached > buffers, B_ASYNC IO.... > Ok, thanks. I see the AIL is pushing buffers through the delwri interface, which means XBF_ASYNC and thus b_iowait is not fired. What I'm missing about this example is how this serializes xfs_log_quiesce() against I/O completion of the superblock... It looks like we (if necessary), grab/lock the sb at transaction commit time (xfs_trans_apply_sb_deltas()), make any modifications tracked by the transaction, log the sb buffer and commit the transaction. At that point, isn't the buffer lock released at iop_unlock() time..? My understanding is that this protects against concurrent access. So the super could be unlocked once the transaction is committed, we do a log sync, push the ail and do a wait_buftarg(). If the latter won't wait on sb_bp, what prevents the buf_lock from being acquired before the async write completes..? > > I guess on the other hand you could argue it protects the I/O in > > progress, and yet another wait_queue in this codepath might be overkill > > (so I like the use of an existing mechanism from that standpoint). > > Mostly I figured that we already have the same IO wait mechanism in > the log shutdown path for other buffers, so it seemed silly to add > waitqueues and other infrastructure for something that could be > handled very easily. It also makes the iclogs look like every other > buffer in the filesystem in that the buffer lock is held over IO. > When you point out that all buffers in the fs are locked over I/O, I suspect I'm missing something fundamental in the buffer I/O path. ;) Digging a little deeper, I see __xfs_buf_delwri_submit() takes the buffer lock and sends the buffer down for I/O. The lock is correspondingly released for XBF_ASYNC buffers in the xfs_buf_iodone_work() callback. So in the example used above, the sb can be locked, modifed, logged, committed and unlocked in the tp commit path. The log sync pushes everything to the log. The AIL push submits writes for all active items (thus acquiring sb_bp lock). The wait_buftarg() presumably waits for all cached buffers to write out and the sb_bp lock serializes against completion of the sb buffer individually. So in a sense, you've done what I was thinking about with regard to inheriting b_iowait into the log callback, just doing so with the locking mechanism instead. Only that appears to be more consistent with general buffer handling, given that the log buffer I/O is async... Reviewed-by: Brian Foster Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From tytso@thunk.org Tue Apr 15 10:36:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0E4097F3F for ; Tue, 15 Apr 2014 10:36:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98D9BAC001 for ; Tue, 15 Apr 2014 08:36:53 -0700 (PDT) X-ASG-Debug-ID: 1397576208-04cbb06e9c574b0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id szHA7c2oxD8w81mE (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 08:36:48 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Wa5Pg-0000x8-BB; Tue, 15 Apr 2014 15:36:44 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C2F1B580893; Tue, 15 Apr 2014 11:36:43 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397576203; bh=lZX/9eKJhLjOQr7qp2/E7lu4szP6Xa2Qtv6r+Kq5pnk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=qQ26WbSQYfPFtwBSz3JLaDAA01fdZB02eksMaM9hm9lRhn0y6zymjDvFt3iUV0frW o7sCR757LbQ3mqMNS+dvneJsJYQa22XRopCsY2PrbxxkxOkZaVLyVtZcmC4S346IUL CaSsw2TcfTLa8xkuqvLiHX6ClJyfGSeyl7JM/CYI= Date: Tue, 15 Apr 2014 11:36:43 -0400 From: Theodore Ts'o To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: <20140415153643.GB4456@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> <20140412152117.GB18047@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397576208 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 15, 2014 at 03:10:38PM +0200, Lukáš Czerner wrote: > > I'll update the description and the subject. Lukáš, FYI, I'm waiting for your update(s) to these patches in response to Christoph's comments. I'd like to push a set of bugfixes to Linus, hopefully this week so they can make -rc2. Cheers, - Ted From fdmanana@gmail.com Tue Apr 15 10:43:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 664AF7F3F for ; Tue, 15 Apr 2014 10:43:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 06A87AC005 for ; Tue, 15 Apr 2014 08:43:29 -0700 (PDT) X-ASG-Debug-ID: 1397576606-04bdf0455458e40001-NocioJ Received: from mail-we0-f173.google.com (mail-we0-f173.google.com [74.125.82.173]) by cuda.sgi.com with ESMTP id 508rHVUSlLTGfcI3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 08:43:27 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.173 Received: by mail-we0-f173.google.com with SMTP id w61so9528993wes.4 for ; Tue, 15 Apr 2014 08:43:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=BT8+ptO44LaQQsewSCF1F/OWY3FLLHDd7ZbTio2sv/E=; b=J6KzASxr2Weg7axX+MXNp8VOoMtRPueTUxV+kkwjZSd1BWRQw9wnc0XkESOTCp1CLO I0vvX3ZVYqDoQiXsEM/gORGVdVSilg6RHEXLbXiLho/W60gaCpXapBk0BZuRi4oO9xBO yHcnFP1G+lx8aXs3chle+th6RyUoqfs9/TtDezT3qg5+idNpiAONfvzYGCiYKo5z0ERt wine7LsvnNGQzVC4bFspmWF+o3DUa3gbLliTvjcQ6x89h39TCLD8SOR66/gTpWFdbTHc 18VKsd0EQzlejk+279qyA/ba2QYl6nF7wkvdjNKiDcxlZqZ2vTfqRlcYJ5z0S/IjBfFw 5tfw== X-Received: by 10.181.13.112 with SMTP id ex16mr14941259wid.23.1397576606393; Tue, 15 Apr 2014 08:43:26 -0700 (PDT) Received: from debian-vm3.lan (bl10-141-238.dsl.telepac.pt. [85.243.141.238]) by mx.google.com with ESMTPSA id vp5sm30195745wjc.31.2014.04.15.08.43.24 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 15 Apr 2014 08:43:25 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents Date: Tue, 15 Apr 2014 17:43:21 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents Message-Id: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-we0-f173.google.com[74.125.82.173] X-Barracuda-Start-Time: 1397576607 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4937 Rule breakdown below pts rule name 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 verifies that after an incremental btrfs send the replicated file has the same exact hole and data structure as in the origin filesystem. This didn't use to be the case before the send stream version 2 - holes were sent as write operations of 0 valued bytes instead of punching holes with the fallocate system call, and pre-allocated extents were sent as well as write operations of 0 valued bytes instead of intructions for the receiver to use the fallocate system call. Also checks that prealloc extents that lie beyond the file's size are replicated by an incremental send. Signed-off-by: Filipe David Borba Manana --- tests/btrfs/047 | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/047.out | 57 +++++++++++++++++++++++++ tests/btrfs/group | 1 + 3 files changed, 177 insertions(+) create mode 100755 tests/btrfs/047 create mode 100644 tests/btrfs/047.out diff --git a/tests/btrfs/047 b/tests/btrfs/047 new file mode 100755 index 0000000..bf71595 --- /dev/null +++ b/tests/btrfs/047 @@ -0,0 +1,119 @@ +#! /bin/bash +# FS QA Test No. btrfs/047 +# +# Verify that after an incremental btrfs send the replicated file has +# the same exact hole and data structure as in the origin filesystem. +# This didn't use to be the case before the send stream version 2 - +# holes were sent as write operations of 0 valued bytes instead of punching +# holes with the fallocate system call, and pre-allocated extents were sent +# as well as write operations of 0 valued bytes instead of intructions for +# the receiver to use the fallocate system call. Also check that prealloc +# extents that lie beyond the file's size are replicated by an incremental +# send. +# +# More specifically, this structure preserving guarantee was added by the +# following linux kernel commits: +# +# Btrfs: send, use fallocate command to punch holes +# Btrfs: send, use fallocate command to allocate extents +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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" + +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_require_xfs_io_fiemap +_need_to_be_root + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +$XFS_IO_PROG -f -c "pwrite -S 0x01 -b 300000 0 300000" $SCRATCH_MNT/foo \ + | _filter_xfs_io + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +$XFS_IO_PROG -c "fpunch 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "pwrite -S 0xff -b 1000 120000 1000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "fpunch 250000 20000" $SCRATCH_MNT/foo + +$XFS_IO_PROG -c "falloc -k 300000 1000000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc -k 9000000 2000000" $SCRATCH_MNT/foo + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch + +_scratch_unmount +_check_scratch_fs + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/047.out b/tests/btrfs/047.out new file mode 100644 index 0000000..44e4546 --- /dev/null +++ b/tests/btrfs/047.out @@ -0,0 +1,57 @@ +QA output created by 047 +wrote 300000/300000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1000/1000 bytes at offset 120000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +SCRATCH_MNT/mysnap2/foo: + 0: [0..191]: 25088..25279 192 blocks + 1: [192..199]: 24576..24583 8 blocks + 2: [200..231]: 24592..24623 32 blocks + 3: [232..239]: 24688..24695 8 blocks + 4: [240..287]: 24632..24679 48 blocks + 5: [288..295]: 24584..24591 8 blocks + 6: [296..487]: 25384..25575 192 blocks + 7: [488..495]: 24696..24703 8 blocks + 8: [496..519]: hole 24 blocks + 9: [520..527]: 24704..24711 8 blocks + 10: [528..583]: 25616..25671 56 blocks + 11: [584..591]: 24712..24719 8 blocks + 12: [592..2543]: 26192..28143 1952 blocks + 13: [2544..17575]: hole 15032 blocks + 14: [17576..21487]: 28144..32055 3912 blocks +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +SCRATCH_MNT/mysnap2/foo: + 0: [0..191]: 25096..25287 192 blocks + 1: [192..199]: 24672..24679 8 blocks + 2: [200..231]: 24584..24615 32 blocks + 3: [232..239]: 24680..24687 8 blocks + 4: [240..287]: 24616..24663 48 blocks + 5: [288..295]: 24688..24695 8 blocks + 6: [296..487]: 25392..25583 192 blocks + 7: [488..495]: 24696..24703 8 blocks + 8: [496..519]: hole 24 blocks + 9: [520..527]: 24704..24711 8 blocks + 10: [528..583]: 25624..25679 56 blocks + 11: [584..591]: 24712..24719 8 blocks + 12: [592..2543]: 26192..28143 1952 blocks + 13: [2544..17575]: hole 15032 blocks + 14: [17576..21487]: 28144..32055 3912 blocks diff --git a/tests/btrfs/group b/tests/btrfs/group index 3a6d34e..d4e3fc1 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -49,3 +49,4 @@ 044 auto quick 045 auto quick 046 auto quick +047 auto quick -- 1.9.1 From lczerner@redhat.com Tue Apr 15 11:17:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 726227F3F for ; Tue, 15 Apr 2014 11:17:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52BD730406B for ; Tue, 15 Apr 2014 09:17:32 -0700 (PDT) X-ASG-Debug-ID: 1397578651-04cb6c243659cc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EOGSXvB41UlbeSA4 for ; Tue, 15 Apr 2014 09:17:31 -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 s3FG9bVf032571 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Apr 2014 12:09:38 -0400 Received: from dhcp-1-205.brq.redhat.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3FG9YfP013450 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 15 Apr 2014 12:09:36 -0400 Date: Tue, 15 Apr 2014 18:09:34 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: "Theodore Ts'o" cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate In-Reply-To: <20140415153643.GB4456@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> <20140412152117.GB18047@infradead.org> <20140415153643.GB4456@thunk.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-1907578942-1397578177=:2146" 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: 1397578651 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-1907578942-1397578177=:2146 Content-Type: TEXT/PLAIN; charset=utf-8 Content-Transfer-Encoding: 8BIT On Tue, 15 Apr 2014, Theodore Ts'o wrote: > Date: Tue, 15 Apr 2014 11:36:43 -0400 > From: Theodore Ts'o > To: Lukáš Czerner > Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, > ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate > > On Tue, Apr 15, 2014 at 03:10:38PM +0200, Lukáš Czerner wrote: > > > > I'll update the description and the subject. > > Lukáš, FYI, I'm waiting for your update(s) to these patches in > response to Christoph's comments. > > I'd like to push a set of bugfixes to Linus, hopefully this week so > they can make -rc2. > > Cheers, > > - Ted > Ok, I'll run some tests and resend it right away without the patch #4. Thanks! -Lukas --8323328-1907578942-1397578177=:2146-- From bfoster@redhat.com Tue Apr 15 11:18:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 607EE7F3F for ; Tue, 15 Apr 2014 11:18:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 414B230406B for ; Tue, 15 Apr 2014 09:18:30 -0700 (PDT) X-ASG-Debug-ID: 1397578708-04bdf045535d0d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1fc2zkB9F4jg90tS for ; Tue, 15 Apr 2014 09:18:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3FGISci002008 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGISJD022752 for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1EF97125740; Tue, 15 Apr 2014 12:18:27 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 3/4] xfs: replace on-stack xfs_trans_res with pointer in xfs_create() Date: Tue, 15 Apr 2014 12:18:25 -0400 X-ASG-Orig-Subj: [PATCH v3 3/4] xfs: replace on-stack xfs_trans_res with pointer in xfs_create() Message-Id: <1397578706-5385-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1397578706-5385-1-git-send-email-bfoster@redhat.com> References: <1397578706-5385-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: 1397578709 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There's no need to store a full struct xfs_trans_res on the stack in xfs_create() and copy the fields. Use a pointer to the appropriate structures embedded in the xfs_mount. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 0e63c7d..f8a232a 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1158,7 +1158,7 @@ xfs_create( struct xfs_dquot *udqp = NULL; struct xfs_dquot *gdqp = NULL; struct xfs_dquot *pdqp = NULL; - struct xfs_trans_res tres; + struct xfs_trans_res *tres; uint resblks; trace_xfs_create(dp, name); @@ -1181,13 +1181,11 @@ xfs_create( if (is_dir) { rdev = 0; resblks = XFS_MKDIR_SPACE_RES(mp, name->len); - tres.tr_logres = M_RES(mp)->tr_mkdir.tr_logres; - tres.tr_logcount = XFS_MKDIR_LOG_COUNT; + tres = &M_RES(mp)->tr_mkdir; tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR); } else { resblks = XFS_CREATE_SPACE_RES(mp, name->len); - tres.tr_logres = M_RES(mp)->tr_create.tr_logres; - tres.tr_logcount = XFS_CREATE_LOG_COUNT; + tres = &M_RES(mp)->tr_create; tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE); } @@ -1199,17 +1197,16 @@ xfs_create( * the case we'll drop the one we have and get a more * appropriate transaction later. */ - tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; - error = xfs_trans_reserve(tp, &tres, resblks, 0); + error = xfs_trans_reserve(tp, tres, resblks, 0); if (error == ENOSPC) { /* flush outstanding delalloc blocks and retry */ xfs_flush_inodes(mp); - error = xfs_trans_reserve(tp, &tres, resblks, 0); + error = xfs_trans_reserve(tp, tres, resblks, 0); } if (error == ENOSPC) { /* No space at all so try a "no-allocation" reservation */ resblks = 0; - error = xfs_trans_reserve(tp, &tres, 0, 0); + error = xfs_trans_reserve(tp, tres, 0, 0); } if (error) { cancel_flags = 0; -- 1.8.3.1 From bfoster@redhat.com Tue Apr 15 11:18:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B7037F4E for ; Tue, 15 Apr 2014 11:18:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4FAD6304075 for ; Tue, 15 Apr 2014 09:18:30 -0700 (PDT) X-ASG-Debug-ID: 1397578708-04bdf045555d0e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0A4tstd8pS2p22FL for ; Tue, 15 Apr 2014 09:18:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3FGISix031910 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGIS94024201 for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 338BA125742; Tue, 15 Apr 2014 12:18:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 1/4] xfs: fix tmpfile/selinux ilock deadlock Date: Tue, 15 Apr 2014 12:18:23 -0400 X-ASG-Orig-Subj: [PATCH v3 1/4] xfs: fix tmpfile/selinux ilock deadlock Message-Id: <1397578706-5385-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1397578706-5385-1-git-send-email-bfoster@redhat.com> References: <1397578706-5385-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: 1397578709 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfstests generic/004 reproduces an ilock deadlock using the tmpfile interface when selinux is enabled. This occurs because xfs_create_tmpfile() takes the ilock and then calls d_tmpfile(). The latter eventually calls into xfs_xattr_get() which attempts to get the lock again. E.g.: xfs_io D ffffffff81c134c0 4096 3561 3560 0x00000080 ffff8801176a1a68 0000000000000046 ffff8800b401b540 ffff8801176a1fd8 00000000001d5800 00000000001d5800 ffff8800b401b540 ffff8800b401b540 ffff8800b73a6bd0 fffffffeffffffff ffff8800b73a6bd8 ffff8800b5ddb480 Call Trace: [] schedule+0x29/0x70 [] rwsem_down_read_failed+0xc5/0x120 [] ? xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] call_rwsem_down_read_failed+0x14/0x30 [] ? down_read_nested+0x89/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] xfs_attr_get+0x90/0xe0 [xfs] [] xfs_xattr_get+0x37/0x50 [xfs] [] generic_getxattr+0x4f/0x70 [] inode_doinit_with_dentry+0x1ae/0x650 [] selinux_d_instantiate+0x1c/0x20 [] security_d_instantiate+0x1b/0x30 [] d_instantiate+0x50/0x70 [] d_tmpfile+0xb5/0xc0 [] xfs_create_tmpfile+0x362/0x410 [xfs] [] xfs_vn_tmpfile+0x18/0x20 [xfs] [] path_openat+0x228/0x6a0 [] ? sched_clock+0x9/0x10 [] ? kvm_clock_read+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_filp_open+0x3a/0x90 [] ? _raw_spin_unlock+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_sys_open+0x12e/0x210 [] SyS_open+0x1e/0x20 [] system_call_fastpath+0x16/0x1b Pull the d_tmpfile() call up into xfs_vn_tmpfile() after the transaction has been committed and the inode unlocked. This pattern is consistent with other dcache callers (e.g., d_instantiate()) in xfs_iops.c. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 6 +++--- fs/xfs/xfs_inode.h | 4 ++-- fs/xfs/xfs_iops.c | 14 +++++++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5e7a38f..0e63c7d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1333,8 +1333,8 @@ xfs_create( int xfs_create_tmpfile( struct xfs_inode *dp, - struct dentry *dentry, - umode_t mode) + umode_t mode, + struct xfs_inode **ipp) { struct xfs_mount *mp = dp->i_mount; struct xfs_inode *ip = NULL; @@ -1402,7 +1402,6 @@ xfs_create_tmpfile( xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); ip->i_d.di_nlink--; - d_tmpfile(dentry, VFS_I(ip)); error = xfs_iunlink(tp, ip); if (error) goto out_trans_abort; @@ -1415,6 +1414,7 @@ xfs_create_tmpfile( xfs_qm_dqrele(gdqp); xfs_qm_dqrele(pdqp); + *ipp = ip; return 0; out_trans_abort: diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 396cc1f..4a612fd 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -333,8 +333,8 @@ int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, struct xfs_inode **ipp, struct xfs_name *ci_name); int xfs_create(struct xfs_inode *dp, struct xfs_name *name, umode_t mode, xfs_dev_t rdev, struct xfs_inode **ipp); -int xfs_create_tmpfile(struct xfs_inode *dp, struct dentry *dentry, - umode_t mode); +int xfs_create_tmpfile(struct xfs_inode *dp, umode_t mode, + struct xfs_inode **ipp); int xfs_remove(struct xfs_inode *dp, struct xfs_name *name, struct xfs_inode *ip); int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 89b07e4..8fdbc38 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1053,11 +1053,19 @@ xfs_vn_tmpfile( struct dentry *dentry, umode_t mode) { - int error; + int error; + struct xfs_inode *ip; + struct inode *inode; - error = xfs_create_tmpfile(XFS_I(dir), dentry, mode); + error = xfs_create_tmpfile(XFS_I(dir), mode, &ip); + if (unlikely(error)) + return -error; - return -error; + inode = VFS_I(ip); + + d_tmpfile(dentry, inode); + + return 0; } static const struct inode_operations xfs_inode_operations = { -- 1.8.3.1 From bfoster@redhat.com Tue Apr 15 11:18:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3EA677F57 for ; Tue, 15 Apr 2014 11:18:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 211CE8F8039 for ; Tue, 15 Apr 2014 09:18:30 -0700 (PDT) X-ASG-Debug-ID: 1397578709-04cb6c243759e20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pLq80DjTosXVOS4H for ; Tue, 15 Apr 2014 09:18:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGISbG002013 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGISr1032336 for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3DDE512573F; Tue, 15 Apr 2014 12:18:27 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 4/4] xfs: fold xfs_create_tmpfile() into xfs_create() Date: Tue, 15 Apr 2014 12:18:26 -0400 X-ASG-Orig-Subj: [PATCH v3 4/4] xfs: fold xfs_create_tmpfile() into xfs_create() Message-Id: <1397578706-5385-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1397578706-5385-1-git-send-email-bfoster@redhat.com> References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397578709 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_create_tmpfile() duplicates most of xfs_create() with the exception of a couple minor differences. We use a unique transaction reservation and place the allocated inode on the unlinked list rather than create a directory entry for it. Fold xfs_create_tmpfile() into xfs_create() to reduce some of this duplication. The name parameter that represents the name of the directory entry to create is now conditional and its existence dictates whether a directory entry is created for the inode or not. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 178 +++++++++++++---------------------------------------- fs/xfs/xfs_inode.h | 2 - fs/xfs/xfs_iops.c | 2 +- fs/xfs/xfs_trace.h | 7 ++- 4 files changed, 47 insertions(+), 142 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index f8a232a..d82bddf 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1183,10 +1183,14 @@ xfs_create( resblks = XFS_MKDIR_SPACE_RES(mp, name->len); tres = &M_RES(mp)->tr_mkdir; tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR); - } else { + } else if (name) { resblks = XFS_CREATE_SPACE_RES(mp, name->len); tres = &M_RES(mp)->tr_create; tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE); + } else { + resblks = XFS_IALLOC_SPACE_RES(mp); + tres = &M_RES(mp)->tr_create_tmpfile; + tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE_TMPFILE); } cancel_flags = XFS_TRANS_RELEASE_LOG_RES; @@ -1213,9 +1217,6 @@ xfs_create( goto out_trans_cancel; } - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); - unlock_dp_on_error = true; - xfs_bmap_init(&free_list, &first_block); /* @@ -1226,9 +1227,14 @@ xfs_create( if (error) goto out_trans_cancel; - error = xfs_dir_canenter(tp, dp, name, resblks); - if (error) - goto out_trans_cancel; + if (name) { + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + unlock_dp_on_error = true; + + error = xfs_dir_canenter(tp, dp, name, resblks); + if (error) + goto out_trans_cancel; + } /* * A newly created regular or special file just has one directory @@ -1243,34 +1249,41 @@ xfs_create( goto out_trans_abort; } - /* - * Now we join the directory inode to the transaction. We do not do it - * earlier because xfs_dir_ialloc might commit the previous transaction - * (and release all the locks). An error from here on will result in - * the transaction cancel unlocking dp so don't do it explicitly in the - * error path. - */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); - unlock_dp_on_error = false; + if (name) { + /* + * Now we join the directory inode to the transaction. We do not + * do it earlier because xfs_dir_ialloc might commit the + * previous transaction (and release all the locks). An error + * from here on will result in the transaction cancel unlocking + * dp so don't do it explicitly in the error path. + */ + xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + unlock_dp_on_error = false; - error = xfs_dir_createname(tp, dp, name, ip->i_ino, + error = xfs_dir_createname(tp, dp, name, ip->i_ino, &first_block, &free_list, resblks ? resblks - XFS_IALLOC_SPACE_RES(mp) : 0); - if (error) { - ASSERT(error != ENOSPC); - goto out_trans_abort; - } - xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); + if (error) { + ASSERT(error != ENOSPC); + goto out_trans_abort; + } + xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - if (is_dir) { - error = xfs_dir_init(tp, ip, dp); - if (error) - goto out_bmap_cancel; + if (is_dir) { + error = xfs_dir_init(tp, ip, dp); + if (error) + goto out_bmap_cancel; - error = xfs_bumplink(tp, dp); + error = xfs_bumplink(tp, dp); + if (error) + goto out_bmap_cancel; + } + } else { + ip->i_d.di_nlink--; + error = xfs_iunlink(tp, ip); if (error) - goto out_bmap_cancel; + goto out_trans_abort; } /* @@ -1328,113 +1341,6 @@ xfs_create( } int -xfs_create_tmpfile( - struct xfs_inode *dp, - umode_t mode, - struct xfs_inode **ipp) -{ - struct xfs_mount *mp = dp->i_mount; - struct xfs_inode *ip = NULL; - struct xfs_trans *tp = NULL; - int error; - uint cancel_flags = XFS_TRANS_RELEASE_LOG_RES; - prid_t prid; - struct xfs_dquot *udqp = NULL; - struct xfs_dquot *gdqp = NULL; - struct xfs_dquot *pdqp = NULL; - struct xfs_trans_res *tres; - uint resblks; - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - prid = xfs_get_initial_prid(dp); - - /* - * Make sure that we have allocated dquot(s) on disk. - */ - error = xfs_qm_vop_dqalloc(dp, xfs_kuid_to_uid(current_fsuid()), - xfs_kgid_to_gid(current_fsgid()), prid, - XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, - &udqp, &gdqp, &pdqp); - if (error) - return error; - - resblks = XFS_IALLOC_SPACE_RES(mp); - tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE_TMPFILE); - - tres = &M_RES(mp)->tr_create_tmpfile; - error = xfs_trans_reserve(tp, tres, resblks, 0); - if (error == ENOSPC) { - /* No space at all so try a "no-allocation" reservation */ - resblks = 0; - error = xfs_trans_reserve(tp, tres, 0, 0); - } - if (error) { - cancel_flags = 0; - goto out_trans_cancel; - } - - error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, - pdqp, resblks, 1, 0); - if (error) - goto out_trans_cancel; - - error = xfs_dir_ialloc(&tp, dp, mode, 1, 0, - prid, resblks > 0, &ip, NULL); - if (error) { - if (error == ENOSPC) - goto out_trans_cancel; - goto out_trans_abort; - } - - if (mp->m_flags & XFS_MOUNT_WSYNC) - xfs_trans_set_sync(tp); - - /* - * Attach the dquot(s) to the inodes and modify them incore. - * These ids of the inode couldn't have changed since the new - * inode has been locked ever since it was created. - */ - xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); - - ip->i_d.di_nlink--; - error = xfs_iunlink(tp, ip); - if (error) - goto out_trans_abort; - - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto out_release_inode; - - xfs_qm_dqrele(udqp); - xfs_qm_dqrele(gdqp); - xfs_qm_dqrele(pdqp); - - *ipp = ip; - return 0; - - out_trans_abort: - cancel_flags |= XFS_TRANS_ABORT; - out_trans_cancel: - xfs_trans_cancel(tp, cancel_flags); - out_release_inode: - /* - * Wait until after the current transaction is aborted to - * release the inode. This prevents recursive transactions - * and deadlocks from xfs_inactive. - */ - if (ip) - IRELE(ip); - - xfs_qm_dqrele(udqp); - xfs_qm_dqrele(gdqp); - xfs_qm_dqrele(pdqp); - - return error; -} - -int xfs_link( xfs_inode_t *tdp, xfs_inode_t *sip, diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 4a612fd..5a7f81a 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -333,8 +333,6 @@ int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, struct xfs_inode **ipp, struct xfs_name *ci_name); int xfs_create(struct xfs_inode *dp, struct xfs_name *name, umode_t mode, xfs_dev_t rdev, struct xfs_inode **ipp); -int xfs_create_tmpfile(struct xfs_inode *dp, umode_t mode, - struct xfs_inode **ipp); int xfs_remove(struct xfs_inode *dp, struct xfs_name *name, struct xfs_inode *ip); int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 2b1d1bd..f315a38 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1057,7 +1057,7 @@ xfs_vn_tmpfile( struct xfs_inode *ip; struct inode *inode; - error = xfs_create_tmpfile(XFS_I(dir), mode, &ip); + error = xfs_create(XFS_I(dir), NULL, mode, 0, &ip); if (unlikely(error)) return -error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index a4ae41c..da46c94 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -691,13 +691,14 @@ DECLARE_EVENT_CLASS(xfs_namespace_class, __field(dev_t, dev) __field(xfs_ino_t, dp_ino) __field(int, namelen) - __dynamic_array(char, name, name->len) + __dynamic_array(char, name, name ? name->len : 0) ), TP_fast_assign( __entry->dev = VFS_I(dp)->i_sb->s_dev; __entry->dp_ino = dp->i_ino; - __entry->namelen = name->len; - memcpy(__get_str(name), name->name, name->len); + __entry->namelen = name ? name->len : 0; + if (name) + memcpy(__get_str(name), name->name, name->len); ), TP_printk("dev %d:%d dp ino 0x%llx name %.*s", MAJOR(__entry->dev), MINOR(__entry->dev), -- 1.8.3.1 From bfoster@redhat.com Tue Apr 15 11:18:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7CA987F58 for ; Tue, 15 Apr 2014 11:18:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 20188AC004 for ; Tue, 15 Apr 2014 09:18:30 -0700 (PDT) X-ASG-Debug-ID: 1397578708-04bdf045545d0d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lZY0GQasLxGkvp6E for ; Tue, 15 Apr 2014 09:18:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGISFg005850 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGISDt028528 for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0EA2A123917; Tue, 15 Apr 2014 12:18:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation Date: Tue, 15 Apr 2014 12:18:24 -0400 X-ASG-Orig-Subj: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation Message-Id: <1397578706-5385-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1397578706-5385-1-git-send-email-bfoster@redhat.com> References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397578709 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Initialize security for inodes allocated via the tmpfile interface. This ensures security is initialized if the inode is subsequently linked back into the namespace. Signed-off-by: Brian Foster --- fs/xfs/xfs_iops.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 8fdbc38..2b1d1bd 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1063,6 +1063,12 @@ xfs_vn_tmpfile( inode = VFS_I(ip); + error = xfs_init_security(inode, dir, &dentry->d_name); + if (unlikely(error)) { + iput(inode); + return -error; + } + d_tmpfile(dentry, inode); return 0; -- 1.8.3.1 From bfoster@redhat.com Tue Apr 15 11:18:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 846087F59 for ; Tue, 15 Apr 2014 11:18:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 17B84AC003 for ; Tue, 15 Apr 2014 09:18:30 -0700 (PDT) X-ASG-Debug-ID: 1397578708-04cbb06e9b5bbe0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iSIyo8Gi67Wc7pPM for ; Tue, 15 Apr 2014 09:18:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3FGIS01002009 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGISXA022750 for ; Tue, 15 Apr 2014 12:18:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E0454125741; Tue, 15 Apr 2014 12:18:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 0/4] xfs: tmpfile fixes Date: Tue, 15 Apr 2014 12:18:22 -0400 X-ASG-Orig-Subj: [PATCH v3 0/4] xfs: tmpfile fixes Message-Id: <1397578706-5385-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: 1397578708 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's a v3 series for the patches previously posted here: http://oss.sgi.com/archives/xfs/2014-04/msg00181.html Patches 1 and 2 are just a split-up of the v1 patch: http://oss.sgi.com/archives/xfs/2014-04/msg00149.html Note the v1 patch has a reviewed-by, so feel free to drop 1 and 2 here in favor of that version. Patches 3 and 4 are a couple cleanups in the xfs_create() path. Setting the default ACL is dropped until it is determined how that should be handled for tmpfile(). This means the xfs_iops.c refactor bits have been dropped as well. Brian v3: - Split up the deadlock fix and inode security initialization into separate patches. [hch] - Dropped the default ACL and associated refactor bits for now. [hch] - Split the xfs_create() tres and xfs_create_tmpfile() cleanups into separate patches. [hch] v2: - Added a generic create helper to inherit the security/acl init. code in the tmpfile path. - Added patch 2 to fold xfs_create_tmpfile() into xfs_create(). Brian Foster (4): xfs: fix tmpfile/selinux ilock deadlock xfs: initialize inode security on tmpfile creation xfs: replace on-stack xfs_trans_res with pointer in xfs_create() xfs: fold xfs_create_tmpfile() into xfs_create() fs/xfs/xfs_inode.c | 193 +++++++++++++---------------------------------------- fs/xfs/xfs_inode.h | 2 - fs/xfs/xfs_iops.c | 20 +++++- fs/xfs/xfs_trace.h | 7 +- 4 files changed, 69 insertions(+), 153 deletions(-) -- 1.8.3.1 From lczerner@redhat.com Tue Apr 15 11:41:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6B88F7F3F for ; Tue, 15 Apr 2014 11:41:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 591568F8049 for ; Tue, 15 Apr 2014 09:41:23 -0700 (PDT) X-ASG-Debug-ID: 1397580081-04cbb06e9d5e480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bI3aUHoXAJZpwBWv for ; Tue, 15 Apr 2014 09:41:22 -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-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 s3FGfLCs009517 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 12:41:21 -0400 Received: from localhost.localdomain.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGfJDf009665; Tue, 15 Apr 2014 12:41:20 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Lukas Czerner Subject: [PATCH 1/3 v2] ext4: Remove unnecessary check for APPEND and IMMUTABLE Date: Tue, 15 Apr 2014 18:41:14 +0200 X-ASG-Orig-Subj: [PATCH 1/3 v2] ext4: Remove unnecessary check for APPEND and IMMUTABLE Message-Id: <1397580076-19826-1-git-send-email-lczerner@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: 1397580082 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 All the checks IS_APPEND and IS_IMMUTABLE for the fallocate operation on the inode are done in vfs. No need to do this again in ext4. Remove it. Signed-off-by: Lukas Czerner --- v2: Nothing changed fs/ext4/extents.c | 6 ------ fs/ext4/inode.c | 6 +----- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 89f2227..0177150 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -5387,12 +5387,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) /* Take mutex lock */ mutex_lock(&inode->i_mutex); - /* It's not possible punch hole on append only file */ - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { - ret = -EPERM; - goto out_mutex; - } - if (IS_SWAPFILE(inode)) { ret = -ETXTBSY; goto out_mutex; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 1922f48..56f1ff4 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3528,11 +3528,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) } mutex_lock(&inode->i_mutex); - /* It's not possible punch hole on append only file */ - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { - ret = -EPERM; - goto out_mutex; - } + if (IS_SWAPFILE(inode)) { ret = -ETXTBSY; goto out_mutex; -- 1.8.3.1 From lczerner@redhat.com Tue Apr 15 11:41:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B598C7F3F for ; Tue, 15 Apr 2014 11:41:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4979CAC002 for ; Tue, 15 Apr 2014 09:41:24 -0700 (PDT) X-ASG-Debug-ID: 1397580083-04cbb06e9a5e480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MXKoqdRhY59Ip5hJ for ; Tue, 15 Apr 2014 09:41:23 -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-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 s3FGfMj7009529 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 12:41:23 -0400 Received: from localhost.localdomain.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGfJDg009665; Tue, 15 Apr 2014 12:41:21 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Lukas Czerner Subject: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Date: Tue, 15 Apr 2014 18:41:15 +0200 X-ASG-Orig-Subj: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-Id: <1397580076-19826-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1397580076-19826-1-git-send-email-lczerner@redhat.com> References: <1397580076-19826-1-git-send-email-lczerner@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: 1397580083 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently punch hole and collapse range fallocate operation are not allowed on append only file. This should be case for zero range as well. Fix it by allowing only pure fallocate (possibly with keep size set). Signed-off-by: Lukas Czerner --- v2: Change the condition to be future proof as suggested by hch fs/open.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/open.c b/fs/open.c index 631aea81..fe48b2f 100644 --- a/fs/open.c +++ b/fs/open.c @@ -254,11 +254,9 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) return -EBADF; /* - * It's not possible to punch hole or perform collapse range - * on append only file + * We can only allow pure fallocate on append only files */ - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) - && IS_APPEND(inode)) + if (mode & ~FALLOC_FL_KEEP_SIZE && IS_APPEND(inode)) return -EPERM; if (IS_IMMUTABLE(inode)) -- 1.8.3.1 From lczerner@redhat.com Tue Apr 15 11:41:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 23DE97F52 for ; Tue, 15 Apr 2014 11:41:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EBCA38F8039 for ; Tue, 15 Apr 2014 09:41:25 -0700 (PDT) X-ASG-Debug-ID: 1397580084-04bdf045525fb80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T2M8ve1sTSLfHUj5 for ; Tue, 15 Apr 2014 09:41:24 -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-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 s3FGfOmw013840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 12:41:24 -0400 Received: from localhost.localdomain.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FGfJDh009665; Tue, 15 Apr 2014 12:41:23 -0400 From: Lukas Czerner To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Lukas Czerner Subject: [PATCH 3/3 v2] fs: move falloc collapse range check into the filesystem methods Date: Tue, 15 Apr 2014 18:41:16 +0200 X-ASG-Orig-Subj: [PATCH 3/3 v2] fs: move falloc collapse range check into the filesystem methods Message-Id: <1397580076-19826-3-git-send-email-lczerner@redhat.com> In-Reply-To: <1397580076-19826-1-git-send-email-lczerner@redhat.com> References: <1397580076-19826-1-git-send-email-lczerner@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: 1397580084 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently in do_fallocate in collapse range case we're checking whether offset + len is not bigger than i_size. However there is nothing which would prevent i_size from changing so the check is pointless. It should be done in the file system itself and the file system needs to make sure that i_size is not going to change. The i_size check for the other fallocate modes are also done in the filesystems. As it is now we can easily crash kernel by having two processes doing truncate and fallocate collapse range at the same time. This can be reproduced on ext4 and it is theoretically possible on xfs even though I was not able to trigger it with this simple test. This commit removes the check from do_fallocate and adds it to the file system. Signed-off-by: Lukas Czerner Acked-by: Dave Chinner Reviewed-by: Christoph Hellwig --- v2: Update description and change subject as suggested by hch fs/ext4/extents.c | 11 +++++++++-- fs/open.c | 8 -------- fs/xfs/xfs_file.c | 10 +++++++++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 0177150..ff823b7 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -5364,8 +5364,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) loff_t new_size; int ret; - BUG_ON(offset + len > i_size_read(inode)); - /* Collapse range works only on fs block size aligned offsets. */ if (offset & (EXT4_BLOCK_SIZE(sb) - 1) || len & (EXT4_BLOCK_SIZE(sb) - 1)) @@ -5387,6 +5385,15 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) /* Take mutex lock */ mutex_lock(&inode->i_mutex); + /* + * There is no need to overlap collapse range with EOF, in which case + * it is effectively a truncate operation + */ + if (offset + len >= i_size_read(inode)) { + ret = -EINVAL; + goto out_mutex; + } + if (IS_SWAPFILE(inode)) { ret = -ETXTBSY; goto out_mutex; diff --git a/fs/open.c b/fs/open.c index fe48b2f..bd42341 100644 --- a/fs/open.c +++ b/fs/open.c @@ -284,14 +284,6 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) return -EFBIG; - /* - * There is no need to overlap collapse range with EOF, in which case - * it is effectively a truncate operation - */ - if ((mode & FALLOC_FL_COLLAPSE_RANGE) && - (offset + len >= i_size_read(inode))) - return -EINVAL; - if (!file->f_op->fallocate) return -EOPNOTSUPP; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 003c005..4ba0ae9 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -840,7 +840,15 @@ xfs_file_fallocate( goto out_unlock; } - ASSERT(offset + len < i_size_read(inode)); + /* + * There is no need to overlap collapse range with EOF, + * in which case it is effectively a truncate operation + */ + if (offset + len >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + new_size = i_size_read(inode) - len; error = xfs_collapse_file_space(ip, offset, len); -- 1.8.3.1 From web27@ares50.topway.ch Tue Apr 15 12:14:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=FORGED_MUA_THEBAT_BOUN, FREEMAIL_FROM,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABA787F3F for ; Tue, 15 Apr 2014 12:14:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C2DA8F8037 for ; Tue, 15 Apr 2014 10:14:00 -0700 (PDT) X-ASG-Debug-ID: 1397582036-04cb6c24365e7b0001-NocioJ Received: from ares50.topway.ch (ares50.topway.ch [82.220.34.159]) by cuda.sgi.com with ESMTP id DloRd3stcs1YPWLf for ; Tue, 15 Apr 2014 10:13:57 -0700 (PDT) X-Barracuda-Envelope-From: web27@ares50.topway.ch X-Barracuda-Apparent-Source-IP: 82.220.34.159 Received: by ares50.topway.ch (Postfix, from userid 768) id D80DA1BBFE85; Tue, 15 Apr 2014 18:14:29 +0200 (CEST) To: , , , , , , , , , , , , , , , , , , , Subject: =?windows-1251?B?0ejx8uXs4CBCYW5jQm90IJYg7/Du8fLu6SDo?= =?windows-1251?B?IOTu8fLz7+376SDn4PDg4e7y7uog4iDo7fLl?= =?windows-1251?B?8O3l8uUhIMTu9e7kICQxNTAg4iD34PEg6CDi?= =?windows-1251?B?+/jlIQ==?= X-PHP-Originating-Script: 768:brtiffv.php X-ASG-Orig-Subj: =?windows-1251?B?0ejx8uXs4CBCYW5jQm90IJYg7/Du8fLu6SDo?= =?windows-1251?B?IOTu8fLz7+376SDn4PDg4e7y7uog4iDo7fLl?= =?windows-1251?B?8O3l8uUhIMTu9e7kICQxNTAg4iD34PEg6CDi?= =?windows-1251?B?+/jlIQ==?= Date: Tue, 15 Apr 2014 20:03:52 +0400 X-Mailer: The Bat! (v9.00.14) From: =?windows-1251?B?yOfg4eXr6+A=?= Reply-To: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_12C5_01CF58E7.4CDE9920" Message-Id: <20140415161429.D80DA1BBFE85@ares50.topway.ch> X-Barracuda-Connect: ares50.topway.ch[82.220.34.159] X-Barracuda-Start-Time: 1397582036 X-Barracuda-URL: http://192.48.176.15: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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA584 Custom Rule SA584 ------=_NextPart_000_12C5_01CF58E7.4CDE9920 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CD=EE=E2=E5=E9=F8=E8=E9 =EF=F0=EE=E3=F0=E5=F1=F1=E8=E2=ED=FB=E9 =E8=ED=F2= =E5=F0=ED=E5=F2-=E1=E8=E7=ED=E5=F1 =96 =F1=E8=F1=F2=E5=EC=E0 BancBot =EE=E1= =E5=F1=EF=E5=F7=E8=E2=E0=E5=F2 =F1=F2=E0=E1=E8=EB=FC=ED=FB=E9 =F1=F0=E5=E4= =ED=E8=E9 =E4=EE=F5=EE=E4 =E2 =F0=E0=E7=EC=E5=F0=E5 =EE=EA=EE=EB=EE $150 = =E2 =F7=E0=F1! =CD=E5 =F3=EF=F3=F1=F2=E8=F2=E5 =F8=E0=ED=F1! [=CF=C5=D0=C5= =C9=D2=C8 =CD=C0 =D1=C0=C9=D2] ------=_NextPart_000_12C5_01CF58E7.4CDE9920 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CD=EE=E2=E5=E9=F8=E8=E9 =EF=F0=EE=E3=F0=E5=F1=F1=E8=E2=ED=FB=E9 =E8= =ED=F2=E5=F0=ED=E5=F2-=E1=E8=E7=ED=E5=F1 =96 =F1=E8=F1=F2=E5=EC=E0 BancBo= t =EE=E1=E5=F1=EF=E5=F7=E8=E2=E0=E5=F2 =F1=F2=E0=E1=E8=EB=FC=ED=FB=E9 =F1= =F0=E5=E4=ED=E8=E9 =E4=EE=F5=EE=E4 =E2 =F0=E0=E7=EC=E5=F0=E5 =EE=EA=EE=EB= =EE $150 =E2 =F7=E0=F1! =CD=E5 =F3=EF=F3=F1=F2=E8=F2=E5 =F8=E0=ED=F1! [=CF=C5=D0=C5=C9=D2=C8 =CD=C0= =D1=C0=C9=D2]
------=_NextPart_000_12C5_01CF58E7.4CDE9920-- From BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 15 12:47:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 80A8C7F3F for ; Tue, 15 Apr 2014 12:47:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6221D30407B for ; Tue, 15 Apr 2014 10:47:06 -0700 (PDT) X-ASG-Debug-ID: 1397584021-04bdf0455463050001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id xoKYksGGZo3xuLlC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 10:47:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wa7Rl-00075Z-8y; Tue, 15 Apr 2014 17:47:01 +0000 Date: Tue, 15 Apr 2014 10:47:01 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 1/4] xfs: fix tmpfile/selinux ilock deadlock Message-ID: <20140415174701.GA26404@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 1/4] xfs: fix tmpfile/selinux ilock deadlock References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397578706-5385-2-git-send-email-bfoster@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397584021 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4940 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 15 12:50:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6CAAF7F3F for ; Tue, 15 Apr 2014 12:50:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1B75AC002 for ; Tue, 15 Apr 2014 10:50:35 -0700 (PDT) X-ASG-Debug-ID: 1397584233-04cbb06e9a61e30001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id oM2yGY3bZb0MxXpp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 10:50:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wa7VB-0000iq-8E; Tue, 15 Apr 2014 17:50:33 +0000 Date: Tue, 15 Apr 2014 10:50:33 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation Message-ID: <20140415175033.GB26404@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397578706-5385-3-git-send-email-bfoster@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397584233 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4941 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 12:18:24PM -0400, Brian Foster wrote: > + error = xfs_init_security(inode, dir, &dentry->d_name); > + if (unlikely(error)) { > + iput(inode); > + return -error; > + } > + > d_tmpfile(dentry, inode); > I'd really love to hear from the LSM people who they plan to deal with O_TMPFILE inodes. But given that this seems to fix a real life bug let's go with it for now. From BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 15 12:50:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B9F07F3F for ; Tue, 15 Apr 2014 12:50:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2BD9E304071 for ; Tue, 15 Apr 2014 10:50:52 -0700 (PDT) X-ASG-Debug-ID: 1397584251-04cbb06e9c61e60001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id M0GWztbQWjQnkOvq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 10:50:51 -0700 (PDT) X-Barracuda-Envelope-From: BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wa7VT-0000on-3r; Tue, 15 Apr 2014 17:50:51 +0000 Date: Tue, 15 Apr 2014 10:50:51 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 3/4] xfs: replace on-stack xfs_trans_res with pointer in xfs_create() Message-ID: <20140415175051.GC26404@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 3/4] xfs: replace on-stack xfs_trans_res with pointer in xfs_create() References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397578706-5385-4-git-send-email-bfoster@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397584251 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4941 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 12:18:25PM -0400, Brian Foster wrote: > There's no need to store a full struct xfs_trans_res on the stack in > xfs_create() and copy the fields. Use a pointer to the appropriate > structures embedded in the xfs_mount. > > Signed-off-by: Brian Foster Looks good, Reviewed-by: Christoph Hellwig From BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 15 12:51:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95FBB7F3F for ; Tue, 15 Apr 2014 12:51:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 47CDFAC002 for ; Tue, 15 Apr 2014 10:51:31 -0700 (PDT) X-ASG-Debug-ID: 1397584290-04bdf04555632e0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id bKKR43tOUuO29iyv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 10:51:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wa7W6-00011I-8q; Tue, 15 Apr 2014 17:51:30 +0000 Date: Tue, 15 Apr 2014 10:51:30 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 4/4] xfs: fold xfs_create_tmpfile() into xfs_create() Message-ID: <20140415175130.GD26404@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 4/4] xfs: fold xfs_create_tmpfile() into xfs_create() References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397578706-5385-5-git-send-email-bfoster@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397584290 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4941 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 12:18:26PM -0400, Brian Foster wrote: > xfs_create_tmpfile() duplicates most of xfs_create() with the exception > of a couple minor differences. We use a unique transaction reservation > and place the allocated inode on the unlinked list rather than create a > directory entry for it. > > Fold xfs_create_tmpfile() into xfs_create() to reduce some of this > duplication. The name parameter that represents the name of the > directory entry to create is now conditional and its existence dictates > whether a directory entry is created for the inode or not. > > Signed-off-by: Brian Foster Looks correct although I still can't get excited about it.. Reviewed-by: Christoph Hellwig From BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 15 12:52:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4BE077F3F for ; Tue, 15 Apr 2014 12:52:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 396E830404E for ; Tue, 15 Apr 2014 10:52:32 -0700 (PDT) X-ASG-Debug-ID: 1397584350-04cb6c243860270001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id Gz8GtEkySAKhR94z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 10:52:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wa7X2-0001L5-1J; Tue, 15 Apr 2014 17:52:28 +0000 Date: Tue, 15 Apr 2014 10:52:28 -0700 From: Christoph Hellwig To: Brian Foster Cc: linux-man@vger.kernel.org, Andreas Gruenbacher , xfs@oss.sgi.com, linux-security-module@vger.kernel.org, Al Viro , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140415175228.GE26404@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> <20140410121947.GA14124@bfoster.bfoster> <20140410122944.GA6579@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140410122944.GA6579@infradead.org> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397584350 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4941 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- So any opinions from other fs / security people on how O_TMPFILE files should behave for ACL inheritance / labeling? On Thu, Apr 10, 2014 at 05:29:44AM -0700, Christoph Hellwig wrote: > On Thu, Apr 10, 2014 at 08:19:48AM -0400, Brian Foster wrote: > > Are you saying it doesn't have to initialize security or the default > > acl, or both? > > The ACLs for sure. LSM do run-time access decisions, so they will > probably rely on the security data being initialized. Given that > O_TMPFILE files aren't publicly available I'm not sure there's a point > in them doing that, though. > > LSMs are also affected by the lack of a proper parent I'll discuss for > ACLs below. > > > The intent here was to have the case covered where the inode happens to > > be linked back into the namespace since we don't do this work in the > > link path. > > That's an interesting one. O_TMFILE files don't have a real parent > to inherit ACLs from, the pathname passed in just needs to point to > a directory to find the filesystem to create the tmpfile in. On > the other hand it seem like the extN implementations do inherity the > ACL in this case. > > The link into the namespace is irrelavant here as ACL inheritance only > happens on initial create, not at link time. > > I also think we'll absolutely need a test case for ACLs+tmpfile to > make sure all filesystems handle it the same way. > > > The bulk of the refactoring was with the idea that the inode setup for > > the tmpfile case is generally equivalent for the traditional create > > case. The original version was posted here: > > > > http://oss.sgi.com/archives/xfs/2014-04/msg00149.html > > > > ... and it just fixes the deadlock and adds the security initialization. > > I suppose I could still break that out into multiple patches, but that > > aside, is that behavior preferred? > > I think just fixing the deadlock and initializing the security is enough > for the first pass. If you want to do the refactoring on top send it as > a second series on top of the actual fixes. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From fdmanana@gmail.com Tue Apr 15 13:50:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 4DEA77F3F for ; Tue, 15 Apr 2014 13:50:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 019CBAC001 for ; Tue, 15 Apr 2014 11:50:28 -0700 (PDT) X-ASG-Debug-ID: 1397587824-04bdf0455465550001-NocioJ Received: from mail-wg0-f49.google.com (mail-wg0-f49.google.com [74.125.82.49]) by cuda.sgi.com with ESMTP id h8JqOkRyBGj1GCPH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 11:50:26 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.49 Received: by mail-wg0-f49.google.com with SMTP id a1so10031415wgh.20 for ; Tue, 15 Apr 2014 11:50:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=vLE5qaipLR769AnuzbYQlV33FfIyE+1TXTmpQutEPCM=; b=cteuTBmWiwrPowC4KrY07w8GQl72wSL5NeJEpsADWxJcxM5+eXEtkF3KYO1bGr8WTP olTBTa7lOm50UNXwbbxF0Yq7ixIUVXKL8aA9XWcaiWl+PZnWUa8IVuOfufp5s1v0cYci 84gbFPR0asUG8c7XZMjX3Zshxz1OgOSoPqAf114aH54+rWxRg8XF3PxAhkoR2lSRSPal prAQAa08+P0gnBP8IS6QbiiPDI1PfZHAnWnKvUe8fWlb8qHMvtnCqm3pxIe1of9tQkwc VZVq+nubKDbLgUHXZsnrL5q2olbPiXhr8osaj371ICugF5Abksr92V97HG/jwZTj7unr I0qw== X-Received: by 10.180.211.207 with SMTP id ne15mr15608197wic.31.1397587823980; Tue, 15 Apr 2014 11:50:23 -0700 (PDT) Received: from debian-vm3.lan (bl10-141-238.dsl.telepac.pt. [85.243.141.238]) by mx.google.com with ESMTPSA id rx9sm30836690wjb.20.2014.04.15.11.50.22 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 15 Apr 2014 11:50:23 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH] xfstests: btrfs, add test for btrfs properties Date: Tue, 15 Apr 2014 20:50:24 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs, add test for btrfs properties Message-Id: <1397591424-25439-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-wg0-f49.google.com[74.125.82.49] X-Barracuda-Start-Time: 1397587826 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4943 Rule breakdown below pts rule name 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 case verifies the btrfs properties feature, a new feature introduced in the linux kernel version 3.14. Signed-off-by: Filipe David Borba Manana --- common/rc | 9 +++ tests/btrfs/048 | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/048.out | 78 +++++++++++++++++++ tests/btrfs/group | 1 + 4 files changed, 308 insertions(+) create mode 100755 tests/btrfs/048 create mode 100644 tests/btrfs/048.out diff --git a/common/rc b/common/rc index acf419b..d4ba74f 100644 --- a/common/rc +++ b/common/rc @@ -2262,6 +2262,15 @@ _run_btrfs_util_prog() run_check $BTRFS_UTIL_PROG $* } +_require_btrfs_properties() +{ + $BTRFS_UTIL_PROG | grep 'btrfs property ' > /dev/null 2>&1 + if [ $? -ne 0 ] + then + _notrun "Missing btrfs-progs with properties support, skipped this test" + fi +} + init_rc() { if [ "$iam" == new ] diff --git a/tests/btrfs/048 b/tests/btrfs/048 new file mode 100755 index 0000000..7e2ff50 --- /dev/null +++ b/tests/btrfs/048 @@ -0,0 +1,220 @@ +#! /bin/bash +# FS QA Test No. btrfs/048 +# +# Btrfs properties test. The btrfs properties feature was introduced in the +# linux kernel 3.14. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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 + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_btrfs_properties +_need_to_be_root + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +echo "Testing label property" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT label +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT label foobar +$BTRFS_UTIL_PROG property get $SCRATCH_MNT label +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT label '' +$BTRFS_UTIL_PROG property get $SCRATCH_MNT label +echo "***" +mkdir $SCRATCH_MNT/testdir +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir label +echo "***" + +echo -e "\nTesting subvolume ro property" +_run_btrfs_util_prog subvolume create $SCRATCH_MNT/sv1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 ro +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro foo +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro true +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 ro +echo "***" +touch $SCRATCH_MNT/sv1/foobar 2>&1 | _filter_scratch +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro false +touch $SCRATCH_MNT/sv1/foobar 2>&1 | _filter_scratch +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 +echo "***" + +echo -e "\nTesting compression property" +mkdir $SCRATCH_MNT/testdir/subdir1 +touch $SCRATCH_MNT/testdir/file1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression \ + foo 2>&1 | _filter_scratch +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression lzo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression + +# Verify property was persisted. +_scratch_unmount +_check_scratch_fs +_scratch_mount +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression zlib +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression '' +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression + +# Test compression property inheritance. +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression lzo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +echo "***" +mkdir $SCRATCH_MNT/testdir/subdir1/subsubdir +touch $SCRATCH_MNT/testdir/subdir1/some_file +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression +echo "***" +mkdir $SCRATCH_MNT/testdir/subdir1/subsubdir/foo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir/foo \ + compression +echo "***" + +# Verify property was persisted. +_scratch_unmount +_check_scratch_fs +_scratch_mount +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir/foo \ + compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1/subsubdir \ + compression '' +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1/some_file \ + compression '' +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression '' +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +echo "***" +touch $SCRATCH_MNT/testdir/subdir1/some_file_2 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file_2 \ + compression +echo "***" + +# Verify send is able to replicate properties. +echo -e "\nTesting properties with send" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression lzo +touch $SCRATCH_MNT/testdir/subdir1/foobar +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/foobar compression +echo "***" + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 +touch $SCRATCH_MNT/testdir/subdir1/foobar2 +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $send_files_dir/2.snap + +_scratch_unmount +_check_scratch_fs +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1 compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1/foobar \ + compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1/foobar2 \ + compression +echo "***" + +_scratch_unmount +_check_scratch_fs +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +echo -e "\nTesting subvolume properties" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'lzo' +$BTRFS_UTIL_PROG property get $SCRATCH_MNT compression +echo "***" +touch $SCRATCH_MNT/file1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/file1 compression +echo "***" +mkdir $SCRATCH_MNT/dir1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1 compression +echo "***" +mkdir $SCRATCH_MNT/dir1/subdir1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1/subdir1 compression +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/dir1/subdir1 compression 'zlib' +touch $SCRATCH_MNT/dir1/subdir1/foo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1/subdir1/foo compression + +echo -e "\nTesting subvolume property inheritance" +_run_btrfs_util_prog subvolume create $SCRATCH_MNT/sv1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 compression +touch $SCRATCH_MNT/sv1/file2 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1/file2 compression + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/048.out b/tests/btrfs/048.out new file mode 100644 index 0000000..0b20d0b --- /dev/null +++ b/tests/btrfs/048.out @@ -0,0 +1,78 @@ +QA output created by 048 +Testing label property +label= +*** +label=foobar +*** +ro=false +label=foobar +*** +label= +*** +ERROR: object is not compatible with property +*** + +Testing subvolume ro property +ro=false +*** +ERROR: invalid value for property. +*** +*** +ro=true +*** +touch: cannot touch 'SCRATCH_MNT/sv1/foobar': Read-only file system +*** +ro=false +*** + +Testing compression property +*** +ERROR: failed to set compression for SCRATCH_MNT/testdir/file1. Invalid argument +*** +compression=lzo +compression=lzo +compression=zlib +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +*** +*** +*** +*** +*** + +Testing properties with send +compression=lzo +compression=lzo +*** +compression=lzo +compression=lzo +compression=lzo +*** + +Testing subvolume properties +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=zlib + +Testing subvolume property inheritance +compression=lzo +compression=lzo diff --git a/tests/btrfs/group b/tests/btrfs/group index d4e3fc1..af60c79 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -50,3 +50,4 @@ 045 auto quick 046 auto quick 047 auto quick +048 auto quick -- 1.9.1 From andreas.gruenbacher@linbit.com Tue Apr 15 14:31:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 66A147F4E for ; Tue, 15 Apr 2014 14:31:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0425CAC004 for ; Tue, 15 Apr 2014 12:31:09 -0700 (PDT) X-ASG-Debug-ID: 1397590267-04cbb06e9d65860001-NocioJ Received: from zimbra13.linbit.com (zimbra13.linbit.com [212.69.166.240]) by cuda.sgi.com with ESMTP id kGCi80NhH3Jga9u6 for ; Tue, 15 Apr 2014 12:31:08 -0700 (PDT) X-Barracuda-Envelope-From: andreas.gruenbacher@linbit.com X-Barracuda-Apparent-Source-IP: 212.69.166.240 Received: from localhost (localhost [127.0.0.1]) by zimbra13.linbit.com (Postfix) with ESMTP id D3B2D2B2D11; Tue, 15 Apr 2014 21:31:06 +0200 (CEST) Received: from zimbra13.linbit.com ([127.0.0.1]) by localhost (zimbra13.linbit.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id AGjXwD02UZlt; Tue, 15 Apr 2014 21:31:06 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by zimbra13.linbit.com (Postfix) with ESMTP id 7EA0F2B2DF4; Tue, 15 Apr 2014 21:31:06 +0200 (CEST) X-Virus-Scanned: amavisd-new at linbit.com Received: from zimbra13.linbit.com ([127.0.0.1]) by localhost (zimbra13.linbit.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id ic1xoGZn2h_C; Tue, 15 Apr 2014 21:31:06 +0200 (CEST) Received: from zimbra13.linbit.com (zimbra13.linbit.com [212.69.166.240]) by zimbra13.linbit.com (Postfix) with ESMTP id 593232B2D11; Tue, 15 Apr 2014 21:31:06 +0200 (CEST) Date: Tue, 15 Apr 2014 21:31:02 +0200 (CEST) From: Andreas Gruenbacher To: Christoph Hellwig Cc: Brian Foster , linux-man@vger.kernel.org, xfs@oss.sgi.com, linux-security-module@vger.kernel.org, Al Viro , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Message-ID: <1188577823.463241.1397590262478.JavaMail.zimbra@linbit.com> In-Reply-To: <20140415175228.GE26404@infradead.org> References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> <20140410121947.GA14124@bfoster.bfoster> <20140410122944.GA6579@infradead.org> <20140415175228.GE26404@infradead.org> Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [178.115.133.221] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF24 (Linux)/8.0.6_GA_5922) Thread-Topic: fix tmpfile/selinux deadlock and initialize security/acl Thread-Index: eVaaUFqsHhxhgNzLBl8pyRHY3sFs8w== X-Barracuda-Connect: zimbra13.linbit.com[212.69.166.240] X-Barracuda-Start-Time: 1397590267 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Christoph, On Tue, Apr 15, 2014 at 10:52:28AM -0700, Christoph Hellwig wrote: > So any opinions from other fs / security people on how O_TMPFILE files > should behave for ACL inheritance / labeling? from how O_TMPFILE is documented right now [*], creating such a file and then linking it into the namespace is one of the obvious use cases. The intent seems to be to make it seem like the file was created and populated atomically, possibly with inherited permissions and all. I think this behavior require that the O_TMPFILE file inherits from the directory it was "created" in. Adding code to achieve the effect of create-time inheritance at link time, only for O_TMPFILE files or files without any links, doesn't seem reasonable to me: it would duplicate create code in the link code path, and it would make it harder to override inherited permissions or labels. (Trying to fake inheritance by reimplementing it in user space seems like a much worse idea still.) [*] http://man7.org/linux/man-pages/man2/open.2.html Thanks, Andreas From tytso@thunk.org Tue Apr 15 14:40:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28E077F54 for ; Tue, 15 Apr 2014 14:40:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 198E18F8052 for ; Tue, 15 Apr 2014 12:40:09 -0700 (PDT) X-ASG-Debug-ID: 1397590807-04cbb06e9b65d70001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 0R3LoY77OsAq5023 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 12:40:08 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Wa9DB-0002BB-1a; Tue, 15 Apr 2014 19:40:05 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5F446580893; Tue, 15 Apr 2014 15:40:04 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397590804; bh=JyWUHRuOtHIWWAj+EIl3Dr7A8m5TV7qPlvG4Jtq8LcE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=h2EaovvmV1W0IcJZECWQx8pYa1eE8eAbMVJ/0GiAv6AjOrB4suUqJmbfqc0ajyLtV VLBG2u3yQ5nZL2p+OIw7OkW+3shn+5+aQNe9IzIf2i5bqqY8KWoUtLRhVzytZOlrLL C8cT0iEb1gwZseUvbh1xZhkdUKQxb9KOJGIfiNwA= Date: Tue, 15 Apr 2014 15:40:04 -0400 From: Theodore Ts'o To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate Message-ID: <20140415194004.GG4456@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> <20140412152117.GB18047@infradead.org> <20140415153643.GB4456@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397590808 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 15, 2014 at 06:09:34PM +0200, Lukáš Czerner wrote: > > Ok, I'll run some tests and resend it right away without the patch > #4. Thanks! So should I drop patch #4 for now? I don't think it does any harm, and it does plug the hole somewhat, but Cristoph is right that we still could have swapon racing with the fallocate. - Ted From bfoster@redhat.com Tue Apr 15 14:40:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CA0417F58 for ; Tue, 15 Apr 2014 14:40:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B80B58F8064 for ; Tue, 15 Apr 2014 12:40:59 -0700 (PDT) X-ASG-Debug-ID: 1397590858-04cbb06e9c65e00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YFZ4Q0gfrL3jksC9 for ; Tue, 15 Apr 2014 12:40:58 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3FJeoDR018467 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Apr 2014 15:40:51 -0400 Received: from laptop.bfoster (vpn-48-211.rdu2.redhat.com [10.10.48.211]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3FJeoVD002941; Tue, 15 Apr 2014 15:40:50 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id CA734120AC3; Tue, 15 Apr 2014 15:40:49 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3FJenHB006910; Tue, 15 Apr 2014 15:40:49 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 15 Apr 2014 15:40:48 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/9] repair: report AG btree verifier errors Message-ID: <20140415194048.GD3470@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/9] repair: report AG btree verifier errors References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-7-git-send-email-david@fromorbit.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: 1397590858 X-Barracuda-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 15, 2014 at 06:24:58PM +1000, Dave Chinner wrote: > From: Dave Chinner > > When we scan the filesystem freespace and inode maps in phase 2, we > don't report CRC errors that are found. We don't really care from a > repair perspective, because the trees are completely rebuilt from > the ground up in phase 5, but froma checking perspective we need to > inform the user that we found inconsistencies. > > Signed-off-by: Dave Chinner > --- > repair/scan.c | 27 ++++++++++++++++++++++++--- > 1 file changed, 24 insertions(+), 3 deletions(-) > > diff --git a/repair/scan.c b/repair/scan.c > index 6c43474..75b4b70 100644 > --- a/repair/scan.c > +++ b/repair/scan.c > @@ -82,6 +82,12 @@ scan_sbtree( > do_error(_("can't read btree block %d/%d\n"), agno, root); > return; > } > + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { > + do_warn(_("btree block %d/%d is suspect, error %d\n"), > + agno, root, bp->b_error); > + suspect = 1; > + } > + > (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, > isroot, magic, priv); > libxfs_putbuf(bp); > @@ -123,6 +129,7 @@ scan_lbtree( > xfs_buf_t *bp; > int err; > int dirty = 0; > + bool badcrc = false; > > bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), > XFS_FSB_TO_BB(mp, 1), 0, ops); > @@ -132,14 +139,25 @@ scan_lbtree( > XFS_FSB_TO_AGBNO(mp, root)); > return(1); > } > + > + /* > + * only check for bad CRC here - caller will determine if there > + * is a corruption or not and whether it got corrected and so needs > + * writing back. CRC errors always imply we need to write the block. > + */ > + if (bp->b_error == EFSBADCRC) { > + do_warn(_("btree block %d/%d is suspect, error %d\n"), > + XFS_FSB_TO_AGNO(mp, root), > + XFS_FSB_TO_AGBNO(mp, root), bp->b_error); > + badcrc = true; > + } > + > err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, > type, whichfork, root, ino, tot, nex, blkmapp, > bm_cursor, isroot, check_dups, &dirty, > magic); > > - ASSERT(dirty == 0 || (dirty && !no_modify)); > - Here we remove the dirty assert, but don't change the semantics of dirty (we use badcrc). Brian > - if (dirty && !no_modify) > + if ((dirty || badcrc) && !no_modify) > libxfs_writebuf(bp, 0); > else > libxfs_putbuf(bp); > @@ -1066,6 +1084,9 @@ scan_freelist( > do_abort(_("can't read agfl block for ag %d\n"), agno); > return; > } > + if (agflbuf->b_error == EFSBADCRC) > + do_warn(_("agfl has bad CRC for ag %d\n"), agno); > + > freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); > i = be32_to_cpu(agf->agf_flfirst); > > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From contact_claude@isabelle.de Tue Apr 15 14:53:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,LOTS_OF_MONEY, T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4725F7F3F for ; Tue, 15 Apr 2014 14:53:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB2EDAC003 for ; Tue, 15 Apr 2014 12:53:28 -0700 (PDT) X-ASG-Debug-ID: 1397591603-04cb6c243864a80001-NocioJ Received: from vps22121.lws-hosting.com ([192.162.68.139]) by cuda.sgi.com with ESMTP id 6forlsPfGCQQiJBP; Tue, 15 Apr 2014 12:53:23 -0700 (PDT) X-Barracuda-Envelope-From: contact_claude@isabelle.de X-Barracuda-Apparent-Source-IP: 192.162.68.139 Received: from localhost (localhost.localdomain [127.0.0.1]) by vps22121.lws-hosting.com (Postfix) with ESMTP id 2DCF117E71C2; Tue, 15 Apr 2014 21:49:57 +0200 (CEST) Received: from vps22121.lws-hosting.com ([127.0.0.1]) by localhost (vps22121.lws-hosting.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8E3S5zzW3I15; Tue, 15 Apr 2014 21:49:56 +0200 (CEST) Received: from [192.168.14.51] (unknown [217.16.14.180]) (Authenticated sender: contact_claude@isabelle.de) by vps22121.lws-hosting.com (Postfix) with ESMTPA id 282F517E7147; Tue, 15 Apr 2014 21:48:00 +0200 (CEST) Message-Id: Mime-Version: 1.0 From: isabelle To: Undisclosed-Recipients:; Reply-To: isabelle.claude654@laposte.net Subject: spende /Donation Date: Tue, 15 Apr 2014 21:49:34 +0200 X-ASG-Orig-Subj: spende /Donation Content-type: text/plain; charset=iso-8859-1; format=flowed Content-transfer-encoding: quoted-printable X-Barracuda-Connect: UNKNOWN[192.162.68.139] X-Barracuda-Start-Time: 1397591603 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hallo Wenn ich diese Nachricht zu senden wollte, ist dies nicht einfach Zufall= =2E Dies ist, weil Ihre e-Mail vom elektronischen Roboter gesichert meine W= X=2E7AR BW ausgew=E4hlt wurde=2E Zun=E4chst m=F6chte ich mich f=FCr dieses Eindringen in Ihr Leben zu entsch= uldigen, obwohl ich zugeben, dass es mir sehr wichtig=2E Ich bin Isabelle V= asudev=2E Ich leide an Krebs im Hals seit nun mehr als 3 Jahre und eine hal= be und es leider, mein Arzt hat gerade informiert mich, dass ich bin voller= unheilbar und, dass meine Tage, wegen meinen etwas gez=E4hlt sind abgebaut= Zustand=2E Ich bin eine Witwe und ich habe keine Kind, das ich beginne zu = bedauern=2E In der Tat ist der Grund, warum ich Sie kontaktieren bin, m=F6chte ich eine= n Teil von meinem Grundst=FCck zu spenden, weil ich niemand, wer die Erben = konnte=2E Ich habe fast mein ganzes Zeug, darunter ein Unternehmen der Expo= rt von Holz, Gummi und Stahl-Industrie in Afrika, wo ich wohne nun mehr 10 = Jahren, verkauft=2E Ein gro=DFer Teil der Gelder gesammelt wurde mit unters= chiedlichen Verb=E4nden humanit=E4ren Charakter =FCberall in der Welt, aber= besonders hier in Afrika bezahlt=2E Im Hinblick auf den Rest der Summe genau in H=F6he von 750=2E000, 00euros (= sieben hundert und f=FCnfzig tausend Euro) auf eine gesperrte Mitarbeiter-A= ccount, meine letzte w=FCnschen w=FCrde Sie es spenden, so dass Sie in Ihre= r Branche und vor allem den humanit=E4ren investieren k=F6nnen=2E Ich bin g= anz bewusst was ich zu tun beabsichtigen, und ich denke, trotz der Tatsache= , die wir nicht wissen, werdet ihr diese Summe gut nutzen=2E Ich bitte Sie,= bitte dieses Erbe zu akzeptieren, ohne jedoch Fragen Sie alles, was in zur= =FCckgeben wenn es nicht immer denken, gutes zu tun, um dich herum, was ich= nicht getan habe, in meiner Existenz=2E Das hei=DFt, wird auf einer verantwortlichen Person und besonders gutem Gla= uben fallen zu lassen beruhigt, ich m=F6chte bitten, dass Sie bitte mich be= i den meisten schnell kontaktieren, um weitere Erkl=E4rung =FCber die Gr= =FCnde f=FCr meine Geste und den Verlauf der Dinge zu geben=2E Bitte kontak= tieren Sie mich so bald wie m=F6glich, wenn Sie mein Angebot akzeptieren= =2E Gott m=F6ge mit dir sein! Ich fordere Sie auf, mich =FCber meine pers=F6nliche e-Mail-Adresse zu kont= aktieren: Isabelle=2Eclaude654@laposte=2Enet Der Frieden und Barmherzigkeit Gottes m=F6ge mit dir sein=2E Mrs Isabelle From lukas@loguj.cz Tue Apr 15 14:56:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F044F7F3F for ; Tue, 15 Apr 2014 14:56:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D6ACAC004 for ; Tue, 15 Apr 2014 12:56:29 -0700 (PDT) X-ASG-Debug-ID: 1397591785-04bdf04553677b0001-NocioJ Received: from server.loguj.cz (server.loguj.cz [83.167.232.152]) by cuda.sgi.com with ESMTP id yWjgfD0UnboOFpIc for ; Tue, 15 Apr 2014 12:56:25 -0700 (PDT) X-Barracuda-Envelope-From: lukas@loguj.cz X-Barracuda-Apparent-Source-IP: 83.167.232.152 Received: by server.loguj.cz (Postfix, from userid 497) id 2EB6E768A; Tue, 15 Apr 2014 21:57:41 +0200 (CEST) Received: from ip-89-103-71-122.net.upcbroadband.cz (ip-89-103-71-122.net.upcbroadband.cz [89.103.71.122]) by mail.loguj.cz (Horde Framework) with HTTP; Tue, 15 Apr 2014 21:57:41 +0200 Date: Tue, 15 Apr 2014 21:57:41 +0200 Message-ID: <20140415215741.Horde.d8xeUy2MbgZTTY81Gl8nkMA@mail.loguj.cz> From: =?utf-8?b?THVrw6HFoQ==?= Czerner To: Theodore Ts'o Cc: =?utf-8?b?THVrw6HFoQ==?= Czerner , Christoph Hellwig , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-3-git-send-email-lczerner@redhat.com> <20140412152117.GB18047@infradead.org> <20140415153643.GB4456@thunk.org> <20140415194004.GG4456@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] fs: Remove i_size check from do_fallocate In-Reply-To: <20140415194004.GG4456@thunk.org> User-Agent: Internet Messaging Program (IMP) H4 (5.0.18) Content-Type: text/plain; charset=utf-8; format=flowed; DelSp=Yes MIME-Version: 1.0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: server.loguj.cz[83.167.232.152] X-Barracuda-Start-Time: 1397591785 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Yes, please drop the patch #4 since it requires different solution, I do not think it's critical enough to have partial solution and it has been that way for a long time. We can fix it later. Thanks! -Lukas Theodore Ts'o wrote: > On Tue, Apr 15, 2014 at 06:09:34PM +0200, Luk=C3=A1=C5=A1 Czerner wrote: >> >> Ok, I'll run some tests and resend it right away without the patch >> #4. > > Thanks! So should I drop patch #4 for now? I don't think it does any > harm, and it does plug the hole somewhat, but Cristoph is right that > we still could have swapon racing with the fallocate. > > - Ted > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From bfoster@redhat.com Tue Apr 15 14:56:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1A4867F52 for ; Tue, 15 Apr 2014 14:56:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1DBF730407B for ; Tue, 15 Apr 2014 12:56:32 -0700 (PDT) X-ASG-Debug-ID: 1397591790-04cbb06e9a66570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7Ujm13UiarnrQaN6 for ; Tue, 15 Apr 2014 12:56:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3FJuSZL030635 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 15:56:29 -0400 Received: from laptop.bfoster (vpn-48-211.rdu2.redhat.com [10.10.48.211]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FJeVau014369; Tue, 15 Apr 2014 15:40:31 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 198B8120AC3; Tue, 15 Apr 2014 15:40:31 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3FJeTP8006906; Tue, 15 Apr 2014 15:40:29 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 15 Apr 2014 15:40:29 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140415194029.GC3470@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-6-git-send-email-david@fromorbit.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: 1397591790 X-Barracuda-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 15, 2014 at 06:24:57PM +1000, Dave Chinner wrote: > From: Dave Chinner > > repair doesn't currently detect verifier errors in AG header > blocks - apart from the primary superblock they are not detected. > They are, fortunately, corrected in the important cases (AGF, AGI > and AGFL) because these structures are rebuilt in phase 5, but if > you run xfs_repair in checking mode it won't report them as bad. > > Signed-off-by: Dave Chinner > --- > repair/scan.c | 66 ++++++++++++++++++++++++++++++++++------------------------- > 1 file changed, 38 insertions(+), 28 deletions(-) > > diff --git a/repair/scan.c b/repair/scan.c > index 1744c32..6c43474 100644 > --- a/repair/scan.c > +++ b/repair/scan.c > @@ -1207,28 +1207,31 @@ scan_ag( > void *arg) > { > struct aghdr_cnts *agcnts = arg; > - xfs_agf_t *agf; > - xfs_buf_t *agfbuf; > + struct xfs_agf *agf; > + struct xfs_buf *agfbuf = NULL; > int agf_dirty = 0; > - xfs_agi_t *agi; > - xfs_buf_t *agibuf; > + struct xfs_agi *agi; > + struct xfs_buf *agibuf = NULL; > int agi_dirty = 0; > - xfs_sb_t *sb; > - xfs_buf_t *sbbuf; > + struct xfs_sb *sb = NULL; > + struct xfs_buf *sbbuf = NULL; > int sb_dirty = 0; > int status; > + char *objname = NULL; > > sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), > 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; > + objname = _("root superblock"); > + goto out_free; > } > + if (sbbuf->b_error == EFSBADCRC || sbbuf->b_error == EFSCORRUPTED) > + sb_dirty = 1; > + > sb = (xfs_sb_t *)calloc(BBSIZE, 1); > if (!sb) { > do_error(_("can't allocate memory for superblock\n")); > - libxfs_putbuf(sbbuf); > - return; > + goto out_free; > } > libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); > > @@ -1236,23 +1239,22 @@ scan_ag( > XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), > 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); > - free(sb); > - return; > + objname = _("agf block"); > + goto out_free; > } > + if (agfbuf->b_error == EFSBADCRC || agfbuf->b_error == EFSCORRUPTED) > + agf_dirty = 1; > agf = XFS_BUF_TO_AGF(agfbuf); > > agibuf = libxfs_readbuf(mp->m_dev, > XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), > 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); > - libxfs_putbuf(sbbuf); > - free(sb); > - return; > + objname = _("agi block"); > + goto out_free; > } > + if (agibuf->b_error == EFSBADCRC || agibuf->b_error == EFSCORRUPTED) > + agi_dirty = 1; > agi = XFS_BUF_TO_AGI(agibuf); > > /* fix up bad ag headers */ > @@ -1277,7 +1279,7 @@ scan_ag( > do_warn(_("would reset bad sb for ag %d\n"), agno); > } > } > - if (status & XR_AG_AGF) { > + if (agf_dirty || status & XR_AG_AGF) { > if (!no_modify) { > do_warn(_("reset bad agf for ag %d\n"), agno); > agf_dirty = 1; > @@ -1285,7 +1287,7 @@ scan_ag( > do_warn(_("would reset bad agf for ag %d\n"), agno); > } > } > - if (status & XR_AG_AGI) { > + if (agi_dirty || status & XR_AG_AGI) { > if (!no_modify) { > do_warn(_("reset bad agi for ag %d\n"), agno); > agi_dirty = 1; There are a few asserts a bit further down this function that assume *_dirty is set only when in !no_modify mode. E.g.: ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); You'll probably want to remove those. Or... > @@ -1295,15 +1297,9 @@ scan_ag( > } > > if (status && no_modify) { > - libxfs_putbuf(agibuf); > - libxfs_putbuf(agfbuf); > - libxfs_putbuf(sbbuf); > - free(sb); > - > do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), > agno); > - > - return; > + goto out_free; > } Would we want to skip the ag, as such, on a CRC error in no_modify mode? If so, perhaps we could set the status variable on crc errors and bitwise or the value returned from verify_set_agheader(). Brian > > scan_freelist(agf, agcnts); > @@ -1341,6 +1337,20 @@ scan_ag( > print_inode_list(i); > #endif > return; > + > +out_free: > + if (sb) > + free(sb); > + if (agibuf) > + libxfs_putbuf(agibuf); > + if (agfbuf) > + libxfs_putbuf(agfbuf); > + if (sbbuf) > + libxfs_putbuf(sbbuf); > + if (objname) > + do_error(_("can't get %s for ag %d\n"), objname, agno); > + return; > + > } > > #define SCAN_THREADS 32 > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 15 14:56:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FA227F52 for ; Tue, 15 Apr 2014 14:56:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D61FAC001 for ; Tue, 15 Apr 2014 12:56:31 -0700 (PDT) X-ASG-Debug-ID: 1397591790-04bdf04555677c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wL1CDtZytsZJpzGB for ; Tue, 15 Apr 2014 12:56:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3FJuSZN030635 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Apr 2014 15:56:29 -0400 Received: from laptop.bfoster (vpn-48-211.rdu2.redhat.com [10.10.48.211]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3FJe4vj013850; Tue, 15 Apr 2014 15:40:04 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id E5E04120AC3; Tue, 15 Apr 2014 15:40:03 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3FJe1Z2006868; Tue, 15 Apr 2014 15:40:01 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 15 Apr 2014 15:40:00 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140415194000.GB3470@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-4-git-send-email-david@fromorbit.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: 1397591790 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 15, 2014 at 06:24:55PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Prefetch currently does not do CRC validation when the IO completes > due to the optimisation it performs and the fact that it does not > know what the type of metadata into the buffer is supposed to be. > Hence, mark all prefetched buffers as "suspect" so that when the > end user tries to read it with a supplied validation function the > validation is run even though the buffer was already in the cache. > > Signed-off-by: Dave Chinner > --- > include/libxfs.h | 1 + > libxfs/rdwr.c | 36 +++++++++++++++++++++++++++++++----- > repair/prefetch.c | 3 +++ > 3 files changed, 35 insertions(+), 5 deletions(-) > > diff --git a/include/libxfs.h b/include/libxfs.h > index 6bc6c94..6b1e276 100644 > --- a/include/libxfs.h > +++ b/include/libxfs.h > @@ -333,6 +333,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ > LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ > LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ > LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ > + LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */ This is used in the first couple patches, so it should probably be defined earlier (or shuffle those patches appropriately). > }; > > #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > index 7208a2f..a8f06aa 100644 > --- a/libxfs/rdwr.c > +++ b/libxfs/rdwr.c > @@ -718,12 +718,25 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, > bp = libxfs_getbuf(btp, blkno, len); > if (!bp) > return NULL; > - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) > + > + /* > + * if the buffer was prefetched, it is likely that it was not > + * validated. Hence if we are supplied an ops function and the > + * buffer is marked as unchecked, we need to validate it now. > + */ > + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { > + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { > + bp->b_error = 0; > + bp->b_ops = ops; > + bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; Should we always expect an unchecked buffer to be read with an ops vector before being written? Even if so, this might look cleaner if we didn't encode the possibility of running a read verifier on a dirty buffer. I presume that would always fail as the crc is updated in the write verifier. > + } > 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. > + * Set the ops on a cache miss (i.e. first physical read) as the > + * verifier may change the ops to match the type of 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*. > @@ -733,8 +746,10 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, > error = libxfs_readbufr(btp, blkno, bp, len, flags); > if (error) > bp->b_error = error; > - else if (bp->b_ops) > + else if (bp->b_ops) { > bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > + } > return bp; > } > > @@ -786,6 +801,14 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, > return NULL; > > bp->b_error = 0; > + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { > + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { > + bp->b_ops = ops; > + bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > + } Same comment here. Brian > + return bp; > + } > bp->b_ops = ops; > if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) > return bp; > @@ -793,8 +816,10 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, > error = libxfs_readbufr_map(btp, bp, flags); > if (!error) { > bp->b_flags |= LIBXFS_B_UPTODATE; > - if (bp->b_ops) > + if (bp->b_ops) { > bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > + } > } > #ifdef IO_DEBUG > printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", > @@ -889,6 +914,7 @@ libxfs_writebufr(xfs_buf_t *bp) > if (!error) { > bp->b_flags |= LIBXFS_B_UPTODATE; > bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > } > return error; > } > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 6d6d344..d794ba3 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -389,6 +389,7 @@ pf_read_inode_dirs( > > bp->b_ops = &xfs_inode_buf_ops; > bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > if (bp->b_error) > return; > > @@ -460,6 +461,7 @@ pf_read_discontig( > > pthread_mutex_unlock(&args->lock); > libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); > + bp->b_flags |= LIBXFS_B_UNCHECKED; > libxfs_putbuf(bp); > pthread_mutex_lock(&args->lock); > } > @@ -583,6 +585,7 @@ pf_batch_read( > break; > memcpy(XFS_BUF_PTR(bplist[i]), pbuf, size); > bplist[i]->b_flags |= LIBXFS_B_UPTODATE; > + bplist[i]->b_flags |= LIBXFS_B_UNCHECKED; > len -= size; > if (B_IS_INODE(XFS_BUF_PRIORITY(bplist[i]))) > pf_read_inode_dirs(args, bplist[i]); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sds@tycho.nsa.gov Tue Apr 15 15:08:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A28BB7F3F for ; Tue, 15 Apr 2014 15:08:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 43F98AC001 for ; Tue, 15 Apr 2014 13:08:26 -0700 (PDT) X-ASG-Debug-ID: 1397592504-04cb6c243965300001-NocioJ Received: from emvm-gh1-uea08.nsa.gov (emvm-gh1-uea08.nsa.gov [63.239.67.9]) by cuda.sgi.com with ESMTP id AGZAGRx651JV3XYQ for ; Tue, 15 Apr 2014 13:08:24 -0700 (PDT) X-Barracuda-Envelope-From: sds@tycho.nsa.gov X-Barracuda-Apparent-Source-IP: 63.239.67.9 X-TM-IMSS-Message-ID: Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by nsa.gov ([63.239.67.9]) with ESMTP (TREND IMSS SMTP Service 7.1; TLSv1/SSLv3 DHE-RSA-AES256-SHA (256/256)) id e3150f0800008c21 ; Tue, 15 Apr 2014 16:07:02 -0400 Received: from moss-pluto.infosec.tycho.ncsc.mil (moss-pluto [192.168.25.131]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id s3FK7dZT001365; Tue, 15 Apr 2014 16:07:50 -0400 Message-ID: <534D90D0.9090805@tycho.nsa.gov> Date: Tue, 15 Apr 2014 16:04:32 -0400 From: Stephen Smalley Organization: National Security Agency User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Christoph Hellwig , Brian Foster CC: xfs@oss.sgi.com, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation In-Reply-To: <20140415175033.GB26404@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: emvm-gh1-uea08.nsa.gov[63.239.67.9] X-Barracuda-Start-Time: 1397592504 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/15/2014 01:50 PM, Christoph Hellwig wrote: > On Tue, Apr 15, 2014 at 12:18:24PM -0400, Brian Foster wrote: >> + error = xfs_init_security(inode, dir, &dentry->d_name); >> + if (unlikely(error)) { >> + iput(inode); >> + return -error; >> + } >> + >> d_tmpfile(dentry, inode); >> > > I'd really love to hear from the LSM people who they plan to deal with > O_TMPFILE inodes. But given that this seems to fix a real life bug > let's go with it for now. Is there a reason that xfs_init_security() isn't called from the inode allocation function (e.g. xfs_ialloc), as in ext4 (__ext4_new_inode calls ext4_init_security and also calls ext4_init_acl)? That would have ensured that tmpfile inodes would have been labeled without requiring a separate change and more generally ensures complete coverage for all inodes. For SELinux, we need the tmpfile inodes to be labeled at creation time, not just if linked into the namespace, since they may be shared via local socket IPC or inherited across a label-changing exec and since we revalidate access on transfer or use. Labeling based on the provided directory could be a bit random, although it will work out with current policy if the provided directory corresponds to existing tmpfile locations (e.g. /tmp, /var/tmp) and therefore already has a label associated with temporary files. Otherwise we might want some indication that it is a tmpfile passed into security_inode_init_security() so that we can always select a stable label irrespective of the directory. From supportv3@ovh.net Tue Apr 15 15:17:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7EDCB7F3F for ; Tue, 15 Apr 2014 15:17:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 63CB88F8064 for ; Tue, 15 Apr 2014 13:17:43 -0700 (PDT) X-ASG-Debug-ID: 1397593059-04bdf04555682b0001-NocioJ Received: from ox10.clicboutic.com (ox10.clicboutic.com [95.131.138.193]) by cuda.sgi.com with ESMTP id 0jF0oMpYslbAFjtG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 13:17:40 -0700 (PDT) X-Barracuda-Envelope-From: supportv3@ovh.net X-Barracuda-Apparent-Source-IP: 95.131.138.193 Received: from ox10.clicboutic.com (unknown [127.0.0.1]) by ox10.clicboutic.com (Postfix) with ESMTP id 5E39DCE0810C; Tue, 15 Apr 2014 22:17:38 +0200 (CEST) Received: from webmail.custodio-shop.com (ox10.clicboutic.com [95.131.138.193]) by ox10.clicboutic.com (Postfix) with ESMTPA; Tue, 15 Apr 2014 22:17:38 +0200 (CEST) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=_88c976a8974a27d868e2cd4d2f009274" Date: Tue, 15 Apr 2014 22:17:38 +0200 From: Import/Export Recrutement To: undisclosed-recipients:; Subject: Coordinateur / Coordinatrice transit -import/export Message-ID: <7002feb556bdeb683ab27ce0420e14cf@mail.custodio-shop.com> X-ASG-Orig-Subj: Coordinateur / Coordinatrice transit -import/export X-Sender: supportv3@ovh.net User-Agent: RoundCube Webmail/0.3-beta X-Barracuda-Connect: ox10.clicboutic.com[95.131.138.193] X-Barracuda-Start-Time: 1397593060 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --=_88c976a8974a27d868e2cd4d2f009274 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Vous êtes sérieux et motivé. vous recherchez un job rémunérateur, à domicile. Pour cela, il est nécessaire de disposer d'un ordinateur avec connexion internet et une imprimante. il n'est pas demandé d'avoir des compétences particulières en informatique.Un responsable vous aidera tout au long de la première semaine de travail.Contact : intersource-recrutementt@outlook.fr --=_88c976a8974a27d868e2cd4d2f009274 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

 

Vous êtes = sérieux et motivé. vous recherchez un job rémuné= ;rateur, à domicile. Pour cela, il est nécessaire de dis= poser d'un ordinateur avec connexion internet et une imprimante. il n'= est pas demandé d'avoir des compétences particulières = en informatique.Un responsable vous aidera tout au long de la premiè= re semaine de travail.Contact : inte= rsource-recrutementt@outlook.fr

--=_88c976a8974a27d868e2cd4d2f009274-- From sds@tycho.nsa.gov Tue Apr 15 15:20:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A9F1F7F3F for ; Tue, 15 Apr 2014 15:20:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 399CCAC005 for ; Tue, 15 Apr 2014 13:20:12 -0700 (PDT) X-ASG-Debug-ID: 1397593210-04cb6c243765890001-NocioJ Received: from emvm-gh1-uea08.nsa.gov (emvm-gh1-uea08.nsa.gov [63.239.67.9]) by cuda.sgi.com with ESMTP id 4Dma6hB4qXmQQpNp for ; Tue, 15 Apr 2014 13:20:10 -0700 (PDT) X-Barracuda-Envelope-From: sds@tycho.nsa.gov X-Barracuda-Apparent-Source-IP: 63.239.67.9 X-TM-IMSS-Message-ID: Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by nsa.gov ([63.239.67.9]) with ESMTP (TREND IMSS SMTP Service 7.1; TLSv1/SSLv3 DHE-RSA-AES256-SHA (256/256)) id e31fe53b00008f18 ; Tue, 15 Apr 2014 16:18:52 -0400 Received: from moss-pluto.infosec.tycho.ncsc.mil (moss-pluto [192.168.25.131]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id s3FKJWGQ002078; Tue, 15 Apr 2014 16:19:42 -0400 Message-ID: <534D9399.2090407@tycho.nsa.gov> Date: Tue, 15 Apr 2014 16:16:25 -0400 From: Stephen Smalley Organization: National Security Agency User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Christoph Hellwig , Brian Foster CC: xfs@oss.sgi.com, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org, Eric Paris , Paul Moore Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> <534D90D0.9090805@tycho.nsa.gov> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation In-Reply-To: <534D90D0.9090805@tycho.nsa.gov> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: emvm-gh1-uea08.nsa.gov[63.239.67.9] X-Barracuda-Start-Time: 1397593210 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/15/2014 04:04 PM, Stephen Smalley wrote: > On 04/15/2014 01:50 PM, Christoph Hellwig wrote: >> On Tue, Apr 15, 2014 at 12:18:24PM -0400, Brian Foster wrote: >>> + error = xfs_init_security(inode, dir, &dentry->d_name); >>> + if (unlikely(error)) { >>> + iput(inode); >>> + return -error; >>> + } >>> + >>> d_tmpfile(dentry, inode); >>> >> >> I'd really love to hear from the LSM people who they plan to deal with >> O_TMPFILE inodes. But given that this seems to fix a real life bug >> let's go with it for now. > > Is there a reason that xfs_init_security() isn't called from the inode > allocation function (e.g. xfs_ialloc), as in ext4 (__ext4_new_inode > calls ext4_init_security and also calls ext4_init_acl)? That would have > ensured that tmpfile inodes would have been labeled without requiring a > separate change and more generally ensures complete coverage for all inodes. > > For SELinux, we need the tmpfile inodes to be labeled at creation time, > not just if linked into the namespace, since they may be shared via > local socket IPC or inherited across a label-changing exec and since we > revalidate access on transfer or use. > > Labeling based on the provided directory could be a bit random, although > it will work out with current policy if the provided directory > corresponds to existing tmpfile locations (e.g. /tmp, /var/tmp) and > therefore already has a label associated with temporary files. > Otherwise we might want some indication that it is a tmpfile passed into > security_inode_init_security() so that we can always select a stable > label irrespective of the directory. Hmm...wondering if we can use the qstr as a distinguisher; pass NULL for tmpfile and not for others as in ext4? From BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 15 15:22:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5AA027F3F for ; Tue, 15 Apr 2014 15:22:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CAE1304071 for ; Tue, 15 Apr 2014 13:22:25 -0700 (PDT) X-ASG-Debug-ID: 1397593343-04bdf04554684d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id dJvGNYtrHf1AWqub (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 13:22:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+652ed24fe461ba827d99+3887+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wa9s6-0003yS-3l; Tue, 15 Apr 2014 20:22:22 +0000 Date: Tue, 15 Apr 2014 13:22:22 -0700 From: Christoph Hellwig To: Stephen Smalley Cc: Brian Foster , linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation Message-ID: <20140415202222.GA10928@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> <534D90D0.9090805@tycho.nsa.gov> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534D90D0.9090805@tycho.nsa.gov> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397593343 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 15, 2014 at 04:04:32PM -0400, Stephen Smalley wrote: > Is there a reason that xfs_init_security() isn't called from the inode > allocation function (e.g. xfs_ialloc), as in ext4 (__ext4_new_inode > calls ext4_init_security and also calls ext4_init_acl)? That would have > ensured that tmpfile inodes would have been labeled without requiring a > separate change and more generally ensures complete coverage for all inodes. Really just code structuring - we don't like callouts to high level VFS functions from deep down in the guts of the filesystem. > For SELinux, we need the tmpfile inodes to be labeled at creation time, > not just if linked into the namespace, since they may be shared via > local socket IPC or inherited across a label-changing exec and since we > revalidate access on transfer or use. > > Labeling based on the provided directory could be a bit random, although > it will work out with current policy if the provided directory > corresponds to existing tmpfile locations (e.g. /tmp, /var/tmp) and > therefore already has a label associated with temporary files. > Otherwise we might want some indication that it is a tmpfile passed into > security_inode_init_security() so that we can always select a stable > label irrespective of the directory. Just check for I_LINKABLE in i_flags. From sds@tycho.nsa.gov Tue Apr 15 15:25:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 60D417F3F for ; Tue, 15 Apr 2014 15:25:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B571304071 for ; Tue, 15 Apr 2014 13:25:51 -0700 (PDT) X-ASG-Debug-ID: 1397593549-04bdf0455368670001-NocioJ Received: from emvm-gh1-uea09.nsa.gov (emvm-gh1-uea09.nsa.gov [63.239.67.10]) by cuda.sgi.com with ESMTP id CqvBzgzmQvI5s4IB for ; Tue, 15 Apr 2014 13:25:49 -0700 (PDT) X-Barracuda-Envelope-From: sds@tycho.nsa.gov X-Barracuda-Apparent-Source-IP: 63.239.67.10 X-TM-IMSS-Message-ID: Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by nsa.gov ([63.239.67.10]) with ESMTP (TREND IMSS SMTP Service 7.1; TLSv1/SSLv3 DHE-RSA-AES256-SHA (256/256)) id bfa564bb00008cb6 ; Tue, 15 Apr 2014 16:27:48 -0400 Received: from moss-pluto.infosec.tycho.ncsc.mil (moss-pluto [192.168.25.131]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id s3FKP3ru002559; Tue, 15 Apr 2014 16:25:14 -0400 Message-ID: <534D94E4.8070606@tycho.nsa.gov> Date: Tue, 15 Apr 2014 16:21:56 -0400 From: Stephen Smalley Organization: National Security Agency User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Christoph Hellwig CC: Brian Foster , linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> <534D90D0.9090805@tycho.nsa.gov> <20140415202222.GA10928@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation In-Reply-To: <20140415202222.GA10928@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: emvm-gh1-uea09.nsa.gov[63.239.67.10] X-Barracuda-Start-Time: 1397593549 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/15/2014 04:22 PM, Christoph Hellwig wrote: > On Tue, Apr 15, 2014 at 04:04:32PM -0400, Stephen Smalley wrote: >> Is there a reason that xfs_init_security() isn't called from the inode >> allocation function (e.g. xfs_ialloc), as in ext4 (__ext4_new_inode >> calls ext4_init_security and also calls ext4_init_acl)? That would have >> ensured that tmpfile inodes would have been labeled without requiring a >> separate change and more generally ensures complete coverage for all inodes. > > Really just code structuring - we don't like callouts to high level VFS > functions from deep down in the guts of the filesystem. > >> For SELinux, we need the tmpfile inodes to be labeled at creation time, >> not just if linked into the namespace, since they may be shared via >> local socket IPC or inherited across a label-changing exec and since we >> revalidate access on transfer or use. >> >> Labeling based on the provided directory could be a bit random, although >> it will work out with current policy if the provided directory >> corresponds to existing tmpfile locations (e.g. /tmp, /var/tmp) and >> therefore already has a label associated with temporary files. >> Otherwise we might want some indication that it is a tmpfile passed into >> security_inode_init_security() so that we can always select a stable >> label irrespective of the directory. > > Just check for I_LINKABLE in i_flags. Thanks, that should allow us to handle it cleanly in the security modules! From david@fromorbit.com Tue Apr 15 16:34:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD55B7F3F for ; Tue, 15 Apr 2014 16:34:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DFDD98F8052 for ; Tue, 15 Apr 2014 14:34:25 -0700 (PDT) X-ASG-Debug-ID: 1397597662-04cb6c243667b60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id C9gu8598nDnHNDRB for ; Tue, 15 Apr 2014 14:34:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArQGAKmkTVN5LEcv/2dsb2JhbABagwY7gxeKa5xHk16FXoEqF3SCJQEBAQMBOhwjBQsIAxgJDBkPBSUDIROHdAcOzGoWjgRJBwqELgSYYZJGg0MrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:04:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaAzY-0005eI-KM; Wed, 16 Apr 2014 07:34:08 +1000 Date: Wed, 16 Apr 2014 07:34:08 +1000 From: Dave Chinner To: Johannes Truschnigg Cc: xfs@oss.sgi.com Subject: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md Message-ID: <20140415213408.GL15995@dastard> X-ASG-Orig-Subj: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md References: <534D24AB.1050605@geizhals.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534D24AB.1050605@geizhals.at> 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: 1397597663 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 02:23:07PM +0200, Johannes Truschnigg wrote: > Hi list, > > we're building a postgres streaming replication slave that's > supposed to pick up work if our primary pg cluster (with an > all-flash FC SAN appliance as its backend store) goes down. We'll be > using consumer-grade hardware for this setup, which I detail below: > > o 2x Intel Xeon E5-2630L (24 threads total) > o 512GB DDR3 ECC RDIMM > o Intel C606-based Dual 4-Port SATA/SAS HBA (PCIID 8086:1d68) How much write cache does this have? > o 6x Samsung 830 SSD with 512GB each, 25% reserved for HPA 830? That's the previous generation of drives - do you mean 840? > o Debian GNU/Linux 7.x "Wheezy" + backports kernel (3.13+) > o PostgreSQL 9.0 > > If there's anything else that is of critical interest that I forgot > to mention, hardware- or software-wise, please let me know. > > When benchmarking the individual SSDs with fio (using the libaio > backend), the IOPS we've seen were in the 30k-35k range overall for > 4K block sizes. They don't sustain that performance over 20+ minutes of constant IO, though. Even if you have 840s (I have 840 EVOs in my test rig), the sustained performance of 4k random write IOPS is somewhere around 4-6k each. See, for example, the performance consistency graphs here: http://www.anandtech.com/show/7173/samsung-ssd-840-evo-review-120gb-250gb-500gb-750gb-1tb-models-tested/6 Especially the last one that shows a zoomed view of the steady state behaviour between 1400s and 2000s of constant load. The 830 series are old enough that they were reviewed before this was considered an important metric for SSD comparison, and so there is no equivalent information available for them. However, they are likely to be significantly slower and less deterministic in their behaviour than the 840s under the same load... > The host will be on the receiving end of a pg9.0 > streaming replication cluster setup where the master handles ~50k > IOPS peak, and I'm thinking what'd be a good approach to design the > local storage stack (with availability in mind) in a way that has a > chance to keep up with our flash-based FC SAN. I'd be surprised if it can keep up after a couple of months of production level IO going to the SSDs... > After digging through linux-raid archives, I think the most sensible > approach are two-disk pairs in RAID1 that are concatenated via > either LVM2 or md (leaning towards the latter, since I'd expect that > to have a tad less overhead), I'd stripe them (i.e. RAID10), not concantenate them so as to load both RAID1 legs evenly. > and xfs on top of that resulting block > device. That should yield roughly 1.2TB of usable space (we need a > minimum of 900GB for the DB). With this setup, it should be possible > to have up to 3 CPUs busy with handling I/O on the block side of > things, which raises the question what'd be a sensible value to > choose for xfs' Allocation Group Count/agcount. > > I've been trying to find information on that myself, but what I > managed to dig up is, at times, so old that it seems rather > outlandish today - some sources on the web (from 2003), for example, > say that one AG per 4GB of underlying diskspace makes sense, which > seems excessive for a 1200GB volume. > > I've experimented with mkfs.xfs (on top of LVM only; I don't know if > it takes into account lower block layers and seen that it supposedly > chooses to default to an agcount of 4, which seems insufficient > given the max. bandwidth our setup should be able to provide. The number of AGs has no bearing on acheivable bandwidth. The number of AGs affects allocation concurrency. Hence if you have 24 CPU cores, I'd expect that you want 32 AGs. Normally with a RAID array this will be the default, but it seems that RAID1 is not triggering the "optimise for allocation concurrency" heuristics in mkfs.... > Apart from that, is there any kind of advice you can share for > tuning xfs to run postgres (9.0 initially, but we're planning to > upgrade to 9.3 or later eventually) on in 2014, especially > performance-wise? Apart from the AG count and perhaps tuning the sunit/swidth to match the RAID0 part of the equation, I wouldn't touch a thing unless you know that there's a problem that needs fixing and you know exactly what knob will fix the problem you have... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 16:36:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF52C7F3F for ; Tue, 15 Apr 2014 16:36:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BE61B304077 for ; Tue, 15 Apr 2014 14:36:50 -0700 (PDT) X-ASG-Debug-ID: 1397597808-04bdf045526a550001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id R8M9c9WODZ3SgDah for ; Tue, 15 Apr 2014 14:36:48 -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: An0GAMelTVN5LEcv/2dsb2JhbABagwaDUlG6P4VegSoXdIIlAQEBBCMPASMjEAgBAhEDAQIBAgIFIQICDwUlAxMOE4d7jWOcGaJjFxaBE406B4JvgUkEmGGKZodgg0Mr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:06:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaB1v-0005fe-3X; Wed, 16 Apr 2014 07:36:35 +1000 Date: Wed, 16 Apr 2014 07:36:35 +1000 From: Dave Chinner To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: <20140415213635.GM15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file References: <1397242665-2183-1-git-send-email-lczerner@redhat.com> <1397242665-2183-2-git-send-email-lczerner@redhat.com> <20140412151935.GA18047@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397597808 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 03:09:42PM +0200, Lukáš Czerner wrote: > On Sat, 12 Apr 2014, Christoph Hellwig wrote: > > > Date: Sat, 12 Apr 2014 08:19:35 -0700 > > From: Christoph Hellwig > > To: Lukas Czerner > > Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, > > linux-ext4@vger.kernel.org, xfs@oss.sgi.com > > Subject: Re: [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only > > file > > > > On Fri, Apr 11, 2014 at 08:57:43PM +0200, Lukas Czerner wrote: > > > /* > > > - * It's not possible to punch hole or perform collapse range > > > - * on append only file > > > + * It's not possible to punch hole, perform collapse range > > > + * or zero range on append only file > > > */ > > > - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) > > > + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE | > > > + FALLOC_FL_ZERO_RANGE) > > > > Might be better to make this a negative test fo the operation that is > > allowed on an appen only file. That's also much better future proof. > > > > True, it might be better to do it this way: > > if (mode & ~FALLOC_FL_KEEP_SIZE && IS_APPEND(inode)) if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode)) :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 16:47:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 918707F3F for ; Tue, 15 Apr 2014 16:47:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2DDF5AC001 for ; Tue, 15 Apr 2014 14:46:58 -0700 (PDT) X-ASG-Debug-ID: 1397598416-04cb6c243868040001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id HB1xgjN5Rm5GTdqf for ; Tue, 15 Apr 2014 14:46:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnoGACmoTVN5LEcv/2dsb2JhbABagwaDUrsQhV6BKhd0giUBAQEEJxMcIxAIAw4HAwklDwUlAyETh3vMVhcWjk0HhDgEmGGSRoNDK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:16:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaBBi-0005j5-Tj; Wed, 16 Apr 2014 07:46:42 +1000 Date: Wed, 16 Apr 2014 07:46:42 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140415214642.GN15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-4-git-send-email-david@fromorbit.com> <20140415194000.GB3470@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415194000.GB3470@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397598416 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 03:40:00PM -0400, Brian Foster wrote: > On Tue, Apr 15, 2014 at 06:24:55PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Prefetch currently does not do CRC validation when the IO completes > > due to the optimisation it performs and the fact that it does not > > know what the type of metadata into the buffer is supposed to be. > > Hence, mark all prefetched buffers as "suspect" so that when the > > end user tries to read it with a supplied validation function the > > validation is run even though the buffer was already in the cache. > > > > Signed-off-by: Dave Chinner > > --- > > include/libxfs.h | 1 + > > libxfs/rdwr.c | 36 +++++++++++++++++++++++++++++++----- > > repair/prefetch.c | 3 +++ > > 3 files changed, 35 insertions(+), 5 deletions(-) > > > > diff --git a/include/libxfs.h b/include/libxfs.h > > index 6bc6c94..6b1e276 100644 > > --- a/include/libxfs.h > > +++ b/include/libxfs.h > > @@ -333,6 +333,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ > > LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ > > LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ > > LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ > > + LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */ > > This is used in the first couple patches, so it should probably be > defined earlier (or shuffle those patches appropriately). Ah, I busted that on shuffling the patchset, and hadn't done a patch-by-patch compile. Well spotted! > > > }; > > > > #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) > > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > > index 7208a2f..a8f06aa 100644 > > --- a/libxfs/rdwr.c > > +++ b/libxfs/rdwr.c > > @@ -718,12 +718,25 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, > > bp = libxfs_getbuf(btp, blkno, len); > > if (!bp) > > return NULL; > > - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) > > + > > + /* > > + * if the buffer was prefetched, it is likely that it was not > > + * validated. Hence if we are supplied an ops function and the > > + * buffer is marked as unchecked, we need to validate it now. > > + */ > > + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { > > + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { > > + bp->b_error = 0; > > + bp->b_ops = ops; > > + bp->b_ops->verify_read(bp); > > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > > Should we always expect an unchecked buffer to be read with an ops > vector before being written? Even if so, this might look cleaner if we > didn't encode the possibility of running a read verifier on a dirty > buffer. I presume that would always fail as the crc is updated in the > write verifier. It should fail, and that's a good thing because writing to an unchecked buffer would indicate that we didn't validate it properly in the first place. Hence I thought that doing it this way leaves a canary that traps other problem usage with unchecked buffers. Realistically, we shouldn't be writing unchecked buffers - prefetch doesn't touch buffers, it just does IO, and so someone else has to read the buffers before they can be dirtied. If it's read without an ops structure then modified and read again with an ops structure, we'll catch it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 16:52:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9079B7F3F for ; Tue, 15 Apr 2014 16: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 8E7EC8F8071 for ; Tue, 15 Apr 2014 14:52:29 -0700 (PDT) X-ASG-Debug-ID: 1397598747-04cbb06e9b69940001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kBVNnsZ6bejIKMe3 for ; Tue, 15 Apr 2014 14:52:27 -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: AnoGAF+pTVN5LEcv/2dsb2JhbABagwaDUrsQhV6BKhd0giUBAQEEOhwjEAgDDgcDCSUPBSUDIROHe8xXFxaOTQeEOASYYZJGg0MrgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:22:27 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaBH4-0005ji-6H; Wed, 16 Apr 2014 07:52:14 +1000 Date: Wed, 16 Apr 2014 07:52:14 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140415215214.GO15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> <20140415194029.GC3470@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415194029.GC3470@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397598747 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 03:40:29PM -0400, Brian Foster wrote: > On Tue, Apr 15, 2014 at 06:24:57PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > repair doesn't currently detect verifier errors in AG header > > blocks - apart from the primary superblock they are not detected. > > They are, fortunately, corrected in the important cases (AGF, AGI > > and AGFL) because these structures are rebuilt in phase 5, but if > > you run xfs_repair in checking mode it won't report them as bad. > > > > Signed-off-by: Dave Chinner .... > > @@ -1285,7 +1287,7 @@ scan_ag( > > do_warn(_("would reset bad agf for ag %d\n"), agno); > > } > > } > > - if (status & XR_AG_AGI) { > > + if (agi_dirty || status & XR_AG_AGI) { > > if (!no_modify) { > > do_warn(_("reset bad agi for ag %d\n"), agno); > > agi_dirty = 1; > > There are a few asserts a bit further down this function that assume > *_dirty is set only when in !no_modify mode. E.g.: > > ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); > > You'll probably want to remove those. Or... I thought I caught all of those... > > > @@ -1295,15 +1297,9 @@ scan_ag( > > } > > > > if (status && no_modify) { > > - libxfs_putbuf(agibuf); > > - libxfs_putbuf(agfbuf); > > - libxfs_putbuf(sbbuf); > > - free(sb); > > - > > do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), > > agno); > > - > > - return; > > + goto out_free; > > } > > Would we want to skip the ag, as such, on a CRC error in no_modify mode? > If so, perhaps we could set the status variable on crc errors and > bitwise or the value returned from verify_set_agheader(). I figured that for CRC errors we really should try to validate everything if we can. If nothing else fails the validation, then it might be a bit flip in an unused portion of the sector and in that case we can actually continue onwards. IOWs, a CRC error is not necessarily fatal.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 16:54:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 546797F3F for ; Tue, 15 Apr 2014 16:54:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4556F8F8037 for ; Tue, 15 Apr 2014 14:54:15 -0700 (PDT) X-ASG-Debug-ID: 1397598852-04cbb06e9a699d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id A3NvVc1FlPl7vyTF for ; Tue, 15 Apr 2014 14:54: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: AnoGAF+pTVN5LEcv/2dsb2JhbABagwaDUrsQhV6BKhd0giUBAQEEJxMcIxAIAw4HAwklDwUlAyETh3vMVxcWjk0HhDgEmGGSRoNDKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:24:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaBIl-0005kf-Ov; Wed, 16 Apr 2014 07:53:59 +1000 Date: Wed, 16 Apr 2014 07:53:59 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/9] repair: report AG btree verifier errors Message-ID: <20140415215359.GP15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 6/9] repair: report AG btree verifier errors References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-7-git-send-email-david@fromorbit.com> <20140415194048.GD3470@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415194048.GD3470@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397598852 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 03:40:48PM -0400, Brian Foster wrote: > On Tue, Apr 15, 2014 at 06:24:58PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > When we scan the filesystem freespace and inode maps in phase 2, we > > don't report CRC errors that are found. We don't really care from a > > repair perspective, because the trees are completely rebuilt from > > the ground up in phase 5, but froma checking perspective we need to > > inform the user that we found inconsistencies. > > > > Signed-off-by: Dave Chinner > > --- > > repair/scan.c | 27 ++++++++++++++++++++++++--- > > 1 file changed, 24 insertions(+), 3 deletions(-) > > > > diff --git a/repair/scan.c b/repair/scan.c > > index 6c43474..75b4b70 100644 > > --- a/repair/scan.c > > +++ b/repair/scan.c > > @@ -82,6 +82,12 @@ scan_sbtree( > > do_error(_("can't read btree block %d/%d\n"), agno, root); > > return; > > } > > + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { > > + do_warn(_("btree block %d/%d is suspect, error %d\n"), > > + agno, root, bp->b_error); > > + suspect = 1; > > + } > > + > > (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, > > isroot, magic, priv); > > libxfs_putbuf(bp); > > @@ -123,6 +129,7 @@ scan_lbtree( > > xfs_buf_t *bp; > > int err; > > int dirty = 0; > > + bool badcrc = false; > > > > bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), > > XFS_FSB_TO_BB(mp, 1), 0, ops); > > @@ -132,14 +139,25 @@ scan_lbtree( > > XFS_FSB_TO_AGBNO(mp, root)); > > return(1); > > } > > + > > + /* > > + * only check for bad CRC here - caller will determine if there > > + * is a corruption or not and whether it got corrected and so needs > > + * writing back. CRC errors always imply we need to write the block. > > + */ > > + if (bp->b_error == EFSBADCRC) { > > + do_warn(_("btree block %d/%d is suspect, error %d\n"), > > + XFS_FSB_TO_AGNO(mp, root), > > + XFS_FSB_TO_AGBNO(mp, root), bp->b_error); > > + badcrc = true; > > + } > > + > > err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, > > type, whichfork, root, ino, tot, nex, blkmapp, > > bm_cursor, isroot, check_dups, &dirty, > > magic); > > > > - ASSERT(dirty == 0 || (dirty && !no_modify)); > > - > > Here we remove the dirty assert, but don't change the semantics of dirty > (we use badcrc). Yeah, I went back and changed the mechanism for correcting pure CRC errors not to use the dirty flag. I'll re-instate the assert... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 16:59:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1A99A7F3F for ; Tue, 15 Apr 2014 16:59:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1922A8F8054 for ; Tue, 15 Apr 2014 14:59:46 -0700 (PDT) X-ASG-Debug-ID: 1397599184-04cbb06e9d69ca0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UydC10ArImPAh5LN for ; Tue, 15 Apr 2014 14:59:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqwGAIeqTVN5LEcv/2dsb2JhbABagwY7gxenMpNehV6BKhd0giUBAQEEOhwjEAgDDgoJJQ8FJQMhE4d7DsxdFoxQgX0HhDgEmGGSRoNDKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:29:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaBO7-0005lh-Ow; Wed, 16 Apr 2014 07:59:31 +1000 Date: Wed, 16 Apr 2014 07:59:31 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 0/4] xfs: tmpfile fixes Message-ID: <20140415215931.GQ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 0/4] xfs: tmpfile fixes References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397578706-5385-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397599184 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 12:18:22PM -0400, Brian Foster wrote: > Hi all, > > Here's a v3 series for the patches previously posted here: > > http://oss.sgi.com/archives/xfs/2014-04/msg00181.html > > Patches 1 and 2 are just a split-up of the v1 patch: > > http://oss.sgi.com/archives/xfs/2014-04/msg00149.html > > Note the v1 patch has a reviewed-by, so feel free to drop 1 and 2 here > in favor of that version. Patches 3 and 4 are a couple cleanups in the > xfs_create() path. I've already got the orginal patch lined up for commit and have been testing it for a couple of days, so I'll stick with the original. The other two patches I'll add to the 3.16 queue as they aren't really bug fixes.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 17:02:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B8B877F3F for ; Tue, 15 Apr 2014 17:02:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A8DF30407A for ; Tue, 15 Apr 2014 15:02:39 -0700 (PDT) X-ASG-Debug-ID: 1397599353-04bdf045546b080001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 0hTkGODxdniGdsYc for ; Tue, 15 Apr 2014 15:02:33 -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: AnoGALOrTVN5LEcv/2dsb2JhbABagwaDUrsQhV6BKhd0giUBAQEEOhwjEAgDDgoJJQ8FJQMhE4d7zFIXFo5NB4Q4BJhhimaHYINDKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 07:32:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaBQq-0005mU-Bc; Wed, 16 Apr 2014 08:02:20 +1000 Date: Wed, 16 Apr 2014 08:02:20 +1000 From: Dave Chinner To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: <20140415220220.GR15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file References: <1397580076-19826-1-git-send-email-lczerner@redhat.com> <1397580076-19826-2-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397580076-19826-2-git-send-email-lczerner@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: 1397599353 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 06:41:15PM +0200, Lukas Czerner wrote: > Currently punch hole and collapse range fallocate operation are not > allowed on append only file. This should be case for zero range as well. > Fix it by allowing only pure fallocate (possibly with keep size set). > > Signed-off-by: Lukas Czerner > --- > v2: Change the condition to be future proof as suggested by hch > > fs/open.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/fs/open.c b/fs/open.c > index 631aea81..fe48b2f 100644 > --- a/fs/open.c > +++ b/fs/open.c > @@ -254,11 +254,9 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) > return -EBADF; > > /* > - * It's not possible to punch hole or perform collapse range > - * on append only file > + * We can only allow pure fallocate on append only files > */ > - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) > - && IS_APPEND(inode)) > + if (mode & ~FALLOC_FL_KEEP_SIZE && IS_APPEND(inode)) if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode)) gcc normally complains when you mix & and && in the same logic statement without () to separate the logic. I agree with gcc here, because the () indicate the intent of the logic and make it easy to determine that the & and && haven't been mixed up or fat-fingered... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue Apr 15 17:06:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C218D7F3F for ; Tue, 15 Apr 2014 17:06:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AFDFE30404E for ; Tue, 15 Apr 2014 15:06:06 -0700 (PDT) X-ASG-Debug-ID: 1397599565-04cbb06e9b69ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5TtwR8PpAKMPVqzQ for ; Tue, 15 Apr 2014 15:06: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-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 s3FM62UH011415 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 15 Apr 2014 18:06:03 -0400 Received: from laptop.bfoster (vpn-48-211.rdu2.redhat.com [10.10.48.211]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3FM62Ri004720; Tue, 15 Apr 2014 18:06:02 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id A73A6120AC3; Tue, 15 Apr 2014 18:06:01 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3FM60PP008017; Tue, 15 Apr 2014 18:06:00 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 15 Apr 2014 18:06:00 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140415220559.GE3470@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-4-git-send-email-david@fromorbit.com> <20140415194000.GB3470@laptop.bfoster> <20140415214642.GN15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415214642.GN15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397599565 X-Barracuda-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, Apr 16, 2014 at 07:46:42AM +1000, Dave Chinner wrote: > On Tue, Apr 15, 2014 at 03:40:00PM -0400, Brian Foster wrote: > > On Tue, Apr 15, 2014 at 06:24:55PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Prefetch currently does not do CRC validation when the IO completes > > > due to the optimisation it performs and the fact that it does not > > > know what the type of metadata into the buffer is supposed to be. > > > Hence, mark all prefetched buffers as "suspect" so that when the > > > end user tries to read it with a supplied validation function the > > > validation is run even though the buffer was already in the cache. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > include/libxfs.h | 1 + > > > libxfs/rdwr.c | 36 +++++++++++++++++++++++++++++++----- > > > repair/prefetch.c | 3 +++ > > > 3 files changed, 35 insertions(+), 5 deletions(-) > > > > > > diff --git a/include/libxfs.h b/include/libxfs.h > > > index 6bc6c94..6b1e276 100644 > > > --- a/include/libxfs.h > > > +++ b/include/libxfs.h > > > @@ -333,6 +333,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ > > > LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ > > > LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ > > > LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ > > > + LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */ > > > > This is used in the first couple patches, so it should probably be > > defined earlier (or shuffle those patches appropriately). > > Ah, I busted that on shuffling the patchset, and hadn't done a > patch-by-patch compile. Well spotted! > > > > > > }; > > > > > > #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) > > > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > > > index 7208a2f..a8f06aa 100644 > > > --- a/libxfs/rdwr.c > > > +++ b/libxfs/rdwr.c > > > @@ -718,12 +718,25 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, > > > bp = libxfs_getbuf(btp, blkno, len); > > > if (!bp) > > > return NULL; > > > - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) > > > + > > > + /* > > > + * if the buffer was prefetched, it is likely that it was not > > > + * validated. Hence if we are supplied an ops function and the > > > + * buffer is marked as unchecked, we need to validate it now. > > > + */ > > > + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { > > > + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { > > > + bp->b_error = 0; > > > + bp->b_ops = ops; > > > + bp->b_ops->verify_read(bp); > > > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > > > > Should we always expect an unchecked buffer to be read with an ops > > vector before being written? Even if so, this might look cleaner if we > > didn't encode the possibility of running a read verifier on a dirty > > buffer. I presume that would always fail as the crc is updated in the > > write verifier. > > It should fail, and that's a good thing because writing to an > unchecked buffer would indicate that we didn't validate it properly > in the first place. Hence I thought that doing it this way leaves > a canary that traps other problem usage with unchecked buffers. > > Realistically, we shouldn't be writing unchecked buffers - prefetch > doesn't touch buffers, it just does IO, and so someone else has to > read the buffers before they can be dirtied. If it's read without an > ops structure then modified and read again with an ops structure, > we'll catch it... > Ah, I see. That sounds good, but a small comment there with the reasoning to allow a read verifier to run on a dirty buffer would be nice. :) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From dgc@oss.sgi.com Tue Apr 15 17:45:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id C690F7F4E; Tue, 15 Apr 2014 17:45:19 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-fixes-for-3.15-rc2, created. xfs-for-linus-3.15-rc1-14836-gb901592 X-Git-Refname: refs/heads/xfs-fixes-for-3.15-rc2 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: b90159297f95491c348354344e52a4b3da440234 Message-Id: <20140415224519.C690F7F4E@oss.sgi.com> Date: Tue, 15 Apr 2014 17:45:19 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-fixes-for-3.15-rc2 has been created at b90159297f95491c348354344e52a4b3da440234 (commit) - Log ----------------------------------------------------------------- commit b90159297f95491c348354344e52a4b3da440234 Author: Brian Foster Date: Wed Apr 16 08:17:52 2014 +1000 xfs: fix tmpfile/selinux deadlock and initialize security xfstests generic/004 reproduces an ilock deadlock using the tmpfile interface when selinux is enabled. This occurs because xfs_create_tmpfile() takes the ilock and then calls d_tmpfile(). The latter eventually calls into xfs_xattr_get() which attempts to get the lock again. E.g.: xfs_io D ffffffff81c134c0 4096 3561 3560 0x00000080 ffff8801176a1a68 0000000000000046 ffff8800b401b540 ffff8801176a1fd8 00000000001d5800 00000000001d5800 ffff8800b401b540 ffff8800b401b540 ffff8800b73a6bd0 fffffffeffffffff ffff8800b73a6bd8 ffff8800b5ddb480 Call Trace: [] schedule+0x29/0x70 [] rwsem_down_read_failed+0xc5/0x120 [] ? xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] call_rwsem_down_read_failed+0x14/0x30 [] ? down_read_nested+0x89/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] xfs_attr_get+0x90/0xe0 [xfs] [] xfs_xattr_get+0x37/0x50 [xfs] [] generic_getxattr+0x4f/0x70 [] inode_doinit_with_dentry+0x1ae/0x650 [] selinux_d_instantiate+0x1c/0x20 [] security_d_instantiate+0x1b/0x30 [] d_instantiate+0x50/0x70 [] d_tmpfile+0xb5/0xc0 [] xfs_create_tmpfile+0x362/0x410 [xfs] [] xfs_vn_tmpfile+0x18/0x20 [xfs] [] path_openat+0x228/0x6a0 [] ? sched_clock+0x9/0x10 [] ? kvm_clock_read+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_filp_open+0x3a/0x90 [] ? _raw_spin_unlock+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_sys_open+0x12e/0x210 [] SyS_open+0x1e/0x20 [] system_call_fastpath+0x16/0x1b xfs_vn_tmpfile() also fails to initialize security on the newly created inode. Pull the d_tmpfile() call up into xfs_vn_tmpfile() after the transaction has been committed and the inode unlocked. Also, initialize security on the inode based on the parent directory provided via the tmpfile call. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 341fcf35d5c111e27c4ef5c2e179a463ff2fc1b5 Author: Eric Sandeen Date: Wed Apr 16 08:17:18 2014 +1000 xfs: fix buffer use after free on IO error When testing exhaustion of dm snapshots, the following appeared with CONFIG_DEBUG_OBJECTS_FREE enabled: ODEBUG: free active (active state 0) object type: work_struct hint: xfs_buf_iodone_work+0x0/0x1d0 [xfs] indicating that we'd freed a buffer which still had a pending reference, down this path: [ 190.867975] [] debug_check_no_obj_freed+0x22b/0x270 [ 190.880820] [] kmem_cache_free+0xd0/0x370 [ 190.892615] [] xfs_buf_free+0xe4/0x210 [xfs] [ 190.905629] [] xfs_buf_rele+0xe7/0x270 [xfs] [ 190.911770] [] xfs_trans_read_buf_map+0x7b6/0xac0 [xfs] At issue is the fact that if IO fails in xfs_buf_iorequest, we'll queue completion unconditionally, and then call xfs_buf_rele; but if IO failed, there are no IOs remaining, and xfs_buf_rele will free the bp while work is still queued. Fix this by not scheduling completion if the buffer has an error on it; run it immediately. The rest is only comment changes. Thanks to dchinner for spotting the root cause. Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit b7f6608b9de371c79498cd3db4b5346718430a0c Author: Dave Chinner Date: Wed Apr 16 08:17:16 2014 +1000 xfs: wrong error sign conversion during failed DIO writes We negate the error value being returned from a generic function incorrectly. The code path that it is running in returned negative errors, so there is no need to negate it to get the correct error signs here. This was uncovered by generic/019. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit d7cc0f34d9b8bdba7f426463ce1dc50a69bcac63 Author: Dave Chinner Date: Wed Apr 16 08:17:14 2014 +1000 xfs: unmount does not wait for shutdown during unmount And interesting situation can occur if a log IO error occurs during the unmount of a filesystem. The cases reported have the same signature - the update of the superblock counters fails due to a log write IO error: XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 XFS (dm-16): Log I/O Error Detected. Shutting down filesystem XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. XFS (dm-16): xfs_log_force: error 5 returned. XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) It can be seen that the last line of output contains a corrupt device name - this is because the log and xfs_mount structures have already been freed by the time this message is printed. A kernel oops closely follows. The issue is that the shutdown is occurring in a separate IO completion thread to the unmount. Once the shutdown processing has started and all the iclogs are marked with XLOG_STATE_IOERROR, the log shutdown code wakes anyone waiting on a log force so they can process the shutdown error. This wakes up the unmount code that is doing a synchronous transaction to update the superblock counters. The unmount path now sees all the iclogs are marked with XLOG_STATE_IOERROR and so never waits on them again, knowing that if it does, there will not be a wakeup trigger for it and we will hang the unmount if we do. Hence the unmount runs through all the remaining code and frees all the filesystem structures while the xlog_iodone() is still processing the shutdown. When the log shutdown processing completes, xfs_do_force_shutdown() emits the "Please umount the filesystem and rectify the problem(s)" message, and xlog_iodone() then aborts all the objects attached to the iclog. An iclog that has already been freed.... The real issue here is that there is no serialisation point between the log IO and the unmount. We have serialisations points for log writes, log forces, reservations, etc, but we don't actually have any code that wakes for log IO to fully complete. We do that for all other types of object, so why not iclogbufs? Well, it turns out that we can easily do this. We've got xfs_buf handles, and that's what everyone else uses for IO serialisation. i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only release the lock in xlog_iodone() when we are finished with the buffer. That way before we tear down the iclog, we can lock and unlock the buffer to ensure IO completion has finished completely before we tear it down. Signed-off-by: Dave Chinner Tested-by: Mike Snitzer Tested-by: Bob Mastors Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 5425a32d36703bf4099d597bb4eea5581efc2660 Author: Dave Chinner Date: Mon Apr 14 18:16:30 2014 +1000 xfs: collapse range is delalloc challenged FSX has been detecting data corruption after to collapse range calls. The key observation is that the offset of the last extent in the file was not being shifted, and hence when the file size was adjusted it was truncating away data because the extents handled been correctly shifted. Tracing indicated that before the collapse, the extent list looked like: .... ino 0x5788 state idx 6 offset 26 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 39 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 and after the shift of 2 blocks: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 Note that the last extent did not change offset. After the changing of the file size: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 30 flag 0 You can see that the last extent had it's length truncated, indicating that we've lost data. The reason for this is that the xfs_bmap_shift_extents() loop uses XFS_IFORK_NEXTENTS() to determine how many extents are in the inode. This, unfortunately, doesn't take into account delayed allocation extents - it's a count of physically allocated extents - and hence when the file being collapsed has a delalloc extent like this one does prior to the range being collapsed: .... ino 0x5788 state idx 4 offset 11 block 4503599627239429 count 1 flag 0 .... it gets the count wrong and terminates the shift loop early. Fix it by using the in-memory extent array size that includes delayed allocation extents to determine the number of extents on the inode. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 68c1fb5d82c8206e78895169810298f181b9183a Author: Dave Chinner Date: Mon Apr 14 18:15:45 2014 +1000 xfs: don't map ranges that span EOF for direct IO Al Viro tracked down the problem that has caused generic/263 to fail on XFS since the test was introduced. If is caused by xfs_get_blocks() mapping a single extent that spans EOF without marking it as buffer-new() so that the direct IO code does not zero the tail of the block at the new EOF. This is a long standing bug that has been around for many, many years. Because xfs_get_blocks() starts the map before EOF, it can't set buffer_new(), because that causes he direct IO code to also zero unaligned sectors at the head of the IO. This would overwrite valid data with zeros, and hence we cannot validly return a single extent that spans EOF to direct IO. Fix this by detecting a mapping that spans EOF and truncate it down to EOF. This results in the the direct IO code doing the right thing for unaligned data blocks before EOF, and then returning to get another mapping for the region beyond EOF which XFS treats correctly by setting buffer_new() on it. This makes direct Io behave correctly w.r.t. tail block zeroing beyond EOF, and fsx is happy about that. Again, thanks to Al Viro for finding what I couldn't. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 897b73b6a2ee5d3c06648b601beb1724f7fbd678 Author: Dave Chinner Date: Mon Apr 14 18:15:11 2014 +1000 xfs: zeroing space needs to punch delalloc blocks When we are zeroing space andit is covered by a delalloc range, we need to punch the delalloc range out before we truncate the page cache. Failing to do so leaves and inconsistency between the page cache and the extent tree, which we later trip over when doing direct IO over the same range. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit aad3f3755e7f043789b772856d1a2935f2b41a4b Author: Dave Chinner Date: Mon Apr 14 18:14:11 2014 +1000 xfs: xfs_vm_write_end truncates too much on failure Similar to the write_begin problem, xfs-vm_write_end will truncate back to the old EOF, potentially removing page cache from over the top of delalloc blocks with valid data in them. Fix this by truncating back to just the start of the failed write. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 72ab70a19b4ebb19dbe2a79faaa6a4ccead58e70 Author: Dave Chinner Date: Mon Apr 14 18:13:29 2014 +1000 xfs: write failure beyond EOF truncates too much data If we fail a write beyond EOF and have to handle it in xfs_vm_write_begin(), we truncate the inode back to the current inode size. This doesn't take into account the fact that we may have already made successful writes to the same page (in the case of block size < page size) and hence we can truncate the page cache away from blocks with valid data in them. If these blocks are delayed allocation blocks, we now have a mismatch between the page cache and the extent tree, and this will trigger - at minimum - a delayed block count mismatch assert when the inode is evicted from the cache. We can also trip over it when block mapping for direct IO - this is the most common symptom seen from fsx and fsstress when run from xfstests. Fix it by only truncating away the exact range we are updating state for in this write_begin call. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 4ab9ed578e82851645f3dd69d36d91ae77564d6c Author: Dave Chinner Date: Mon Apr 14 18:11:58 2014 +1000 xfs: kill buffers over failed write ranges properly When a write fails, if we don't clear the delalloc flags from the buffers over the failed range, they can persist beyond EOF and cause problems. writeback will see the pages in the page cache, see they are dirty and continually retry the write, assuming that the page beyond EOF is just racing with a truncate. The page will eventually be released due to some other operation (e.g. direct IO), and it will not pass through invalidation because it is dirty. Hence it will be released with buffer_delay set on it, and trigger warnings in xfs_vm_releasepage() and assert fail in xfs_file_aio_write_direct because invalidation failed and we didn't write the corect amount. This causes failures on block size < page size filesystems in fsx and fsstress workloads run by xfstests. Fix it by completely trashing any state on the buffer that could be used to imply that it contains valid data when the delalloc range over the buffer is punched out during the failed write handling. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Tue Apr 15 17:45:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 6B9A97F52; Tue, 15 Apr 2014 17:45:39 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc1-14836-gb901592 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 X-Git-Newrev: b90159297f95491c348354344e52a4b3da440234 Message-Id: <20140415224539.6B9A97F52@oss.sgi.com> Date: Tue, 15 Apr 2014 17:45:38 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated b901592 xfs: fix tmpfile/selinux deadlock and initialize security 341fcf3 xfs: fix buffer use after free on IO error b7f6608 xfs: wrong error sign conversion during failed DIO writes d7cc0f3 xfs: unmount does not wait for shutdown during unmount 5425a32 xfs: collapse range is delalloc challenged 68c1fb5 xfs: don't map ranges that span EOF for direct IO 897b73b xfs: zeroing space needs to punch delalloc blocks aad3f37 xfs: xfs_vm_write_end truncates too much on failure 72ab70a xfs: write failure beyond EOF truncates too much data 4ab9ed5 xfs: kill buffers over failed write ranges properly from c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (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 b90159297f95491c348354344e52a4b3da440234 Author: Brian Foster Date: Wed Apr 16 08:17:52 2014 +1000 xfs: fix tmpfile/selinux deadlock and initialize security xfstests generic/004 reproduces an ilock deadlock using the tmpfile interface when selinux is enabled. This occurs because xfs_create_tmpfile() takes the ilock and then calls d_tmpfile(). The latter eventually calls into xfs_xattr_get() which attempts to get the lock again. E.g.: xfs_io D ffffffff81c134c0 4096 3561 3560 0x00000080 ffff8801176a1a68 0000000000000046 ffff8800b401b540 ffff8801176a1fd8 00000000001d5800 00000000001d5800 ffff8800b401b540 ffff8800b401b540 ffff8800b73a6bd0 fffffffeffffffff ffff8800b73a6bd8 ffff8800b5ddb480 Call Trace: [] schedule+0x29/0x70 [] rwsem_down_read_failed+0xc5/0x120 [] ? xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] call_rwsem_down_read_failed+0x14/0x30 [] ? down_read_nested+0x89/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] xfs_attr_get+0x90/0xe0 [xfs] [] xfs_xattr_get+0x37/0x50 [xfs] [] generic_getxattr+0x4f/0x70 [] inode_doinit_with_dentry+0x1ae/0x650 [] selinux_d_instantiate+0x1c/0x20 [] security_d_instantiate+0x1b/0x30 [] d_instantiate+0x50/0x70 [] d_tmpfile+0xb5/0xc0 [] xfs_create_tmpfile+0x362/0x410 [xfs] [] xfs_vn_tmpfile+0x18/0x20 [xfs] [] path_openat+0x228/0x6a0 [] ? sched_clock+0x9/0x10 [] ? kvm_clock_read+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_filp_open+0x3a/0x90 [] ? _raw_spin_unlock+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_sys_open+0x12e/0x210 [] SyS_open+0x1e/0x20 [] system_call_fastpath+0x16/0x1b xfs_vn_tmpfile() also fails to initialize security on the newly created inode. Pull the d_tmpfile() call up into xfs_vn_tmpfile() after the transaction has been committed and the inode unlocked. Also, initialize security on the inode based on the parent directory provided via the tmpfile call. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 341fcf35d5c111e27c4ef5c2e179a463ff2fc1b5 Author: Eric Sandeen Date: Wed Apr 16 08:17:18 2014 +1000 xfs: fix buffer use after free on IO error When testing exhaustion of dm snapshots, the following appeared with CONFIG_DEBUG_OBJECTS_FREE enabled: ODEBUG: free active (active state 0) object type: work_struct hint: xfs_buf_iodone_work+0x0/0x1d0 [xfs] indicating that we'd freed a buffer which still had a pending reference, down this path: [ 190.867975] [] debug_check_no_obj_freed+0x22b/0x270 [ 190.880820] [] kmem_cache_free+0xd0/0x370 [ 190.892615] [] xfs_buf_free+0xe4/0x210 [xfs] [ 190.905629] [] xfs_buf_rele+0xe7/0x270 [xfs] [ 190.911770] [] xfs_trans_read_buf_map+0x7b6/0xac0 [xfs] At issue is the fact that if IO fails in xfs_buf_iorequest, we'll queue completion unconditionally, and then call xfs_buf_rele; but if IO failed, there are no IOs remaining, and xfs_buf_rele will free the bp while work is still queued. Fix this by not scheduling completion if the buffer has an error on it; run it immediately. The rest is only comment changes. Thanks to dchinner for spotting the root cause. Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit b7f6608b9de371c79498cd3db4b5346718430a0c Author: Dave Chinner Date: Wed Apr 16 08:17:16 2014 +1000 xfs: wrong error sign conversion during failed DIO writes We negate the error value being returned from a generic function incorrectly. The code path that it is running in returned negative errors, so there is no need to negate it to get the correct error signs here. This was uncovered by generic/019. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit d7cc0f34d9b8bdba7f426463ce1dc50a69bcac63 Author: Dave Chinner Date: Wed Apr 16 08:17:14 2014 +1000 xfs: unmount does not wait for shutdown during unmount And interesting situation can occur if a log IO error occurs during the unmount of a filesystem. The cases reported have the same signature - the update of the superblock counters fails due to a log write IO error: XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 XFS (dm-16): Log I/O Error Detected. Shutting down filesystem XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. XFS (dm-16): xfs_log_force: error 5 returned. XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) It can be seen that the last line of output contains a corrupt device name - this is because the log and xfs_mount structures have already been freed by the time this message is printed. A kernel oops closely follows. The issue is that the shutdown is occurring in a separate IO completion thread to the unmount. Once the shutdown processing has started and all the iclogs are marked with XLOG_STATE_IOERROR, the log shutdown code wakes anyone waiting on a log force so they can process the shutdown error. This wakes up the unmount code that is doing a synchronous transaction to update the superblock counters. The unmount path now sees all the iclogs are marked with XLOG_STATE_IOERROR and so never waits on them again, knowing that if it does, there will not be a wakeup trigger for it and we will hang the unmount if we do. Hence the unmount runs through all the remaining code and frees all the filesystem structures while the xlog_iodone() is still processing the shutdown. When the log shutdown processing completes, xfs_do_force_shutdown() emits the "Please umount the filesystem and rectify the problem(s)" message, and xlog_iodone() then aborts all the objects attached to the iclog. An iclog that has already been freed.... The real issue here is that there is no serialisation point between the log IO and the unmount. We have serialisations points for log writes, log forces, reservations, etc, but we don't actually have any code that wakes for log IO to fully complete. We do that for all other types of object, so why not iclogbufs? Well, it turns out that we can easily do this. We've got xfs_buf handles, and that's what everyone else uses for IO serialisation. i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only release the lock in xlog_iodone() when we are finished with the buffer. That way before we tear down the iclog, we can lock and unlock the buffer to ensure IO completion has finished completely before we tear it down. Signed-off-by: Dave Chinner Tested-by: Mike Snitzer Tested-by: Bob Mastors Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 5425a32d36703bf4099d597bb4eea5581efc2660 Author: Dave Chinner Date: Mon Apr 14 18:16:30 2014 +1000 xfs: collapse range is delalloc challenged FSX has been detecting data corruption after to collapse range calls. The key observation is that the offset of the last extent in the file was not being shifted, and hence when the file size was adjusted it was truncating away data because the extents handled been correctly shifted. Tracing indicated that before the collapse, the extent list looked like: .... ino 0x5788 state idx 6 offset 26 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 39 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 and after the shift of 2 blocks: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 Note that the last extent did not change offset. After the changing of the file size: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 30 flag 0 You can see that the last extent had it's length truncated, indicating that we've lost data. The reason for this is that the xfs_bmap_shift_extents() loop uses XFS_IFORK_NEXTENTS() to determine how many extents are in the inode. This, unfortunately, doesn't take into account delayed allocation extents - it's a count of physically allocated extents - and hence when the file being collapsed has a delalloc extent like this one does prior to the range being collapsed: .... ino 0x5788 state idx 4 offset 11 block 4503599627239429 count 1 flag 0 .... it gets the count wrong and terminates the shift loop early. Fix it by using the in-memory extent array size that includes delayed allocation extents to determine the number of extents on the inode. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 68c1fb5d82c8206e78895169810298f181b9183a Author: Dave Chinner Date: Mon Apr 14 18:15:45 2014 +1000 xfs: don't map ranges that span EOF for direct IO Al Viro tracked down the problem that has caused generic/263 to fail on XFS since the test was introduced. If is caused by xfs_get_blocks() mapping a single extent that spans EOF without marking it as buffer-new() so that the direct IO code does not zero the tail of the block at the new EOF. This is a long standing bug that has been around for many, many years. Because xfs_get_blocks() starts the map before EOF, it can't set buffer_new(), because that causes he direct IO code to also zero unaligned sectors at the head of the IO. This would overwrite valid data with zeros, and hence we cannot validly return a single extent that spans EOF to direct IO. Fix this by detecting a mapping that spans EOF and truncate it down to EOF. This results in the the direct IO code doing the right thing for unaligned data blocks before EOF, and then returning to get another mapping for the region beyond EOF which XFS treats correctly by setting buffer_new() on it. This makes direct Io behave correctly w.r.t. tail block zeroing beyond EOF, and fsx is happy about that. Again, thanks to Al Viro for finding what I couldn't. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 897b73b6a2ee5d3c06648b601beb1724f7fbd678 Author: Dave Chinner Date: Mon Apr 14 18:15:11 2014 +1000 xfs: zeroing space needs to punch delalloc blocks When we are zeroing space andit is covered by a delalloc range, we need to punch the delalloc range out before we truncate the page cache. Failing to do so leaves and inconsistency between the page cache and the extent tree, which we later trip over when doing direct IO over the same range. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit aad3f3755e7f043789b772856d1a2935f2b41a4b Author: Dave Chinner Date: Mon Apr 14 18:14:11 2014 +1000 xfs: xfs_vm_write_end truncates too much on failure Similar to the write_begin problem, xfs-vm_write_end will truncate back to the old EOF, potentially removing page cache from over the top of delalloc blocks with valid data in them. Fix this by truncating back to just the start of the failed write. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 72ab70a19b4ebb19dbe2a79faaa6a4ccead58e70 Author: Dave Chinner Date: Mon Apr 14 18:13:29 2014 +1000 xfs: write failure beyond EOF truncates too much data If we fail a write beyond EOF and have to handle it in xfs_vm_write_begin(), we truncate the inode back to the current inode size. This doesn't take into account the fact that we may have already made successful writes to the same page (in the case of block size < page size) and hence we can truncate the page cache away from blocks with valid data in them. If these blocks are delayed allocation blocks, we now have a mismatch between the page cache and the extent tree, and this will trigger - at minimum - a delayed block count mismatch assert when the inode is evicted from the cache. We can also trip over it when block mapping for direct IO - this is the most common symptom seen from fsx and fsstress when run from xfstests. Fix it by only truncating away the exact range we are updating state for in this write_begin call. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 4ab9ed578e82851645f3dd69d36d91ae77564d6c Author: Dave Chinner Date: Mon Apr 14 18:11:58 2014 +1000 xfs: kill buffers over failed write ranges properly When a write fails, if we don't clear the delalloc flags from the buffers over the failed range, they can persist beyond EOF and cause problems. writeback will see the pages in the page cache, see they are dirty and continually retry the write, assuming that the page beyond EOF is just racing with a truncate. The page will eventually be released due to some other operation (e.g. direct IO), and it will not pass through invalidation because it is dirty. Hence it will be released with buffer_delay set on it, and trigger warnings in xfs_vm_releasepage() and assert fail in xfs_file_aio_write_direct because invalidation failed and we didn't write the corect amount. This causes failures on block size < page size filesystems in fsx and fsstress workloads run by xfstests. Fix it by completely trashing any state on the buffer that could be used to imply that it contains valid data when the delalloc range over the buffer is punched out during the failed write handling. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 51 ++++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_bmap.c | 17 ++++++++++------ fs/xfs/xfs_bmap_util.c | 13 ++++++++++++- fs/xfs/xfs_buf.c | 16 +++++++++++---- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_inode.c | 5 +++-- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 20 ++++++++++++++++--- fs/xfs/xfs_log.c | 53 +++++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_trace.h | 1 + 10 files changed, 147 insertions(+), 33 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Tue Apr 15 19:07:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3B6857F3F for ; Tue, 15 Apr 2014 19:07:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C18630407E for ; Tue, 15 Apr 2014 17:07:22 -0700 (PDT) X-ASG-Debug-ID: 1397606837-04cb6c24366b940001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id sYWIE2a1TsSkiLEG for ; Tue, 15 Apr 2014 17:07:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhMHAALJTVN5LEcv/2dsb2JhbABaDoJ4O4MXimucSZNegVSECoEiF3SCJQEBAQMBOhwYCwULCAMYCSUPBSUDIROHdAcOzFIWjFCBfQeEOASYYZJGgnFSKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 09:36:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDN5-00064o-2N; Wed, 16 Apr 2014 10:06:35 +1000 Date: Wed, 16 Apr 2014 10:06:35 +1000 From: Dave Chinner To: Theodore Ts'o Cc: Eric Sandeen , =?utf-8?B?THVrw6HFoQ==?= Czerner , Ext4 Developers List , Namjae Jeon , xfs@oss.sgi.com Subject: Re: [PATCH] ext4: add fallocate mode blocking for debugging purposes Message-ID: <20140416000634.GT15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] ext4: add fallocate mode blocking for debugging purposes References: <1397420518-29218-1-git-send-email-tytso@mit.edu> <20140413220016.GD8122@thunk.org> <534D5B2D.70408@redhat.com> <20140415184442.GC4456@thunk.org> <534DB38B.7030805@redhat.com> <20140415233039.GR4456@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415233039.GR4456@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397606837 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [added xfs@oss.sgi.com] On Tue, Apr 15, 2014 at 07:30:39PM -0400, Theodore Ts'o wrote: > On Tue, Apr 15, 2014 at 05:32:43PM -0500, Eric Sandeen wrote: > > > I also had a sneaking suspicion that we might have a similar issue > > > with the INSERT RANGE patches which are coming down the pike, and so > > > having a general way of also being able INSERT RANGE if to be able to > > > quickly determine whether a potential bug was caused by INSERT RANGE > > > or some other pending changes might also be useful. > > > > Also: I'd humbly suggest just not merging those until they pass stringent > > tests like fsx & fsstress... > > > > Adding a pre-emptive knob to turn them off post-merge when they turn > > out to be broken sounds backwards to me... > > Having learned from COLLAPSE RANGE, I agree. The fact that we didn't > have full testing during the whole development cycle was unfortunate. > And we got lucky with the renameat patches, since I wasn't able to get > tha testing done because the xfstests commits didn't get merged until > *after* the they renameat commits got merged, and also because I > didn't notice that the i386 system call wasn't wired up when I was > doing my manual "just before I push to Linus" testing. I asked for renameat2 tests long before inclusion occurred. The fact is that we can't co-ordinate xfstests inclusion for a feature that we don't even know is going to be included until someone sends Linus a pull request.... > I plan on insisting that INSERT RANGE support being in the VFS, and be > fully enabled, and that we have full INSERT RANGE testing into > xfstests, during the development cycle. There wasn't a problem with the timing of xfstests inclusion - the problem was with the fact we didn't have sufficient QA coverage in xfstests when the initial upstream kernel commits occurred. This time around, the difference will be that this time we'll have fsx and fsstress coverage *before* kernel support is added, and I've already asked for that: http://oss.sgi.com/archives/xfs/2014-04/msg00121.html > Some of the work that I've > been doing with kvm-xfstests and why I created a github tytso/xfstests > git tree is specifically to make sure things go much more smoothly > this time around. Ted, this looks and sounds like you're preparing to fork xfstests. Why? What's the problem with working upstream on test development and refinement like everyone else does? This thread is a demonstration of how avoiding upstream interaction results in nasty hacks being proposed. If you asked the question on the xfs mailing list of how to avoid various fsstress/fsx operations, we woul dhave told you that using FSSTRESS_AVOID and adding an equivalent FSX_AVOID to xfstests is all that is needed. i.e. we already have partial infrastructure support for what you need in xfstests and it would be about 30 minutes work to add FSX_AVOID.... Is that fast enough for you? Indeed, we could also use similar env vars to ensure various _requires_* checks fail and to populate FSSTRESS_AVOID/FSX_AVOID automatically and so tests that require this functionality are not run. IOWs, it's in your best interests to work with upstream to add the functionality you require to xfstests. History tells us that forking development into private repositories has never worked out well for anyone, so I'd really, really like you to *at least try* to work with upstream as your primary test development environment.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 19:15:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A49CB7F4E for ; Tue, 15 Apr 2014 19:15:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84A2C304077 for ; Tue, 15 Apr 2014 17:15:51 -0700 (PDT) X-ASG-Debug-ID: 1397607345-04cbb06e9c6d1b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id GjqlwdsqGSX9vh1k for ; Tue, 15 Apr 2014 17:15:46 -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: AnoGAGfKTVN5LEcv/2dsb2JhbABaDoJ4g1K7EoVegSIXdIIlAQEBBDocIxAIAxgJJQ8FJQMhE4d7zEsXFo5NB4Q4BJR1g2ySRoJxUis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 09:45:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDVi-00066A-CA; Wed, 16 Apr 2014 10:15:30 +1000 Date: Wed, 16 Apr 2014 10:15:30 +1000 From: Dave Chinner To: Theodore Ts'o Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH] check: add support for an external test expunging file Message-ID: <20140416001530.GU15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] check: add support for an external test expunging file References: <1397530320-20579-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397530320-20579-1-git-send-email-tytso@mit.edu> 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: 1397607345 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 10:52:00PM -0400, Theodore Ts'o wrote: > Currently the -X option is intended to specify a set of expunging > files which are stored in each test/* subdirectory. As described in > the commit description for 0b1e8abd4, in order to exclude the test > generic/280, the -X option is used as follows: > > $ cat tests/generic/3.0-stable-avoid > 280 > $ sudo ./check -X 3.0-stable-avoid generic/280 > > However, it is sometimes useful to store the set of expunged tests in > a single file, outside of tests/* subdirectories. This commit allows > the following: > > $ cat /root/conf/data_journal.exclude > generic/068 > ext4/301 > $ sudo ./check -X /root/conf/data_journal.exclude -g auto > > If the argument to the -X option is a pathname (that is, includes a > '/' character), treat it as the latter case. If it the argument to > the -X option is just a bare filename (that is, does not include '/' > character), treat it as the former. Can you add a new option rather than overloading the existing one with new meanings and semantics? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 19:24:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B04467F4E for ; Tue, 15 Apr 2014 19:24:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A44F08F8049 for ; Tue, 15 Apr 2014 17:24:06 -0700 (PDT) X-ASG-Debug-ID: 1397607843-04cbb06e9c6d4e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id DJiPIwr2OxAnGuSG for ; Tue, 15 Apr 2014 17:24:04 -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: AnoGAL/MTVN5LEcv/2dsb2JhbABagwaDUrsShV6BIhd0giUBAQEEOhwjEAgDGAklDwUlAyETh3vMTBcWjk0HhDgEmGGSRoFygVEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 09:54:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDdl-00067q-Ju; Wed, 16 Apr 2014 10:23:49 +1000 Date: Wed, 16 Apr 2014 10:23:49 +1000 From: Dave Chinner To: Filipe David Borba Manana Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, jbacik@fb.com Subject: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents Message-ID: <20140416002349.GV15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397580201-27475-1-git-send-email-fdmanana@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: 1397607843 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 05:43:21PM +0100, Filipe David Borba Manana wrote: > This test verifies that after an incremental btrfs send the replicated file has > the same exact hole and data structure as in the origin filesystem. This didn't > use to be the case before the send stream version 2 - holes were sent as write > operations of 0 valued bytes instead of punching holes with the fallocate system > call, and pre-allocated extents were sent as well as write operations of 0 valued > bytes instead of intructions for the receiver to use the fallocate system call. > Also checks that prealloc extents that lie beyond the file's size are replicated > by an incremental send. Can you wrap commit messages at 68 columns? .... > +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch > +# List all hole and data segments. > +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo > +# List all extents, we're interested here in prealloc extents that lie beyond > +# the file's size. > +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch That dumps raw block numbers into the golden output. _filter_fiemap is probably needed here. > +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch > +# List all hole and data segments. > +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo > +# List all extents, we're interested here in prealloc extents that lie beyond > +# the file's size. > +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch Same here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Tue Apr 15 19:25:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C689B7F4E for ; Tue, 15 Apr 2014 19:25:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B5A198F8049 for ; Tue, 15 Apr 2014 17:25:55 -0700 (PDT) X-ASG-Debug-ID: 1397607953-04cbb06e9a6d5d0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id EnwwHEVp56Xnoljq (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 17:25:53 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WaDfk-0003er-OR; Wed, 16 Apr 2014 00:25:52 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id AA223580893; Tue, 15 Apr 2014 20:25:50 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397607950; bh=5uJUA0WduArOyoEQVSV4OpBLDTZdMxQGj14dcGeBlqQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pkEB6gOl/jwFlPEtV09P60v8l5JtE8Xv5QDTaAnAGyVjtoI7aI/qS3cp52agAobrX pybzQBdP1TfxwR4Ygu8mZsltLP2v1ES+eAaelTiK1mLCLyJay9rpCCZrhYnM/clg4n +3Cij6o1RH+eck8OVJxxloD+BhFr3jD47ZqapRrE= Date: Tue, 15 Apr 2014 20:25:50 -0400 From: Theodore Ts'o To: Dave Chinner Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH] check: add support for an external test expunging file Message-ID: <20140416002550.GB12078@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] check: add support for an external test expunging file References: <1397530320-20579-1-git-send-email-tytso@mit.edu> <20140416001530.GU15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416001530.GU15995@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397607953 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Apr 16, 2014 at 10:15:30AM +1000, Dave Chinner wrote: > > If the argument to the -X option is a pathname (that is, includes a > > '/' character), treat it as the latter case. If it the argument to > > the -X option is just a bare filename (that is, does not include '/' > > character), treat it as the former. > > Can you add a new option rather than overloading the existing one > with new meanings and semantics? If that's your preference, sure. How does --expunge-list-file strike you? Or would you prefer something else? I'm easy. :-) - Ted From david@fromorbit.com Tue Apr 15 19:29:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A94AD7F3F for ; Tue, 15 Apr 2014 19:29:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 899DA304077 for ; Tue, 15 Apr 2014 17:29:41 -0700 (PDT) X-ASG-Debug-ID: 1397608179-04cbb06e9c6d740001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id GPurRLwLIrY7zhmy for ; Tue, 15 Apr 2014 17:29: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: AnoGAOvNTVN5LEcv/2dsb2JhbABYgwaDUrsShV6BIhd0giUBAQEEOhwjEAgDGAklDwUNGAMhE4doAxDFTQ2GVhcWjDSCGQeEOASWdIFtjHeFT4NDKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 09:59:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDjB-00068m-Ot; Wed, 16 Apr 2014 10:29:25 +1000 Date: Wed, 16 Apr 2014 10:29:25 +1000 From: Dave Chinner To: Filipe David Borba Manana Cc: xfs@oss.sgi.com, jbacik@fb.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: btrfs, add test for btrfs properties Message-ID: <20140416002925.GW15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs, add test for btrfs properties References: <1397591424-25439-1-git-send-email-fdmanana@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397591424-25439-1-git-send-email-fdmanana@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: 1397608179 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 08:50:24PM +0100, Filipe David Borba Manana wrote: > This test case verifies the btrfs properties feature, a new feature > introduced in the linux kernel version 3.14. > > Signed-off-by: Filipe David Borba Manana ... > --- > common/rc | 9 +++ > tests/btrfs/048 | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/048.out | 78 +++++++++++++++++++ > tests/btrfs/group | 1 + > 4 files changed, 308 insertions(+) > create mode 100755 tests/btrfs/048 > create mode 100644 tests/btrfs/048.out > > diff --git a/common/rc b/common/rc > index acf419b..d4ba74f 100644 > --- a/common/rc > +++ b/common/rc > @@ -2262,6 +2262,15 @@ _run_btrfs_util_prog() > run_check $BTRFS_UTIL_PROG $* > } > > +_require_btrfs_properties() > +{ > + $BTRFS_UTIL_PROG | grep 'btrfs property ' > /dev/null 2>&1 > + if [ $? -ne 0 ] > + then > + _notrun "Missing btrfs-progs with properties support, skipped this test" > + fi if [ ... ]; then .... > +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 > + > +send_files_dir=$TEST_DIR/btrfs-test-$seq You should define this after including the common/* files. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 19:32:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 14C9E7F3F for ; Tue, 15 Apr 2014 19:32:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E597E304077 for ; Tue, 15 Apr 2014 17:31:59 -0700 (PDT) X-ASG-Debug-ID: 1397608317-04cb6c24366c3c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id q6fGACaODZA3LZN5 for ; Tue, 15 Apr 2014 17:31:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnoGABHPTVN5LEcv/2dsb2JhbABagwaDUrsShV6BIhd0giUBAQEEOhwjEAgDFQMJJQ8FJQMhE4d7y1gXFo5NB4Q4BJhhkkaDQys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 10:01:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDkn-00069U-Fr; Wed, 16 Apr 2014 10:31:05 +1000 Date: Wed, 16 Apr 2014 10:31:05 +1000 From: Dave Chinner To: Miklos Szeredi Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH] renameat2 syscall: turn EEXIST into ENOTEMPTY Message-ID: <20140416003105.GX15995@dastard> X-ASG-Orig-Subj: Re: [xfstests PATCH] renameat2 syscall: turn EEXIST into ENOTEMPTY References: <20140414104953.GE10187@tucsk.piliscsaba.szeredi.hu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414104953.GE10187@tucsk.piliscsaba.szeredi.hu> 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: 1397608317 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 12:49:53PM +0200, Miklos Szeredi wrote: > From: Miklos Szeredi > > XFS is returning EEXIST rather than ENOTEMPTY for several of > these rename tests. The rename man page says this about the errors: > > ENOTEMPTY or EEXIST > newpath is a nonempty directory, that is, contains > entries other than "." and "..". > > Which implies that both errors are valid and so the test should pass > in either case. > > Signed-off-by: Miklos Szeredi looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 19:32:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E75C67F3F for ; Tue, 15 Apr 2014 19:32:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D29FA30407A for ; Tue, 15 Apr 2014 17:32:18 -0700 (PDT) X-ASG-Debug-ID: 1397608336-04cbb06e9d6d840001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id X8zSv6zFj32oFxcs for ; Tue, 15 Apr 2014 17:32:17 -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: AnoGABHPTVN5LEcv/2dsb2JhbABaDoJ4g1K7EoVegSIXdIIlAQEBBDocIxAIAxgJJQ8FJQMhE4d7y1gXFo5NB4Q4BJhhkkaCcVIr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 10:02:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDli-00069g-PJ; Wed, 16 Apr 2014 10:32:02 +1000 Date: Wed, 16 Apr 2014 10:32:02 +1000 From: Dave Chinner To: Theodore Ts'o Cc: xfs@oss.sgi.com, Miklos Szeredi , Ext4 Developers List Subject: Re: [PATCH] renameat2: add system call number for i386 Message-ID: <20140416003202.GY15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] renameat2: add system call number for i386 References: <1397344384-15302-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397344384-15302-1-git-send-email-tytso@mit.edu> 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: 1397608336 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Apr 12, 2014 at 07:13:04PM -0400, Theodore Ts'o wrote: > Signed-off-by: "Theodore Ts'o" > Cc: Miklos Szeredi > --- > src/renameat2.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/src/renameat2.c b/src/renameat2.c > index 5145959..8613aa9 100644 > --- a/src/renameat2.c > +++ b/src/renameat2.c > @@ -14,6 +14,10 @@ > #define SYS_renameat2 316 > #endif > > +#if !defined(SYS_renameat2) && defined(__i386__) > +#define SYS_renameat2 353 > +#endif > + > static int renameat2(int dfd1, const char *path1, > int dfd2, const char *path2, > unsigned int flags) Yup, matches the kernel code. Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 19:34:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7898F7F3F for ; Tue, 15 Apr 2014 19:34:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5BE2E8F8065 for ; Tue, 15 Apr 2014 17:34:36 -0700 (PDT) X-ASG-Debug-ID: 1397608471-04bdf045546f090001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id GVsl9V3zpJtmpyIv for ; Tue, 15 Apr 2014 17:34:31 -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: AnoGABHPTVN5LEcv/2dsb2JhbABaDoJ4g1K7EoVegSIXdIIlAQEBBDocIxAIAxgJJQ8FJQMhE4d7y1gXFo5NB4Q4AQOYYZJGgnFSKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 10:04:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDnt-00069z-FO; Wed, 16 Apr 2014 10:34:17 +1000 Date: Wed, 16 Apr 2014 10:34:17 +1000 From: Dave Chinner To: Theodore Ts'o Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH] check: add support for an external test expunging file Message-ID: <20140416003417.GZ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] check: add support for an external test expunging file References: <1397530320-20579-1-git-send-email-tytso@mit.edu> <20140416001530.GU15995@dastard> <20140416002550.GB12078@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416002550.GB12078@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397608471 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 08:25:50PM -0400, Theodore Ts'o wrote: > On Wed, Apr 16, 2014 at 10:15:30AM +1000, Dave Chinner wrote: > > > If the argument to the -X option is a pathname (that is, includes a > > > '/' character), treat it as the latter case. If it the argument to > > > the -X option is just a bare filename (that is, does not include '/' > > > character), treat it as the former. > > > > Can you add a new option rather than overloading the existing one > > with new meanings and semantics? > > If that's your preference, sure. How does --expunge-list-file strike > you? Or would you prefer something else? I'm easy. :-) -E/--expunge-file is fine by me. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 15 19:38:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 487207F3F for ; Tue, 15 Apr 2014 19:38:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 327C930407B for ; Tue, 15 Apr 2014 17:38:32 -0700 (PDT) X-ASG-Debug-ID: 1397608709-04cb6c24396c690001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id cshwrBqUPNSvWjhR for ; Tue, 15 Apr 2014 17:38:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArgGABTQTVN5LEcv/2dsb2JhbABagwY7gxenNJIGgViEUYIvF3SDAjskNAUlAzSHe5lwsgcWjmqCGA9ngRQEmGGSRoNDKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 10:08:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDrk-0006Bs-EJ for xfs@oss.sgi.com; Wed, 16 Apr 2014 10:38:16 +1000 Date: Wed, 16 Apr 2014 10:38:16 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfstests: master branch updated to cd444c6 Message-ID: <20140416003816.GA15995@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to cd444c6 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="wzJLGUyc3ArbnUjN" 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: 1397608709 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --wzJLGUyc3ArbnUjN Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. The new head of the master branch is commit: cd444c6 renameat2 syscall: turn EEXIST into ENOTEMPTY New Commits: Miklos Szeredi (1): [cd444c6] renameat2 syscall: turn EEXIST into ENOTEMPTY Theodore Ts'o (1): [5fba951] generic: add renameat2 system call number for i386 Code Diffstat: src/renameat2.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) --=20 Dave Chinner david@fromorbit.com --wzJLGUyc3ArbnUjN Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTTdD3AAoJEK3oKUf0dfodA9gP/iubBLoi2DR2k0R0Fj50CN// xGWMlKSGhOdlqCX2RmbbzZicLxMQdLSI98pquP9WUr2XIg/FvG7DX2cQDrIhjxa1 1W+TvuQiyd8+lQc+zbPrVl4Txu3Exx7modBG9RDJGQMpYcE4VSj0MSQB8rV1ix2W CdrE11YufKkp1Pf8BriONIIGuY8l3swV4VQtV3HBPrnS0atrLKAf9LqT3lR2BnrQ QIgmf2etG3TpjHOw6tSWtjJVL2HylWeyjnmaRDBJblMQ7OZRWQq6PEJMxAMmWJYO wjkWT+WwE/oKe+WmlGw41u7b6JGLniNHqjic85Y8x2eeJGvfVMKsizpTXRos4Vx0 VJ8068avSQWN5/YVMhMJfoFa3aHIPONmxzJEdAHiyNS8+C3UaUyBMGY7+/oNmXc6 O4SNUcC9MgME5A74sRW4lkEfI5m8P2SPOMhwqiTc/RvBBX4tXxYB66+Zfpc1M131 VLG3DGjfApD2x8Dsc2OaBSU0sE2ZrIpitk7vz00hug+K4dyKFJ6hFcosOwiboSIj l2eu7YyoS4fPp+4tJNpuEMp6riProNQ2JCnYi9Br9OXDeJV0+Hg1rlwFaFsh22ya Nr547DUNiqantH5bFaQ57VrDQHUqOi4bGdJZBXW0uqCKu6CsPn5MYPhqPbhop981 L2EipBaO65fL5vLUJmZG =gQIp -----END PGP SIGNATURE----- --wzJLGUyc3ArbnUjN-- From david@fromorbit.com Tue Apr 15 19:42:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F99E7F3F for ; Tue, 15 Apr 2014 19:42:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59B4730404E for ; Tue, 15 Apr 2014 17:42:01 -0700 (PDT) X-ASG-Debug-ID: 1397608918-04cb6c24376c7e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id wJLgwg9CFJBDlilt for ; Tue, 15 Apr 2014 17:41:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnoGADjRTVN5LEcv/2dsb2JhbABagwaDUrsShV6BIhd0giUBAQEEOhwjEAgDDgoJJQ8FJQMhE4d7y2AXFo5NB4MkgRQEmGGSRoNDK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Apr 2014 10:11:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaDv7-0006CR-7P; Wed, 16 Apr 2014 10:41:45 +1000 Date: Wed, 16 Apr 2014 10:41:45 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140416004145.GB15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-4-git-send-email-david@fromorbit.com> <20140415194000.GB3470@laptop.bfoster> <20140415214642.GN15995@dastard> <20140415220559.GE3470@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415220559.GE3470@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1397608918 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 06:06:00PM -0400, Brian Foster wrote: > On Wed, Apr 16, 2014 at 07:46:42AM +1000, Dave Chinner wrote: > > On Tue, Apr 15, 2014 at 03:40:00PM -0400, Brian Foster wrote: > > > Should we always expect an unchecked buffer to be read with an ops > > > vector before being written? Even if so, this might look cleaner if we > > > didn't encode the possibility of running a read verifier on a dirty > > > buffer. I presume that would always fail as the crc is updated in the > > > write verifier. > > > > It should fail, and that's a good thing because writing to an > > unchecked buffer would indicate that we didn't validate it properly > > in the first place. Hence I thought that doing it this way leaves > > a canary that traps other problem usage with unchecked buffers. > > > > Realistically, we shouldn't be writing unchecked buffers - prefetch > > doesn't touch buffers, it just does IO, and so someone else has to > > read the buffers before they can be dirtied. If it's read without an > > ops structure then modified and read again with an ops structure, > > we'll catch it... > > > > Ah, I see. That sounds good, but a small comment there with the > reasoning to allow a read verifier to run on a dirty buffer would be > nice. :) Ok, I'll add one. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Tue Apr 15 21:51:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA2FF7F3F for ; Tue, 15 Apr 2014 21:51:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8C11BAC002 for ; Tue, 15 Apr 2014 19:51:42 -0700 (PDT) X-ASG-Debug-ID: 1397616697-04cb6c243670730001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 721CiXpWEtmdt2Es (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 19:51:37 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WaFwk-0004Hw-Ug; Wed, 16 Apr 2014 02:51:35 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 175F5580893; Tue, 15 Apr 2014 22:51:34 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397616694; bh=q9mp33YKRnfZ+ad6zQz3n0drM7SDU2qCUWnGnhpOfSE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=VdX3r9k5hhAiSGHLk9F4lUn7tHaqQuqaDUL9Z6ni9Qj5X4odYUfe2kpl0kck+3Bb9 GTREg6lLpiIQ/KYqDA8lzUlEmxp9A0WfIXP1Rm0dEqI2wtw4lkpjmp5FwUPxtPE2dR TBxyCUBzlP5hVFPJWc2k17LqkXCK28b6ckbOKCfA= Date: Tue, 15 Apr 2014 22:51:34 -0400 From: Theodore Ts'o To: Dave Chinner Cc: Lukas Czerner , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: <20140416025134.GB21807@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file References: <1397580076-19826-1-git-send-email-lczerner@redhat.com> <1397580076-19826-2-git-send-email-lczerner@redhat.com> <20140415220220.GR15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415220220.GR15995@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397616697 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Apr 16, 2014 at 08:02:20AM +1000, Dave Chinner wrote: > On Tue, Apr 15, 2014 at 06:41:15PM +0200, Lukas Czerner wrote: > > Currently punch hole and collapse range fallocate operation are not > > allowed on append only file. This should be case for zero range as well. > > Fix it by allowing only pure fallocate (possibly with keep size set). > > > > Signed-off-by: Lukas Czerner Thanks, updated with Dave's suggested added parenthesis. - Ted From tytso@thunk.org Tue Apr 15 21:55:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B24F7F4E for ; Tue, 15 Apr 2014 21:55:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E818A30407E for ; Tue, 15 Apr 2014 19:55:23 -0700 (PDT) X-ASG-Debug-ID: 1397616922-04cbb06e9d719c0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id b3t0WzI8hlhiHiaM (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 19:55:22 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WaG0Q-0004IE-3W; Wed, 16 Apr 2014 02:55:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 523D1580893; Tue, 15 Apr 2014 22:55:21 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397616921; bh=4a7PLv4oW2ZosX1k4DJwQiD9hoMRBwvx3yiZDsIVrkg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=GFPPcIuQX8r/gtOuTGwdvezJN/+eUIsxokXfeGsm25uRbWaJ1R8h4gVxR9CrSggiK EsjvJlmMeRLqppJwPx3GV4Is5e71emQSiIh+PALFCZ0NTDniiR2p9/2hAOcsNtsGwQ M90QC2uUOhZp+JGyIEqBOrVsoUoP3YkyvsgvBuYA= Date: Tue, 15 Apr 2014 22:55:21 -0400 From: Theodore Ts'o To: Lukas Czerner Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/3 v2] fs: move falloc collapse range check into the filesystem methods Message-ID: <20140416025521.GC21807@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/3 v2] fs: move falloc collapse range check into the filesystem methods References: <1397580076-19826-1-git-send-email-lczerner@redhat.com> <1397580076-19826-3-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397580076-19826-3-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397616922 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 15, 2014 at 06:41:16PM +0200, Lukas Czerner wrote: > Currently in do_fallocate in collapse range case we're checking whether > offset + len is not bigger than i_size. However there is nothing which > would prevent i_size from changing so the check is pointless. It should > be done in the file system itself and the file system needs to make sure > that i_size is not going to change. The i_size check for the other > fallocate modes are also done in the filesystems. > > As it is now we can easily crash kernel by having two processes doing > truncate and fallocate collapse range at the same time. This can be > reproduced on ext4 and it is theoretically possible on xfs even though I > was not able to trigger it with this simple test. > > This commit removes the check from do_fallocate and adds it to the file > system. > > Signed-off-by: Lukas Czerner > Acked-by: Dave Chinner > Reviewed-by: Christoph Hellwig Thanks, updated. - Ted From pvotdeuh@mail.ru Tue Apr 15 23:17:46 2014 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 06BBE7F3F for ; Tue, 15 Apr 2014 23:17:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D27708F8049 for ; Tue, 15 Apr 2014 21:17:42 -0700 (PDT) X-ASG-Debug-ID: 1397621858-04cb6c2438727e0001-NocioJ Received: from fsa.ru (mx.fsa.ru [91.221.29.8]) by cuda.sgi.com with ESMTP id DL4HISxilGNf35yG for ; Tue, 15 Apr 2014 21:17:39 -0700 (PDT) X-Barracuda-Envelope-From: pvotdeuh@mail.ru X-Barracuda-Apparent-Source-IP: 91.221.29.8 Received: from [82.207.51.92] (account vab@fsa.ru HELO 92-51-207-82.ip.ukrtel.net) by fsa.ru (CommuniGate Pro SMTP 6.0.7) with ESMTPA id 282427; Wed, 16 Apr 2014 08:15:23 +0400 Received-SPF: softfail receiver=fsa.ru; client-ip=82.207.51.92; envelope-from=pvotdeuh@mail.ru Message-ID: <7F2863FD5B094A2A8C0B555E6CA8C3B4@dntgga> Reply-To: "kcjqou" From: "kcjqou" To: "axejy" Subject: =?windows-1251?B?3fLgIPjy8+rgIPHv7vHu4e3gIO7h8ODy6PL8?= =?windows-1251?B?IOLt6Ozg7ejlIO3gIPfy7iDz4+7k7e4h?= Date: Wed, 16 Apr 2014 10:15:21 +0500 X-ASG-Orig-Subj: =?windows-1251?B?3fLgIPjy8+rgIPHv7vHu4e3gIO7h8ODy6PL8?= =?windows-1251?B?IOLt6Ozg7ejlIO3gIPfy7iDz4+7k7e4h?= Organization: =?windows-1251?B?zs7Oq8/w7vTo8i3Muw==?= MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_01EE_01CF595C.C626AB40" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8089.726 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726 X-Barracuda-Connect: mx.fsa.ru[91.221.29.8] X-Barracuda-Start-Time: 1397621858 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 This is a multi-part message in MIME format. ------=_NextPart_000_01EE_01CF595C.C626AB40 Content-Type: multipart/alternative; boundary="----=_NextPart_001_01EF_01CF595C.C626AB40" ------=_NextPart_001_01EF_01CF595C.C626AB40 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CA=D3=CF=C8=D2=DC =CA=D3=CF=C8=D2=DC ------=_NextPart_001_01EF_01CF595C.C626AB40 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
3D""=20
          =             &= nbsp;           &n= bsp;      =CA=D3=CF=C8=D2=DC
 
3D""
          =             &= nbsp;           &n= bsp;           &nb= sp;  =20 =CA=D3=CF=C8=D2=DC
 
3D""
------=_NextPart_001_01EF_01CF595C.C626AB40-- ------=_NextPart_000_01EE_01CF595C.C626AB40 Content-Type: image/png; name="1.png" Content-Transfer-Encoding: base64 Content-ID: <447EE9E1D05740F8B5B40E9F2A2FA336@dntgga> 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 ------=_NextPart_000_01EE_01CF595C.C626AB40 Content-Type: image/png; name="2.png" Content-Transfer-Encoding: base64 Content-ID: iVBORw0KGgoAAAANSUhEUgAAA9MAAAGaCAIAAACDp4efAAAAAXNSR0IArs4c6QAAAARnQU1BAACx jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAP+lSURBVHhe7L0HnG5Vee8/7czptAOH3jvYaQI2 ijVREDTRKKDJjYkFTXLvP9Yk9+Yqau6NSayJKUpJuYmCGFsUBTtNFJRioyO9nN5n/t93fsPvPDxr 7z173jNnYM55N+cz7HfvtZ7+rPVba6+9dv+BBx7YF47R0dH4s3/sGBgY4CK3dNdluBV/dk1na6jY s1UvrhpSqesU6MVVL656cfX4dkO9HOzlYC8HeznoLGiDogcXLVoU0yaeA7h1pLzip9oa4XL/7JrO 1lCxZyt7uRdXMsWU5E4vrnpx1dBEd9209uKqF1e9uJqSJrqXg+1Taeux1eCOO+5YakvADQ4OkniK vMoCJRzfdDqmMFkBZlDFBpNOyuYzSOWuRe3ZqpeDm6Od6cVVL656cVXXs09PN9TLwV4Obs052H/Q QQdJf8+Q1wWEV5vUjUs2kU7XAsygisl0M0jy6Re1Z6sy0Xo5aJt0HZC9uOrFlfq79FB4E/uvXlz1 4qoXVzEGum6iu644g3JwfLWJn6o0jMOaAbfudk1na6iYDLg1qNy1jj1btUm3ulkrZeJkc7lrZ82g ir246sVVgwW6juReXPXiqhdX0QJdp1LXFWdWDo6v4a4c/XeRS13T2Roq1g3IJmvnnq3aW6xnq56t GiywNYRH1zr22qv2udOzVc9Wm6Od6cXVlhpXj3l7Ukq2fKI9oUW6ppMqLpzXd9ShA4fsXb3iPIox VRwnVM0FuuZYZlR3HWTXApQVj36iGvkJaKuWETKF3mnJsWer7gy1Ke3e9Hu5a45HHdK/YO5jdq/q zlxdC7A1VOzlYHdBtZXkYNcp0IurLSmuNq7zllZ+7wGk+87XztbPs963esKsOP894y36Oeevvum2 0fT+RPzZHHmp4jbz+y/5q7nbzO+MED762TUf+ezaaP2XP2fo5c+ZpSsS0kfXHKehYgqgqbLVZCVn SHPSEUMnH9n5F0W68dYNl/xg/blfXrtsZQ71UlTi5NRnDR196OCh+wy69BU3rL/k6vUXfWudKTTo CBQ48RmDzz9qFtBfjua4874NV964AQpX3jhS59YYrhPGZ3sjn3368FGHdnT5escI6yorKjs0WELI i761vmwUqLj7Tv3nvGG2bp3912tsjUmlQHu3PkHiqpeDssBm8nL7SEYGcpwW8rTnzIrpyfW77h8h Q79xDVnWya9JoYFJCTDNyfu4p8DjLsAM8k7PVr22vWHCsetInhFxlXcVtLb77TZw9umzd99pgH8f u3BdCSzSlQ/8/tw9dhrg35e+v+6uBzLyVuFkykqaqcxTDxh41cnDLpkgzvOPHDrtucPi+9ELHwPK u+Y4DRWbI2MaBMDIYMeP/eHcV588jKOTPDttN3DMYUOvOmnWA0tGb7qtFvjSqf/Rbw6///fmPO3A QapEIrjjOU/tULjl7tGbf9WhUOl6iXHeu+fiRMSYPbzxsQYQHKzA9UP3Hvz2tevXPhqAdXQmjM/2 FY85rMMXFWbPAlWvr6z4a8d2tFPgbTOvvw55MyB5w8tmU6a/b/Tv/7OjQxcp0D4enghxVTpis6rc 3q3NEdI1nSdyxbNePOtjfzSXMW1KT0zBjAZpCyjffcd+hrhrJm7gN9rviazy454Cj7sAM8g7PVv1 2vaGZrnrSJ4RcVWx2qS0hcYl3S2HiNS6oAOIX7Zy/PHojbdtmBBgpQJdcBSF6a84nZKDdz93zvw4 DXbTbRuuvGH9VTdusLXBvoymeKpQZ/N3nTH7rBdvHBRRDArQcXko0PGnCfVI7eC9+s591xyGdr54 1/0dMSwD16l+/nvmgfIbjql1FhP24nX0YbW6A6ktT0MxQLyKeeZ+akWdbDo8LoE9/Sp3zXE6c7DS d11LXlbk0c27zpjjh0jkFJmlf2SZuQO+ycFNX4IyhZK3jOoZxHFLiqvN7Z2erVpauCw2gzJi+kV9 osVV7WoTHv2f955xvHPIa5aPjIzPfabnI/75039ZKN3O+N8rwBl1E12VdKJRyoo8smdihoqCL7EA vctbTh9/mo+QlSHbBUfRmdqKhFqdTabQVi0lv/j98w7ZexwUsqbinPPX3HV/Z3iDymDcd585h0lf kVq6YuTUd63U3Wh8EDmz3boI2n7vuavsHSi87sUb/SIKv3qgwjlf/+u5u+80LgZLiS781joxwlaH 7jPwwd+fayHP/fKac87vPNOYHlvFYL7qpop1sVf9/fyF8zbO0Cvmk4aI+rlzxlVgCdZ5XxkH9Ftw XE2Pd5qbi4YUeELl4Ga1FeNVBr0yBZj7HX+7mrUlkSNj73e9drYHjRd+cy1l6tr2MrCfyC1t1+HR dcWtJ64q/T6pSO7Zqn3u9Gy1Bduq1Zy3sILWAsYVgelnpZl8kcJ1dJor3nnfyOXXrwfZlAJsJo5d i9pQcXps1VJyMK7mlVmj/OYPrQbvuuLSFaNv/8SqS64ef/zMnFnlpPVbThtfXs/82Wv+vIM7rSAU WI7/5g+tknegwDLT0lOnPnvQsPsjn1n94c+swdEqBqkbbx152TtWMD+nK2e9mIVP1a/YtlS5FKCh ovmy6qasuNuOLJ99jDBxCtzlGYF45MADfenVXQrMlLialJGnP3mfUDm4WW31rjPGR86k+QlvXQ7s Tux4FefM960m/XWdkTZTLdPftm+OjOjFVbLAE8rIW08OomlzKLqze3zx1RMqPLpO3hkXV62QdzRH F+Bbrk2BKDq8a8++Jc2gqrJic1g3cCwrMv2DDPrHU9c6USs50l1J/jYcbTrKm2NlK7m5VWb+9cS3 rWCa+Z1/t6ZScuawLVgJK086IoDmzz7mRUzrSGdv+H7mix6DvMXxrEcvgt2B3ZVx9fa/3ShGOQBo Y/PKTAY6H3Fw35GHPAY9RwEElDmS7uLoi35qD0Avw+PQvceTC/TDQGJScWWx2+jYptFpQ6fSVltY xa3BVjE9mcku35P2IJA098ouwPfUtu1T2EQrMtVQk7a7LupI2tAr+VZsaVnbNrNy0MKj8vw51R3o lBs5wsGWRk6OmNDIW0MOTpWOU0Wn17ZPQ2BPysj9BxxwAE+L/MDIJ0ce3HfBny4QrYNevVSNdcOI 5Of/tq3uptUm5OFpz52lHUiYYrnwm+ugw/pXrpz+vPGFItxicW3aFMUP5d995mzNHb7vvFUgmCjD W18x++xXjK958GoTV4zwJUmOmrx4hAwlnmNXDVDjRz7b2YmiVFm2ohZoMk2I8sSWf94roLSVFnJQ a4/FG1cJUwx2H71wDbNQpeTMXR26T2fadYx4Z4Jqj8WdN19575BV2mxC8vJ3d7BpS5VLLzdUvOaf ttHMLhPAZ7x3HAGLAlKd+aLOpBrd9hG/s8wxnVTGwh//7+MLlk591woUtKiY4gf/uI3K49ZPf6ni 7Vjd/fwHWI/esYDEsApIzooUVrJyi+Uu7zuvg91TXOHK91+wVhN+qnjmi4bectpw3EGFlTZfuyq/ X2bJWSpz9BvGd3ixrT7w++Orcd7+iZUffGNHQYrJDjGVvBSKEcib/nLjEIJidXEllaOOyaTNOZgE mBSdykZgc8SVNZp+jsmY0y/A9HD84Bs7ryyjLCPDE966ojnraV15oBRj2FYiv9595viSlWS68qfb dt+i2ZcY3vynDEh3DTfeup4UjmRtKwAoOUuT67SVtLSHtNI8YSvdSiNJFUbIqaWlJMnO0jU9o0sV D9t30O3J+y8YbxNSCrjNoe5r/3xFovDPfzofojRHWhpX5nJzdalM28grNHQT8QUYSU43QQ84ha3H 9ARkQ/BMvwAziONW0l5VZv0W3w92puXKqY6yx52w5XUBtwuaLeM6q7RpRzpNyY4d9ANcBtNH2M1F 7vpFOlcUTVCmqrOJRLMYqWJD4Y//97l1L//RWL/uJbMv/fCCypl4JsU/+odzqFuuQ6CbQS8azUq+ tLmXfWQhWpedAZ0K7zue+IyK5w+H7dNRvAPWx15DpJu89MMLOzt+jG3ht838jQsYJnTQZL1M3yaa N9y6XnX1k5OjDhkX1S8jVnKPiJZeMHrH88FUZPzQILwflHtNquksnNsJG/4RIXRXoPwUV5gaT+kl UQpc9L658Z0zLlKAWrgmCXD59RsX2zDTVgTkRvVBDGOOYCeWnEqeGm+2kq2ajNxdDk7WyzFtuxNg BnFMXp5Bkk9KVMaN0pQEnLCik5QY9gvBqk57q/xq809tezxostzsl50CJWlgBTH5R0NX6R2S93Pn zKPFi7BbGadWOsnMLVcpW1ruYhxaCRB/2ebE9kQNXZmDLlO5Do02Ss1RXSq9+4zOzIv+lQJQi9bm G38zH30T7JbkF7+/WvIJvVzXwE5/xa0kB6OaXRu5Z6v2iG7G2Sp/w7J8VFSXtHXX1URW0mErq4vf P9+z1HrdPm6mwZRw1wK0r8ic0MlHjre8cGc6mXXG/GMuxOsHtLNHqSPDBndsY68lrXrTX66krivS HzDZmSrSx1zwJ/NlGTh++kurX/vny/kHR6vPTGrdqhtqARwx3eteMj7BL/pX3LBhwknQ1ATo54S2 gp0XYbO9jLmooiahOZpBMwVsFnqsKGrseNCiIcZuCLgcqSol5zrmtV9Aw16oDWVmvyjA3oXey4W7 Qsw6yok9Hne4AMOMKDmkpD6qsT7eqNoaubCHCl670pxKyciTzTuX75rO1lAxWXWLVNkvISizmnWM bwanPb9tq7gvijdIKbdJmTBiU/LS2ic8nSiwlo9G2GViQ61mk1tp5AwQ5zGUqyCk2nb+efEbFSHb 0Ni2aSG7yGU2eWzYBwmCiMT0k7sJeoeym2CsUin5DIrkrSEHp0rHqaIzg8Kja1Fnlq3GkffA2KEH MX4mOGFLWlngsH0G6+jwWFONO23o885e+ozfXsrLefylWRQpVih2LUD7inAXImShM8udWev80Qt5 cLmWx508nGXxg4QZe973mIkcfhr7nvnelVRkI+expSlrqSgtoFzOcf7Fo50BeO65b1kKIzpFNs3g mSYCaCc+GlyWkdTZHL6H7Tu+6IKXF+HOP7Ywn5Sz2nv59S95zEKgWJHhk4W88bG7fZfCe1MUjFkp atxAsFL3WMChlUoChYkrSuKCA1+1hFcziauXvWN8GQxTX0wjUQDXMExi6dRr//fKU965Mjq63LXw ptvH5/iZjYuSG2EL1njY4OuylefRtci7TSq1904zta7pbA0Vk+m2PJXjHLByZ0IdN8591DxUZIBN QrHWi5cy+ccJ/0gi/mkJXPNB+pSdy9gHvComniOp95w1PvdB5p7yzuWsWaelVUP9vLOXaWzMJ4Fi FQbqNO9coVE96Q86Mqtt5x8rviBiZU9/dPumSuHb9yaV1Uub08I0NO8i8tZXjA9FxvRdwZIVxkX8 i/rSTVCsZDqhl+t8NP0Vt/gcnELv9Gw1UetSe3/6A3tSHDtoe3BwUC2jlGjZ6NRhvmY6NHyM49k9 I25U97GLxicgaVZAt+0FSDK0rEhbdtIfrHrLX62Gr14/ihX5bGHd1hZa8qFm3ZvoWYaxxn0lEDxt MIdGnup433mdF56izfn5pke3AWnY+hqmmA769HzfuGYE1A4XbNhS5Ul5GYG9UTfd28/uGO84pTvw 18HuFSll+ItjdFAU1bNr5az5hGOJSpXHtlhZzpualoRl5fYjcYXLTn3Xqq//YOP8Oo524aiUJL/q pvEenTnvyNHIRrvLe5R1yF6PSaVJLTWZlHeiqcv47zqXt4aKyXRbvMro20ZH56BXOJQ52IZOXR8Y 00fnWspM+bizePLOC44e9tZAYO6f3v6YHUXVbDJ4ZpgdR7bLV/W/65Nrz3pfZ5CgLiZypyQtsBil 9R4aHiQZJmyLRL9UvOxPedCqyew6lZnR8F6uzOmkth19Gedo2OBi4rsprUd3bt0UjltbDvZslXKw rpXYxEiecXE1kOARCjDbT7g88/DaCQk1UlR05qc2S9dF57EN3/qXvWO5pwlNhxO+4aJarBcsKyZv xYrx1qQqRhCWKhpOGWqL4167jNvEL+ekiuXuXVSkC5GQnVUQN47IdLG9ppHVk1AvFy6jszNi+d8r Lv1h3hR8Uiq3tJVn6CnP4CR1LROub2njncol+5Vx9bM7c8dWqkxnFjvgUgBgN/0WL2OlgEwz7rGi l4gwZc5eKK7IIk6ZUQXoEdWVUmyvXTbOjrtf5yOgMQWmPJJjDtbl8mYVoAyPZOQpV7lrjluPraTp D37WcUXLrO/EMB9bfWzbbotNig616kJOycuaPS3CZgqmLjy8eEzTHFVZPxoHz49N3hHv6JIqlq9T t2mvygZZOqZ+0OZKNvcE/9i6xIpXQqHzwmPGHzN6WidJjkYWXuP/TZe8C7eW/ReStO+Gtp4c3HTv 9Gy1BcdV9a6CDehKiWeonX6mFirRAZi63amrqHkXVaxsvttwrOz7N72in2wyZeuPO0ZRU0Mmjobv YP1oumgrf6R9j52q19uc95V1zD1XdgATClA5LkpGtuR0ip6h5yM7cXxSci8dlIzMGvHUCcmtJam6 uKrbEy3SIahcrNLLBJ4KJFt5tg+gnCW/f/RXD4xPe+v1UHGUceIaEj/iiFsQHrLXuI4axW2mgJQZ Nz2wpyGuniCibg22qvSmLzY0F5SJDVRlniY6lbwqwZlLsrufdlNhz5P0maroHWeQx8BT29AdMrbp Z9fxkGwVIXiyCRP873zt+FYz534lL86xANY3TQnF1sMdEL1k15I/7hUfdwGSg6Y2rqa2oevZqr13 Zpatavfzjkt41QTzNwHHOhxZ1/TX0YnljVONk+LdlhwTcC8ljzR5j4ctAt9y+vB575l77rvnfP2v 5/m7mKl5BWP56+h8wZH21AvBGzh6lhQLehvvdLLbozsDaNOPhknKOttOSuVIJFZkbsbvv6IpDz2b e/EoaqWRyx0PSrd2HVdpXFfSSbi/BB++ovmJpKxTwDuxsP28yhhPx3UpRt6dr64++m3OuMuk3doc kHXe2ZQcnJLwqBRgswbk1HLcHK3HpJw1DbaqG2Y3oI2YBT5vaatUt01g821aajF2ZeFHBPeJo5ea pJdJJhXJbBXCu0O07e//vdm07WyTcvU/jH9rmQeMLXVsmAaS+s10eOFeE/xpb/VkK3cTDPFT78B+ 3lw5+jC+ojDeRu25eOPkV0MTPSlbTU8kd2fzNnEl+Z+AKned9T1blV32JmLRJ0541CLvtIRX0CTN gjRPilQGXCWdhrYj3ioFaK5oK1dWpEX+yB/MvumfF5z/J/N5y57XX8b37wubbZcI+J2f3LgbCduY fONvFtCaA8GhFtO+kiObbLDDRvrHy+zsy5GW7lnylpahceeD5/xDHf7+7F+34R/nN14wX//8ycmG VoBeiv1VVADYzULJyvnmui58st4xnea4Qqo2RqiMq/T2VaXkulgZyeF7OuN7uaQ1JJLcxbzZoiF4 3GJlwvBo04NuYg42Z0R3AmxKDk4zx0m1V1uArSbMnTR2XTq2jLghI5p93aZtp6V69OMMneYlClDn ncosbvYOQ99z3jB85SfnsQ0fm5/QttPAdvb7C++o1GU915kOZxYm/QO4c6Vyg/OGuMIFmuBnPWF6 /6euwaSbUKeQ/nHR3cTMjeSZK/n0N3Q9W7UHGzPOVpP7hiXtXWwr00+Zqc0eapUV2wCsqar4ztfO Ylvu9EYjOIn2kQ1PImBKHHlvj4/XsAzD0tKaA8Fp36/6+/nMrHiXjK5FbWOHKS9DD+ENrYDd7AlQ B7vrJpKFLFNfXidnCpKGuJpwE/fIor0ASTDmsEvJLSQullvL9yapxUfvtV6cGSkVKx+Ul3boWtQ2 OdgmPKZKgDa8VOZx5/i4CzA9tjKXlrnjB3fxdefNYSsY6XO2NLDsClV2q5WtRwKsE6YSzzAvfO8c vpIWtyzsLJ6+YT1tO0tcTKFOx7Gtzat3Ma/ceLHBVp7gZ8J7QsmnJzxaNtEtvTOhzL32akIT1QXk 5sjBZmFmLscZJ3kr5J3mTspc4vsy7cOrueG787G7RFWS3UQrMz+tTzBy8Hoce3Kf+LblB//WMuDm mz/U2biqHDxEjqwqfstfrWHLKvZb9eITSNFeMyfBBnZxi7pYkX0A+dAm/w597Qr/4yes/Q/uU6ty G78wAilhd52R4xtC7fsh7QRSHnGD2wnb6AbQHylvYniYFKMsv4Kp2e6NO4Lf+Ji9zNLX5ttvbDJV ok4VnTbRojIzl+PMlbyNdybc6LMk4pVRm+LWNkDtA783vmveO/6uAoZOSVzR9p7zhtlxS2y+qUzr yi6iNO+0rtpzsLm5oFMAo1f+awDuJaLli7ma4NcXkeuOFJBszJI6hdhBcM5dtkrcFGc97inwuAvQ JpWmJCDbM3LJCfvBljS3QiPPIJUf85WQ6NE401A5dxIbmsd8knCiPZ7Lhi9eaV4hkFrMliGYinnp xee+vZ7tBZl9Kd83r6QcVaYK+63SoIPaaaPjJ3hYu1JZ3V+46G7WQU1tJeULv7WODib+04bf/keB OlvxqigfelRfpS+0x06ikuNGZeu/KqqKRx06vhNI6ngiPkh7aSeOXsIBtZZucovZXXhEATwLSIQz /pQH0xoSrngzHObbUMdLVCecrptCURvCY0I7THlAPvE5bqkqx0SLuVPnkTirkt5ljFBgQodOWID5 Dg2zx1rLCWZquvbOqc8eXwzNmPmM967UltgTypZyB/G0BXj5rxK4V9LXR+/VXMQ9WOqEscrl1yub 5e/aVo97xcddgDaBMbVNdNcce7ZqMF0yzoyw1cZPXpeKGWDVfdvMVdxY0N61WRyceG3KSKV9KKtk BEZ8iWay1UtR1UwDwT0dwoPOSHbZoxtnxfHJpqhcBhYy6JsLdf8oUMnxXWcM+1OdyF+5yKSsaNx8 0hEV30C27mxi4CN9XShOgcctQUp3OLTi44WWXtuUDFTdOJntRd7lI5Gw1HvQcKcE6M1tR9fSRrJT G1dt7DyDOE5hs9Ods6bHVl4LR3pOyDFua90wXz4hnebYptVlJR5l6FPqHuslCu59JlytHitaHTaD 4plVmwB2me58WrKQrXj5R9MZ7zu/doI/1vUDvcq30psV6do7019xK8nBKWmTe7aaVP5Oic2nLSM2 rjYZh2ZhVrVyu7RKWxg8sX1bSWdS5uu6+WtZMcJfVuh2Z+hSR8YbcSVf7C3KD1XEtn6qBGhpZEtO X8hUt97+4WAiqnIlYqWocQF0w0eYTwsjkPSJeEYC7lkbvh+EkHp1lcOh1VLTstlqqBjfLYsqb5zM PmzIQV4CFK9LYYzqT+2UnzKdUPJNzJ0nQlxNqGNld9Iyecu2tYuKj7sAXXu5ZUV/VYBoVHo2VDxr bOE1ByPbCSdNWgpQxgCPGQVDmxuZWNEfkT15bPzQMq4Wjn/1svMYqrumVYzac6wUjFZLsxJs4N1y AOCHvbzf2Z3kXXtn+itu8TlYRkXXRu7ZqmXuT6HNu3ZW+4rjyJsKIyPjMNSNjp+s8ZnfhokHbnmW l/aupDNZw3XX6rVsreJa4flzssqIijp6Daju4LsqE+oY+7BLHn0dk+Y4LQE3HWi2Pyqd1aa6K7Iu n4XdhrysdG+eiEoc4weD6j6JjKanPnt8RpxAKr3jV6wInjr4Dizwa1KffZRIF+ExYT6UvaNUjgMG f+y6ElJ7fOVXCCrf2mxwU9duLZvmCeOzUoyuBZhBFbcGW43tXj8OVT/6B3MavMNOI17kXW41PVW2 YsiqpOD99TQCb0gHNzK0xjSPlVnfMGg/eK/OF9lSs0Oj5LmG5gazZW9SSYSvUXoD7099aU3L9uqi b4+/cspDM9rnSgEapjl6OdimB/Swaqa0kFOVgzMoPLoWdWbZqukNy87ShbHvgHB87A/nVoJvLr7/ DePLmpnFLN9Yb58P01Ny7Ksr493S6148/p6lWZ/14llsRBVfio9S0XCzIwo7CR66T4Xd/G0d7BAX Mvoz5pBVi5wOqF38/vnsTjip56pdm4vm+7KPLNQKIkxxyjuXT9ZraBeX1lhxi4Sh2DzRZuQFo1La uPQcfFB2KpD1xurE4YRrQ7s2SHPFtGikbmqwXIJyw63VL5VuJjl7ZHsWkAUY9p/75fF1dKQ5e+FV IjZWmjm/NmvT7Y9P/fHH618zLJzn8QPNyMf/aF5l+8BTOzb7i7duun18VfdZLxpOL5Bo+6YGsD5V 8cNrHtrA+33nNb1Ymdh1VgyO9bboW/mmEPLTR0xbNzFV1ujR6VmgZ4HSAh0EqfGf73nM0Wk7zmfX 1c4tmpLPnTMf3Pnm02Yxl8k/TvjJRa8Cf9OHVtXRaTY9AsQCUYDmipHdz/9tWzax1rbW6R87W/PP pDybwldj3nXGbIAvjdopzxrkGzrvOqMzikgfFXdFpojUcIPOqcinDZicQHg+sMIqxrBgOm+Y5QXl bH5y0fvmMotzxMF9+j4CX3lg39ax78YPfvyPHn1WWq92g7MmNLLMxTpCY2JeGUSXaC7ZKv2L24HL O+89d5WXi6A4plNg8JeddPnpqGAHGIHm5NaxV1THV0BS+Ot/PZ+KJkKHyreKHkUSo2//241fme4u PEoBGswVjXzDrY/xZt0akoS8b7y189XM9qJ27dakRdd0toaKW4+t2PvC70Ww9PnSDy8EpJ79itm0 NqQYjRVboHr2l+buzX81wVrkrsPDNv/wZ8Y38E6k6tJwyfIRqujuYfsOMTfxjtfMUpvJw0OGE2pv 0c4LZvjp8TwdFu0qJZkvP+HpnfaZho52pq5tVz/YXTdUqQIT/Opo2jcC1pdu4tIPL6CbQF93E9p+ ChU4mbmRPHMl7zoFuq7Ys1X73JlxthpIzY0V0NOuG28dedNfrnRr1fnG4elAzDn848TzBxRgxQKF yzao+bGdLFvZcpXPCstmsRlr1pEFNW6c9n7J7M9/YCH//uJN82ispYhnjBLH95672jOg7OH9z3+6 4Jp/2hbEf8GfLvA3DpgMTis3UOTy69e/89GNtGg6Qe3U1b+3vmJ8py1Yv/EvVzaYa/pt1WDepStG GWgZfGM6BYY+WmFkzzoTJn6SGa0jr/yDy32XiibiN6Uwy2v/94pywnva4io9H697Cy0Vi0C860ie VMXNER6TEqDOy5VtwpRn/aRE3Rps9dr/vTI+rnn+UbNoavQvZqjyK662ajBOcmVzDsbCaX+Pls6i ffCKR5qU1//aHBpM8DQfT3D7wOukbGAiXpC94ZYNrkJL+7f/34LLPrINf9U+g4br9tWe2oDUFzon mxE8ZKb3US1a1PecNVd9BCrTMHqrRPZsid301EouM05DN7Q15OBU6ThVdCYbkFMLzHpxFe3ZtNpE lgJSnPLOFXEf0+QPWrqXvWP5hd+s3beuzn8TTn5U5r+ikL+Thd2uyGQknQ2zkqUiL337ss9e1lmU XKJ8XaQ/e995GxFnLKatwWPLHkVlRQe7/tXtd0GX8Ny3LGXoUhedE3ZylRW7tlUb29LJvfTt+H1t 5TQS5mXM1vD9CNmTXpOtDyv3LYEsxJ939rLKEV2dhG1ULm3FQ4+6immS+/Lr19WFR3RuAuJde6dN xe5UVhc7YSq1EaB9A/24c3zcBZg2WzE2prEiB8uGTjKQX4x7T3jrcsPuZJwu2lgj4BRX5f4eLeOK BgQVPMJP7S3vhfMFhhTJQN5y7z+M8Mb/u+KN/3flkuWPWQPWdTzANOooOhaP2euWkwVJALrR1/75 8oZuwv7qWvLHveLjLsC05WBzBrVJgZ6t3KSUEKhsr2ZQd9Z/4IEHJpRZGZf6jjrLKphI0PbebAfB W2V1u6XWxZzoNETktFVkFSD7nGjuBHTFqtz0an+zqKxR4c0hmwIKBojNFVmVeOjeg95ipZK1XPDE sZVDos47bOjBJI32w0IjXmNNHc+EbsUsVJc7FFrMLpebLUxIpwGRNwT2EyEgJzTyhPGQFOzZqj12 3LJtpeRy001bd9cDIy3bqzJrHhdboQKNwx47daaK+NoaO4EwuG3ICNpnmlm0pjB7mKbR+4Sp1LWO U5WDLJJB/sMe/dw9jeqY1qObT/KuVe664lTZqmsBZlDFnq1sgQlTYEbYqhXyRtWBgcltdVQZ023o bA0V20RGz1Z1MxPl9Z6teraKFmgTD70c9PC+17a3HF304mpq25leDvZycLJzXltMDg4uWrSobppQ 0660y4ODg5w4StLgo6F6LNlAp2sBZlBFDdR6toptTS+uNj0eenFVYu5eXPXiqtICzd1Z171JLwd7 Obg54E0vrrbguGpC3gSTjqS/ELn++qSh2ZqQTl3dLaliz1b28oRu7dmqZ6uGZqfr5qIXV7246sXV 49tl93Kwl4O9HCQLBnfcseIjLp0bg4MYqG6aNl1vKDYpOnGOfEut2LNVL67KoWyJJns5WGmTurnM STUXvRzs5WAvB6cklbrusns52MvBrTkH+w866CDp7wU3dQFRvltambpd09kaKiaLbQ0qd61jz1Zl fvVy0DbpxVX78OjZqmcrdfGVy2q7Do+uK/ba9vYB2bPVFmmr8dUmfgLVMA5rWE8SB76cazldy2XN qtu1ADOoYjLgDJJ8+kXt2apNutXNWvVysKX1pj+wZxDHXg62jKKy2Azy8vSL2ourXlw1WKDrgJxZ cTW+hrv99lvNQdM1na2hYt3gdbJ52LNVe4v1bNWzVYMFtobw6FrHXnvVPnd6turZanO0M7242lLj quJLOi2faE9oka7pbA0Vy4zqroPs2WrCOHSBnq16tmruHXs52DJCtoZU6lrHXtveMorKYl3bfGuo 2IurLSmuar9h2XUo9+JjS4qPOl26Do+uK/biqhdXmwM39+KqF1e9uIoW6LqJ7rpiLwd7Obi15WDT 1+OxRS+X2qdEz1Y9W22O5qMXV7246sXV4wsNeznYy8FeDvZycAofik6AvGVr8euOa/JWd3S6FmAG VSzH/T1btWzuZ5CXp1/UXly1jKKy2PQ7awZx7MVVL66awWh3/VcvrnpxtTXEVf6STt2GJCMjIzJH LEA/0XLDb5uykk409KQEmEEVe7aqTKdeXJVmmVQK9OKqF1eywNQ2rb246sVVL64eX3jTy8EtOAcn Rt5+0BbnvBWRvlIGaHmlgU4zgN4yKvZsVU5mlDN8vbhKg1sZrZeD5bC/7krPVj1buamZnm6o17b3 2vbNgVJ6cbUFx1UT8m5e3EajVmLxyiZvQjp1yHtLqtizlb08oVt7turZqnK2oxyWpEdwDSvieu1V z1bN4dF1N9Rrr3rtVa+9qhvuTqrZ2XpycHD77beP/ZnN5GeXdSGVWjH9dPXJ0tkaKsbmqWerXlxN VTxMFZ1eDmLJlu1ez1Y9W/l5VGzKev1gXcOuZ3c9W8kCLduZXtu+pdpqcIcddoiDFc0MNcwNNOTV ptOBe3cCzKCKyYAzSPLpF7VnqzbpVllm+p01gzj24qoXVw0W6DqSe3HVi6teXEULdJ1KXVecKTm4 EXlb1a6TRxW7prM1VKwLi8navGer9hbr2apnqzbdYXsrbT0NXa+9mmxUlNNPk6XQa6/aW6xnq56t ZmjbPo68B8YOPUKN63La+1Ulu6azNVRMxtwaVO5ax56tJpt6Lt+1zbeGir246sVVgwW6ToFeXPXi qhdX0QJdp1LXFWdWDvYfeOCBxtwsMrnnnntQgBPWIXFd5xpZamWScLmWo8wa7nvq8aMv+a0Ni/cY Wbd+ZO3aDRs2jK7f0Ld8Zd9NPxi88kvD9942RDFXTERsqYY3VOIUgs7TCkutjSnHvl5v5/JRfpVf v369CHqBjQpTsnIwHdfwRaP5uuj4VgwFCHKdux0bPXY3xmgWVa9c7ZNGRJFpaRaxTr4rDWV9bQf7 N7KzSHUL9ZQt2M3L12TDsjGyYUVKIiX7i5RV4EQCuHDUN8ZkdJADz6rpJAVh4h5ltlRlEEpysUv+ SjLYYsnUpWU28UpiVFJLUZdsLjtEw6YAc/bFGKgsk/I0+jFJZaaReGxhJrRJlLnMmkQ/SlJ5K4ZK naiTEm9C+VMBYmnPPfdMiqjpMN+UMpHCFFaMpB4XAaZf5a459mwVW9HmgOzZqmcrR8jW3F71H3LI IdEQd999tyOjso8pOsu+vQ8cffFvbTj4iA1r121Yv3503Ya+lav7wLRL7hv8/heGfnr10Ib1Hbhj pJVgU+qYVdIAqMQTdXiu7CkTgC5RQl23rVGHcVVlUxKNMzg4KLGpaJouYKxZKiVNk8GNO200DYGS oagb8ajLRDVLBWP/HR1RAi+BSzFN4DIKHJWyLrJDFDs53ZTTSaX3RTZi8RiE0RFJ4BKKWYwUV8lr 0h35GSZFy8PLpigb0Ep2qafxTyhLL8nv+PGV0kSGp3aNYyDpZafUwUcqxtiLlKNeZcSWBtQVe7zS CHVipOvSK7o7BnCZhtH1Jam6KxNKmKIrhkrleQPrurqVVVR4n332ibUUcjEIY4LHJI3nsuHzn/98 mveFCxceeuihV1xxxdKlS6+88sqf/vSnohDtUHL0rMSmCNC15DOrYs9WbsG2krg66qij1FKlVLrq qqumKnlJgV5cbclxVSLvyh4uNfexDPG37aKRE1++4YgT1g8Mb1i3vjPnvW5D/zDz3ev7Lv/irB9c Omvlso2zmAmEld1n6n1j929ckgSowzexWJzFjzKk3t0ZZcFSAUMTCybknaZpXSspGPt1i2dSpbLl 5LEkFAQ00zRhk7gn+CjgJSNYnihYif4TCPPPEopVOjRiuzrooOtDQ0PSK8rmBr0yDu2ROoQXRbLk YoHvNFUfQyuaQuXLBz4GBwKdZgFBm9dhGTUyVJW0jnadm5RkkGAeYrkKJ5FR6YVKg6d+0e1ajAHz rRzvxaYwOTqmSczHSqfEwpUZEU1aqV2Ztg0xlmSI6eBalfKXkRBJNahZx7G8nkyx11576YqeI6Xy Dq0ktqq44umnn/7mN7959913L9ndeOON73jHOxL+LjnS62+KAF1LPhMr9mzlMHO+pIC0W7cMW910 0011CX7DDTd8+tOfvvjiizc9krcMW8VGcsLwiC3zpCrOOFtVzHlb4bLXqexp1AEPzxl90jPXP/fU tdvsOLJ6bf/6kT6Q95zhvtmzBm68ctYl/zF0z53969dt3FQodvYREJTXI8iLGR5Dv0R76W7lJj7K Dc0+unxCOcY6EYxWihRBScRPqY+0ss1ENE6gTDl/3GCQCPWMXCOI0cVKHJmuR+8bmNqMNrhwYfKg jZnMXkrucYUhhalJgCiGFalr6FMY+KeJS/2U3mZkLBvpRCIJAqbnDBE3OxjskWSKCNxTIy6OaTAg C8fcjFqUmpbtvuOwHNWkpJPwUeDSaIKGkrNSfidOvFt6sLIDayjWEuy2LJa4V5q3MmFL+jFQo+51 aV6pOIVB3rJtZcWEvGPbYvT8gQ984NRTT+UWM3DnnnvusmXLQNvMsOy2226nnXba0Ucfza1TTjkF 9CCZXTF5uWsBtraKdeHaxlk9WzlZ6nKqMj5TG142QXWBPSUVhbw/+tGPRr6kGA+XNNw977zz3v/+ 95fNy6R07MVVe7fOOFtl5M067whTFChqHdQZp9bZTX/npH90v8NHjv/1tTvvv6Gvv2/WrL65w31z Zw8Mzxq8++bhL//bwE0/HFm9auM8q4kbCMbeq67HaujJImCK6WqN2vSsxj1SzfDCxKMA7rq8CMHt iI3m6EkV43S1VzV0gGHVehtfNCNVl3hR5ihn7FkFIETfBo/DiRTlvhWRR2o4KrvqdDHZ3Bkip3hO Fy7xXEzLdkrK2rmx1Y65p7oxHqS4dYlOiVFnK1XmvIZDli26WCJZ4Kh1qUX0XaooBeHCIN7BEF1g wVJbU3KMBaxjjK6Y3dGkiZTpRANWalonZylzsrljuNIa0ReVIVGZYo4fB2Rz3TrXp0iIutTd6u66 5Nx7770dqyWduqRQSSqefPLJAgTvete7Lrrooiit1D/rrLO4xcqTE088EVDuijFtG+SfUIA6OltD xWS3rUHlrnWc0bYS8j744IPLTGHc+/KXv5zrZOJdd92V2q6GJqgh62e0rbpTeYuPq/w0011gGVJx vtNREsOlv2/g5p8M/uc/Df/w0llrVvX3jU1wa5Z774P6zvzD/ue+tH+b7fv6x6CLGKmZjnOHdX5K DXpDP2E8pN5dc8apv5RfI8JI3bOJqJhIGYIk40SOUkpTVlFI8YpXYoE4Qxmr65y5WFlJy1rKztLi qZjKmKPF0+Nj0XQxiSFDWcJkHOurWqbsYr7ikYA9y+oRjRZcOK7uQCNX8XlkJ40sdtTFxayRtLZh JVVUVgraOzpJc8BWMDWaqps0jb6wGOIYq1ukyvCw5R2QnBjim0Upj67YsDE2Yn6VWjuYLXM0foyf GLQxKlIkVIZlKXmM/5REdSFX5lpMnDq+KfgTkbqfDeK5SoxkZ1lL+hMWswDRGhPWSoEBnv7Yxz4W YXcswCz4JZdcss0225x99tmposMvBtWkuG+dFTfFWdHm7U09cznOXMlbeued73ynAHflWq9mIsk4 W7ytprC5mHG2qpjzjt2Je2iBp9iVehVEiVRYefLkZ61/+onrdttjZMH8/uHhweGhYZbUjo70XX7J hksv7r/ndvYVyW8nROLCTw7TyMLYS3IaJZRwQQK7Dxa11NKl6mViuHqkY3lKeFS2pFHg2H+XyEOQ wsQhJczNieeDdWJhKlGjoUmsGG2F2EJ7uuioNV7krllTzHO9afTluVuLIWrJFzFUdG5NRVyaJqW4 ZWqcpBFUNEJ0jZ2eQihGV1TZXKJrYrTH60kv1Y0qxwCzwCWcig6KYWlS1iJxTMFc2Y6nQI1pkp5Z RcltTykVh2HyUXSH+SaCkVeUrS4pyut2UxlFjlVJklK7jIFYrPJupfUmvBhlTt6xoyvbGVe0MMnm UlBz3lGMRLbOaNaXVyo1mV1XEUzwjW98g2lvXhSjmF7BTByTmkzyiSbXFyxYwKweU3rAd4hw/Wtf +9rnPve5xLFBAPOCtV40SiovX77cS2ndOiH2SSedlPiyoLbOVkxJUl6razgYb3z961/3NGRpZJTi OQBKwTEqlULimGOOoQArebhOFVigBee8vYoRfvWrX7m8JUcGV/FdC8BdzMjK+1QRsrKzrkskVMA4 DeGhl/+SzJK2Oa5UUSXToYp6Wxe/SAD5Dnveeeedqbz1jRxx35lnnun3yqiILsSh6tpWJkVJ1Fdk ojvmtfsiWdZQ7brrro5PV5d47BgRJ56piGysxUIYCmB2FmKxMiRNTk9oq4Y5b1hAEC5AcEa/KQfJ HQKGV58VMwpLiqFg6R0CWAZPd20r6cjduO68wctwh2Yqb4vtscceGJMAljWS5JVxJVIlRwRDTacG BJV9lXHlwCD1IEhh8og3wusaurr2ynpZHoyDykROGdK6EktC9uqrr3bJGJBl/kaV1Sh5oIWmF154 oR8nVqrcYY0nIjK49957yxxw5dTT1OkDBab89nvyyLN+be2BTx6ZP39w1qxZgwMdEDkysuG2n49+ +V8Gfv7jAVaejI48po2IknBudj5XijbY0Xfdq+lKmoM0lHTOp+ipZJEAWeRVWkZXfN1gt66k5TRZ TxVbGGuhMgn3xGGA1Y/hlXrTMTd1pmb1doJjUcUSPnBdg2yVL4dkAhCmEJlqojRuGFIZURJedKyI Sqbp4TqvqbpViI6IQWVRFQ+uUom8RcTqxLhKKssyUQX9pLqHLqZma0ddUhiLVJpmjgpa03gxWi96 wYwkT8qyWDI2Q8n+KRNLRyT7O1wr1Yyxl0JXdrMF0pOZlKeV4WR31LUbk70e4ypmSqRTGrzSBdHR ql4i75TClQ6yASsN4mj0XSbF6S14C5N+gn7l/PPPbzYCa1TUgYFNWcBKH5nK+8XNlgKoWB1reMHR jkNlQBiLZCr5gudiP0cM0Imec845xqxRpPe9730Ao2hSzinPxTT84DrdPyZKnaggMugNO6QqIDku ahASba4qaXGCEwHsgr5o4SvoS3deaWdg7lve8pb0hh8VARmIWqmyWZdJGjkitogQEqUTMRGgHFNo kRIV8R3PT1ja9JGPfCSWhwjDITQ644wzTB+ZOcoYoxjXIejmgjKAGHRnhJPKy7x6mGPKCAwFeCWA xSMdrhMGcre8TPVKE6FCWrTdbKs2yBuHSiSTIgDgAsBNeuFTtIhDLxUQgqeKZIvOUiOglS0ytWk2 SA56hmYqb+MwCiK/zC5xrHypNHlZpAgAmpdyyp+4Qs2oO6LWBQaFeRG8Er82NBrYXPRlBJRF5cpF QbGYTY3kpZG5W+avihFRmKsyUBl3lXkUTbpx0Wq0SEISlfimri9/tL/vv/nHQ1/49OwfXDZryUP9 Qti6tdcBo69+24bjXjiyaDFgonMlWiH1apa17KJErSHgTDb25cZDCaOYr8iKspcliJTMEgVOMiR3 Rr5pElEljZUNv7Tbd2QnvrKDZPahVQ3MFrOiwwtRSgmjaqpiwUSKut4Y0fZ0SV+JrpERUmAkd4iR bWiCyYBRwTSnLoNb4FhRF6P3bZ94URaWTVIV2V8X4zKeOICJAsTASGFpSays7ROlglopdhkzDowY cpFgtEMsE0M6+dEjK19P8eywkcBmx3kcLaSIjbFRZq7DWLeSYaOaUVrHg09i3kUDlqEetavUNEVs Xfnm6ynrKxsBu1Ucy9bSDVFD9dK8kxXYIZEqqh8VcAQ002P5ELLhb7zIjg2QojelT1X3DAKjS+M4 8sgj+Qkpbnkmb1KSI4x5AZVS2PCTvhaQgaEq+RpauaIAFmRBJBKSQx35u9/97hJ7MfBAfubkwLuc 0AHzBiqogj4VvpU2hyny0L9SmIMOHtmwDFeYOIzubu8yO0vQs9LO2267LayTneEICEYvZEZNtPbR zD2GBztyUFhrlMtDRgNM+NFHnY4CIhEHY1XBa4yDoWQxLgpZJuBOXWwOESg4xqhFXQyCWfQQoy6w LbmKRTEYuSkqwH/yMlGBobgCTPdIr6ENaeNWz0OTVjGS8Sn6ArvxVMwdAh6fEoFl7qg6qaFbSWU9 E2gTXRPaCiJYoBzWuqKeVCihmkNLg1iUpQHB2tHI/MQFUWDkrwwMMpHCdaknCrHRMOA28TYqV5qu fUVpSqCiKcGsqNZISYHqxzuVjPJOse4PYmn3dg2dK+VTH0PhB+8e+Mo/D1960dC9dw5sWMcbmHRC nX8Lthk95fUjL/6t/l337huaNc5KPZAWOcTDPVNz3Jcmi2ClUvmE5BTcLumJzzqtE8wSropQTzYx bkjsdEtlbGEpG7GmflYiNhVOh+X39RLxRMvIbrZeSU23omrWMbkpGiqem2biFW1lkaJVE8ySJSOI NOXkOwlmg1faJJolFjAp8bJlyjBI4lGxXPxTBp5jzIaNcjraY1SUyVVqZJVFLaaDk9rEo1Qx5ist HA2VpEraUT2OncrYTnau9JGCrfSg8iVKm1SuzPEUouIYw6a5ZZiQZqV/nfKlm8qYLCWsYxrzdFKC lRUFC9Q36FG+Dz1r5m+8KLzF5BzA7k1vehNoyQ/oucVPAASoog4KNEsOnjOvNLWmisw9Q/+1r31t yVegP/FFNuhQnoo2FB0kwvMzYSzqYgcEAJBRURyxjzBZfI4cbQ44oIAX02MEJKEnptPV5O6mOEt2 5ij15Qoskr5w5KJE4kl3dFybOJGoLGVBC/SthIAyGqixoUHTLUHeaHkEwzgyl2cxMTU+5QrYRSsZ lNpwx/gCeTHGKKlRWXRf2RpIBoggRlpWIQfxsAJ57B1sRZzAqHJKvi6766wqeI0vEDXN1+JTBg/4 lFtRL0xKQpXvXZgFtyJgteSMIds412UqG0/dJf6xat0CCSoqJFBhwtCCjkIRZSkvpjYyd2N0kfg4 BY+kwNCDFwH3Oh31dQIflcUUHnVB0mC9NsmLLhque2U/BJGKDOXBWvJayWu8h4OTlqVaylLc1GeU vVdyrQqsXtn/7S8OfeG8gV9e389rl/1jpuDf4FDf8S/se81b+w9+av/c+Y95kiIpza7ScL5bJ5U0 EqnogIZ+V8Ua4Frs+3UexYhwIZ67luhHkC12IiJMEz1UXi/ZWTULn/xSEvGqa/HSUEcrQCSqZeBn mkqPxJPASQCIwChOlzrGUNM7oHMxfVMmcq9Lp0pPRUsmOaPTU+TEHIsQM+0wqFrmW0LDZHYPVJKL /TOGmSwZ5XcKNGRBORgr1ZTN0xJ5Ea8cy6m8wyClXmmE0s7RZR5AxjQsfeoQtYWT0ZLLKqMiJU5l FpRhE73g3E+umZBdXYHUHqZidndL+rGJnlRfUlmRHgK+5SxXgzCiA7ADopUCCJNVPsqfEsmZka18 3l3Jl57vNa95DTomFwgOeuW3lJXMeqCfRNV0bKVSdLclUlF5YPGmq4yRMXXpjkp99WT/U5/6VGzN JhtXmAum1GLryVQX+mAg7B9dELsexwO4SuZKaz8wb6X7NHQx8oYOVgWb8syhlF8UDN1s5NhuqJbm 3SP656ewfullOCIGuZACoxQgcuSuVkro0CojLdgAOKb3m1UR8372s58tcwdbIZteuigPSBFRcrEF 0AsMycgNHk+Sp5KAeASofCc7VvQsfgMjjQmxc0oBjc/tGlHQeLXcAQZb6QlM3eqpBgF8y3Zubocb vNxc0ZpGjupqER7VCMKGt2zHd+S1lAYBIqdOyB88T9OE7skS6FHFjZqP9P3oe33/9vG+718y+shD ALKx4mNlDji8//X/X/9zXtK34y6Aj41VYucn/d3re4TgzK90g2WLd6PAVjD1vuYlLWwQ1414IhWO RlPdlGapZfRkdulj6ytkHEGVahn8VeKqpFQpWBQvwmtKRhQoHKYC0RoiKPXT9RhCMa5iSduQAoaA Oo/ujgYUWWkdz2OwiUVUtvS+/ahRQeQeXezgNwU/jYn2sTA+iTIksycvp5L2uMSwplFfX5Rlkh1K +B5JxSji3GFTCpzyWoKJY1xnn2K7TRo66mLdGKspoSrzojK2S0fHBE8sYuFELcbPhIwqVS7tWVls UhdTjssRzfYXTuJgkeLPxo6f//zn/OUnhxZ2s0qhpRhdCCDKm7ui4G+cSBNHw+LSVgmvAGKgwMVS 1K9+9avcmhCQ2YaeZI0oqk2aTNZWqUfXOMpHm/Co5CisXz64KCe869z6ute9Dgp1++qUwab2xMvl 20guz5bxH69I4MqFtlMVkNBnhYYPhivSQi8XxsnaNhxRqnzNQObS9Dl/I533vOc9ANYPf/jDbfJ3 QlsR4dBPURSNbNmamx10JzJpc+64444Y9nKr3sStU7MyICsdrZLNo442Nq80XWXFsiRqSlMPG1JF DWIbmo7HfFqSohHrVErW0I7UgR5VueeOvs+fN/rNL4xtbLKOznwMIY32Ldy2/9TXD7zwN/r22K+P iXAdlYBVt2LHFvtpC2/oluRJyMbaqTxHXOvsuiVaSmaRqG4yjC8TCjTIVlvjw7BGwM4gOCJC28S8 XCuOhZKodSu/vaqbukaTvmj5kwsE8myWhjlayigKDa9NMwJukUpq2mjWVC6OarpMFFVx65IphKxL ZfSqouSRHRxpHt6IYAyhFIeVHOMAqTKbyotR1CitTVdmQYxkixHjUKmRisXsMCPbOVX3noPRlapl P4q+LVbaJ8W8RHW2Jgsne8bClZaMCVtp1ShPlCRpmurG2LDlW7qyjmPL6s761GJEP6aUj5Tjo9jy XNNX5ctelaarE4B+hUXeesWt8rsh3UneYB/pC67l0FxjfDFOjXBldW6xy4Ge2sc+W5AdaxxxxBEi qwPVdHBXu53UkY0cKcaCeEpWwosGZ1GlQXJgHHb23CqFjbylsryZ3vRqZldpKyaJQRIIn5aqg8UB fwKyDUbGXFpxqwnLMpWkI8VY6EzYsMpCEDk9e3GzECngKZ4zcAVM0xxXeBkWoKLKiWfRxIB4Gb0E nTXYaOllS8UyFR9a/aypfVA4899+9FEZOfIpVXCr3haIxaKRsTwPOnCuYRxGQ/4IuycruZRVUiAA GZFGKcnLcpCgc6V3JLzC3hmaUkk61o32kYQc1CsBHHHP0waOZUCW8elcjouaKp1SF1cqHI2sBBTs rswI7yxZl4b9Bx54YBTi/vvvL4vGXi31cMYiPoFa7OYt8aM9dN9Tjhs5/kUb9j+0f868QbYAB4KP rUEZ/cX1/V/619Ff/KRvzeqNKMc6V3bkpTBlCJaYQxIaq1HF59zC+pp5VTGf+GeELA7EeDHiy9KY XImQVAqqOnuMRIhj4tHxEikiJN1FbJtIKqiktEsyi7IL8JPyhstSWYtAoilsjSiPDW4E40CMlvdk dgw2y5AUTILZPnr24nnf6JrkL+sSKZt1skmMmRjG4mXK3HJmpqiIQW6bR3ZlWEoGVyzltJDRwmV5 FZP7YsTaxa5i0+mKVYslYyzF0U4qE0WqVC16OckcbVUWs01isDl4Ys4mZVNwNghQNgiprgrY1yl0 Y5tQ6p74pp+lx8sCfMPSxSrplxed4O0r0pFfcMEFcNeL/7GisIj2rKgUgJ6Mvp+d0aLw4AOwEV04 2EspUJqivAiRj3/8495OgQL0jgimhaExgzhH5pKvyqTyusgz9AhoBEyZ1hWAk8qwm3BfF4izdsVG 9kYHVidGiKyH6fRsXWV42sBfQ6UYgVynfCk/FaUvfyMwlZ3lOAsADrj00ku5+N73vjftaCbWpZfr vMOkNXYDOrNiRyrzxF/bw7NGOXqQMMBTgHUt6gB1KSTe/va3eze9GFfQkTola6mfwgMx4gBGFcGg CBYpyOCs4hDWgcthhx3GObAeEJwyAtMhA8g4jTllVWRAElVpTiWeHVEmYqeYg2BuDURPOOGEtJQC 3IleyadWh3CNuYN5MfJBBx2EbJdddhnAl0U4nONrBH7e856nLE7x2SC5XKbyYvrBD34QazAQQk7t BkMyllPpkuRlL3tZXHBCaEHKO9g4eUv/xitAfFwTjcw6b62ZjsXkEZIoCiMja2+T1EDhkTKJJHaS h3CFbNxnE8khSMm6Zwhvfetb5W57GcuzoL/SVsp6qqgdEM2yiW71JR2lhBMjBocupqYkpZC5UhJ4 8KPvDFz490NXXdb/yAPQ7LxyCXjg5IDDR8/8o/7jXtC3w+KN7FQ3gQCZsjLCkiTJ6KIW5RFwidRM VnU9KWvA5/LW3UxN2SaKs54qb13S7KDAUHSShRd97nrVR7RAdI3OrQIncQZXtSSbD1e3qJLEvCxw xJ12sR2kYnG221iQMjFmormig5LvRJmK0PEydJepjDF7xF6LBjEv342CiTK8NIaJ9CsDPkZRdIfD NamWos6+cN0Yhyluo+PiLStipzuSY0i7SnS6vVkKbFfGeHbkxLBMXpD3oyIinpKuUki7O9FMfFPw xHhI8VPav9KqMX0ihRRpiVGlsxoEqHN3KZJ8lJ5d1klusirfvqLQm5dYlBVjzEfu9JH0Z2AsEB4Y SHN+9EnPeMYzVGxSkqu71ZtYzRWBCPB95jOfab7gAEBJ3E8tWQnidJA+uMt0Kdi0tBWwQ1i58gDV KUiihDFKW6pMZ6wjrlJI3zOyCuAh2RkfRTszL5hiiZ/Ir51bWIRwzTXXAImoy/GDH/wgOmVCI8tE /NX6WpXXfDBYvExMrmNeKSXYTXW9BpCMzD4VDLHAxLgPUYkZQCTui+Or5D4KJ/dRtw4bnX766RKD WtD5m7/5G+3GE1Um5tnukDLkKY4G/8Ed/Er0epK+lLw59Xw3ViRgtG4nrZjnJwBaPkUA544RfF0g 4VkkJJ6hwNCIkRjDmyRYF5JjXggiSVwcUullTfFWrvMumx1pV3cokBwe4FdiQ1u+xMB44xvfWNk2 UtFL3itFLWv5uQR5BO7XcIXBRim5MzSdlF72BjvN4VEuo7LuGXlLmtjN6EqpZGU3k7pqlYnVRefu 2/o/908Dl32+7+7bRzes51Jnzptjm+1HX/7fRk8+fWT3/QB/1bMmleZOMMhlopCxoiFXJZKjpOBC mhdEcve4oqa/JQjzreiYWCxiu5JIiQCMS6IMqVipbJTWgDKmt1GRUbLoJ1sJlJuaFdF13VLYmGAa csS7Nl0ySNzaL9nNYWnZVNd+dJTGAiISxfaVusg0XxfwiWGlxY5Gi8EQQyLFhqjFgYElFGtnn0rG 0UsU3mTLoKpLEI/0KiPWtSSAjsjdjByuZbMQpbJekXKyf2WapLYsuU8/VbFS01g9lYkBU3IxoxgD agGsciKeiEwoj/VtED66KdFv+Inwk6oogALknVRF+htm7MABoF76fjpRT3naL+1ldsn49ZnK6oII 4MuXvvSl5suMZrPKGhLoAGABBQDudLoAl1SxRN4gPB9+03FStioVsTAgTu22xglHWZIOm5GG7AwE sZ0bBEBIdBQ20sQth19qbC+5PnoCEhL41gl06t6ugy+DLg6szTmwEnAJNooc8R0HFJAQdKXdVyZ8 XY95WSwmWwHTcZ9GI5URAqiisMISyn/xF38B0E9e/sQnPoE6cGcqGmqoqdU1ZVMwqVRKzYV+imyc 4Mcm2iYPQ+FTomtSuaNdblhIoyck6eVRt6uTkpwY02Lx5vAgGhG+bl11yVH7e/iIqSStkVYc0YUm RYGBB9sEBhX1vGLC+LFfZGcO8gjLa9BCO1ZKrnz04YSNESLJK+1fRmYUMhm5Ys479gqpX7eDUy8V i8mssYNUrdTZrFg2+rXP9H35X0d+9uORNWv4umXn32jfyOAQ398ZeckZ6/Z/ysjsuRVZlrrexDrZ KAocZRaksOktW0In7kpLdUxZqpmaIaDRVSIigS2MynsIGNM4Qj2upwFxc+ctRQxYDY7lHf+NJ9FH mvq14yyzTkQtghLpaHY6T8FjvjamQyWKFJGfrSFejt3StnZHQj8J49o7NrhHDqLgAYNEShrZ11bN XjDllD4NbrL6tl7UNwZJyVd1rayhYYyuaN5oc3MpqycBYjTGgPe5B1qRb1RZsd3MUWKkgY01cl1H Y7qSfjY0CBbb1kjmsp0jzZT7zqzSIM2Ctbwbc61NFSVFfAe60teJlDegqKtYaUbN4dF9lj1KfLbW RgAFp6AJyLt0RBRY7+3BV4AmqdzGSkIYHAw5XvGKV5hd2i6jjlTkWJkIVtlbpFeSauks2ZmpU9u5 WQDxgjWH1hL40K1JhYfm+MHQxNULXvACzpmPrEsrDMsIgQMsAqbRfmpAushR6gDFKDZhetpuUWVW +GhJkuZ9S9vKUPwFvWkvduQH2NnRYEftM6idJeuOLlKpDEiYlvveKOM0iCp1dFA15A4G1LqjcuK/ ZVxFrZnWxSa4zCqXga0rmt/Vw5AouRQv26vmHZOiqHqcUvfFnOQjV1SKEXgt25lEh6VQ1AW+czQ3 O3UCOIab3xatjGRzzMi7MjF8MamaUE66y88Iv0zEfSqrdq+8tO8zf9d3xSWjSx/pLDh5tEz/gU8e /bXfXvuU567bbqeNk8oGN1Ip/owWjCpEyZNqyegSXlEYEXml7roYUZqqlyxSRkWsIwrRaDqX0SSM GfmKMKgtsNGRYU46Mq2MreQ4/4xfl4yDkAhAPQCoVDbhTouNSAa7DgBOtJo87WworGZSpQp2va0X IWCyuf2SotF2doZEd8TCKiB3C0pGgxhcWhhFfjRyCn5LGHM7yuO68kIMkkjWAjtyUmMR66ZcSLfE yCFtHFwXKvF6SszkryhkElgcK2VOKotdSvmYLDqPYWO/x0BNfilZV16J2e3oje5OuVDp35a8XKwy cxMR+SvZkD6+Uh7XBe/SZwAO/O3u1GJU/uRiOdtUKUB7ySWG5x3rxFZfrmKVHO3rBiNTUUu641Zl +hB6cw/aRkerbFhQSlJHpywpIoZobQSgPHiXvyynMcGG5Ir5lQRgMhhTA3D5wou2edbrd23cqk8k EmBxhb2gmydN29CpVFkUKleKR5Wpq825WUDsSG4zUVqmUteilu8uy6cRkbd0q5OCQYWeSJTTz5OV HMyNZyHF99LLIElpqKFORN4lO4WHxrENOyYllbVuhGFVc3uVsl6W1CL+VLElHT1k82vKDbkQUyNq 7Rco6zh6HV2dlx+D/MwmiRI7nsqmLXW9qYw76ZIsV+68hT1P+r71n6w86e9jhe0YzOgf6Nt20egx v77myBes2W2/Df1VK08o5448dYfNDnDFKJhki7DSbU2JohQKqiLLliaSDIJTCu463GB5XFLQM44B fMuFTdPKxkCMOhom2krUTTCU8sa7UkrqG81osYouxr9imma8oqNFRNV9vfJEInmHmVjekpt1zMYo kgo4SaKLo6diR5JgdELMclzyr80SWZcVK5NFBP032tlxlfBujDfTLKO3zDvHc4k4Y1g6cipVMAqP 7YM9GHWJoajCMSZT2DgjUjDYHeX1MiSiGZP6UcJkz9K8UbV0XsZqaedKy1j9aIpKRpVxUkL8WEyZ 4pbHt3gZjgOsE22VKuqFIUBSmpmrtFIDnShA3IqupeT6aAufoihDui5xSpUjwouixn33bKsSDyGq YGV6YVQCgPgrjeyoM0eprOfy9MqVj8JLZ8XojW2muZdetp2TkbXfBeBMrF2xtGQb78gprG0ARXGu OGlTER31SdEYD6quKcZEp5zAluSA/tIgEkBLWUq9oq3gyO4imueORq6MK7yswVgdx5YpYOJEtUA/ oWWaMdeSW7WvpY5KI1sA1smwPD1pUSles7NYjUMtfRe20iamiQ31IMWPmxoyQrtq4uhyH+u69qpO ZQdGqohDFZMT2qq0kiXXWy7eRTH2pJVxpYvRVlhDuwApGpMZ9SEnqmhgUxlX1a/0NbCv9FPlxQQv BL9iePl82SOjX/7Xvv88b/S6K0bXrd+4vHvW8OhTnrv2xFetfvKxa+fMa1q9EHWL546/Sugm50XD GaDoYkkq+kCFOdauXbty5cp169bJPbJ1qa/hoMj6rwqbl08sW8QijhJODL5t/yizVYhKRb6SUHTE 1MNfiWSpRKryNUcbQdUjhWhDnZc0VcVKOZ0kktWReHHZsY0svrFk9Jr0FWvHW2VUxEy2xVKtGC0m EuWMiSAxTKGuWKyiwtEadekWHd0gbUmcinEcGPMxKhsjKrUdyZ76GctY8cgrWcahVaesR3r2YHJr pWVs5OjxyXoh5viEXKyj5axzWQyYll6OMWn1OfEeoCUvzYcBvtWdxzjhfLvttmNmVHuuxf346mRO AgjVAVKTAEwx+qvvJpX0lTCu6E3i6vZ+jpJrO7Njjz02xQA7SKTP+1GMjp+5ba2pTbaSTdK+xULe qJBshah/8id/ok9hl/bBwqiQolfCeGcPC9Bg3pQXUlDzi6xKT6++sG9MsrME0BcQwT3akKQhPFp6 R+hZ8DF9t7LZrZRXBEY0qcn7tHEeu8jhvoi8JTl7+/hzlclu2oLQQ4sYDLQ/yVZyq59vqBaRj61i Kh1++OGsHW9+6FGqLMEqX0xCcUA/XHCH3hBQXEkAYil5hyFKmYkprhps3hxalZL7I+flGvcyPDRK R5GWcSWzs4q6bK/IShbMxK33NUfu13llK0xHcikwxNSkqKv4jx+Zam8r0SEGsADT3pWfdiobAc8q JlOr4SKGSyO/7W1v04c8G95g2fiV5sQysanEBO5iZaMyCMq+PPpD5+LLypMffbefye/Lv9q3fAkX x/719Q0N9e198IaTfmPtMc9fv+OutaNSsU4oRxeTkP4ZUVSUKpHip1CFMKKRpa+DR4dnDW+3/XaI CwS3GySP2SUWtrYoq2SCm0JUHB6xlHLahnV1oxHEIropulW3omCedLci8a7ppPXoUXFzN7yOYWbv eADAFUGuqLWETMMMu08EYyyVNrFPY5ZG18ToTaSiX1KEV+oSL5aw0tKmura8lbUYDuxEWbFRJp1J lYg5xXasHqmlZLehKqvbdJVNRAw/n0drN1xMBJ0O0Q6lGcv8dZilyG+wnks6nWNUVNq87mKSsMFr zWQdOcmtqRY4SR/ko/ei6QdQ6nN3ejlS2wzT5Wjf5UkdCCAQBgXNaNIRskUAF6GWPskeKSfJ6fb0 IXFQCBLWvbnlMKY6YvOTWrCLfFGtRPxaAMqaBDayoP+W42DKclLtJyhY6QNJMAjYi+vUkrQsB9d3 rcHx5RdGqEtJpKKAkAT09agBUqzlbems0v6qqGlmtENl6NvO2uq4rAXsxuM4gsUzzeFRx9GtnApg Q227lr5bmdwqHyWOSE5dfWpE5YVRFIqccB27YT2MbPeZjtwHGkMduVvmBeJwUZtb66KNrPOkmuLK nzSiosTQThqUx+PYDaez2iGFRGmlkiNXkCQdwGvCAPpowZuUnueGHZCUnwQkyaKYIVqoTkzG0WMd 6yRA116GDqGCWydUGfGiy7TnILuw+4AU08/6aV/rW7PaiRILy638BCvjCywT5/7lSshqhliBQdru ueeeWo5vt2IxcoHylCG64oOyBmfplrZChzsUiDcxbZh3aJm8jCLQVNsLSn4FFa/2ao1W+YmDKGp/ erf63nvvFaaJ3VICPQ4C9SIStLIbK4FOpZncvYG6ttlu4LgXjj71WWvn77h+2coRkPfwUN+c4f71 qwev+/6sK78+cNfNA6MjOc3sIUmin54itcDmrgLm6+5QurgY1x3iVjbmAHd33XXX5zznOfvsu8/l l1/+3e98d82aNTZIfLdMgolgDCmxA77HoVVpcFvYyCzKE11gXeqgalTWVnJhSHm6UXA5im0ALetJ GBk8YnpTsIWTO+L1qAjn1C1HmbabTJpsaGGi7+xiaZSCQU5MYpQhkQjGeJbWdqsDL5nINO308smP uVg7M0qBKjOmYKjLPunodT4SOMWPysielV6LKttoUUfp5bGTTWp2VqGSdaJfesTGmfCW07bNSaSW ykebS4sGgqV9Smox40qCkQK89tlnH5ev5JvaqFjGFUHGvJWYZhlVkh6RvqdcZ2IxvK2vdqROB5Q1 neyDjhD0oCUW2t+3zlySnA5Jk6naENcrGSSANutNdKhFZybc7APoRj+KjlpbHPnST6NFORiAF0T8 qNoqUx6lyk9V07MCC9LUoCYveY2PpwfJwojBYoC0rgDhVSVNrNpZIL/SbkC01HNHO0NNW3RzIANg BSERqXyFMbKeVFwJZgEKAayVFb2tMk5MOeK64C0ZGTrJHQQhAYZN7G4HNu5A9zhrLk3RUbt0xzBQ uEK8HMIhOcbRZtVUgSzT29FlmAvhiR8JHIk020p7upcHBBGDRxbC2akAAUaYxUlffEoMe+sY+1QV tcl0uqhbspWwO0TiQLpBcrmM6pXm0iextE82ZWTYSjXLi2Sf7Y+CoM9yI23khEU0C6Li6PTN1BgY NFaCyKStdFTWMxhODW9lEsmASVrSXy0G122rSlM7IMv8VcWGdgOBK+fUN/YFCXnfd9998TmvhY79 H5UrsXjU0HZxZ1/ZgUWyPgcGHHbU+icfv27xgetmz+6bPdQ3e5h/gyPrB268tu+qbwz98tpZq1eO x19kpIiMfVtcnZx4RbySOj8Ht06kL39FTbrr1cDFixe/6lWv+t3f/d2ddtrxO9/9zoc+9FdXXH6F qelEf9Nks5OHk7QGmvJDQ0MbPTTmf0kSV9xGfBBtGyuKi/0iSbgSF5mkCfVU3RRc10aOV8zCgZFM GsnqVqm1PCL3OegrC1upaISUivavWWsK304xI/vIbsW5lIwDp6hXnY4pbERWEhr3W5hkvRgzHvCU KaPqUQCzSOonR1tH0bSp0zghcTTNmMVRcp/bcbERiEwTKYutMtHvUREVc/ZZ8sQl/YxRUd4qDVWW UY40c9HdSmqxbWkQJlJww9UGeZeRZlJRHq1z9eJmvZ4lcFa6yRU1W6mFjJUWgKA6S0jRjbkYvJYs WdKw25f4An1YxZtwkvOCzgw0Rs8a+y1X1Gps7povixYgmMpLbEhRXrNxUECwtKY8+Q46cbU3tvKn WKIdpKDwEFjKeBq8Vfa1klzL7utU5m4pP+WRHDtzwl3qmrg+xWdqyV+pbYxvN9rIlW5NFfVQAviL lysrylN434/UTcG3tFO72CGJXo7kotcNR3cnAcRdL9dCBLNXfg2eYgQkd8vAxqHQZ2PviPYwqd+2 dDxoabKIVKZSspjf8oyplMDchLkTfYpx0DHtVYf8qF/5UEh80Y7nBil4Grwcy5eNABPYHE58IW9g rpf3VDY72JOBdETeKpayiXAql15I1BgYHrFIVAmDqMkUpY6VSaRa1hQBUptmOpWmdkW5OzoiCkDd +Gkk2gEPzBpa2jznXX7D0p1r7EKauxP1W5Fr2T9xNxagvPCEEA8YbNd9Rg955tonH7du2+1GQd5z hofogVesWH/bLf3XfGvWzdfMWvJAxa4IMdzdmanlVS+uE2eXy1sj4x7PvBpwx4XOOt9ll12IPLZw 4uTyy7//sY99HPdEZUtD6UpUP6IQB7fkNPLQdSFmBLNTEj5I2iVecUo1Am77K1omtYPmmEwXi9nC UVSdR7+kYJApSqBj03GicY7VqWzUbEaLGtODunjWzpULFG/mDhc9fOBjovEhgFV2SdX1QCh6M9rH xhE7lXeB0u/c8sWYQaYTZ+5FSuWtaYo3XY+jPhWOgjnMTM3xUF6JhWOwpTxSxVS90muxZLSzr0cH +WKSP1FORqjjW3m9rm6K/0nRLIM/UkvNRXvkLbKlK+tkiyUnVbHSvKXH5Z2U3bFu1wI8oSpG5D1h GDyhJG/vHcAEk4sces7QvmIvrrYYWwl5G1LXRbIeF5TIu7J9mFR4dJ07M6K9agKvwhMJVeinO+B0 181uslrqJFIt+cNd9Viq999968CVX5591X8NP/ArpirBTfzXz+KTRbuOPO3EtUe9cO0eBzIxmV8h Ml+oGejEi2XHYGFSF+jeMerrvl8TqA8++ODnPnfR+99/zoc+9KG///t/+MlPfuJasXqlvrZkFI/z 9Ci/JOjwTRDKRo7GN5JwYZ2Ubo2pEtd7JFRXiX5cNwaAfRrZxaCKlte5YFY0iCj7elQtAdnIJeGk aIRI0BbzaxyS2atZxFeQ3SND3/UtCx/lFNOoSwow3xIdCyYLi1SiIEb2iH1aOjRFb4oNS5IMpWKx 87DpfFL6urxSmWWReGQRZah0XByV2QKpZY8cY8TGgEktcqQQo66y2IQF6oin68mnlXdbkiqdNT0V E5dmqNEg0tZQcYbaSiuP/WXHXlw1W2D6I3mGxlXqXLbmuJpg2lgdf5wzK7vM0nxlv5s6uTJuYof6 aGfZv3LpwNVfG770M7NvuGpow/rxJ6SgkXnbjD7l2WtPOH0NM+Kz54zPI8YutgGEmbWwVKrF3Yjn 9DNKK9UMXtnP5Pbb77j44s//7d/+7be+9S098IrwK5pL13UljgoiSErTk2IdIVqUMFY0MrDuJRy0 IpIhebZylZF79+RBQ1LzNUFpR/nSvIYd6SSqWZaRBUpPVYKqEkpGyCiVZWTDVluYu6zzScJE40cj OzWg5u2KKMA5RGY9euinTKFiCZ1bPCse7ebCZmd5UpY58CpjJro+GdPmjVmjQLX3FTAOe0epq1jO KJUtHJ2SglncUyTHn0mMSqdHFVK2JnliLCVS1s4GdJykHKyTITVrdT+jnSuNnzzbhqyqTGfFJNX0 C/B4cWzjjuYyj5fkLcODpbc8u2clButbpl/UrTauWnqnIbSm31ldyzz9oj7R4iqvNmGdd9mjq01X PxRXrMYeSB1z7KJSZ580jwBCxI083IVwpbMKZXB0t31Gjj5p5BnP3jAwvP6RFaMrVvdtM79vVn/f Q3cP/PDbwzdcMfTI2MqTJE/ENPEWvJIW7nS9nsRAJyFvVzT4sLkAWHE5B9e9lNmW0UXVtcouZhVi +YgVGowc8aWrWLZ4N/pXoMdpADTUkADZYm6UWE0+SqDWP31LFaM6STVFBey0nkSSu7psJQlLnGSv lZgj6qUoEhcv9Y5+1OodBlEimIys6uLu5SWRowdUYhHHJCoWx3LSiL8saLGFk3biqItS37rreunW 0kQpbm3YSC25T76odJDdXbo4BW2MrtJrkY51hKa9HxsNA18bKsVAalLSz2SlFCSxcbDiMVyll9Mh WSalW7MkMVliySihzlHZuwTUKVt33R6fkoqVvpPw0yNANNQTiuPPfvYzZIvvvW0BtmJpAcvHmTnS FsVgbtYPaNFzL67K7J6egNwC4mramosZZ6uJPyAXuw2rF/vX2Cep6zKEcoDG8i7gdlxdrHGGC+tk w/q+u24e/ObFQ1+/cOjeO/s3jNAW0B70DQz27bjHyDEvWHvMi9cu3puFuRsTJKKTND8XO48Sneiu u/yIiV3R0MQoTd0z0M0QzQJESdy5uqePgEnnQBD+arEHJx7tRFHjKCUaPEW5YYRlsDtkaslvd3iF SQQluitAKZGiK8twtzyRuwnG6qmkxbBIPonQNkVX1Mjud/hZ7MhLZEXThxxnmGuVy0iOutiPxtYR TYq7sL5mwYfHDk74GXd1dRnPjquiucuzSWxrp4iNSRS1iwFv6/miaJZdizlGq0Zr+1xREUcXjpDk Hce/A9gGjFeoFeMquqmMQMd8apEsv6g5ZyOjmMjmEs3lUDGXpHW0W7xV2jPdTXkUmVrHyjKVnpL9 p7aiuJdWnTYBKhn54uZQuSXH2HqnlryZQmwuptZZLSW3T0u36oU27e7CbhKC3ZvDyL24Ss5qMHLP VluwrSresHSjoN4o9lvqgdKVyj7PrYxPyl7fPV/q7SSAefnunHl9+z1p/YFHr935gPU7bNPZ8ISJ SAoyMr/lxqGfXTl884+HVq/cuF1g6i+tTmy+xStCnKiOZfZFQyvhVGYuueKJMZATh0wkDC0Z3N+L l6npluyp84jdjQY8AHDdKGRCTqYWEUx0mXjZj6VZkDkiSPGylWzVlBWWNvEqk8dXPK5INoFCpVJ1 HYw1iqHrwkbV0RFJIxWWK3Wiwg5FU7Zxoh1inDgGrIJoxhjgiiPHvBQJ/PRJOfBTgZg4bp2N7WRM D9VisDkZo8WcX3a6i9mGCXE6eGIsuUwSL6ZbMkIM0RhynOvxSxTAcVUmbORodaLvkiLJJk66pGYZ bw7UmD4poSprJWFKgS02M44xu1OzmbLPNql0WVRnshVt/MdLgGjG5Jdon56tNsXL02/kXlzF9rA5 knu22oJtNbj99tvHRplvMSZIoZ+xX9d5ulJZJnZ4RmaxazQd98Ge7jVfU2ap9yP3Dzx83yAfmd95 95G5c/sG+scA62Dfgu1H99inf8GCgYfvH9CGg0nC2NfGc/N1n6q7nkF0F6u+03NLxlVGunGxb4Q+ kl+zkrGVjPOUNpTKuGO27uJilB/xVgSppu+LumKVhercT7u8OUb0Lzs4/z2TOmFI2P52emW0RMlt 8Gj5uqirIxvjLZ1LeKsQT6KalJG+0fIRgqee3pqaYFrMLVI2r0GeuYi7psApFoMk5VTyWjRO8oiw YBq92CCxcCQSo64s40ByRiQvREAcy0S+MSujg2wNxaezQExj1jg3k4/qlCrtkHIwipEY+VayTGpb Yq3osspojKmRLKOf2kYtHgmmm10cmVSS2sSKpfoWXiebW4AU4U9kjj1btfdOz1Y9W/Xaq8Eddtgh 9hArVqwQqosAqDRTXRflzjh2MO6NylqRF1US7iw7ReYiVyzpf+hXg6uXD+yw08jC7anSNzLa+eLl jjsP7nvgwDbbdz6BuexhOmy/kZnHCWWPaKQSUZcBk8prDjsiVC6qIodepPMKAd3ib0R7Ul9LyQ3E ZWej8Gh5XTfgFuzWznfu8zTDKnycoE/0moSMsDsaIfbQlb216rq6QZi9nG5F/GG+pmyjSVlHmvQV TYNdUVbdElAamcWKqmLIFcNPsDiKHZGZ9YrBrzCQACkgHe0mInXsXMusSBApa2Sylsplor5iGq1n Yexxa2QWigofUXgJE2WL1ZOakXVU3xo5qcvsdhnTNwUrGFlHUg6S0obRmLGK3RG5lAVKLSplcCba 2pFUnI6yg5pNkVxQ97NE3mXglQE5IfEUWhOWryvQNZ2toWKZZZWtx4TG79lqQhPFLN7ijdyLq/bx MFNstRF5K9tB3qmbrOxQy67U+Kaye47llSduXNSPxk5a/Urk+9gurX/dmoGH7h1kenv23L4dFncw EeB77vDQNtsOLt6lf/Fu/evW9j14L0tBKoCvJDG04iRKIjGSeOr741N+9/HuAnXFAFTXRSd2k0m1 pKN+Rthn2KHun1tRDH5q3XC9rTrKSjCRsmGto3XxSYxdA76ospSKljSQgpGGHzEeDHajlyWz9yaX eHriEY2mYtJalM3LQSUF7crILqop2aJ2KbblZRWzwaMFovxiF82rc6/VToYVX6kgdcSOi1qh5ENe 1ux4NKMtI9Z2ZcodyUBgqJgHhKXAyVAKMOvr6XnbWXcr48SWtFQxYKKn5OjoBfkulokFTFleVnXr 4lplaKliivPS+3ZiUtMVo93sjnSS3JS4JBbxrs+lMuERP3GXSopLsl4ltamqOFV0pl/y6efYs1Wb UKwsM/3OmkEce3G1RcbVOPI2cGG1SWzZjdViN5b6s9j56dydd+pXYieqLiT2oO6fEtMqu/evX9u/ 5MHB++8aGO3r33ankYHOF+YHZ88aHB7u336nvl336nRjbHiydnXF0+qy17TKSUL/tF5WzZJrHloy u/sXqLLR1Iv7r4GXqqhurOICJbAQSuO6AGKcxLWQwigJediMVkpOF8pMLksxQBWjXlMWDIomEl+r Y6hkuGAXG8NBwYYy/IqWtEmlctQi+lHFohZJIwkT+UZfRy/YU7GA9UrBI762SZq9jsK7mMdOiodI IbpM2RGD37C4NEIKVD2BcZxEPC1XekmMSEl+Oz3+TBjXUrmwo9ouSCHhIC99JGNGvcqgVRkfYmfV ooWjx6PuUZ3ovpRcMTbi6NEc7Q7LnGRLipuX0yQViH6U8LCoQ95uolPSxQipPO+6YqLWNZ2toWLP VhPGYV2BrSE8utaxF1dbalwNLlq0yAuUUXL58uVGA1Fn9xm+a7hWWUxQJtVS15LKl91VCQUSguHn 2MKLvhVLBu+5fWjpw/3b7TS63Q4Ds2d1iDOtuXC70d33G91ux9GH7+9fuQws2OGZoFia0ovdcOzb lDMGXpqk1JVxMR59Wy4qYoFLKxmYiqOtZLQtHC9ALzqcexM6+HoC2ItbDG4iHrLKpYOMGKx1FN5E hDDscU7iLclmKObC0elilJB0MqDLAxZL+tJXwwMZ38LLBa4uw0akGKGPXZaU0iy43WQcmRCnneUY jmaxhSNiE4XINxrQukSNRCcixeggm9FWsvopzJzRElKxZI5RJEegEzNy18XolOjNlDL+WbrbRott Qql4CpWEXCtZ2/sSu3SK9XJ42Fl2cQykFL2ljjEjYmal5iXeajgv2ZWrTSgTm+gY881cNqViajSm X4AZxLFnK4fxhAHZs1XPVnVBslW1V4OLFy+OoeDVJrHLt6ViX1jX76b+srJYuUoysnCXnGQw5DIL IPXaVQMP3TOw5IHBbbbt22mXvv6BPsHs4bmjO+y8YfEeIytX9C15kO2ix+cmE8JIQaC77sUjStMC AEEHzRqqrhcGCNAIHwgCluhNt4wPDGuMnLjlOVFDjbi226bzRnVa3iCyBlWRSwR8NqntEIw5Pskq DCEFbQFLLl5l91+HgcTRtaKFJaQqJrLJRCUitwARbyVMGWGNZ3ll4VhdEkY4G7UTkYTbLHNKjdh2 OFxVPdpZ1GI4SXKP6xxsydQWJqWG6ctfMT7F3UGVgCMjukhTQsYINCP7MZ1Ums7Kpuq2iRIkWkYq lPomUuZusaOXYzBEt8rgJq5isSlIt6JbI51SmEqPWCQFUvlTV/zXZRApznnbm5FCNGl53XcVBl1X jOO0TaHTtQAzqGLPVmVz6gxKAdmzVc9WKTZkkK2tvRrccccdoyFYbRJ7MqdNwovuUSIkSm1l7HIq O1RPNbnHNXLShDQtvoGmO2l3va4+sn5g6YMD9981yEuVO+42ylcIR8fAxtCskW0Xjey27wa+O//g PQPr1oz3+xa+soMsIamAiGYNZYc4pyjVjLOtCxeT8MYWNqYBQcRGEcqIuJGQxIAXa7vnzp07Z86c 2bNne4tofTZRkhhg2fLuPj3LK8p2k6Xiugsnn5qsVY4YRfkj++jcPoqAz2DF8EslLapr2dqyiYtJ 5hiToh+hTBJMUnnPRxWmlmwr7jGYy8CO7MYjKbyf4CvR+NFcMWUiL1lbJaMdogARbDkRHKixb9Pd iLwdWtEjbv3FJWW3ftr1Vs0O8q10JVaRVKYf3aHgiaFV6TgLGUk5TmKrFe0TNYosHCGOLt2NBGP5 RD8KXKqZHBTDI90yWcsTqXHRyJvzSsgbBbPd4sUpqUheTAmd0k3RIMngkSN2eOpTn8oTgAceeCAS OeaYY3bbbbdf/epXU65y16I+7rbqWvLpr9izVWoJG1KgZ6st2Fb9hxxyiNWj0+Iblvw0IHP3n/pm 96kpdWOXzLmrVxZzB6+T1AVGdGI6KuOOjROPoTuLTLYfPeK5G459wXpmu12dk5XLB37y/Vnf+uLw fXf1j2wYB8oqoP7PEFmxLvWto5hq4llVvKiAMt63uxJnCD2oekQSRjZmLR2FvVzLVUxBZQDc9Ewg b9lN0E1GZhYTXvxdu3atNo1Oue3eWphMYhuOS9oISqSgBDZU5ZwqVipiNRWzNQRtZbHIMVpYSsm2 9oud7ooxutx/R+3SQCLCPllJH4ePvhA7qywv+4GGcyGqI9bW0a6UmnFU5kDVHLaMhlP0vUwHT3wp U4w4KMbhnzaX7iownGIxhrnFAMyPLBQM0UGONAkgLmKULGxGVl8lXT5VsUiRjiMweseOliKRbByv 2ssWTyo7NqIALmyx7VkVsxFcXdzdhliMKJ7JepBm9aPYyYCWM2onedzQJV1kvV133VXRlcwSbZ74 RjpTVbE07DQLQPt25ZVXLl26lC+Z219cvPrqq5GEbsthMFUqp8Bub+TH3VZdSz7lFeWsMiCvuuqq spEpG5P2Np9yyWPr4RZyK8/BGWTkGZeD1cg79kxlMqiPiV7xeUQhlX2P+zkjLfdYuiLsa4Snk9gj qrN0brjKWJKMzlvQf+BTNhz/krX7HsLOJlSUnP1rVw/c8Yuhyy6e/fPr+teuGQGaUBHMIV6xh6a0 OMbt/4Sc3PVGcOwOQCKZVOpxY7cdE1vXbU+BM+kYAYG5c13Ie/78+fyVZQT4hPlkELAdyJvDESlq NnvCRhFHirtlcEVdtLT2gh9N2Cy6FQcwxj0yL1UoYIxrIaHARRlBlkltX7SVJBTlhORiMVtb4Nth KfEUYDr3IKqMCgkj4a2mLWOLmYVnKx0PrihwL3Za7CHHCUCYC74T/YQLRTAVtmcliV+vlBesoD1o q2psppATIx0Ww1csm6+kwnJWpb900fHgMpGmOMbIkWvkWVs4WiNejxlk+R0eKcXMKJ64qXEuiE7M lMRFFkgOiga02DFxRF/WEP2oCF/SKc0YTW0ZSkdsjoqJS0rAdHdqBeBjiieddNI555xz7rnnitEH PvCBl7/85RdddNE73vEOXZlajvZdd0Z+HG21iZJPlVt/+tOflmGpKzfeeON55533uc99rrLAVAmw WQPy8TJyL67au3Wm2KoCebvRif2B9UkdsHuOsjd1v6Jexw2lsUisojJGUbFPUl2jDSMndWAl2dlz +nfec+TZv772sKPWzp4DYOoUAdUwlfnwvUOXfm7o2u8NrFmVoUbUS9PGEUOYqYU3zij73dhbW0j1 EByGQdar7D98y1JxxbgQnMQKEya8+Wucqs3jxjTtADiuA7453FiIu8oLzUR0K4hmxGndhThVWLWk gsmKnVGyEaEuxn4x1hV9rZyRsoY7USpr5/CQ9WQx/TVgcoRYGJXRT4rFBfG6LgrSnRPNDWtUECmr sGfKrbIxq4NBBjSMlpWMOM1U3jRNxoHc0l+pzK01a9Y4CB1+MSZTnkpHcZSzrLs8KDHsRCsVlXXo 2mg2pnPNrrf1oiTJ4yKoAvEkhocCT+6QeGXkiGlMhyiPg8eOkMoRQyuEopVszCikydoUPikVLwsn c1ngVNeRKaWibELe1rc0u62dbplUPIkSTqqiXfZ4CQBfZrjf//73A74BbUx+H3rooSw+ueSSS4Dd fNs8mSimhq09KZVntK2mWeU6Wwl5M2SKYYPjOFgjxEXAN0Opx9FZXXt5+is+EXLwCRJXqRUqW8iZ Z6u02uT+++935+FuTIhNDboxEz/VsbnniOcptdy3ubCRk22aOmb1RhG1qErsZfVTHapQxXhzPDA6 f+HIEc9b+6yXrN12EbcQEoQ4ONo3sGp5P8j7ks8ML32I6dUOjKNiwqAAViE840JDH/Fyox8hUdJI tySV/pZgSPYUYjYMlbVtcIe+1wxAR+u8Qd7RJqImbMFftDB0M+Aw3BRf04yIxB6RWSKQFSpNTrFN HP32hdGevGlPxZNUBnwsphAxAhNlwzIHnsrUYSMHmwp4wlviRVfKLCLlOFd13dJJXIhi50ZdIOuH D6YT7SP6IqUTC6Y4kXm5qzlvaxq9EKWys+xZySAFPVqLqjl6dTfGs4NNASkLSBFLHn/G8nKxgtCm i66xoRzw9qnpm6BZm0I8sdY+cXlTcHl70B6xUpI5alRKIiFj4jgFXDgSSQTFK8WbOUalOKdYRN5R zqhXqX5ZUixcMjp6QuslI2wKna4FcEUQ21FHHbXHHnvceeedrD+56667ovzJ74+LqM6gTbT5pttq sl6eco5C3gcffHAZkAyieF7BdYZScuLj4qwpVzll0xQGZC+u2jd0M85W/SRJ7ORA3tLB3WRU3j2r y7gzSz1TbLsNgGInJBbGQMIfYpp6IwsgOmkeqwx0rozhjBG+s3PoM9Y/99S1e+6v2dwhEDgU1q7p u+1n/V+8YOjOXwyw4FaAzN2zUK8hixuI6ForKy1shFjY+MNiW1QjS63Hla2EjdT7cu5tBA1ihNVk ASoy582CE/4aj0oS4TZN20c0JlHjQMUqazs/YzVxNMiOXrOyYmR32N3WOtnN1rOyLgAdoW35nb9e vmJ2KfA8xHKgRiNokGPdHVGKMWkXfWEiKond/FnQCK3kI6FG+92uV13DbnORCnaNrhvy6jq15AL7 Wu5j7CR2vi50bhgdiTvLOJH8DgaHllNJjlOExJCQvnaEBgYxyNMVuzVSjudlwKSETXFiTaM6ibgH JOm6xU7esb9U0T51FCUtohFkqDhusWA2vgk6GMpxThkzdaYrkXcMV3mnztp1tnWEt6+YSprytAkw gzj2bGULNCBvynz9618nvM8880xGUKoyg7w8/aL24moLbq86yNs5QKsK8lYzbVhWtuYpYfQz4ht3 M65rvBV7PjHyrF6c8zNwMSCLTN3DVTom9g1M/C3eo+/k09c++diROXMBMeOzQBtGRpc9MvJf/zbr 6kuH1q2F28aXQfX2m5G3pIo6iqnso86+BILqsC2zQaqoibjwlqrrenypzgLYtt4AThXB3Ex7s9Sb nwLlBlsQ14S3/CgWdpC9I+F12JKGNVyU8a2IzGIsKILJPqJm1OsoEv0IHCWSXu/z4MeOMHfrJcDh gUp0vbGIcV4EfJbTazDkvgS8pJ2MphcxpYtsaOt5VBDDQIXlR3+Q0kGikjaLrpusblk2Sa6hF04U QQ+6FHJJTTtULPgbkTdXdMjLtpV+yv7R7BZABSyqhxy6GGPGvrBgVjay87kRcJRHzrVZKumnQLWP olksTNI3Ka66Np19pKSwjrZMqWOsK+JOKJ9bwRiQiakpSySmeCt1t5usSKxo+VmhER9jRr1c8aab bvJqDRfghIrMSro6xVgbEOeYZQ3ToWT67o8k9+t00RfUoq+BPgsPdJ01JKzYhkv0hW6Bz7ADt/i+ ROSou+IrLZKtrH4Slb1QKifLYcQULIcoQ/P8889ncn1CHa0aMkiFdCQBKgtwkVcSTz31VMRQAQzy jW98g6U1dV6m5FlnnSUfJQe19E7yPgQ5MA5al0LK1ODpFDAqWerYjLwJJ/R95zvfiZqRFyGxYMEC 4qGSSwwPvcHpAGs2MpI72Oq8U1pDO+dwYBZcA0fqIhjLnFik3sBR6WOODd5ReJcilYkZy6AOgXry yScr6RDpa1/7GoOZylymQGoKLHmZC5KnzsvJO3VZb1FNXxyhLLFVoCHrTaFl7pTh2l0Odp28m1Jx I/KGCmbSnLc7ztiuVfbcqYGgTOyr3I1JRH4aXqui0Y+Im4XmmZIDhNVUTAfnBnmxLVDFR19f65+3 oO+5p6x75vNHt9l+vBp3N4xsWLly/RWXDH3rogUrlkFn44zm6tWrhcAsFayFjfRGmvhGMaxgmh6T JaFmTCbVOAQiBde0aBu+rDHQZKfMVUdWyBvYLcGgpgGD5lxtN3VaktMCG09Hd0gpkYpOlwDxooib pgFZdJYoq2L0ePRyRJOKBEkLQb35KgvYCMna9g4n0sgFDDRNRDJYEoeKxOOnHKRnBSopkaSU6EsS P5mJVhIdHZ5WV8UY1dGhcWQlyRVgMovGAGbhilLNKRBNJFEldooB717ilkIlqaJpbwmgi7KkNLIK Eim6yeVNMxKJESgtoh9t/+Rix4xpxhPLXF5UxchF2kUXxJi0YaVplMfhnai5jMRQ/lr+UjvHZ6Jj I0dlY7I0IG+zKzPU4gEUwDeVBvTFM844w5OOrviud72Lyciy4kc+8pGPfexjMXKsGiBVuCQdJfSn AHgLyFgW/vSnP806hKTRW8YOTY4q9VwAjvCFjrRIFenjo7Rmx8pjFIncqQhOQqry00WsI7/wwgtF uU5Hk0KGSru1cRaiGvSDn4SoAMFvetObACill/FRacPooGirOsnjlDPsZGrs8+EPfzhxxI8XX3wx ZVKVaMbknTbIu6QmRP7a1762HLPF3ORcg5y0RDaGR5TNodKQDikXzj77bFkDL5SxccUVV3BX46Jk q0rXwLfSO+JSKRUsSIdyLIfKRItHaK7LeOnNb35zLB8zpbIpKHNB8lR62e2JvTNhRkDfC/0ZumCZ MsX02nRdO9Ymd5qbuMr2qqyyOQRIGZGYmuPGHsuQMRV1h2fwQQHqG50IoPhQMXdFqVbkEmtJIP+N kR2xnbtYd+cqGXt3nQc80Q+wvuQ/hj/3j8N339rfNzKGOcZ4zRruO/LEVa84+5HFe67r63/Mq2CW zdYQuhUkUm9ty1gAW0Y2kRipmO1jBKyXI0trRGoGkW6JRAci4HUdfAWJRoEd2bWlibknygamXLds +i5PKqmfQnKCleae/JUi2CU9lRspi4iAnQSIIaRp9YgvHcoSuAxIc98Y1mPS+qcMVaaECHpcIWUj jJMYFi86Xd6RMDFEpZ2CxNJy7rCJHjSSFlOPRiyqhZEYOqK+nNvI8pStZB9F8aIjlDtRXykVL9om Zu27KexTDJh7ktYsnFkWyY2GrpRGkLNiAyWpnFNuQ1LSmaDMKAox9qKLo2C+7sCwHWIoOlVj3Sin BRN3yyDjeOgY3Z2qxxi2oVIZ/6Qnph/VAbag19QBnqusQmdPSWrRU9LH6wB5AAfplbU8txRAsBv6 Pipnf6ko2A13ZGDmWweIAfqve93rYFEpVaXK7373u+u05rpmHJlStcrve9/7KssjPFqDCQABrCOX ynp3kx1UAMQyMtWjglyJtsVoVC/pt3EWiAQuogZrZOAnE6ugKzCWo8vEkQobglcoJmlxFtUFm+o4 Tugd50LJsdnUbXSMltEULOZNQRiDecLAjgRbCpD85YyQGJUcKUNsMJ2cTM1e8rg7tjaSR66B0Smn nFKZPpWiQip6hxyBAizKoSMhAYbmL4j2iCOOOOiggw488MATTjiBOOf9B6BwevQUrUQZq6xcmJSR iVJTKzNCwZ8srAcaFCbHsQwpxvDjyCOPVNYrxSDrWfBNaegamoKW4dFd8rZvr+ok3LgBgkq4J3O3 mrphFVO/6N7R1NOEnGlG9u5mYpcsp0aw4p/G0OKrvtC9sh+s+xYnqiJEMjYLPDQ6Musnl88+9//M vuEHA2vXjHZ2PBmlCx8ZGOzb86B1Z7xjyaFHrRse7jzsZoIwwhdHKrcEnjg08y2Z3WClztsS2qTW TqZTXU2eSSOuCNmrA45NoW3luh2txharqK52MmFDDCC4LeYyHipQEuIC2WYRU1HUqKiP8hg/2ZWP Nez4tJ/EoDwiaSAh1ex3FyihpFWzZ1XLs8KayJc15FPx0kXO4cgTA38lx2EsUUVfXrBGiiXdFSnF m67bqkLMliQCpmiZWN6aSouU/zHCpVfU2qy5Lo3kQY2LVF7K6iGJfnKLc/2UjjqRLk7YmIMOraQF ZVxXujv+LVuKcxkwaqqSsnmqnuLBJX1d8elM17nHP/KXa6lwvGJlbVUXto8UMxK7rButxF2lBiWT H62aDejoimnrRoBiToeotQ3lQI0C+NytTQqqysJcZATOXCzH5ZdfziyazjnRg+mY7/wEg4KtmeQD B0ToTA/KFQqACXilJNZydlNLxHXAN4mE5Mzig0so+ZrXvAYZrAsoE3xMeZBBJXQoOQIxhd7qFNf1 qHIdwNKkI+gfTCOCCMZUt0RiPCAdqR4VjLbV9XKw0cZZWu4sm/v5wx133MFsN9gaOHXaaac55GCK AfERwAus42UzsKY6P2PIORNligm9UxpZV+BIYFQOpWSruoqVrhF21Dgnum+ydLrICOdCygiLkWSA BVlJYBD20dREL1We//zna8Bp7zh9iJy69GEtjSW3s1JoKd3giK3SoyRiFdOBm3kuYbGZ7f7jP/5j kohbhGtpdj0ZgKAbAY95SpUrvYYRYrqVGSGCycJwFH2N3CT2kiVLFDAaFXNSOevfdTyUzc6k4rOL uNpEjo/ZLTvSUq+mKImJHTuweDf2Me7vFcTqwGQIQw3HrrBs4qKfxhAlU1FOAhs5uV80X8GI+3/V f8GHZn/ri7PWrByb92aie7Tz/7nzR09705ITfnPZ3PnjeM70RcGUua4uVhfTIaXM1P26REUA7bHt 8HJvzYnQvJ/+GyOqsMGHtRY1rhts6Za5m4JdI7GFMm1eCWnWosbBFaMT29kCG3CojAoYv4qLd/GT Mc3XyMPUKCABONGoQK53tBhTxpDgPA0PpHLyfrwoRnauzpHWe7zop3SJ4MzGlPBira+HRsxk1naT jROlivaM1a0mK/i1iF+QmhOgtr5RyvV58+aJtV605a/wtzC6zG6tJW26YggrZWNU64pdIDpcdA46 eqWjFZTpYjzY1LBLSeQ0cSBJQq2wNymx1pWU72JkFvaLvWZFTMS8xD0FpCgoUB2iMZ2jDCKOAE63 qKB0sRmjbKU6YifT+a4jxGR9Jd4y98q7Mk7lESsC8igDqjMud0WQhLp2AEclHcG+OhaiI1jAvJdB g60KfXpi6Gta3a6vpKklzshTN3NvpSqXLEeVBW7gzrymgs0qQxz8zdSjBgMpAJKmyTvtndVgc2AK XGxwCaDHAqzMSQIAepj7TAtpYpkJvVMZOSBFgBFQFWs3q1zJSytYOIBuQG1cjJ3xMuMKr/Bub6tS wrrAnpSzkuQxPBj8KDAckHAkemX/mAvUUujG8HZFYqkhfcrkhYWwfjQOcQgLbnlX+yj5e9/7Xn5W rnfSGg8gb2nANoHNJ70q062lkRGbFEMdB23Keh5PxcUzXcdD1zk4qcDurqVtsNXGLbFjq+eOR/2H 4B0X3c859N0d6kScIrJU9Ti3F3Vwd87FOKFlAdSPuvmIGF1lzIsy7nQjTorycL5q5egXzxv67N8P P3z/QGfWe2zhCf8b6O874sRVv/HfH9lmh43zfKIpFfw9SIhLHbtcJ15g4MxRrbjwwLPmKsNf4SRV B0mrz/Yka/Kc5bGzmOdetWqV9n7W3bL/jqhLULWj76MTfoZo9pFe6ZNh7VZVke5m1DHfo8BOOEYF DHFcxfBCBYzLo8usu8iKoINK4tndTpsYeBJA6DOFkEmJuGtFNa2O0L/n741oLTknwtyGvILCUsER G20bBw8YMDpFdERcUFsT26LJX9C2youdjGPoL0l013bWwEnmVQBHrzkA7FbZRzZ3XRk/5riiS6Eb Y0O8PNaKZVLAJIKRjhPKNoyGkoRSJ6rmxsFuTWMDK+tWS37xyvUYS1aWwrKD2yW7LMZPDCfRMQVx cQrHpDCFGOHWzhfLaLeosaItEO9WXnSB2LBogg2IEJtKuR4BhL3K9dx+k8y+jsSj5CrJPHQSTxVF H6RrjnWSv+c978FughqlHcSx7o06EbeoKqZF5KWRhX4OO+ywBiNX2mqyNgeZlQJoPUZcyozx9UXP OFtcKXmlZZJUbSoyWwlue/vb355cNmFAqjzjBB+MMWRtVGCBAXq1ESA6K8ZVqWCbjNgUjlFlxXCK MYUuLztW2qoufWJoxYqCy352hOTaAyPRdxVilWihVnq5gooaOtYNU1NGRCNLZWKAdKtcrFXnnTLr 08jNFZViQt5T5Z2polMZY21UnlTFjLzVPbgDFk5Sb6dzToSkYx8sluqZYknEVR8Texr3TGoRDA68 yDVWUf8nUKKSFsnVRUTwReK5i9UtiRfF+ME3h/7pnHk/v3Z4/dp+1p107o5B8F32WX/Wnz7ypGP5 BA+9ZqdWarakoMUWcV2MJSWqVXOLP47LHt03UGieQ7hZeFH0bQ39VFS5pHlxRTuiaA9yOUVVJJgl jC5LCIkqFszhK6U0GRwhndZhi5EU1ImEjKTEXXUllc45sSJyCiU1gyuZJV6ys3GPjR+1s4S2gOLW gikkFCe66PPoJklizM0t/XSASU7BX1U0/hYClpt0V1xiFshKvmXrxSsykdXkZ3wS4lgSdy2GsfEd h+LLrThijMLIOLaP2FkpcbFUtmrUS86K8aZaan9NTQUcYA4AFdZdk1Ui2FkWLxbTxRThIuLr5h5V SCFko0WR5D7HthQUdwsWBY42TOZyrdKS0SYOCaqLtW1odZpPXD5K2KauytP/Aen8OFgVJQknmj9m /UMiKIhwww032DIq7wh0eaH2tLWIS2pOjhUp5lgpOfgG3MZ8sOk4fmJF9eXNaIPygimcsPyUBdbp KN9jS95PojZLntSxzbnOGp5KAZLBhe28UKfr8Kj0Tmlt2AGXmcT1Hi+T5ehF9n7HAGo8YYAs24PE 5xuRO04hVHT4gcMmZkRLlUsfVaqsdUFpFKr0AStXilqXPuYYkxdzYQS4KIBFUN6vTB8R0XjMGWSC GiFMuDQrtW/KYnItpVsZJ65oUWMZia2Z73SQbkyot8n6ytypbCG7yMFNb2nd4lU2WfFiaqL5mZE3 pd2buidTv6v+w+cqmfpvdzbpbnQSt4SKPJkETaMN7gpSRMTvjj/edT9nlKZes0y2CC8E4jnuu3Po 3z4879pvz1m9or+Dvcf6VrruOQv6XvW21S989bo5c0f7mQkfOySSOZqF2blAwgqyg7TjVoSwsolw s1ahADti5x07dVW3MOk8usYl5QsRkcoyVPSFTe1uTJQlsL1g7XRdhSOWEhddsbmixSSA5FexiIDF VMY0/nZoGa+LqUhRxQDX6kcZdFFkfd0iSQsPb1RGJhLlqLtmmrkibF36QlXEUQXkVrNWFYkNHQ8t ZDcbX09I+KlV+x5T8UxD+5MISUty3dWgSxV14hy0o30SdXQsySMOPF23O9waGJ5aR4eBtJAi9m+M Q4eizO4Ai6GY6sbq5mjZxCsCdMugE1XXicwV0yHGoe7KLw5daWF2dSeiaWpilw4nhQubl0o6eiP3 CVmnAolm++oC0A1QtY5UAgTNAjTgBqGZhrlq7tJ/86oWQqblFqWPoAPUaEYbDgyWwfxz1aGlIOVR 6d/2pnZJ6AjcV3LnYsNeeG3CUowikUmFxwc/+EH8pUUv3R1aZ3/11Vd7lTnIGzjO23UQxJWVYxue adgg11xzDduqAP4mJXmUtuuKSsOWisd55clyZATiJwPYhPUtTDOz0umNb3xjyb18g8JlNBPPI5ok gAKgi9RGKd6ApGLl+paWllExUqkyyE8//XTuluP5CYlP1sh1BLumM1UVq1ebqDMgyY0sUcDdpDpj d/C6lTQsr7hj9kkMcXWuRgBGZp5cNFBT0yMgEoGUKMQO2NBQ05b6Gfu5tasHv3z+wkv+38JHHkBT +vKxDnvs3/NOWfvf3r1+593BoB3NJHMEChY+aeqkdRVbBvFYlcsiXSllbIeReS3SmMlta8IKUjBa WywM8oxFpKNmaiPooS4UbAoZJLYyYq2LjgHLo5KSoRLKJ2rJMvwUKYtnAeQ1ASBDW5koaSEWkkR/ oxZW1hehJrgcgb4DQ/I4Zuwprgg3U4u/cg0XOfcEs6C2BnsCdg4PjaOAwSwEom40i2bTKc9U3/Jl y7Vjt+hIeGFuCaC9dNjSGCShcwnD9jU0xGxlo4vgcn7CS5IoZ0Utso6zArKAfRHtKSMoOHXdfkwB qZIqIzvE4I8Rbl4xGm12x5ujK8akzx2HEimO5SSJXZBi3spaF4eQvR/DyXZLYlhgmysGcLSGAyme RGqSUAKLbLRtGZCVBM3Rzop6NVSJFZ/0pCf5Z6mviZRY0LPLdnT0fuJeibxdsVKASOH1r389nXR6 8J1ae8pPCDWSqKw51g5rlUdcLN4sanuzJzraf61OgGRD6pYqN3gZ/KStCWMuO87rKr71rW/Fs6wz UcW6FrI5ulJAOjCAlVrnXTm2wb+aLOeEkkDJT3ziE7g+5V3LwHbzNaHKJmg/tufoJUl1Kot45VAK 9Im1dWAQwVBGwsajMa4mBNApPKCjFUrN5qr0MiPSMt3KaJTKzcnLapMyvIl59m/hQLwucqfSO1NF Z1ItbWwwJ1uxYl7HE3XuTd1/G41V6pm6llIswybdsgVNX6muTsg4zHcFzS2VuysKm7LXCbhW7NXE NCJCgucn31vw73+93R2/GGLlScd8Y9Ab1Hrw0/vPfv/6pxw7Onf+Y6zqDl7yG+JElBN1Fx5SYrBm Vx+eFPzlLy/PacGuWgrL5nPTF4ikpE0nzK31BjJLFFQcbZlIWXY2ek7usF7GB5FsXTsudTypnxJS keOL8rIYWUjPBEdvaqigncstJ3R0PY7WDLJFVuWjr33uW5LZGllIR6ANKyN76tQ290yzkLoGUYcd euhf/MVf/NM//cMrX/kK/CUkLU05AOXI/6xnPeu444+F+6pVq21eQXBBZHlWO9Vst912EAGCc5Er 6L3zzot5SrNkyVJg99w5c/fcc09MxL421Fd4+EFBTDQxiunsjFPWpyFKsmQsHCFjhOaqYqbxRKz5 62Yk9o7ObjnXoaITA9OYZZYhppu4uKGQAI4okXJOJYO48YkesUaSypKIUUTMSsAoTDSg6Zh4vBtT LOZOUi0Vk6ayajpaVox9s+Rxxfiz7Pj1nhkbMJcCJDoUK3f4rpS8rEhdgCBTg0Axze3VKUvdyhW3 NkvJEVgg7FvC37ispY2olZJP6CxASYMArl5+a91p1exlRuxtvGNGfoe1pVvLqHNCxVvRONIFT5WS E2O4mIMnG+wrwp6JlOQdTe9706ysWU9K5RQeicWEbvXbCyksU8VK3Ky1JYByHehLMDDNz2S/kbrz UbFdebi9jXeVns14vTKwYU26MdvdgNrbZISEQQBSyYcxt8JeLCY0srJ+QrdOFZ1KI7cRYFIVHzPl KSvw110p/Tc/42yZehf3oGImnWNHqJ+xl4p2cXnPIEYiUQHNbUsGDvWg/BUAlSTqs6PY8LWlxEsV PWfgitL3gbuHL/r4jjdcPnf18gEADdfGqvRtv2P/GX848vxXjizYjunP8YcAsoZNFCGvkJPuyhpp qpW72mxbt7SyIgrmzBcdEZfi/NQEKkfkkvxt2WSEuABaWtsRtoxoRkNRUq63mvEu59Za9hcXF46A WNjU/k0RHIWRrRQSDkXjaUno2FMB+V0nsUD8qQKyuco7hh2lkTIlLYNP7FlDbUNkBycn+t77C1/0 wpef9nK+2/WG3/s95hTXr9u47ERz2C972Us//vGP0brx9j+1hMWttRwNfea2+U7pm9/y5r/920/8 t9/9HTYceOSRR3bZeZf/8T/+xyc/+ck3/P7vLly4YPvttz/7bWf/3Sf/9vff+PuLd9557brOl4Bs bakcwz5Fi0dfeg4jD8ZgsHmNhk1cpGxYo3bHsJ0omhFnx7rR3RLYgRQViaGoMr7iE3NJtxxmKTD0 U1zcjDhIUvAroXQ3qmaT6pYMoiO6NZ7Hu1HZ6B1dT3QikZhlya0NFeULJ4sqChknjv5ZEqd7Bg/x fDzRsVuTAPFTGja17KNVs9qOrVJlFj+AIHmxMlUsbSV0UokYFFfRI5REi66NXGerxMKhkpzFd/7q bBX1ksp333136YJmyWUKrFrK01BR77CylXVLt5ailnImt3rVxISBzUd5GAAQOfFdXtuzMuDrMmKq vOyPR0a3On3aJ69KJiPjLEZiWpDDLLgcF5ugOpXl6wSylVZkaMuANHHWmZBuwOLJVpwqIyc1J8x6 B9LjLsCkJN/4tN3B5P7DJylQYp/nFs1qu1lP3SdE3CHFqCo7HvfQ6sOiQdX5ecI4SijiFBBasj8s oe66X3QnKsSwemX/N/7f9t/8zLYP3zs4Mo79OhB8zvy+E0/bcMZ/X7vngSPDczba1iqYb2Sqc3fq OhFo84cquSL0BvDyACNVFBHhCWEjzcKiheCj1DEacPXKdk2kYmHro1Yg1ZJl4uBB9Pnr65JNupia fcq8LbCcrTlSgSinqWk5tWSIYFEqG5dHW5mOZLCv1QRLtmhArV0RfdmBv1rDLTEkJz9jnERrO4Ri mjkmOUG8++6/76GHHsLR+KdDmfcIHo1kfD1v3vyTTj5p++13mD9/wW//9m/z6ro0ktHMmnOQ91FH HvGHf/iHxx//rDf+/htPPfUUZriPPubo173+dc94xhFnnnHmb/7Gbzz5yU9+8Ytf9PSnPePVr37V S1/2UtxIGfkoZUFMOhnBgyt730opxRwSjhmbLt6KYSMuZaTFLsTixdT2cCg2L1ZBwjj8xELejDHs nFKBsic2EW4pjyy8vCxNFUhmGvmanUnZFOWJClujlF/8jBaIuqRUShaOWRnjMJ6X/VCMilgSFKhn 05Y23vWuwLH6K17xCsrEnddKMSyAoDDzqQoetyeqolUrcTlKDBWewoMhWH5ALqSKiaO+rQ2dCDfl x9J9gilJ5a6N3IWzpK/f1at0lm1V+WJfdFYp+eGHH56smsxVcmSWlAlXIJdHBZWh1SxqXTQqC+xu /0wZkcJDilfu9d61sxJHtRKVqVe69ZnPfCYXtYbHoqb0STmoYYPD2+1nnaGcLC6gaXXSsE7lMoMo jysB0KpbNjt1KrP0XOmmAVKzd5rDoznrG5qL2M60b+i6yMEJM6KyvZoqyTfO38RuI4FmOyD2Uu60 dFEdlTJKXRrnsesq9YzASEQErFVSRjc8ilwMr93BU9LdcMwli2SCwnaS00Ka6U1XzfviP253641D a1ZRoBN7/KN/P/Apo69886rDjlw/f+FjHjdLcROMDYpZiIsQNqhIC3llJWFxzsFeMeCSHbyRHHS8 5jjlYUp4p02ELFFOGcRMIwSJk/oqEJGZEY/iUmaUI3RuV6LdokU7nHTyCb/1mlcfd/xx4G8Pirz8 Ro4zQrKENmx0loARAsV5cSenTBrjUBLKFDqhjMpLKemin9LFAePQ0onulo2R9JUlOXgUw9//+sp/ /fMF/3zpZZd++lPn/uQnP9FrBhKPE9aEfP9737/zzjtA59ded92ypUvKdlC8Otf7+letXMX5nDlz Dz7kYNYpQWTd2g5S33bbbQ886ECoPvzQQ0TF7OHZ2267zayh8acoclmMcClijzv7FDmxpHSxUi5g CsggB8kg/uucEjUfsbBkcN0Yxg4hx5vdITvHOCxTWBZO4WrVojwia2tIbLFQqppXjC6LqhOV8RHt kLLP5aMWkidqGk0RpdV5ZGonlsW6qKg+su6TcrpOFx4FUL9ebvZcKY/ms1nVGsPPJb2nYVmX8QAz cIjHhhgTqiw5tYx4QltJJJB6YjphxTYGbyOAbF4uIZAAKJ5sxSCHHSEqMaiAV5JcH5lvHhpFXeDI 632YpfJ745Vad2ErbU0NtRg59mwZHhr11b0v24UAMZV83tKnzhGEj6K2SR8vaK5MgVKA+D6lRona 76VUGe+zqwnoP37EByNTOBk5Nl+VKuvFSkT1nuuKKxVuKbkpSx7EnmzFrt06VbnctQCTqjgOc1NP aR3sLfeppq6Ox46JJeWw2LnahWbkujrx6oVIkFpGde6wfSKORgMqHJWP/bTIVhJJ0t5/x6z/9zcL rvnO0NKHBUcELPp22XPkZb+z5pgXrhvb8PsxW9RJKZmoMs50S1BbCwkoRqfOieY7EU9okuueijNB 4zauGHRSmOtAvWgBtya+aDyRUijmoQrbgOIr8czOxkwwJTrUunccumEE2Y486shjj3vm/gfud9JJ Jx56aGfULmWN6iIOFgrXRKyjyy7ju6MHHHjgb/3Wq1/xitP32nNPLbyxvhLYONuBoYuytv56NtcX LZIhuI3jGI4VY9SJSPQ+a0IeuP9Bnhv+4R/84X/8x38w1pJG4gIKBz1f+NmLPvbxj7Ni5M/+9M/u vOsulmjbJn6UAWXGKkDzL335C/fcc8/NN9/M5wgZ0gLlL7nka1yhafv2t7999dXXfOnLX/nxj6+9 5OuXXHbpZes3rKdWtINks4Rlnkbcz10XdsrIBaIpLWTDmG66VYZijBYb07HkmIwp4OcSoqmc8rmW 2nsglDjGqI4tiZsvMbJq1j2axedi6kP6KpBsz3hijk4Ks3Pk24Yxeq1d4pi4N9zdlIrqaOl0S2AH nNXnMLTbt7jQr9PZg+om3LBM5bUhCR/7KHe0gDjLW+tAvD/d10bx+K2ZaP/Kuvr0Jq+RCaFGF2ME FjmwvLgNU5ehVkTGEwogm5cf76Qi5mWkkVbGC0Oz+jlJBV/eVAMu4xHfwm78RIuGLWUSHZjiHdaZ tNd6Qh0TKWIJvYD4uJtV+9HmlUyxACblVsOHk9pLm7zcXBHvl1sfIo++aBOFh45cySqRhvSp2427 FENfa48qw1FfmyLCS5vLZREr81MvsMbvK7VxFqz1pcxJ2arOkvqwJSlWfuUHQzGSr0uxNqK28XvX dKanYn41x2gvdrQRaiQAJxMYuvk89mTWxCjQxdxxJjSWsIKKuXD8aR9ISM9RCSpJDFcUlFQxKaJ+ VNyNV9asGrrwk7Mv/lT/Hb/s27B+4yKK+QtHnnPKupe8bv1uB4wMzspfj4eaxfbSi9QHJ2mFYDQB rOoGXkIYsS8XKWlkZQVVI+BwGRlZGMUgSQKYHSfGE5ZNxtF1GceSWMHIUQXyg47+DncWIvMZRhY6 j720Or5LN+UlczSOhaSWZo458Tp4cPYOi3Z4xStOe9FLXnjSC04+/ZWn77DDDuzmITE0bBNZAyNj YkWC/Ksjbsht7WxYBYOsIak4sUMdYDHYbHNJMnfeXDjyiENfw3F2iNS8+fPWrF1z3rnn/Z//83+u v/563rgVCHMoiho/wdAs7P7Qh/76T/7kPX/2Z396ydc6XxO8665f/d//+5d/+qd/QhN52WXfXLFi +b/887+85S1nn/O+91977XXe99COtgdjbspfniFWmZhi0SzxoYRki6jRseGQiBFosm4obNJIRAEp MWKQO1Ssjr3jwo7b2D6IjqXVLUUCJ8gQq9v1KsNfhZPDwHSo6MR02MecsjAxeaPw4l6mZCURU0sn tmFdgYaK5S06SH3ZG2Ck19o4wGEAOFAd5/7ity6qK8VE9J3pELbW9wu9lAL8xysN0AcfnHLKKfqS Nr0vdQUOQA+VIJ4n9VT0EvDYXEQtwENQgDW7kYCk/QFFfUMRjhQGw0lUV5RSoA2KSWxEQv1vfOMb iCrn1nEsbciucBdccAEGLG9V0sEmdTaHlHa3iBUxHUgaTbGYQTlY9vzzz8dKSCuQjfqgc6lZwvSG aJF3wEPtVY7Uko54zQdqcrBom1hCL+Rk95JKd6MXu5tz4AW8o5ihVpsB3qSc1SC5bsGRiIK1oL8C A1Nz7m9VmqPTBwM2p4+IuyLrDL2RPG9b4i/GV/hUC76jkGKKcxHJ3qcuY1r+Ut7b/xEh0CH1AL6c x1zgXMMJLMzHREvgSxaw1ijOnaeAmayR6aGUYrDTyFCW1EAivvtRF5mT5TjldLoWYMKK/QcddFAU 98EHH9RP9YvOQ0McLsZeTQUq77q6yseS6n7ERcjJ3bCBgvs/Q7SIjUwtAj5LYrENmJLYkFIPqulk DnpZkeLvo8tC1ux5wOjLzurb++CR2Z2FEus3jLLOoZ+H/7/82cD3vzDr7l8Mrlo2vkIm6hg1FfE4 jS0tBCsFQCWkbah9MzSnSwHOBa+ZPR1bOtyBaJo6BdVp7zkOf0meCVTAHHsXCjBRPi5QkXPtQTki Wkmess3tFweJgZeKJZsLr2iEg8D77bffS17yot123+2H1/zw61+/lOYAyVVRLCJ9W4ATvaooYSgD Kbbv+KP//gfzFy5Yt3YdrvjQX37oxz/+yaJFi9xHWpjYuiGJsJTCiVuYxUjd4xyu66J9p8l+R6ms 5OCMNlRdc5dGBrW6bpgraWUfRZ3K2w6uqMihmL5RSgF8inMpwH6CRIKuEAOrVxMYq9DLe+bIdAok KRVj0nrpljNd59KFE1nAqkkY0bGCohxV1l37zvrKubqbrOpgc4wZnvpECRtjzzqm1HNomZFKRsPK fTaL+Fo8TrwXpERVySi/mcZgtpFtJddysWg66xu9s/POOyfBXCzJWf6kIj0xEAE0QF9eVgQD0SsD nfX4OwqgTjpVoeNkMs+Prakr/NHm0IYhLsmMXSV9IA49cVJZhUFp4GZkiKJCEBlQEyCij1BKqTYi USa+rgeRyr2ltfFCJGgBmIystC2QSMtdEDhilyR5S5uDVMDZSQBQC7YqV8jgHXyElUBODBuohd3A VRIjcgSfYSgCI76EKlNT/cQTT4wYVxU1eiFg0idIK43DxTrcpjXHiMpRImkcWnoQUnhBk/0ODxA8 P/VZRx91Roam9ugoc0FR5FxwKklfvAlHAixNY2s8kKyqn6rYnD6uWJlrsh4T6hyliQDcvGpc7hGE dvDlrX2xJhc0WmhzaO24vex0S3VLQ1mRZgtTDBYf//jHy4ddyEkwb0pD5zZ2Qk2bc7CBzmatmJE3 a0/djxqWGXC4j0x9jJF07F9lkVhS1d19SjFdNPLQXTpLLcMwNNc5f92pi3LsUKnLXa6rk3bnGmew Yqdo4haAKtQF1nBoBfainftOfuXIk47esM3260c6yLtv1dq+R5b13Xt3/8+unPWLq4aWPTTIF3g4 jF8jklZsGdLJJgKCnuOUHYwOtZ2cIKMMyNwnGAsE9vDDD3MdjAV+5SJ/BXAFvgUNtXEhh18cjNPn tr8EkwVkxugpO1QOsiXlnQiMrLhBG2LLjJKKyentttv+wQcf4B0pr7uwu0WKwrKGwKKcaMH8ky1B XvJrL2aM8a1vfuvf//0z+Agk6lbAGeggdGzYtoofKysuklbgWJFDMeFO554D0jGsEzMVL+nu6zad JYng1VBSVnW+xLiVDBLYxKOzou/kTc3sUt47ToqyMbSCTSIpZpynKqPD8awAdq65udSJTeSwt93s Qae5rriiLK+LtpvDUmbUXwksaX3FvtAVW0kCi2yM8BQhMeB9rrxLvGSNUk67NSnlAIj2sTWkYBTS 3KEzWeQtpWxYZpQBlwxxSwxEGTpCppqAj+7ao0foIOlKvZ0wxdJKbiFvgHJ6uh0FQBcEYKIrIW/K wBp46m5Yi1gEGhxUUocyHBSo3FBPWqAgWlBRyLsSXTk4oYlIVDTaMEdEMhzHbsI9sWIMGxixE3+5 /gGIxiN+WIBf4xqPOjpWGTURwPN/tnldReSP4BtpzQ4ZUIQlv+UiE1EDsGqT7wjsbOrKFysJBgrw pdKGL7lEUQ2gY1xNuKu0HGo6MXojHVQQ/USwzlYoC2X8VTke4BavyiRrCBODvBk0kkr41J9zj4C4 kiO2Qjwv+ynTx2kim8e4ojBaxw7Fd+MJMmu7QB2kTxrmCXlX5kJsKJwLuigv88go7mFvLjHdklTa eaYyI6J2RGxMMUZTCraU9Yn4hLlTaaLyYtd0NmvFCuStDl6bEKuH6PTDj30r0V6MfUYsGe3uMuop 9TNhFCFROUPs3AErXmNvLeKp99IV9ZGCTWKhTlS6WGx10iovjhYSvAKWBeYKeVNl9ty+o07oP/5F a3fea0Nf/+jqNX0PL+tbvqpv/dq+u38+dP23hu+9bXDdmo2QwqIaoYqdbSggKHkkpKGh+mOrwE+a DxoITRWzupco167eTHBS13Oilp9bNBnUkj2jahJMvGQiycBfj3MkgC0jbAEp8XJ1X5eFZVhVNPKW 1vqajD4hROEIN0Utskt7vAhzizjuoPBhhx06NDj0k+uvB3bPnTtHgNmKxGh00Kq6481G4KKF0aMD q6ATSloAIz/zElkr7pAzNJTx+SupTEE/Y5CIiOByNGaCgM4L22R0jMzY51c3vmbgFzqFvMVIlEVB LEzEWsT0VJlYXmFpRqrVQCTZ30aQMK4LTbtGssloURhdSQZXGQWwpU1SWf4oTJJZTLmoMljMzYjd F40WWwwFcPRm8qy97GBITYGVEin+Ll682DGQtNbP0hq+vpkqWgwh73JKOAngYumh+WaSXHNyaR60 tJUAumYNY6s1VUZm8pin+SDvSHAzqVwp8+MVHl3rmLToms4UVjTybv6E5xRybJm8LW2lx0GVuRDD I+ZCSwGmX+WuOba01eZoBNrnYF7nrW5M3aG7tAhWUtOvzk99lf6qgA93aeqTfD2K6B40FvBiCfVt HGZky/pKJXdzlC5R8kRTtzTtauyo6vxdt2bgB5cOfemCub/48fCaVZ3+EaDOzVmzR/d9yvrjTlm9 /9PWzVu48Zm+u3b1spbWAIjeXe9ZioW0tuXVtUskTpjb1nwA4nEew5G7RlfmIguX5pWJpKPNZcvb wr7iMkbhyU3RhgJPNqAEkDElP+MBaWoBopyOHDld1bUURzKrIsp+97vf+9a3v935fMzcuRhJFaP3 Rd++04kdYQllc/PyeVRKDw1EP4ZxtJ61iOhN5eVEh2gcq/iune7glO7RC9E19uw42b7+gbH8U3mb UXwrfS2BI31zjAnilDGYswUc0mU6O+pstyiYbRtdbxekiPVPieeMkJo67GtrJGqVOqp8vBvFEEEY WfEUWtFoybBOYcujujH3pY61cINjh9oLHiw5o1ueTG3FUvgJxZhaASZkR4H4BKlNeZeZWlFlKzB9 y81eLPkMMvJUiTpVdNq4u2svqzF/3EXtQgBV6aJi17Z6glSccSpn5O2OJ3YVOjd8if2HuhD3H/op rGMKEbXEc0MKOioTj9Qc/b4YAVMMsjhtps5eCxvsDwq4jxeR2LPGnlLym6NUY+XLLTcMf/Hcedd9 d+jh+8dUHuhn8UnfQN+uB4wcd8raJz9r/Q47gw7z4lGrIElQk8USdMuASO/iLHN53i5qTRWt2eDE 67yll+B72fdwi/LeMkUe4S98+VyiJvKNP9zEGLf5lryjlS3cpZYRXoQvKsYVWbiEXL6ilSSOJVhr jUfCKLa/7GA0yQmz5izs5gmAF5nIj4Z0UQt7X2X00+eKc/2UESy/OPqntTM2MtPkXAebrts1MTuc IClTrLXfQ5XMxovRsNHOUWUHebKD/JUUTJmoMjK4Mai5I0mElSJVimFnOeocKvGWY8aWUTGlQF1J O9GOUxWpFkk5UGNJB4CbHdeK5kqJoMJ2hFSOvnABh7HCww6V2EnT+FN3XV1y+jD9hhM1IFNbcRMF aCO2BN50ycXL2dfMeko4JuPwkzUGbBHoF92m2VnTr3LXHDcxrja3l63XzM3B2A60ScPNkRFdh0fX FZ/gcVUaOa828WIjowp1DOqnfZ5OZC/1H5zEh7+qqB7dxeKJOipgijGHssvUVEBdrCryU+LFMu62 JQB9pLCdyog7V3wikXSXwkKBoswbbMBcDm2zzUXNxXJr9ty1x5w897hf32H56D2sowAYzx7uY9fl 9av7b7t+6NpvD9318/41Y58DF+U4XBG85tPixx9//EMPP3zppZ03DpkM1uSuEkZwzUtBOAH4MmfM X9ZJs9TEhlJFyRnHOcg5tsx7wWx2FRn7KD0Egd2wYJ4YjfW5ctmHWyogq0oMreuQ1+I7oG71HAmG C3aEHS3vGF6Llx1hJ8LIO6w7qOIgxJZxzDgUdUUxLUkcKnauw1h+F2zSigKxk75mHXWXcSS5ajlC bB9x1ygIIooTjzG000iMgcSRKhSOiNlBLsmlmuNWcipKTVZGsBP1Pi4/0UUyx0xRFijAxCtmq4Qx X1nVxFXSiaZiktDZLTFiYCQWjqJ4YkYxkExECqoRUOiKpuNQBRQP1stXbFIbSgKLvnNHFUU2subc +Si+smdMOoWWDBUj1hb2xaipBY4y81HSpEuU3yVV167xz2iETalo7eyRZN7NLUBpnCcsR2zFMlkt Pd8Um88glbsW9QkeVywZ4mCVVFxt8nilwBPcVo6BXnvVRdYP0tDH1hwYV7bdsYczZFEXUnYzouYq 8dy33E+7pzTsg6Z61tSDCjOph9NdVdFPdcyRvhGAKVsk30pCuu/0dLJRhXr9znR13+wnH/L8Qw44 fu2GZbPmbli3YSWfm+/n6uy+xbuNLNp5lA8Irljav74zr73xKbkkBJyxk8zb3/72M888g+WA9957 L+9VWHL16Porw/oWEB/YrQXTUhNIzZtYu+66KxiLV5Q0QpC07AHyzGces88+e69ctXLN6s6eGIi9 cOE2z3/+yS/99ZcedfRRaHfPPXfDxwa0Kw1Hop0lvLFI9J2c61o2NSdyojTy3LyAoP8ahaii4aCM YAgoIoKz9nj0HYw8I+vIkQBRbPlXUqmYJNGQz0CWKsypC2qLnfFNaoKtptGYyBqPxvIqLHlUQFrr ROBbiNl+L1s0lXSEWDtRlrQ+FyNniizmw5a012Qu200EJYyMYF/rljnGQBIFBYkqmq9/xiuOLt2N qW3uEsyetVV9Uia7qpimJfd1ERRHnUdqDmlfl/oqaQdF25pI1MLayWWyjEnFKibOGxHRTQ7XaAGH WSo5tRVNzea1C6ZHgOlXuWuOvLP4wAMPPI7O6lry6a/4RI4rHlxw8AZn2svl8UqBJ7Kt6hqfnq2c U3FaJ5lrkK0nYmesfet0yILqhHyk/k/XY1/izil1kKnzq+xK3VGprlm7/4uSxI4wUvND5FjAYhtF GRPESV/uCuF5wYYrYkSGJbz/9MpX/sbOiw7qW714x0U7/eq+nw/NXjM4APLrG57Vt/2OozvtMTI0 3Ldyef/qFXSx42aErNDna17zW+zQtHrt6s4OBiMjl156GXg6QkyDqtjBq7pRI+V5GZm3KHYaOwDl 7EhDeegDu8848wy+NXP8s44bnjV88823MK0Ojjz99Je/8U1v4uO3T3/60/fae6/rr7/h7rvvFtST bc1OZveQI2aRvawTWcY4I4I/0ZQuMqbRtkc1umt3CKAbl3Odc3mBcwYPfvkSyuYlF/PT+1hHgVMo qpb8rtU+HeFHN85iWkEsBsFyxY6DwVpLTYvqEYKiiMM0HW+ySRxoxZxyqMfUi3AtAeWYZdySTw0o zT1lULzufHHiR/Ctkvpr1rFNiIjZFFzSiSx1IipNDYtlltdiC8BPj8aj+mWz4GCWtKaZzm00GzkG M8o2GDk6yM1RpQejIilyJJ5i1XbQzxJ526pm7ayJt5rPJWoXFRPZrulsDRV7tmofkE9MW4G5mfBu 3oxl+iP5iWmrNr7u2arOShv3Mou9Juexby5/GnglZFbJRtCEDsavrIlg7Dh1rg7Ss4DiEnvx1FtH TGDWCXsZMbibjH08Fz0uMbzQSdTFs5iMTO68467hWXN22f6wu3+8yw++MnrPzf2jI31805waTH7v uOvoM05cd8yL1+1+4IbhR2evJBLHcnZiXrNq7pw5AO6f//znesLgu+Lin9zyz4jbgFbMdrN7CcCU R5yMnWQHyhx++OHHHXfs8OxZO+6449HHHM0DDT7FwkfFjz322F132XWkr0N8/wP233HRjqLsw/OU uiJH2JLibtiUAId8ZKtKI2F3zoUytXmIYLdYeHjDCXZg/KCF7PwFZ2tjR22srhMBWVUXO3tW5wKd VkTcUxh71pmCT3nKk3/913/tOc95NqMgIGu0vIZJEd/H+IygUJpKMMnMgXM5mAZjF0gGRTyUoEB0 NLWwhh5lSEHra0QujrKtI1NRFAPYpog4z8hSd20rV4yuNPGUaBLYkNdOl4VTDOhKSmoZR4oY37tu FExcTCR61ipoRGG+1re8GEnZjFIzPhAwFztXVzwcTaaTI6L9E2ubPbY5Nn45eJA8NrvYVTahqZWI TURd+dQexsZkwiqVBWIzNT0CzCCOyWIzSPLpF7Vnq+4S8HFpBKY/PLrmOLPianzO232MV5uknjX2 6+qo3Mum7taY1VVUXh1nAnNl96ky6o2E3tyfybLxp88F5iLYioUjznBn6QKx3xUdwURNeaqu6WMf VomwEPynN/30Py/+6k+uuXvV0qE5c/u222F0eLgDvumah2b17bDL6HaLRjas71v60OjaNZ3a4vvA gw90Xq9ct/573/3ueeedf99993mRN1wEUqN5fS4BJAm9NWARbE1d5LzllluA1+rX999/P0A2n3uc PTz7Fz//xeWXX86tefPmssrlgAMOmD17Dijve9/7/pe+9EXgIFWihe24GMF2hCWJKEpVjBgiBbnG k8Hey8WFDf2FXGVwT3sL+8YpcElFdSNsiWRpFZM2lJ4kOEL4KdQ1MjqC7k968uF8KOHZz3n2YYcf CsX777uPNfQxNmJE2SkKzhhpnCOnRgj85ZAi2mR9u+2246FE5xtMG0b0MUt5MI4oVN6uj48OHPx6 y1YquP11VDunoi+4qIGcyttQlj+ZzmYUWdtNJxFiGimaggvEVDLfSnhq1aJschkVxz316FsZom99 LaEupuyWEZL88ae1c13JYL1SdQeeWwwJqeoygv9ar2jDaBZLEp3lwtzV28PlUbKrLDaFFROp6Rdg BnHs2aplNE5hfM6g8Oha1F5cbalxNchmEXHeBcRghBf7MOMY93Opv0m9tX4aEwiuGRXFjsodm+5C 3x2wqluM6IMIqgwmEmiI/RnnrqJeNt5118tF4RVPr4qpcIx6TT7zyWe6+YAiJ3wTfemDA/ff0el9 F243Om9hZ2/lzm53g/3bLx7ZafeRwaG+5UtYedLhhl7Lli675poffu973/uv//qv+++/zx+7EQv/ tWzu2iNg4lxrVABwN998M5vSIxXAjlrMszKbu/122wG7//M/v3DLLbfy8JrC7JDPZ8bvvvue73zn O//6r//KdQ+EzMImUjMhfT1JHN0k90W8YixikKQrQqWG1NbRs/tcMe40WBScVRljRyF1ffhdQWI/ OkJSgLm9k6iqAmWQ94te/KIXv/gls4Zn7bTz4oULFt78y1vu/tXdfOLeU7NiZ9zpMNDUu+VXnAgZ O2a4i9ZPfvKTX/e6s/j0z9w5c7E8mSXcrMJ6NTaqqZc7AV64Um+dSn7Nl7OjC7EFuteMrCdQYxir imGrIzbmphSJCeiMdlLE8k7hmPgmIjq2cwnBRSrV5WdsGaIKUi3CWVOI8aa2xS1MFFjx7MM/JWQp jwIjmgXKbu6SpuIYUyayjnyj1rHBSdaO8kjrEnlLwshUJSc8NqViJL4pdKZf8unn2LNV+4Ds2apn q7qGa1PamRkXV4MsXI6hAEqrjIzYF6rPiz1iUlt3IxrzFQMaV4k9ojtyyyBnpC4tdYfQdLekkubu c/WX6vLdAXNXdaWLxwaCUEJF6msjahf04Xh034++5Uv7HvhV/9pVA3Pn983fdnRs6rtDcP7C0UW7 ji7cvm/Nqv6VS1lSDCoaApMxvcpfZqBFXNTMy4aVLi4QMRCgDdzPlDmv9VDRqyzAlGDua6+99nvf u5y5cKqD4ShAyeuu+zHL15jw5gtnkpwjdee+aGwkwSJckJxc0XUZzQjSIEwu0EoSzQQLs3Iue0bQ qSsG2eVdIV2pI2W1g4cDQxLaU44Qh5mjEUS9etXqnXfZ+alPfQqYG6CDoa684koeZYia55UN2ozD FBgcWv2iEZpn6wWRqUUB5Hz1b73qlb/xyl132WXxLjvff//9t912myQU8lYtWdIRqG8k+Y1PyhOG /D3uuONOOOF5C7ddiNPJUHkn6h4dJ5UdLQonl9dPlRFrUXOYxZATWVcp6fiuaVqqdMWOiNQsmwNM BpG0DkIHVUwBE3QYm3U0jlhELezWKKGqOPVS/DhNKBYjPJoxWVU/VdFGjrpHY/qcAhpCWwClmInH W9GV0bzWYlMqKhkl/KbQmX7Jp59jz1YpqVM0xkDq2apnq4bw6Dp5Z1xcDbJoIRpCb1i6M3PX6A7M XVRpPvU0hjjGE+7aU/efAIQ7yEjZE3ixf43dktm5302dk3+6d489ljtI9y6CgMJGqiuxPclqvLJR ztG+tasHH753aNnDQ3Pm9c3fZpSp7s6yb5Di7NGd9+zbZbe+0Q2Dyx7u37C+s9hd8FGUJb+wZsIx NoiKGRsJdwoFyixRZZAZOJv1MMJwhoNc521LfoI1PS2kusITnBh0irVls3EiatG5yvDVTB6eQFmA UjbkryZ3PcvLFcoIrVIrzh+Pz28/usGLf3p22UAfYWRAmUsyezWLw0B3DZUM2jgBzmKidWvXMkD6 yY9//LnPfY5NZtatX9dZqP8oEqW6fCTE7z0cNYrQjpNelSRFHCdqBY555jFHHHkEOzlysDbphutv wDTyuVerewpfAwkdiCBMz1+2tFm8eKff+/037Lf/Pqzah8Ivf/FLg7+I9qS4g8EB4zKOH5eM8eaW SxVjCygLewbdXFLsOSvtAhnfpKKEjm0no5m6DUkZHaX1LTcyJm4LRNTrdizKEAM4KWXJTc0Ce4Lc uRAbBLtG6kQ1U0MkFnGCXwoaeddB3tg82ibx4pRUdLrFSCjb/M0nQMnLARYbcF2cEpW75tizVeyA mr3Ts1XPVqlJmZLknXlxVSLv1MOpI4wTnwI07lTcwcSeWD0Q/Up8kuu+Sm1l2Wum7srdmGQQo4hB HcRCFanPVhPgDlhiR3wgCY07Rd9Ts0KH4mjJ1VNKBpnFfTnIbcmDQw/fM7x+7ei8bTbMXdh57ZIF DCwc2G3P/r32G5q/cHDJw/2rVw6Mdr7Bs3HqMWkkmaMpYgHdleTgNqljeTgHuunb8pxwXerourbs 0JyxBJAu0VA2kQt4xldcbAHnD694soicbVWAhgBTXivUFuNC2H5jEqn22msvSvJWKGMA76ITJ7+F X/UXCnG1t4XUwEPCW0fQrWb3+bZ8QkvyncKDv4gEcV5t/MlPrr/66qsvu/SyG2+8CZQ7a2h8gYed Ti2t+oALQwvk16ufjGGEvDXM8NjAiQMjCvD8Ybttt+VF2KuuvuorX/6ve+69x56y8Npw3VP4xrjy Gge8sOrLTz914TYLB4dmYZQf/fDaDSOdXd5jukk7p6ScGFMmNvdOvZgLOrevFYERF5pFSlJVNPfY Gjj7XMZOjPFvsR3MtqQEcKBKcqdDZGrKFk9SxfbHjJyz0Uq+qzgRnWgifloeyx+94EiLtRyNvhtN ZBV8Is9qbGyvNZ9EOaeqYoqu6RdgBnHs2So5qyEge7bq2arXXnU6pmbk7d4rdVruPNQ9uItVn6He jltasep+KHX/6uljV6Ge1USEwDy7qR439ltlD6cCJhILxOru53zRmhrzCaK5k5acEXlHdR7VYmD1 8qH77+pbsWx04XZMfncg9uBA/+xZ/dsvGtx1r4HtdwSds/K7o7rjr7KPN/iIGEX28WGkkoCCTeqp U5laWnsDvlg9gRsRtDtiY+GSnFAGanvvvTefcMNc+kQ8684B1npu4FcJceWBBx7IB5bBkSxwArCy raHnWaGvcw4BceFvncgj0ReWR4OKXXbZ5fAnHb7brrui4YoVK3mH0soapSGtnhJo3TkFmE5mqf2q lZ0V8z6gpqnusd3TOwCXD2dyRUbTQEJ7rchEtqH9pYv8fOiBh372s5/98Ic//NZl37z99tsVPDHe NGxgDACAd6ZIa02Kyyws0GdVzO577P7ww4/88Jof/uIXv9C8eEoEC+CIld1iCshlKilJootNIaFV qeNwjQRTAsYmNZ2XDYgyTmNXqcNfae0GxKwtkkra8ilN/NPtkgo7eCyVcS23PMAwu+hNzuU4Z6IN KJltBJ9E7ySaKqMC0tR+FAu9iZus7YBvOLEZ2xSOZSorPu4CtNFialXummPPVpWm68VVm4hKjUZK zPYUGui0IfIESaWuRZ1xOZiRt9+wdE+pvlnPweMUrzsnlVQxIR716DoXbjaKij2ieiD3qeodjRoF 2TXXXtntqa56VgMId4S64s5SvNztuW+LXXgkKNQYe02DOUkVn85zBWmZZh57Uty/YtmGh+7pX/7I wPDsvvnbjc4a7iBvwNLcuf2L9+jbbqcN69b2PXz/wPp1E7xV6WByBy8kbSu5gOGU1JSmBp1GM8aX CTLafdYXCvK189n4wCZ91O/9bN+x6NFtCu+55x6WTTPdiwGFUHVCYd44BCLzk8EeAvzyl7/k3Gtv HEUWWxa26xUJFDMK15Qws9FHHnkkXw5i80SOhx95GO56C9PQk1l5puQpySIckO6jK0PGcM8YgpWy cjEHXyBijnmHHRYRBEwwGxZru0BNeJdNlU007q/+vpUrVrCmH9zOYAMrMf+taJeO2n1k991323nx zkuXLSPieCjBoh0+QKrZdOnLOvlbb73tzjvuvO7a61isTxW9hOcEtI/svkfpb0ScyhFV0V2njBs7 p3zMGp2rbsSv9pdoplyLbULKQXOJ5qKMLeMGJMpjIpJB8ph1kjw1MgqhmP6iFq871GWfOPaw7iny RdNekNhlvqTEiWGjc0srap5oSF6wmxpOrEVUp7uKscltQyEG4eMreUtpe7ZqaajozV5cTWi0XlxN aKLY46R2o2Xd0sgzrr2qRd4ygaCtugf1RgIEuuuexp2QCqtf9wNxLoLAgC9ACk1Sukwkor6QA9gB PAKzsSyCAp75lgzi7r/uQTnhrvF67IyjV4w5rIVkMHFvbKdBiHtWs6a8wZ+txGoHcBXYDjqdveXW jDxy3+CDdzN7Orj9otEFC/tmDTH33T84xJ4nG3bcY/3Q8MhD9w6sXb1xjwL1u7azUY5NjWBa9qA1 GH6Y4HlNB7Fllmru+yPx5Aiv3zA1owq1vAlaGTEwRTvmqc7BbDdTvIBvTXgLPmrQxV/swzbk2gyR ddVMA0OW4YqIExvyfpoYTlkqUn7NUcj76c94GkAZNoDvpUuX3X/fAyzygazE2GGH7fnqEN8e2mmn xVzhZUfhZhWQvoL1mktmnMCqmBe84OSnPv0pCxYsvP3224gErA0pMD0c9Xql88LWFk3k12Q2+Bh9 4bv3Pvvst99+PBZgL0hFiMyC3Z557DN/93d/99jjjkUtFnAzsc3+j7KJwk+DJQYMt99+x3333j/a N8rdlIDi6/ih1qNDi3HPx+ZM0kpIZ58SRFlga9jvMpEDwOHk1FNJcXFg+Er0YDRatJuiNMWq5FEx nbhA5KJbUQBLbo+owbF46WeU3/aRK6NZzD2KEZNO10vZomVStJi1VYgT8CYePdhwnmxeuqCubnPF qaIz/ZJPP8eercrWJrXhdT+n31kziGMvrrawuOrsKhidCuT1z9jBaFKQv4CG2FEJLam/cfesTk6g QUga4AIK2X///env9WGRWMscBYDmzJ59yKGH7rTTjqAcYU0uQsTDgMRI3N1juW9Tr2mgILF1qHeM XamuqHfn0GSt5/hd18BUOuo6QjLbqqXV/NWCBDizn8nSB2avWz28aMf+hduCHsCDHZFmz98A/t52 x9GlD/cvewQpxzdVsN0khkNNWJNJ0yOOOOIpT3kKCzYefPABuEiFWNKOkO4eIaiMdNd17TESTWTo ZujguwY3RkJC6sJGSAKcveOOO/g2EGtIhOklmMODE5agaM33TTfd9NOf/hTzMlxhLQd0MBpeFkYH sEpCO4sTP9zQLa2x1lIWDgyy7377gN2XL1/BZzu9Mzcl+TIPcHb/A/dTzBCHyEkEChwLQ0sLTZPL YqedftpTnvYU9kTfbffdVixfcc899yIhqTE2IOwcqhKtKvoSVbcYaiIY0+0MNnbdbVfWfKMud6mu D+ig/utf//qjjzlqcGhw//32u/WW2+BCmiC/xqgAbuSU7p2HKmxPyHOT8OarQ122ikgxhj3CxElc 3YqoLka1QkgF7HcoOHFiHum6ct/RG4NKhU0wso7Ws39d2GSjItYx5bLLSJJIpNJEKpDMIp86C/Qz UbPRfEtXbKhS2aim1Y/axcTkvETeKuDWoOGkLNZ1xcSlazpbQ8WerepickLvT1ggNlORy9ZQsRdX W3BcbZzzViiDCQQ+3H2qB3L3DwIQEFSny3UQBieCSpTUm2FCSJp0hBRP25nyBFTxbRH2nAZSu59T H6beZdEOi572jKc9/4UnP+nww5/1nGfPmT2HYlQEvmjpQoSAVBFTn/iuhVFXFzszd67ukg0Q1YPy c2w+chxgJd+rsIzjHhELgLz5SUVBK8Hizhz84DYjqxetXrLt/IX987dbzyT+2KztyMCskUW7bth1 bxj1P3wvRhu3gMhaErGDLKZja7nDDjsM7MXKCoiwJ7emvV0l9tCqKBd4qY9O8Aj27yxZ5nOaY5tI clAYkAcOZt9ooTQVFs0IxWTAiKUUNrxYCbb24nj7VHamPGYRQNcG5EBtjs4CkW22UWwgg7YQEV9t scd1bQ+idSlypWWmGIHx4IMPEZAA1l/8/JdsWsLEsOAvR2fANjAA8GVLPkAsM+K33Xb72nVr9JIr xZiXJ5z14ilXNFP/6y/9tf323w/MvdPinRgtLXl4CZPfFICL9+FW/JdqxiCEPiadz6eM5s4ZGBzg EcDaNZ09JUkBxIbpC1/0gv0P3P/hhx5mrTw7xDNs2HPPPYS22UCQMtaXi14BLMjIT8wCWJeyjgRD f5mxDA/Fhs2ok5hZEaZrMKy7GkhLa1OwhMkU/hmzT7ycU+LruBUj/Sxt68KxipWVN53UVspiSAXV TSwsj2Pb2W0xYgpELjFBokkV8xwylM0rXrZkqakZWaporvJivBJt2+Z6e8o22jQLUKfRhJJPf8Vk mekXYAZx7Nmqi+zu5eCEWT+D4uoxq03oJIS86RhAPGSyUbgexAsJcQ6K4i4nAkZgiLjJAxcBVVDT zDHFQN5UhxrXQR5ACnWBoq9+iFsUO+SwQ45/1nHLli4dmjW02667sWM1X+AW7ADYaS8IkbJsgiBQ AyxqLjZCRsobScTYhYj4UpjqgqRc8eoIL+eNtYRadEXnkh+ABQaSHbRdNwUQBkw50D/8yIP9D983 b8P6kYU7rGOdCZh23QY65r5tdhhZtNvIvAV997MdeGct9DjgcMcv+ojE2IMJ77EFD8uYQ4XLjTfc EJFEmclSTX8NwUGZnZXWi3Zk1TXzxCBvdgRXZy+voYjxBzS1ZChiBRmTixJMhU1fyDv1+kYkEkbr joSnhR0pIIvJIxyYTshb8+LalUXIm0OLW1SAv9Dk7cN7772P6FWgyrkSctny5StXdK6Dofl6KPPQ 88bmnvfae6/DDj2UZdbwHXtGMY7XV65cQcXDDz98wQIm0ZffeuvtwPQFC9nbZDZT7XwT1KtNjKio a9ToqOBESJ0q993HoANLdw4gtdbBIxUUWAmDNX7y45984YtfvOdXd2MNlOXRAZ+dV46IuKbkpT76 UgxFeGClvwpgD7EcpVyERUTSlllO5K+hHrV0RU8tVMsX7XSngwFouuLojX5PFyMSlZskiTJXvovn Tg3TNIaWYC6QfopRZGdJonltBNGR1i4Q6UtrFbAFEnfnSCqgn9Hm9o70VRS5WGVSR4+kApujYmKh 0KpjtDkEmEEce7ZqH5A9W/VstTmai5kSV52OXx2JOiRmLjkRiOSnNmPGQAJJanMFgrmlGUquCIvr m3zGVXpcLkS177778nYdNMEcvFoHQqKD8UJqgSfWwnJy2JMOe/npL3/gvvtZmDEwOvDVr36NN/Zg zTQh3yLhRHOinlulk2MZBvgDmnwMReCbvypgCbUy2L2yOz+EZxqeaVfoQF/rW7RznObmI2oxwoCy Qa2AEeiHd/iYMAZ2s6MF9tHohbGENujtLM+d9fBuBzx47IvXbLNow2qE4Ws7A4CzvpVL+2+7cfDS z8564O7B0bG9KNz9ixE27Gwt9/KX77P33mw7PXvO7K999ZJvf+tbYFJ12BHWSEiNT/T8IXb2IO/d dtv9hBOet/seu82bP/+uO+/6j3//DPoiOUYA32u3b8hqfxJO/NKtAYemh/VT9JEQz+JuT3vrrnRB Ep1zaGZdAxVtG6LrcpCWkchT0kLwGgpeOO4xnjCKoLxm0BnncO7ZepjqnQGq8BbjgQcesP0O2wPb lzzyCDB10Y47ovTIhhE+YHn5FVfec8/dmmyWRsc/6/hDDjl4+bLlFJg7by4XH3lkCfuKsKJGgRFD yNpJbBvcAwBsAG0JrFyT6dDuGU9/Ot/R/PGPf3zLzbdQkWjEMphRJZV9naUmY2uZ8A5EUAdNd999 d/xFRiAzUceTBMC6l3JJJFgYQfJTWFbuUAFBPc619FzJpZBWecVAqiUFdd2jXJ1w2BoOALFzGMQG 1/Qr64qLyouaiVsLJ4sKi5dr2R26aCLyheyTWJuORwKqK2UtTLriWraVCkcj2KplwFiYOuRtl1Vq Z48QGOwgZK1lscgORiz3IoZdhkDiIH74xhYnp5566tFHH81dylxyySXsdm/72Ho278knn0y7BNOy fLQ8FQ899NCTTjrpmGOO0XW+6nXRRRfB0ZJHmTmnMAfycE46REliSch2Nu686qpKlVEE1mweyt1k mRiErsv7J/CS0WgPTzvtNBTULqhY42tf+xrWqKwoRhYjOQutoYDZo5CQxVMye7IVP3ktBN0Zgce7 UoEcT6QkMFU4KK+Hismeis/yYl1cRXPFithB3FNFXmg588wzcYdYYMnzzjsPSRJHlELIqLXoVKpm q1ZKftRRR2FVGMWMEB3TTxXFHRPxUWepQAE5wnqlgIwCt8nBSmquWOlWcVTF0kFcSXGFkensuFia BfXlgrqMiLaCHeXrbKW7MSOU9RiExCQvJCrGJDe/8Y1vRMlxnGFJsqd+iinUxCW2SNHIai6si+Kh LpJNViyUEWeddVaKyZhQk8qIqOCmV6xA3prmpE+is4eZFk4AaABn+gwKsIPkB67x0y/GaQkv5QUF oMCJ1mzQqVMdlEBdITO8InxMMU8zswqcZ+677r4LoGfNqjX3P3A/kOjee+4FVUCBVCE3NOnOX+FR tY/MAQvdgjyYWtS8IFw0DFAPLY3sNi8tQCqAO8KzvhbgzvpjfW5dOgIlpYucHftdBRaHLoKwcbOA PjLQYgonYR+hJeTpvNs3snyfg0ef9evrdjuIRwHgntF1ApkjfXfdMvC9L826/vvjO1V3rj0KZbS2 Z5999uFVPAj+/Gc/u+rKq4Hg0lp6xfk5rgvdIgO3KICzNC5CjOOPP/5Zzz5+7bq1TK6yfcd55553 7bXXIT+DByFXDtRHdySXnamIDJptRVnSXu6TnbWuXebCR/KvhUdC2VAHcgpzc8BIAaBBgsG3zrkl X2uSWwu7Pa0rdK6BHwUIAzAr8kswLaeReMjGX56fPPkpT9pm24XMgJOUe+2952570Kn3Q3TJI0u+ +53vfve739vo7s6gqJ/Y4MnAfvvvO3vO8NIlS2+79Y7rr7/hjttZrLJW3rdGcpau6FyaGnmrIfBF R5Q8otAi7yiDythH6F9PXfxkSTP9GgqiL6+BEroLFnZGXw8/tIQEIYDxgoyv4HRsiAUVHSf81LkO DdIks7WwRo5GRZoKKJtUxupH/C37SJJ07lRSXSVpjBlJpeo60RWHeipgSXziugLQURcRkX3kFBlN +WLL2GiW31rrRIdNagmjnS2n70ojyxkVlFmsrL1jdlG7eNdc6JxAPOWteOWMM84A+PrK2Wef/Za3 vOWjH/0ofdI73/lOLZzzccUVV3CXvJayFoBi559/vns1l6erBoFFZE9zAYXXve51pVSf/vSn3//+ 93M9qkwWI4wxeqSM5JEyt5ABlesGG0yCUEazSxSj8ISWQV/KgC0++MEPJlNwHe0wUQl8dcViJFsh BgZH+MgdBfEUmnL4uipigUsvvRTu3PrIRz7iu1IBUlg4KUIt0A+oiPIclSE0qbiqM5e5Rx1PP/30 D3zgA6VtsRXjq3idSFCwWWvRYZADhXPPPfecc85xebpjua9ScmyOMK997Wtjekps2y3F1de//nVZ 9cMf/rAjGUfIqtFBqogjGGthVQmc3FopldyafNTsVumripXxmeLqggsuQE3exS8FeNe73gXWjKEo gpWSU5LyBLzCKVKDI4rTIJxyyikei1IAN1GlzAu3EmJXJkjSSw6CICqjCwK4RbKoDOnJQecvJ4qH hiPGFTMIZUyiCwHmmJxURkS+m15x45KP6CE9yhfqol/RTJj2hhM+EKRQfybYJLylngz0INDmKXOu C5kJYaiuuAh4wR03d/aku/nWT/3jpz/5yX8479Pnf/W/vkpLB4plNloLCTQqEBIVPjNSQTxd1yHs wqHJPMnpOSeuIwCsGU4gOYIhqjZr0/iBQ0BH5zK0/op+hALQ0TAD6A9ZrQGAsqaQQYFc13clV60Y /eX1g1++YPYPL5u1emXnUzsCFEOz+nbfb+SkV6498RXrhjvjnc4hIxsM3XzzzZ///Of/4z/+4/vf v3zN2s4DB8sQhdGkMtwZkADOOoOZXXcFonEF1K41G9ziEcTuu+3OOopVq1YD9eQsAW6WQ/DoQwBL qBdh5DKBEt3SoVUQnPivkZm1cGEBR6yHrehBQYrgxdtvu53HGnfcfgc/WYxBbmi0xoFPOTSV7k1F JIYcoROpD3EtPrHjhCZVRs8xmL3eafGOs4YpM2uP3fc46MADadb33HtP2lZaE0neCdHhzhwzq02Y I+cJw9jIYWC//fal3TnxpBMohoRCwFLch8NPuvNTiigvdEV/NTKUi2VnFZDuHjoqkvnLFWmnkghJ QmGW5ctWsM+hCii8Y6BqFOqLxogKYGeERJKbBEklp6USTUlo7/tEdzF7umJ24wH9aEhHfU3Qwiio 4ojX1VPFKFVkoQCIBnfQuooVlN08pLEisokTMJrI8Wx57McUEtGkZp2SJTrOHrQ6OlFL64uK/Hgl lafnozPjAJfEg+bUQZiqUBgQDDQBdNLvctB1QQdAwPVSAMFuprtOPPFEkoiDE6pzMUJJKoLsgd2w RhI29ecANLz5zW+mBeC6gEI8Pvaxj8GU8vT6lOR43vOeByMocysVLn+WltEVCAKtfKj35a8MJVvd cMMNXKQ1+MQnPkGDADg44YQTpB1bl6KXZNAcf91R2mpCmZOX3/rWtwrcOBObKcAROKvnA6rVHB6m NmFcEQBYTPaJmDhWZPoTiIM33/GOd9hWFOYKkaPnJxPaSsUuv/zy9pJHmm1UNmRMqdSQRwSnrTqh rSbUsY1bnbmyeaQ5oQDkbJlNUKiryDgHvEuulbWwFRXf/va3C3broGXA0TRfdjTuJknVSsSsj23O +973Puoq/Z19F154YaW5LCop9u53v9vxrBNXdzQmcxlS0xY5JtXmPOMZz0AShOd63bOFBls1J2AX FccXVpouCFJYARNospBz0ICQGcBIy1HUT3Odn8BKzXQK5WgLCK3WEIpVt0RvSmviZcSUFDBy9wZ9 5gauuPyKH/3wR7fecitQFTodtAo2HJNE3ZgqagZUh+gzNc6hdocqWmMglMYVgwB1e9JRc6jgY01X sx43YkohNvs+5qdRiO4K5YNrQbQYENkkBhQQjLsIpslI6G9Y33fvHQPfvnj40n+fzcaCnf6UVwL5 29+3/c6jx7xw/avOHtllj43QVtpJsGVLlzFBCx3DbgnJLTtFEA0xkEfTwJxoSrjztt/8+cDc66+/ fnTDKA76zne+iwcpg3ewP1c4kHbsOzKdYQx/pY7MLi6KCq54FjbCtWg0nxubCp9RHV2gwKiAdxkP O/ywfffbV8MVXqvVMmgZVt7XLtoaa+lQBMq/HJzreYjGZmKngJQj7rv/vh/96NprfvCj6679MXur ELTaxqczwhwrhsX0hETjTGyy7z776XkFA7599t3nN37zN84447W0nq985StYAoMMZmQHye8KNsce wDtO2KMLYxs9H8DUGp167EotbnFouZTo8Ndr3KU1d8eWj9/Hs2WWqTA61bBWcFPOUurJ4JVOEX3Z J6JJJ4sJoqzCjFvSSxV1UT9L2K1oiaNHV3FUx4qCvxoqSCrRF19h8YihLZJYO8ZkBJEygndFlVT8 eFgSE19146hbdFRGAqfD15URKR1ST2+Nos3lINGJh+2QrstEOspb9JfMQoFj6Fl9cMUTxmVFWIOG maRkMCzLC3VRBWiV8BNDUDAolN/0pjfpwT0HUydQUF9O32bJtVSDflfTyZKclRtvfOMbOU/wAkYc EKFH1zhBlCkM+IYyawwqVY4xU2kr2cTW0ENn/nLFtpJ9uAjm4GBmFO1kK24BxAGUQDFm46yIbFX5 s3RlG8lRHySUPNVcEZEY3sTH6M3hMaGtHB7Y3BbzRGZUGVLvec97+IuDPvvZz9pWoDpig+tGdSmS 00894vDIsC6w20heep8rWBWvpQcmpYPiFWKY8YyX1lSSbcjBJCr50satRGkMyAnjKgoAVE0KTth6 EORUicM2pSTmEi6PWsvRr3nNa8DNDki1EsQeHtRqEMIjNjvyKVzIMh3cTbFaulWjFBWzjpGs/JIa OspLAKF2YtIQHwF4woa+XK98/jahrdokb2XKV1bc2CWrjrAIWGfs03rjH3HUdaFnOhVt7wBs1dJb 4zB1JNwSHKeAulLhQqNngQwwDZbVanIVcKfOORDLnR8/TQHiXBdIEh0GAyy9vfXWW0Ez3IUadtdy CwEvda4CN8KRQnWAPMAos+xIy3VWnwNlNDEsLQTv7HjnQDyRbFBGDPAiPyGocIGOHl7bGdJizMGj Sx8a+OG3Z33m47Nv+ykrIsAufWy2QRM+b5vRJx8z8ob3jDzjWZ16sbpQlO1pf6mYjO9zimmpBnO3 2gFaZbRi/j8//4VPferT//iPn2KNBVVkag5K6qMz2IFiWs0v/1oS3Aodxhh+a1YLxPWSa5TZ8lhU BfcYLhw56OCD3/SmN/7Nh//6k3//d//w9/z3yY994mN/+Vd/+T//15++7GUvZU5aa6nF14orWkTZ MEUTnHghzlwadEIBFQg/1pZddeVVl33jsut+dB2rtzUAkDDQEjgWUhcpQohpb3ZeYWuSQw4+ZM89 95q/cN6BBx/4mte89mlPeypINyKniDslNvZngRA70hz7zGfuu8++7CqI0TjY1fvUU08555z3vf0d bz/iyCN2XryY5w9s76IxgzUV/BXCEwrUHLk8hbRkKFnGXjE8EUI1otejUwujeJP3pZrI2lNcUV5r jxSFqELC7lMZycBFE48noi+B7RdHbATNMg6FuWtkbOiv6uIopgk92+ayjCPEUNgxpiZLBD38kCS2 symIoySXuWSERxN243bv1k5lHI0+dxXpKAEsrbROqS0i0TW2UmwB7Ljkwcoyk61IRwvMUpA4PBgZ 0l3x8/nPf37krp+f+tSnpGzkpZlRpsd8EcDK2+ElJhAQZ31wVIeJdn6KaTre+973coVhQOK4ibaK KpsjHbb77KgjVrIMZcXJ2lzsEh1AAz0IKLbZy85oivFQHvNqcjEepXfa26oy2MqLAEpwv8CiiNs7 wkmKhKRj8qCIANEMyEoXt5RcEiZH8JMhJcQr4yrZ2T+Z98WqWpfScFQauWu3lhVLdSq9LLjMbLQt UBnYKTwYWKIgPbgWfXEwCwkQx1ZJcfIOH5EUWlgfHYSVNOFN8k5JCmjwSbuR4qG5oXOYOSbTyAEJ GfAjPzGZ7NDGVlPY7ECqAnm741EXKMCqhbNCJ0Kuml/kxH2P7OLejp+UBLpRQC9oum+jI6QuFMC+ 3KWYeh31VZpbVQ+nqTt1oqLMLYThOj/5qxXGSAhOEgtOmD2lQdceIBFza54bgtrGTmX4pAvTwFpf oZ5eK2rkSI/vk92NAKBGRWRgAMB7cqwJ0buJCAN+5QSIpvnR5Gw2M7nrl7O++E9zr/32rLVrxrr8 zsR3Z+XJbnv3n/Y7oy89Y5RNOFRL7CyDRh22kiwvFsJkJAMaMQxgCQfryznXwEDaUeZXd/2K0YKE l+Wxm/Zc5zjggAMAiBAUJLK74asVxtzFdCxi4YRaYEf+cqvMDUEKEdFfXLBo0Q4vP+3UV7/m1Ucf fQygFoR6yMGHPvPoZ57w3BNOOeXlb/2Ds1/8khcpEiKysR1kCrlGHCkseK3yClF5MzquE88jG/TG JGbpzMYtXw5+pQFi5EZFT3sr7HEi666HZw13lpcMDM4enjNvzjyNGDvJM3ZwrvX9hpISm3U+Rx15 JPMAz37us447/rijjzmGZ3O0a6961W/+8R+//VWvevXv/Pbv/Pmf/69X/9arX/jC5z/r2c9ip3ZM yoCNdbFaba817kLksNNCGqnsRCC6tIhfsFsLvSSJza7ymjW3uUSTv152r/c6HEsaz3Bo0yEEg4ji QdwjrDS0VaoabvLT6az8krmc5lFU4285Wsp6NKWSEtu1HFRl4KkxlY5WVudSQX8V/9Zad510sdmJ 7VIUQDI4j2KUmoXYiZoDUlIpelVAVxTbpUaxAUmNiZV1e1VXuLKiLBA5WgAhqrSeWzOUIHVRs8Cc aMFGuUq7lEdrNjRNZQqq6NnxWEvdMDurRo4WoI2+m6lidzaXtZOX9UIYGLqcnY0OiuGhJxJUiQsD GsKjfVw5KhoCUg9Dkr9cXtCHxxSWp5K75sUdTsmVXWQEFGJGACWxquY7mw9LrveMG6xaCmmOJQsU FLVKt9ZVbB9XpBIPPbA2yHKyGcFoRM+pwKNwZDEGHZzmwqMiZWLGrOfxGoX92mVLI9eFogafDOwb jJyMkzKirg1RmKEgfXEXcRVV3pQmGjoZeev5vhCwek2hT10nt/VQm76Tnlh7P2viULGuyVF1S7pC Rc0fi4JWVKtTF0LtPO4fm5nmilaPiI6QJSUFsimmDTG4yC1IyW2C70BAYLResKOYROI6FQW11d/D guvAKYEYKGgXF4pRVyttYAcFrc2AuLvqdBKDRl01jASyYQH21WppLXqJdRVMqrJ+3eiDd/d/66Lh r/7L7FXsZsHlMfDN3R12Hn32r42+5g/WL9pZETI+EYUWwCCmpZE8UlZMiCxQTCsZwJTaZtvoH021 FgX0qUlxYwJUBkAze71wwcKdd94FNMwARpLLR1iG8mBHjSiYD+btQ/4t3nnxNmNfbt9hbHu7KG3K HAER6qLCoYcezIJ49o4c7WflC9POGwaG+mfNHhqe3VnaceIJz+OuHnFARKBHosoUgpKa0dcqGq1i p7yGeXI3hQUEqcK54goBeEuSpRo86PjlL37+05t+yoIN8OUhhxz6pCc9iVGHNhgZGdVa6s7229de d+1VV12JcdkUkMVkfKpTmyEaHyuklQgwYuELQ5FFOy5CoznzZu+0y05s79P5sM72OzDPve+++8xb 0Imxpz3t6XzGkoXme++zN+MZkLfeY1Y6GM3L+JAlxmQTLdwSd8qLu+JKyRIxpZwoo7mYfupVV5X3 6upoZOgTEkoTPcZRixPHACLrpjC1AMaUPkFCzdwbv8rLOgTQXVgC61BzpChSGIhUHGaIppoLbYVE SQ3gFQay0nhSPbrmJLGLxoyyibXpyNdOZ51YKUddZGoK5mivubr1bX8isu3Lu6Rjo66uwFNabUJr yWBVK0N8aClIhFkN8ngdJ7NoUXLm1WiveNAvUjrMIhLcFJUnZStAGwKAbDgq3yOcrNnrJNeiEZBB HQYtGWFGRMJHdQtnHXuTUjkyaq7o9egpGPhJPNBZTGgcVi5x0MaWSEt1u5PcRsaqAF8tm5lQGOUg jTAT3hNaNVGrc6thcZ1bY8XKMeeEYrMORHC5O1vpaQnT3jiicp0JdzXiTatELLmul29e1knekLwN g8+WLaTEAP+k1kMhqpjUa10TGrYsMFXNTuZNL+6d+6QnXYsn29wjcgtMKSgWsb86YK6rq1OPCFxg elWTrzwTB/0I/EHNS8k5EQpXTybwLSAuUgLcQsYiqxPNEVKAkpCFguaDNevpbpgTLUHhRLPdbNh8 7LHPZI8LeFGYuyAhIVFDOiEbdcMRWLjbdrsgxCPAxIEMOB7w7SU3ZZY+Cin6lz3cd913hi/+u+3v vm2YCTqMDhil/NyFo4cdvf7171jL+hMBa4ShT+LR7bHHHssbP+juBQamjwxayUPzwQHG7UDARzEx xaSd8JbhLL4YWxrOxnwLWFPBdtsylDwuzIoAGth0XkXt75s7fx6fp+HfDou233nnxXxhkblh4dGo rCSPhoJg53XYDeuHBoYGOtuaDwxivP4h/g30Dc4aGl4wb6HWBqmiTGoZFAxIgjVgp3l3fS1yDDF3 HjWQXbR3QmmGZQpLKhKNt95yS0esDRsefODBO++4k6nYww877KlPfcqhhx5y5JFH8I9ByBDflhwc ZI0qrxvc86t7PvaxT7z1rW974++/8a/+6q9WrFypWPII0woiG0wByGNPUTrfiAVt8/VJLnbg8vz5 bONNHKMyVbDY7LEvU4IekY3yYMsYMwK4Up/reAGvCZ0LCqOmJHHeGZ7KUB6zySmym+aehac59Jqy Rqf2naznQxFCSdF01quABs8aM0RgrXZKh6o4PDxC8EWPXlRL1/UAQRP/jgRZ284VfbGW1koBDcAU APyV2A4qlVQtUYCgAt4T7Up8FXMzqIpuXtyCW0I1fR4SWDwp5YbRsS2bRGvrPDUalT9lK7c8LWuJ nSuau1k0CKC5aprQf37swTuX7LrAtUo5mcfiro9rrrmGDTEAN9SKilMXxyXK/inKSXKuaHuW8kiS lBUbzAVw/PjHP86TTN5rRwAWnnJ41U2s2J3N7XQLiYm4WC4aiSrbAqqu5bCVVUpbxficMLQEX5QU DRX1MAQxSpfhWZCchI9xxTkASM6ijN6E4zWANMnqWs0C1CWFM6LBqnXhQRXUZ+VGS8+mHExkRa1y xr2s2EVcEajYmfUePOKORpvQxY4r3q/jvWGExBflOpNIR0+0Ug7KQZVD9FKGZls1DD6bG7rYXikm GY1UNiM0O9yNDWZ3Xm5oIRuaHQdzRt7aG5u+nMrq89Rb6NCUobBp7Ofcn1FLXQsVBZ2F2KSbKnLO vB0Xte8HCF74zx5VdU2Wa7GKrsBRr9nxU4teqCWsABdu6aPcFJMWmhI2dtTmJxRGht133wNIxNcF AW16J1IbaKhXBjPRClhmd88G326SrK+El5XEVCA++sB3VVK2Vb++YV3//bfP+dq5O914xYKxb8nz RXn+B74c3W3fDa/4/XUnnb5ucKizawpT0QhMRdaEgC+9NDkCLIEqgQ9BcDpLvUYpeYRC7FzJifp8 lJ6LTGZjZCzAMEnPKzT+oQqG0rJ41iXPn9dZ2zPQP8C3cJhdBKdiQ3lT4RVBhoERJ0QXk/Ff+fJX r/rB1ctWLOX9Us3269/a9WuuueYHX/7Sl1kIojX3av2REFsZxEgXBND7o5r8nj+fldmdD0ZyYCVU 1uy1Q0t4CCI33fizb3/rO2zOeMXlV91yy21Y8vDDDzvgoP2e+vSnnvT8k0497ZTjnnUcWxAC/wHK y5atQDRC9bLLLrv88is6q1DGnr1InjjnKjnhgrmYT2cj4R9fd/31P77hpzfexPudN99yy3333XvR RZ/78pe/9PBDDxL837/8e5d/73t8LHPnXXbed7+9n/70pz3taU9hsKSQVl6kNkIxr4BX8LhYJ5DG DtWVF+Tc5BQRwYZaogMpjYHlZTlOFSHFGFJqapWXE0p5IS6Kdl3RfHZnJLC+M0WtNJTj3O4IImss p3M1KSrmTJGRnW72vnPTeecmwrMDig3CQIV1SBFZTCUdG0k2E3SrJfNKF+kojQyyU5i5gNXRswW5 Q/TlFw9yYhZbHgtfnsgg1iIWiFq3rJg41gng2S8WYmobL7ptHfrJwRRsEoDuEIjgA5FYcKmltBZP Vej7tTVe5aE58qQyyFvIOB1R8TpbSc1kIt7BYpAAzmaekpXrLKLVVJzn/iuN04XNFQYcUOZhPY/+ y5fPKiWnil7aY+m5X0VNWtRVrFQ52aqc46zUTgAdp8hZlfGg/cVjdcJAntIaBha1+z1d52kZ1W0y QlzMSztPI1jdHudlhOAIlpqgiDacbvapmpTKHLRbgcVxyXJsixoqts9lICaiph0J29gqSq4XGDh4 osuT3jqtla1T2+w4BTipGya14ZhUdkzGZsTxmXb1ntDRm5JKpZdht/F1KNkdo5NLnruSA9Q9cKIe nb90NpQREPcsmmbdZEeljU6cDOqx6KTBZ8w7AuyE7dT1CuHp3U3PqFEl4l3OtZTCiFxvVSIMrLXL uLaGYH6dKWexs/xU11z7/fffx0uZ1/zgh7ffdgf4DC5UITkRDGEEWynsKUB1tNEUUTspKJn5q3Uy mpXUBLzNomIuz4nQBiejI/0rHhn+7oW7fO2CnVbzbuHYpie8ddk/0Lf9TqMvetXo7757YO8DOkhC IElT+BLJCupEs6EAOMYVgHWtmZEKwtwqFgEW5yBvlrzfeONNN1x/06233rZkyVKNVeQOPUOgFq/0 MfClMEsp9mGRxN5786oqHqHpxKoUMxpTREUIiACSBJGu/8kN537q3H/8+3/413/9l3/6p39kIpmZ G6YZ/vh//H//88/+Fxtsgwx5miGELYspTpT5ikAtlujMwTNQ7DxLmbUdE99skbIdC2YWMwAbe0uy 82FOSSJgSt3lK5b/4he/vO66H//0pz/D6axU327H7XfaaTF7D+1/wP6c7H/Afrvuvitfz1ny8NKH Huz8Hwpj06iduWEnqkzET+HdCIWJKJD3v//7v//rv/7bJZd8/Uc/+uEPr7mGN7K/+c1vvvtd73nF K19Ji/y7/+0N55/7z3f/6h5eszzxpJNec8ZvnfW6M3/jN1/JTmoIqYc8UlkoX+5TZOrgl557aHJX VtLDCs4dt6KgR0bOUxkQsiQRuaMNbaSauCgy8TXO5TOcrIrX+7UcVFR0caItLPkrZ1FL8c8w5rnP fS6To1p6joSMh3EH1ZUFAuiqIpyK8ErYtWs672frigiqSeGn0kqb7qOQbO7WTWRRBPtr5K84V9hT TBBfWrg9dXulW6Lp3FThVF4x6b+6qyoONnFUXZndooq1MkJEUgMtsX1XYeCD6xYv3dLPuopmJKbx SBz9MxXTvBddVwm4tU0vB/13EiBuKQgeAnMTGPSO3rVNRhNl0xE1Xvbi4ASOF198cSm5NrPjeSB/ tRGhDptiUrYCe2mbCPZX0bws3/JIaxUqvdNgc5m9lNwS8pakhhzJ2nWSI0BdFXm/oWL7uIoARSqr roXU4nKhnLp4EKqOxiE8cBZbv7H/CYbVOEfPUjZdcssGQcKMJlewstk7vsu7mCABValUeVI52N6t GtSVtmp21tve9jYsmUawlrx960GcU4uYZ5BJStZVJGfr4kpjsAYjT5iDDMMqB58TVlRApvbKyDu2 Hp4gKAO7va0cAF030Z1eIBmLBcRxwgydpbZO6CfU52kRM1nHTz28Rm49uVbHxhWdyCLqeDRRN/ZU vbMERVNownbarZli6qT5ybl6UG1Q6DlpTWfSfwMuBeK1joVpVGCQCMKUrAMN0NNrQlRb/oEShEWo yBWgA0JqA2l1tIIvrFtQ8LEUGESicYgRc0w8t0FuL7irMYDWWCO5iMc0duOlDp66MkJniczavh9/ f84n/+eC++7s7CHNdzw7//oH5i3oP/zokVPe8Ksd97wXsUHVuIDoEVCwkRU9OlBz7POcC9XZC3IJ f/gktvKa5+Yzjddddx3PWJn/1gyfwYQGWrij80mgzvcXh/EmxsEXq1au5tVSqhvTWEdxtFRGUfrk JFsGsjXHDTfceOmll332sxd+7nOf/8IXvsQHaxBem6VAUAMhR6A8KC0UOWN+X79k6VJMzh4xKEkD MGu4E6sUEIUIrbjCrUfnjFkmMcBnibRxIXKuWb2GWV6CnjB48P6HWIuCKWgQcajeUsAIqot42ETv s2ofwJj/MoViXi8bKDYIOS7+5CfXg8tZXz48e3jvffcGZOIsQhSj7L3PXkcc8fRdd90NmUVTWJ+f mr9HEiREAFTHpVoQJS97fOVMFF9DW8kgqYhSyaYxg4RXsiujuTgW9gNsE7rHHruffPIJtA9KYdxH ZlFsLBE7AyR8pDGePL7X3nuBgtAFMKTHaAyEiFvUVMsgt1o84RKpDMU99tpDAihgJB5EtI6I2KC/ 2X///agk7QxwHdI4VC9aGBBrRY2CyuV14gGAAlVV5D7TjyfKC9NxIscGwTbXUJPCSgR3586LKExM yRhOkbJY+0qqop9lrxApVFaJFV1Aa/n8DJBzwoa/2L8LASQ5yAbsRWdPCKnLj4cgiByh67b2ZDmq +mRtpTUSYC+ewrfhaOErba5OsJmOtnUrlzc0gHVmu3GBts2OtpK+k1W5NLK8UE7A2yPSSNPtNAst Oaq6XqvlLxvAsycdIIn5e0DkpCS32evCQ7txeylOCaNd0aTAnbZqCssuAnJSbtUQ1PvoRe6VCA9b 8WoQAmPDuiXsdQGZnIWv9S0bhk+kJAu+6zAlHOsiWZtka516CsjKK8m8tDPw1ajbMZZOUhX9tFv9 UzHJTJCrTyquNr3ZadNe5YetvAdGt+e3pNUhqf+jw+u8EjeGhtUlSzEBIJgJ3wiuySKaYvRkDyd0 q4YpdOFaOukqVMQBdNUMrYSEMBlX4Au8oLvVl97VwXNF/RnAS12s6IytV55PN09z4LfuJAa8oAme 1nQ4CIaNkKmujlaTdojH/tGdPfWWLIUdF7X7suatpZeOMp7sM0xE/yRko4muWFGmi902PykJU3g9 cP/Dt/xs3UfePXr1pWMYoAPA+ctU38B2i1fsf+wV2+z1vVtv/dn3vvc9hhxq1i2PIAgceZgAFCYE b775Fm24zqHZd3unbFkErEF12NPjIikusCusgNm33267dWvXPbLkkRUr+ELSsmXLl/EzoQrZRyJF rAORsbd4N2y//Xa8cohDmfHdZ59O4BEOelYgmIKhONHyYj2pV0wLjcnvAHe2prn77nvGRjp8GH7J kkeWPvzgIyuWj2+A44UQ9pfcgbLEjE7uvPOupQ8vubezF8w9fEaHUGfZOp+O58HI7XfcTsDoEz8U pulhaM4+JH6RV0BWXk6tgKGwWiKZgoNMIbRA9sQ2X+rpgNcxAMtFfrLoetfddwPpxkVfSjQ9TuG8 M9+7etVOO+3INB8T9jzM4JbMBX0lrFNV5vLQS8nLgQE73+JZvlyjPg0PFD+igMxjqq3fb799Tn35 y552xNOPPOqI3XbdlbU3yAYvfHfooYc9/RlPP/xJh/OVUBbhaJAAnYXbLIDpsqXLySGGipiUwkKo Wp6OEThHSOjIuWoKWPf+6y/99Vec3tkxWqMvmY6/WGysDR1gV8fnnvCcpz71qbvusisFVN3oWYVl KAdeHIq4gE4cVOqQONQuKW41mHHWuIpPLKEyURQklRqoGLfSRaEiFtYupk/KTYeuC5cF6q5Ini4q iqA3Wo50aEzwpiYpJzzqBBBc0AcmfWibXk9/die5OU4oWyqgitroMH1/e1KkJmVzIBcQjaEIBnFF hVDdgX2oQnm/tOeo80lLgetE1QfV65C3A1LLD+LWkC35uhgCaPwAUG7/il6sriRKfJGf3eVl1VKk yrjCEVQByHJUajFZtwJn9WZnG7dqqNP8Gmh0LudMz/PXGwI2WL5BcmJJ9oda+W0dV5Rg8QlVZKfr aeWYjdwmJHjuQRRp8Nld1puLxKD76I5O1wJMquI48jZiYHEqQguMcnAuVEH/oekxfTlcPbduwU+9 mqGwFVZvqp+aaWbSC/uSYOqioK++Tb0RHZX2++Or3czsIobXe2ixMlWAHIKbXrcd+1Ft+KD5PM/t abIWQIn8yElFpnW/8pWvsAUPU7xa8ApBqUnJBx98iOq//d9e/+1vf+vzn7/4uc99jnzpkSKiahSl HtS66LrnHWVDZJatZGR+ClNyHsEB58KCnef+K1c/dH/f+X/V/y9/M7CO7ewG2NGODnwI/D13/oo9 n3LtLk/90sq1d8hBwkkyssEfmkKKuaUxVHo34Fs9vfGrYUrC7oJBsoNwntCSwlpTgFx/+KGHsRre ZPTzyMOP/PKXN7NY2OjHwlBY8EW+5q+ACC7QuiD2jV+1kscdzJ13Jm7lU4lEMUkr95mmng9oPIBg +Br4SEV+MWRiHMBCBWyIuylJdY0ltI5CHikPtjf52le//uUv/deH/u+HLjjvguuuve7rX/vGl7/4 lRUrVyCDkej/z95bAOh1XPfbYmZmZkYLbEt2zHbsGGKHmdqmSdqkwXK/Jm3af5s2bZO2ScNNHDDF ATNJMooli5l3xdKuaOl75j7yye377q7WsqzYra6czX3vHThz5sw9vzlz5syQIUNwn2CRdM6cOexz BQj6yqZJT1zxIcj3e37WChlsuNyyeeuTj807fPAw4dPhKqAWju/fu58uA1wLTB1H1OXAzOYqPQiQ MnL0iF69e/Xr159YNDqfsDGUDQBMO6FH+7ohPpTw6A6Hm5Kp8MR8xv5S2rMchGis1G69ecsWNuCy qN+tezfXl9i8CxOIMNl/AEeC9iXOpHzg1fat23EdY1YAQuPbwBMEUjBqAv763XBaZWfxd/SYUcOG D8HZaczoMVi4odMRKrXkYpoyZMhQGMV8oV//frQuZhoOgXxH2OlKvo2Nt4pBwF/L54m+OvHJCl5J A+VLtp0e7KJF3Lsc59JEjO4A9DEQ/FpGj8Q3wRFd6xVjsK4E5zyjBRopDACRJ0Bo0vAgYvVg9IJ4 hdqrLPn8N/mMNcYZOvX3whnLyWd3i6Gm2QZmNPRbBG9ueMZismutEXcguqwuAGohZtTGySfx5Ypl pKccmm9slgZKVEPq0gEjf+7mGXOdEcg2sHesyOMeJeCMGYHdgNczxrTJl0MfceHeXc/sKM/kupqv YV6/dtIohzx0zEaNDkzD7Rdf8ZVoSI3F2fOTzzPy6oz9aGhFmFNryjPaC86agJeVsfBDD2QRfLsG rdFavYjlb9eu3WAgsYgJGP/AESzlKBJX9tUoAk2hWAAXwUF4iPpWYOeqOtodnQdYBHag1EksPmMI CWg0zqm3XPTX1Odza3TxXfCt1ZmS1YtWxFttUeHPbQ9RF4qTmCcUdsklF3/pi39DYOspU6b+0z9/ BaDjsrUpw44lVTzRWix6iDQmM73q3MSqfJMFoBQTJHz90rkwx8pPPXrv8b/71Ild26qSCwX/Q+8z z2nZaMKsqvd/vmr4hNQ7vMjDPrkhROaeRvGT6kQJAjIRhuRZr+iWe/9GuwTiMtC/vGWv4dJly555 9tmN6zcuW7KcvZJYqigs2psXQWcdFBvixFvFCQvzoUNEP0zBQ7Zs2YwTi/Kg1NkEElupV1iX5Wpg GvkJBOfzoR2XORU+M3iJ8ETMF5bLPOSSD22zuISg3EMHDj37zHP33H3vfff8fO26dcgqQqJUM/fD MN+9R3cOaIUiQ5iL52RXME1WB86zo1P/5c5tpVHwBKZx86tf/epvvvS3n/rkpz/x8U/87Ze+/I3/ /OYvf/lrYK4sNa8zOoU2HXpaXdO1azfO+zx6hAN9mjBwoJ+lIazmJHaph+pEk1QRGDGmHxYr9Iy3 jhEfesOMCKlhOwTz7lEjhuPcj62dDwPDSt+bbG9G+kNQyJ69ejCCGAgUvm/v/uefW8iGVLaWspAD GQaYZ/XA5Rc9duhQL2hwQoWknDx+snPXzu3at7N/9dciMRLCJIr+5RDWilOVNBZRDDmR7Ojl4Hle 8GLEWbJ957jwietCjik7NC8tMYjMGB1NFbi+XHnFFXwMnSfETMnvksPcorwcs9FH3JNFUTnjFZJ2 xpQFCfIDs+AVurYYVmI49OS/gqB1/sRPoJgAAMe9996bP58ZP2mehCIPGjy9Mk5GtChLDsUf5ZML YMTbek5+rosb9bS61iyCDDR3QUaoellIzsLrr51aQF2s8ufthflWF1MIBwA6AZWKExSIB+kbyDQz 0lOwmmLjLO56xIzuwxrK9KkYfFMpr4q9iWotzX4v5nkDJbygyQBEIsphDK6Vq/kyIyPGhYYDWbu1 np6l7XZrrbC4ICMMdxJ1RuSdp5w+gvn5M9vPglf6mVBObNDULd44J/kCmYbRFgPzFVTkCkwM3lrJ qH8UOE2q9SioBjYqn4wmQCoyGRO56Cz6Bamu9cNVF9kv9+sRo77+jIXIG6LZZodiQP2gGrm4R5eg 1GfOnIH1t2WLlngyoDZQsVivUfnUBEDRIB22Ih2sBegkUP1TFD8NLx3h59SpXLzSLk7JenWTEXWI DQkzHiiHG+AOwT1AsfSTCpJcRiTkglogO5f3OGO4y0pYT+2eCaIuRzt6OIjxy7loIy3CzDZ79qwb 3ngDhRN5o7K6olfPPkibWFANmtealJxBqKaZH3lCPBFOQahEpUzpGNjDhw/nXl0bUFjISF0khmO4 wtJGXBrIAiWY/bq1uejHX+n9wlM0tqpR9h8am0wDR1S/7eOnZl1zqmWrZjDfKIECJqcrdJN+Jvmw FdRu1dzIXtsSJk+ei4qE2pQm8DUZV8b2FP7lwV8/9B9f/w92SS5dupT25K2AZrSiYJcl2HZ7EGHD JQZSWWQAIcsEwR8p4bZdYxblxHtbKj1Qrhhwz0PEhjKB3TrMUIvoMM5kzefiPpsMtuT4+quuufKt b7vjc1/4LNscL3/D3Isvmd2/fz/qonwdgbgOHzqI50uPHmwrbIUVNcBZftAGo/J8luHyJCYV4s40 /WnaZPWq1U899dQDDzx0//33L1q0+NChtKQgS01GXjsrPWzcCPh7rLycvIDtVq1SqBNSwlWSuUsY U7Q/rS4vdRRid3tFp9hY0zu4jBjDlGPLtq2//vUD27ZsZ6IFqSRByEnAxAa3LMLCZy5hfApqkGGG avIkaVSze88e9rBuzVA7tdAL7qv2a+AWSSm0OmpHjME9zzz9HOb/VatW6k9lF8s6soO/ly1bhpbC 3rZu3Xrn0ooHf/0KeelopPBQuwmcTJre5ptGQaXtuvs7BVXg+UsWEzsc7IsoFr+Xm2+9edyEsQxb 2e6X0A+Ls6wgL8qJ0RGi4kSrgVeokwamj2S1ZkS80bXsQDIgN58U4AugmftiXAiiQhOj2wBMAbnQ auAAkDpf0TzgYEjyhKIoUPzNl42tdcK7AuhAyahG04fVypKBCDwvCILRwLa/LF65uw5qPZMP2aaN PDTCST01Foc1xHuBK5rMfcF6PTyMLYC1llxMOUOs1r2YBdnNSHXwk6sh1nr4TBtJTK56vIcLKrIH kRz61GDJCo8ALr6H9fcUTEAClb2CJsvDWkNGeuBicDUyQj/OQg2ZOQRVkMoS8csFsnXJFaU1pFth FCgQRiEGSn4D5ZlktJF54MsS7HzhCrYzSUdiXE4YgK0FSxAmhlo6OizHyBXzatpbl2NP/Z8d35K9 rslnsTw0hEWSytQr5vAQzIZpiHcLX0MKaQjl9ZdTT+8UWllQmePGj1u7Zg3AAuWtXqR0Ygzddtst 7Tt2mPfUgrt+9jOCo+ENgriQDF9YNBw/3SWpyce9jBqQ1CsqQsCuSEI0rEIVN5ASvwg2pAOONV6i h7BA467N1xZ8hrJHKYbKFNbzk7wUIhSjWIypnuxNsSJRLgE9CZgSoBqx62MW5a12enUzyJu/4J5B gwaOnziexAmvNDm9/VFqVbfeSzM14sZ60003EYeOgyF/8uOfYthDkvR9py43RGo35Se7djK89Zsj BikE9wCYyZI9qwckRkpwwsDjFzQP1ARtbN764vHdC7sNfaGmMX4v2SbCRjVt2jV6xyeazbis8+JH u+zbnXxq4Rv00Bw5L2oRJcifAIv8DEhnu6SQDiKZTi/CWd9Gw3mih8BpBIl/f+tWTnUowWJFG6I9 GWXVYjuBDhJCLZz6SY+IpGFaBHaMGhEqJzDCIO8tyvK9p72UFsTbrVQNVTzEEkkaj1h31CmW1EvK 5LkxdGCPnt27dO2Gv/WpSgI4NqWr8FpZ+eKLCiflI1TLV6wAJY8YOQKpKCnZQ4EyWdq8ilttjQLH zJ3m9KkuDItgCEcR2RY7xbhO3ruGY17qopn6f+Phw4ylW9euxGnZt2+/80/GL/wkMcnI5WqV0NZ5 o9jOQSRVciMEg1emkTncUyYHf77w/AvEAqIYUsJS7dZcuPfs2rWHGSvdx9YMJo08xPmeGDjNWMBp 3jxbd0puM8ErRVQ5UbpCQmga6Z9+5ukFTz/NR8Ih41gOKbVRfBMoxG2dNickhJ9UR1FkdGZuJ5JA 2VMaGWVcNMQJnrkYcab002cXiNSVNKcxThWy71gle2GnXzStR4/uJSWl8AeGUKONCm5HmRYi5xUV 2+4nKH6GOJ3xxvH1yjMKN0GWxeo2Io7licFKB1IHHAO58s8BHAUH4AGMjLddYEXTGaDYpcGDA6GE cNoFJVNpWDFfeZPr4i2qByyC2obgoBlgBMiof2WfZtZVpoGKeUs5BYU08GzFAuafUTBM4AZZLnqq /tN27H0BOhZQkFADBZIW0cUwysOG8oTRv7UKT63EUw5Egv5dBgnFUY/VnJmYNYKzC7h6FqsTSFcD m1xAf61jsJ4g65GdeY6tYxTkfYca0rl5pHt2HwFYp59JwbqTA5NxzRDAuhEjDiLr6mh6uYEMr5XU +mcpcuNltRG7TD0yiXi/el+P4r6rlfLGEXrJDJzPgm0b/2ZcCEADaHFUF7oNx1Z2VjVJh4s0Qys+ /8JzLLZfdNH0GTMvwlq5YvlK/u7YsR2FhDJD32hURrUY/lkLEE88VxIQox+2uke1Su2oZAxs6HWM tfwkYh3pQd7sO0TRUjI35IIeMvJ1dl1bcKmVKxAbz8X6AjVPyUGGnCQwW9D1WchOaVTK+YUQBsHk ZSZKxHVe4TqM29AHP/ghoX8wUU0JsGNX2RtvuvGtb3sLOhsM+rOf3HXnj+5U2UMqzQGLgF3IzkyG kjlCgnvIEApTDlUzwZgxczqQbsjQof379bciTpYBUZQfL2/Xph2cOlq+/2TjVRv2f/HoyQ1V1RUA WNBBRWUVh4ru3Nh2xRN9Nq+u2rN7b3jFyHBtddSlg414zlbIdpnAFeFieAX9hvIIpMJDkY1OwzZf GG1YD0p2kcRLDogzSB8Tj+gp6LEQVwkoHMqT53eGWvwCOjxI5o3AUbRKi+SwyXgIS/Wv5TmXkAs4 OHnyZASJWsCChBOhfwX6VAo4Iw2f75mzLuLgTCAUbkwJ2jdtyubR5UuWE3sbsE7hGcQs4x7C3OPL PXmd2sVMQw5LPK8CWCvbkNevb1+wZFqIAO1lzHdFQjSm0AqUZS/lOGkUf0uJoi6jdO6iZBmiNxev 3A5h+QG+SWnfxdBzBiJvSexzbe3SHxhUqqIvAlOSmIHZtUtXhJ8JJKwFdh88eAhz1LXXXk2olmee eRa3n507dtJqm2DrJEYhlI0MBBqi/CAMCq3WYpd05JWMsgSJD2lRmKHNUJKu3lCUc12LcmcnN3wH oIeHfElc5DHejrwNRzWZQy6y2FP81DGGG/5i47/44tnM3Hbu3MW8nWA4McqCt0GzFEpwviExEYJa 7+u6ImNBAiuFfubwtKhAm9oKYA3Sy6pCfhUeBYyWMpAf2Yns4UY3CgGrFa/X5wlAc4OWTM/zhx5K jme1Uk7JhMcOiy84Ce1o4VJekIuUzAFiyx2wrHjzGRnRX6Spa1+a20NrzUivUQVk1AqmKZm3wlD4 4FK7pKIii9lbvARvc/K8ojQug0jwHGmvq6fIyEepmDx4iAkMXtXaXrsec0BBi+h0YLEzovrlSvEo KDx6py7RijYiCeG1b9wSfMOKu7Uuthc3OaLc1DMiENfgKnXliSyWK6rO1y7lxe3KZ/RtgZzUMwZf VrcGw2sdAtBW67ZLcoErCkZxyBvyWavMFwukhVtOMQER3CYkP7oy39HIG0fH1zMjzXbh1/JFskY5 UOswjO9VrQJZz4cu6CQN35DY/pv/5tT12cmLa/1f2rP+RJ/uiALkfe21165cueKWW2/58Z0/AaYg plDfq1fPiy+5GDYBu9t3aP/k40+uWr2a9oBUxowdjSLhUBKW+MvKkmMD6ZORLLMFop88tFKNG4Yl dbw6Ujq0JPFcmM5bTynnHvRPmYZRAzbxl0v7utu8AttRmopcZCYUE0CACbgBTTIwQMBQa0hECAu7 ILGcSY9yJfEzzzyD5XvuZXPXrV333e9+j1VyMpo+wAcVQUP/fv3e8973TJg4nlNkhg8bvmH9hv/3 //4BV3WnB0gVjCIvifWiQdAhm0rFUtygA+gFShg1mkBpQwEEAWvEKOIShgdx2Cob7Vi79+/3lT/e uEkl/IJtJ07VHD56snRHs/XPd10+r1FpyWFodJ0dxgZOlRXUKJMDs8pwLkiFzzwnF0CEjstceE9H W3eORDKd4+1Bg6NDmIsPJKZfhDveiDNI4xxAn2nnALbLjbPcaGWHM3S0uSTVJigk9inlOCRE2IIY qaJYQTDPU7iQ9u0GpkPZ+2cH4hzHxIzcYmW3FZTjCgy5CAI87aJpQ4YNad+2PTsFqRGYzkB96MGH mWeSwBbpxqM5GQCt9R5KrDTwX57tJoAVkMda6uyLZ8FlSsNQzQk2bE5dv37j9u3bjNTmvMKm2UE8 kVQnKsJHJ5xKBQ/d0kcW/TfIyCvDnIuhDRPkEOOnskEyATqd49lDmQU3ueNnzUoQ36pJSXY/VfwN wuJjTSeyXoQMUA7uUtmujOrb77j90jmXkh7Pn6eeeApIynSXGsWdDna7UsK4wc9K5A03dM2nabzl CYOCjIbpdMgrP7SFvIqfAmPneo4StSNOmrRDYBQtnkC2M3Mdk0gAx3SRF6/z15T85ZUlxI3i7fDh Y8XKiZ4wdoHtso3xfbOLeeUoU04k2zkP9wiYr+r57pug4Ap08nIzapP2GJQoMz83KKiorvLPmoDX e8YG8kp/CZH3eW4ysBsTbIS1rlV+zk+3NpBXeQrr55XLKXL1XI2I89w7kNITb6kAAP/0SURBVF1r jeecV/V8VV4jTc734MsSyNcdrwr9vMeNG9uieUswgeYf+gPQiRMIEdZwU+7eo9uypfxbRjuBp+CN FZxFsnptts/pNMyCd8JKVBfoVl0olPSvlidVbzA60qA1qVeVbKASVBo/8fjkIhk6VQhCAu49wkM9 x3OUN0pa22ceCamwdeTAHcVwcmhZVKb70qAHyxzIgOc4hIASfvjDH334Qx8BRsOBsHYHaJD4pDVR n01TkAqK4hx1cJkoR/JIxgX643BCaFOdk9H2Zm60CRCDJ4kaIc9V57qLqJuhTWMbdbZsOmhU978a 0uUPWjTr0aRxs+Tz3bgReK1tl+NjL9t20fUlPfo2atM2nZBCURQoGJUbpwnOLU9DZLCOt9QI/pbt TkjsJjkpQJf5wlYd5Xko6g3EkMfNYQa2dsFlTC1kRTKadu3qwTd6F8T0JuCdkDTkJBC2/Q4b5R70 w3ac5K+48vJbbnnTJZdeDJLmbPSW6Wz7hDhtsnDHbgIq4VVy//2/+PY3v0NM8c2ZmzjCsG//XiYj KUzh4cNhOSYXFCbw+tIOOVlku6JwwWuIN93HJHbS5Int2rdt0brlwMGDRo0ZPWzEsAGDcOjvg8FY xmrAthBL86HBNBF1Gmj0DN0wYBddIPp0CuGUhkvLsV0jwU5+uI9QJz269yA838CB/eG8MN3ZEfU6 c1YCnccqHtRiu3Q14YaSuQFxZpH1S1Mk+H37M4TairicLFJZMsS73hVCYmMpMIRKJO3hPtCQ7XlN w4S5t1Ni5VkWyeEQJwemAsYNbWfIuxrjZM/02SA67TfiLgjSmJGLXnaYhOFZCbG9DoewI/gcCnnI TH7RokUUSEUxTOAzk3yt9VyOdz9uNtCUvvKbKW/tQa+8Kqrr3ra/koyWnK/xPBNw/pt8Dmt8jfNK 32uWL85hk+sXy3oE8jXOq1c+lM4hky/wqkDM/jfJVVMQT755t735VtTZggULiLunXzVKiEjJOEaz q+nRRx57+ulnACKoDaAAQBaF5JExYWzT4ijs1lE4dHZ82cUHgrZIENpIm5aKlovC165dC+x2t1wY 8CgEGtDKIG/tT0Bb8I1O1XoMh54mgZvkgAgUSGJKnjptysWXzOrapQt2TKEb4IAES5Ys0UgJbWpN 0ZW6ViXtjToexDdp4gSiXnAwCtCNwxEBDGoyCsGk7Rn1cAPQD7tUupZMS0EYuHcPGTZ42LBhABTh jkpXgChDfjOBadKmQ6uxrZv1P16xpaL6SILplTWVVTXNm1X1HnSyZ99GFcfbVp1qi6+y9rbAZIJg n9gKG+WNAEtveJoPIgnIwpMAB84WRG8QpoWVY9sp07iNFKWdUrLjkn7/5p+TngKBHaTXyq5URJMl j5/UyCvRFX+1eUuzVCEPzmTGjBnNSewcak8YEKBPMkhXVTOBTDExXjplUzBKsRRCvXtL9xK6h5u+ /fogCYAwrOZsH+RYHw3SrrHEjCiPVOSqRHojNJRUhRkQNnrM6E6dO1Frml9V1xzGo+XgobKj5Qc4 Sn7/ATx0xG3mVeSc4dBAXrkiQVFKjpfLDlTqkoXg2y6m4dqMg1R+9uvfnwFCFnzfP/ShD97+ltsn TZ4E+u/YqSMwHnSJ4dYhafkKub3mcLZdJhDRckPJkk0aYqLjd96xY4fhw4d26dL1wP6DxEQHjovO nSQo2zZT+ukOLjvULyz0K0tRncspIQ+21NWGkJDgIR8KUbWzBS5nDrbOvH5PYlyQF982UvKJ0JXI V3m8rp+JXPWyl20FBWpZsOP4axNiVmDrpFnULnmOd26c/Ocvm5+vLu7ji1qQJQhrSEZPdMdkaIQ4 WyQ9L6ucYhpebcpfIzU2kFfGhQAB1+Xf0pDOOosmEzgiH/n7t9utDeRVwwUb0YWrOD3L1YZnVM7P 7VA6i96pdeReGIMvt3fOuVy9XAJe7uBN9qR8HeAMjDdcegtwqXiwXaWTC5MWTPKKC7i2Zx4SCwXl YZwTNKt2I/VNKMUAJWop9Zm6R+kPYOf6r7AjGRsPH46NcSpLi6VqI76h6rjXsAcEV9cCQQwtJ3RQ kZMS1CuwIwuu1UQmBpmxr7Fr1y7MN4zHAoYgDXZut0iGEhJOyd8AHzwh2XaQxdZtK1e8eP/P71+6 ZKlt4TmkQpJsQZdrh3MdQFVNOdyAy/v06d2hY8fefXqjra3Fqps3a374SGKCewd9lShp1Kxt8yEd Wk08VVV6rGLPyYqTVdU1TRrXNGta3bNvVb+hVRUnWhw92KyqMpnJA7hbr2z0ks8BZOWSgWWgTZO2 2bWb6sBDersY8QC+Em1m4qRJw4cPI+YGfKCN9lEQHDjbRtmEQGAZcE8OvgHLRHghJNZlRmEKN7KX n5BkMBlu6LsMTDcdMnQIpycCtEiJy/nGDelQIVyACLJBAtEw6WPiZ3aagH0IQEyC4SOG4x2OnBPh ZNu27aB2WuR0QuId6vGhF1pJYRAvtx0LcJXqmObR0dQPNk1bQtu16dK1K8Z6BAB5JgyPLaUQW0f2 QLcx1aF87aMkdomAi7bblQJW3sbWXjuC7H04oKdvn2zm1Oqaa66eNWtWm3ZprQaTeovmyeGnqiJF e6Rb5Qx/SavV1j6VUXaobCQNNGgpJ4vGcuaCLB1s3rxl5YqVTz75JCZhth27g8IdF3xUMs78JtKO zaEWjejOcGwInxSn8Yxo2e7l2ORvECYNAbK5gYe+Ddht34UoWhRP6FxmR8iStVMjYknTnNVH6+xx n9j8mPvZa7xyRuTHB7LzzjB2qyTZhPhIOmkMb5Nopk02ff4mZhGRsuCmgRmLkXeeyTLnVSWgmP7X XY0N6SwmNnWFmXtVmYwk//KXvwwrWENIrUuiYrC8Enk4twQwqWAvoLD7XI2I145AnltevRpfjwu8 OrvBm6KPBe/4uHOGCOoEy2uypGYeDhpm0EB4qd56681jx47BPueBhSBCLGQkyE7T6An41rSsyrGb 1TSq6lAeqDQNb+7hE4aqCzUXafriOUrX7MJZ6fGvG93EYVw80cLEX+5fOl0lvdJUZjmmAZrjPNOo pvGBfQdAP9xz8GGYIqhdf015mtfTEhmtU/tCJCADXzrmJxpfyYg7AAZ4zNjGmgC49uzVC76xAUuD OnlpFDjDgIk4RAwcNKhd2xR2UHbRCk4y375juzZm8ZBoI0MkTVs27dGp9dQmjVsdLN9y/GR5TSPA H1itUftO1b0HH2/WoubU8bYnjjU+fiyZCZ3SCLsDOApNRHgJMGXWX34Kp2LulMfrRq3R7IfndJ++ fS+aOX3I0MEAOBoLbMVRB26H7gyOWWaGuhLaEFrBv2ypIc1PXHNQrgQrgcACr/BcJASR3kAbvYlE BcZF9HC0gavtO6YtB9iTly1bAXqGYxAfkw2ZLGIWhUN/n769sUAjqhfNmAE9yNSAdDByk+eee4FJ k2Tkr2hmiDelCe5lNQmchIBrgf7A0TWr1zz15FNbt2zr0rkznjDEgZ4wccKkSROwtlZWVG3btlWr J62zpwLTa63nQhhYqtKWD0la4pVSHZzgP+OLmYOOWK720EY8sWBIxvZGQ4cNBYYTv4XwfyeOHd+7 b++OHbvKy8oJqsORpI4+iqJAboLtjsQYEc579RFyJJ4Gmo1qiHrOQhnBvLdu3eZuXSiBw+ngyd7M MAnPkrZJBEvFrJTgOptAQfsxN7x1PMZ4Dy1rhzr35oaUXt5LauD4l8bOb3xObI7dRHo57GaDWE/g uV8zU/LTwcslQ/Th4cYPgnZ3EXYe6Et8ZOeeBAJ38tKn9A5z/mJllv9EBxn1JCt+5TCU/oK3xcj7 PBNQf0Pqofy1lrGAntcI5ei1Ytj9Wyf1t07Aa6R3XtYoNvHriPLzT+rrRa5+g7zlEboB9IMCUMEI 9bgBFrBBdf++AyDsTp074lYRIADMhFI3jgTZ0bLqaRFkAQJTn2mbBDCppwWyqiVxBvVaQphOVRv+ 9EK9UaNLuu7jhHI9YtHcGilVq6YXxEgSWVD/aTm+fdtuXbsd2H8AqB36G/sc2QV/xYpKOuWVxap6 dX2hadxwpvfNt7zp7W9/29VXXzV+3Fj2TU6ZOuWyy+biBYFSx3NGzU12KIEApi7denQdPnxEty5d ARKcoELhQBA8zkHzZMdPGYSUqfY0gxHnEduuZbOO7ZqPPnWi/f4jGyqrj4Ax8HMhGaft9BxwcsDQ Dt27DK861erwod9s4KNFMlm2+1fQIGcoXN+PsO+SXhROMl9BG/xp1rwZccpHjBzpPAHZAPKWlu4F 5wk4RLfckJGJGRuZ+/TpS3ZwGPsVeZi2z3Zox0yPYxEBi3qtUDLlUxHAEWnxoHXcIbp3684NlFi+ lOPkM2rkSE5zIgGzHflPjUS8pp24c7CMU1pSSgc56QokBMFSSEXcZO5GbQcOGggaHjduPIZ8HtrL x08ef/KJpwgjSHUhzyEbprE3FWN/+kQ8J76kXcgVeHTLlq0d2ncAcxNwEps3btaMGCL3AXf37E5n zZCXLAwBFj3STsHGCdHaHfyELdw4BTX4o54zNIFmGiSbrQXcw2dyYWw2On42X2XXclPODcUJm6We Du074odz4BDyvw8u8RxfEbI4eYBmJ1HRlUJJqw486rKDEmsgkZjP8Ny5FiXQNWwjwZ8Z3xlmx+B7 SuO7oeyJpO16x1Rg6/gQyYH4mocAOxyU2Pw3x+72bci8PejD6E1pEKBEtBmLivHCWKGQ+LI5OZEG C+RnNqv5zT5U8jpwnBppFLAj/LTySg9+sruhHAmJT1zBTTS8rgRnlxGr4Ve/+tVwNamn8FeJgP8d NZ6fzrrAqzwH/i8I5AW5ermfu0j/WhaP08hbuAChqElxswYklRnKA6swXtTEK0K7YJcFm7oGjWpH 3xuSmbwoeFardTgR6arbvMRtxhxAQ2sZMqKNOkltZGIVm5pexan655UqGSK1aVECcF/rOFn4SWAK 3ZRVroH/4h7tTgl9+/aGGA455NhCqjF+As4tbLDL4jP8D6AvVaGtQ3PncQkPYcXkSZNwl7/5lltG jx7Ts0cvDrjGdWHI4CH4vILnCAtF2O/tmYuOE4PKqnQUaBZ+uFGb1m1wgMH2efDQAVqBJw9ACmTW ulUbzjDC0wc7PXwB6+EoTEcRbuPwofI926v2bKk+cHBn0+ZHKKA5Swjws3mTpq0Pdu59kvPFyw41 3r83GTJV/IE+5ba42S7jp5iPG5jv9EPkbS8E233eo2cPsLdTDuAffDt08DCmerojFtlJBhDEtIZv cd++/WgO8xyouPwNlzM5uea6awmHPHLUSFw7sqNhugB/Z1w0/eqrr77hhuuvufaaq6+56rrrr2cO c9111+IjMX78eKIPbtyw4eSpCuq9/PLLZs2eNWr0yGHDhxNvHqs6AJraCfGG6zahZjZv2kIrXWRQ GpVMDZb8dI2FtxgdmQTxp0vXLiBZgqPAcGYxmKgffeRRQZX9nv8WBBZ0nCu6yJXxpKEkvztTVvMc gzRTWZA33AByZXJ7pKy8HORNv4sCO3XsdMutN8+57NLu3boRpy9NdbKlHkaczmBOgRiY+Mk4j9W6 nKY0XTonKHwiuR0zL9VPg8QQQx+VpsNolq96cdXWLZsJhUtYqKVLlu3cgWDuohAYQi7divwpRlQM oEG/FyE4jHUrpN8Ncb8wVF4FLOamW7aJlgkCZOzZU8rMGpLCMh3gOPBrDHmlVJHjbfBfibUfhbn5 J9TuJMG30fXxRbb86Dh3cPKQXNIgaA7sTvkEe+NAMSaKTFTE06bRw9tOcXxZFIUgpcwY41skJVRh e1u3at2SmEWVVfQRfVcciM3Gxifar1BeAuu/P+uMBcWedTn/FzJe4FXDBfICry7wqh4OnPXn4vUl V2mJM3QkpIMD+KyjPvkrxlItoWtZJh43fizQmROhCdmL5iAZmp5kQAf0NAoe2O2icF4RBvhWG+nO KFJH06CxJEB1pWbVUKT9NZCN6txC3HZGXa6kE4yFrPzEvIfqEjgG0pIY9Zz9KkCHWnw/1q5dBxng hvRzxw7MzMwfVL1a9fJXqM8C5ad2528KDj1zxszZM3v17EUBp/hXlS18c1+Bdb8RASWomiBron8u yMawXbKnhI2k69au37ply9p1a55/7nmOSjl6+Ag2sJ3biYV8hP9YNyRa65Gjh/ENwHd29eoXiZH3 wgsLn3/uheULt25YeezkiYpOXatatwVwNEW9g0MqGh1t0xkfmCalu05VJBf30wEl5E++ObKIv3AP YKRVWw6IxekT/j/mQuQlyfFjxzhRnC169CbocNOGjWxXBXgjDBHNDbZMmDABy33m1NEUdEsajOXv /+D75syZO3jg4D69+/bu1ZsDw/EXRgLB0NOmT58yZfKQIcOA7P369e9N9PhevYlYB1Al8DYBbACO dBZrCNdedy1IPUFmDn5KuzxZ/cBdOflgEEyPyCTEjreltI4WQZVOBbQr5mYCJva5UvuBQwebNEpB A+2aBQvmf/fb32OqidTQ/AKhChgU0ssTo75YqcwUojkQFBWeJK95RkFzthVWIRtYndetWU+HGmme Dr/hjdff9uZbWOtgTgisBeqR14HjuKCP+AkTIDszsjdFhnWJBgUz0JjOImxuWhCYOkZSBOsTJ5n/ rF+/IZ21u2MnOyC5IFWnebghZhVWOnasIoaG3IMAByM/5TB/JU8Iq82bJ7xiysSUkOWO3bv3HDmS fIr8wsgZq4ghL68gICRTlsYQdgYl5/1KmDLGvuT50fAjEK/yfRFjwcTOIhyb4m/LhA8083c+8pEP feTDTHWIN8p49MPFW/4qRRJsUbSOUN8cUHL99dfDB7fE2BFcAno/aEhrFrq0DRJb/M3Jf6JD5AqS Ff8MfsbHquCrVVcJBcleSTnnn/LzX2OBgjj/BLyOarzAqwtjsJ7PzllL8utOrpp6mnrQjY7HGoc7 BGqYh+gPLpewE4A4VcFaOSZhA3K5Aq69B4MNWh+ljucowEv1I4AOZal+4jmYQNhtIAW1JjeqYS1P qnARkp9+jYWoK+gxah7leEIN3h2s2OLGyj0luzVQ9RkWLzUcb/U25jmtOHzkiDoSygEiPIEGXaKd A6hWC/o1zzETSF6KUjJo0NjxY9NB8e05/ub04nigrixlM2JoeDSURjIuqoarq1evIawKJ48QQOa5 554nYiNuCWvXrJ03b94TTzzJX4yvTzzxBBGmF8xfwPk+jzz8KE9IDwjYt2/v4YOnSrc1P1bWqF2n mnYdmF00qqpBrzdp1ORU++4HW7Y+dfJ4s5PlWCtTa8QTNkSuSmTMfIQRPuRe6yboE7TgjEjTI3zD kTeFb6usKCktyQ5Iqjx8+AhQVddemYO1G4eljskVqD3sxa5/0YyLmMslnNekUTXV1lRj1CdgvPgm OXynMx4J2ohxP731hr+Q0LZNOwLqAB9nzpox++LZeG5QBbkgCeBSUXGKIJiedCO2o1HcGyXa+QD0 B351ioUMY+smsEmjxjVgdohfsnjpgw8++KMf/oh5Jk2mhLC2itvyGCi4x8PwjRaHifUjPTyBmVTH eEESOIUKYcDkvHTxUszPHEeFhAjjrrr6Srxodu7cDdaurqrcvm2HFmLHnYMOhjIVadKsyfFjKVQ2 PKHh5C1Liw/pAs/pje1wFk+nm+Zp96TOOcZOEVgrFXrmxKqFqyUxE6YEyyElhdBZDMYQZgea/e4r sS8X5BF5EMCqcxfjxY2hgey5l7zoI8uJr4RE+iRy2bq8LdzqIDKqji4zo1mE8nZNiDQpNR/4sTKZ HzochN73/vdhwubJjh3bVq1aIzEhSyESlOan6X3ve9+s2bOZGsHnNWtWHzmSlvikNhtZHIHZa8SI 4Xx5unTp/IEPfuCRRx6Nr40Dk/KLtXWM3Pyn6RxmjAnMb4uA89/ks67xAq9C7OuClSHJF3h1gVfF n6xX/qF73clVU09LjgsLq7owHf6c6VrVD0gXOE6wXtSJqlSTrV4KABojVSdY3CrttTL2X14PhaoT qVMO0FNcrtpTrxsngSq4EWGEflX/oeQgBvyRkFBlFZHaPv7xj334wx/CCQGgBiajEIjR9Zy6Anmr QtTHFE5R/HRnGBW511N3VVGp6ll1biGhoVXYXAGpSZDAXPMUehn3EqyneG+nR8RwAE4mmJJctFs2 T2HOn3pqHqcUAZsEfFqXNYsmu2CGDnmYxUBMpkhSgp9AaYePpNAo2At5DrTF6Lt3377MzSazC1ZV E1d956ZG+3Y369ipRYcu1JmwKi9R9N36nOjc80RVRdPj5c1PnkhglipoXeyNU/r5K1SN1oE98Ja5 8qorpk2fSqg4yFAeXpL1dMYbUDthOjAjx5uXH8M0D1qlFUI0GdizVw9ia4BF7JcUfmTgQNA2KFwZ aNak2f4D+2kpJJEMtqXZQ8I+6Z9X8rc5fdDPQQ7hGTZiOPtW9XagOeQ9ePDA3hIWBDYjrkJewVMy A+e2H6TOyuZXiijJYDvbQxE+oqDD5WVLV3Ag38IXUjeR0jmkY0GkHl2fY1R6psA4LpRSna/yOom3 bqUAGe/ctRNesdyxdctW6oKFenck9lbXDB4ypGNndkk2Wr9uAzMcSoZOBEPPBH6yAQDf+jZt0sZK VhIQCd7aLiUqgpNQJiXbF5qiuaEWMbcjMZomBJc5kdGJMQ9F8CSmBJiv33mIMWmEvLxK/Zg7vymY wEO+M0iRyFVm8pZ7yaN20T8Ttosumo6hn+rcrCyHeWVikjmTjxYV6DblWTEIJO0Ta7QHHcLcuMPV 4ZAf+Ky0MF3s3bcPtcJn5kvMH0xml5nLAikfhmDI4PRfJJ93rL0ws9q7d79sVzzIMmXq5MFDBx89 XMZa2U033fzNb34zvjO1Yu74EBU0M/+BeuUZ/fq98nLy1J4fys9/jRd4FTyPUZDvhbwgXeDVBV7l VaH66JV/Z15/clWAvIUj6Ayt0Spg8Rlqjws2GR9N1JgAX3ZpKubkUg5znTN3DmHLgD7gg9MQ9SXD ktrOLDJdQVRVZ94IyepJMpRZ+KKYS/VMmizoRFL8mJE++KEPvOlNb8JXEk8E0NGWbVvxf8CApI0K Cu1mqtNuF33sRi5hhOAjlKhaE6Dmk/BdCVUXiETigzaMspj8yYpuBkCdOlkBimaT30Hc0I8zT6jE HwOLNjGemNhojvUS6Yo5dCfQpiieCGzBDW3XH0A8ZzKRlqAEU9rhfU2PH+7UpnXbVu2rGjU5WV1T he2YA3datTvZuVc5lviWzboMGzwBDw29SvKtsBwbBVW0nXgU7/vAeziFdfyEcWymxJK6ffsOIaYu E+An5ht4GxNWm7aACoktiLu8QM3m0JVMAtpmAe846xRGQTa5WrdsDZjWZ52o1itfXAlnEDiaxIQB j4g0d3nJEzcJW001p1ESxRH7Oi7mSK8zB8R108aNROZhPyXx1EtLSxCG6Bcy5v097HTXOnyl7NEj +/buA38TeARKEOAYAsqqlJASE6a74uhrKYzvqUwTqcNedxwWyAnVOf0zEjk3dKunrkQ5JNidIvEd Qpa2bt5C01h1ImPMAag0RTIhMsmJk2zJpVuJVAifsyEMIOb8zoF4z48cNYKzZj2hyXWkGG7cKHuO cacWDpZAqNFwx7h5xeiOSkXUvCRwriu41OsmZimOOCVcxgZIjQ+Ckqz42UeXXTanV+/ezNBwv4cu Xrmjw87lr3tnYSDtRaJSbMRwlUneLxV8JfBHomTPz5L5QYMfKEE8by3TMDvOjuQGWaZNmzp85HBi JeKiM++ppwhnRBYZKJf8QCkA7NOdO3cu23/5+iDhxIN6MluewqvET4pEUqEjev/+gxgOCBD0s5/9 LE9PyEM9N6HJzmFGP0cNqd3Oil4LTjYk7/+OjBd4VdDX9XTrBV5d4NWrMepfd3JVaPPm04+lkOVg dIO6TT2qSUzMJ2TUIG2DTYlHwR1vuf3KK6+YOn3q6FGjUJDEDAl17gc65jdyX10VCkP7GUrRKjyd J/9lV/F7bh8whdPdb775Zu6PnShPJvPGTQhphyc0Zr/Y8KQupN4s7Njp4F8Wi1cloR7wf0A3g3sy J+B0pI5zD7FaAI5QzGrZoF+N60+KZbLBusGaNWs5tAX0tnjxouQl8tQ8ziFatXoVTsO/+tWv2faH 344whStghDeyRaUuZxyrYkQNtx60br1eJpBX3Bwra3LyaPd2rbu36VDdpBmIrSr5dBB2sHlVr8EV 06aPvOGaOy6feyMhVZYtWUpjxfrkDRpEYxTFNscbb7oxk4cUIhqgsHLlSiTEOQNspzuA3YMHD+rR qwccxvTO1kaYoAg54bHjEgpPoY5TmERkA4DOVr9du+mxnevWr1swf/7ChYvxnMHNBt6tXrWaF0Q+ 0ZbpTA/7+tZtW/FxhwzkDUBJFVSEc/zTC55ZvGgJZWIOpp7YUmkneskxSnOBRb6J29jwYOR1jPpY NI1oHqDKOZumYiLBX3vt1RxKSpbsDKljMW1zsFAm3eTkzTES35ogwKK4lMkROBwMH+7M1t2QMo0Z xbYtTDR2IC48jOFgKwSdcCatIB05Sn0eyEpeQvewKyNFJR80kN2WTN/AxuA/D47RqKwkRzf5xCHp xU+Hg3A/dEb+0xlfABeOSBkSK7aWz1k0m+POdgLr+zXQhSbGl2z3JzPq8RPHlZWXwSKmbXt2l8Ax p4uy2gIpH8lECLmnOXQixHMPScxrLr/8squuvoKpSOkedqGkznKimAfW9pGTScokAX0Bl3QxojTq Zb8B7GUL7DNPP0N4eHfQiqFllwLm3OPGG2/8wPvfz/zs3nvv/dWvf/3Y44898fgTxmD1k6IAcE+n 4Dq1f/8+jgVgWCHbIZkNAa/5TjmHGaOLG05DSELDswReP4eUN6T2c0vqBV7VyvNamXyBVxd49WqM +tedXBUib7YnsoSKvlEPqVTUlDonaN8Cl2jkFsGozGbOmjlx0ngcD4gK3LNXT47EIyX6CY2rvufS AirCU1H5nHteGUBXQ6C2WBLk/WvFCjykdgIS40M5bOhQgr4Bi7AzcuT36tWr0PWsv6PP3CgpXlGz kldvYMi76aabrr/+OgJu9OvXN9nrqjCP4eBxOvqeWaAh7yogNLEor7zai4fQhi5Fg65atYqjQFet Ws3OyWVLly1cuAiLLB4RWctPH5USajtKFvHk6+KnE5gAB4HAAiHlgYtNrq5sVnOyd9XJjpVVJ5q1 LG/WvAJ2w7/Wbdp06HK4Zdv9Xbt0nzLhsg3rt0GeUbqjOVIlEzDdTZ4yCU8GqgChEo1u/vz5xt8g DRmZreFqPHBwOncGNtJpGPgJDo1tWxAmQoLzRvxo27oNXim4Yq9YsZKYITi1E/WZE4hgDuAj7Xld s5aJyvx583HpnjxlMiekQxvEwFh8b7Cms1HPgJKUz3NQHWb4FctW4ntj7HPcfkJuoTPEQEhHLoTQ xnLv4eTQJrxOKBOv6pcObHLCEPMHEO0tt93MuY9MCYhMwuwE5x/Hhdkt35t4EsBCIeGtpm4TsNcC HO/O48ThI0fAjmYH6qVRlh39LqoLqfPGMQgBpCckCztQE6vbtB4woD8HMxlnUwyKJLONkgHOT5vj SeY8d9Jl+U53ueeJh9XbiU4RRY2Koj3LJWDVRco0CrNdJhSOJRoHu0ObBLxyimt3yKhIQG7YT7h3 5ptYhUnv7EukrlHcz4huLU513EGRjd9THIRECJ20utK6FcKDHxRZCLRPp7taIvG2106nHN1gHHdh 6fdwLlZFKESBTNsbXpqfh2hBDn0yc8aM8eMnwKRHHnn04YceJog7/NErhrrsXMcsNBs+HJaxBdNv byinhuDI/FfoXGW0R/KfuIZQ8lqgvCF05pv2ytt4gVd18bxYHi7w6gKvLnyvEvAo8DbhkapXqOcX SlWhgleJom9kn9CBNNiq8UYYN368J0GiWImZwAl2GqUwDQqAAp7my1d/awGifJMBXi1fcBkj1iek vOSSS26++U2sthNyA7iFrfT73/8+SpcJwJhxY6AQNMZflC7wBe/xDBYkPQoued973/u2t72d6MK4 TxBzo7pRDaFF3JNHyeEkEJ7i1qh6Fvp7k5chWyFDRDaCNn6mLaFt04mb5pW92oyFIMX6Ml+Ftcs6 0UnkkjPiFcvxbdYKQqYc2L3l5P7daVrSpsPJ5i2znYXYWGF1473lp1aR9sD+quefeRHbqyjWksUT JAYWECebo174S3N4/jjXY49TID9JDFIEx2BB5Fx00if7ZUVyOMEIDZ6QSyJRjdapzRV43eCysn3H jp3MQ/THEM+ZRoAFrGG7KssaPdL5L60ztjblIRsTAbvs4qVclg4QV0rA1M1uVHLp1gy1QGQioUCk Yqy82YmBe7zRuR8cL5PdTMzf6AJ7lvp5QmNBckh42hjQNPUm7RBU2UxhuqDQ3o8rxMP5p295CPJm JyUSAVcRFZiDKMo65yqZA0my5uoBZV+HjNkRlMYBmZAB8ZCAnbttmzRj0QUcizgzFqIGMkCyJrdh Y9/gIYOT6bdlilHorgO7QEFiRONUE7MOobOcDLG3aeSy1/xZIKWCcvLKwOBk4HieBF4PaUnfpgz7 chASuxJ372Jfwx5hN92d5y1ZoDlrdbpoIGkkBkqYtWAOpy3s+163bj2FUCYw3W3cFEjD/ZpZnfKv uEK2Jm0fkpIgMCmYYGUaHbxFBtzfomAL2WF+tty3nzOJ+AY+9dRTDAT2s0qS4NtpiRf3koqHHl5D RlkNDvsFzv+s5/5VyvhbJ+D8N/msa7zAq3pE91WSz7PurNdRxgty9b9MrlJUwXynEnAaBcPXX1WU 0M5L2FrIqwVazRS6Fl2CCh85YgR+pSAY/E2xWbImu3HDRjU3MFqbUKBDVY5KNynIDIjwFuRhZEPj Fbp5TmyhChRZgqQJ+Qz4rqo5Hf/koQcfJhLFhAnju3brxi41LNn4MFAI6/jjxo3D9AWyyXbRHZk8 eRIxBABnJ04yx6jUz3LP7l14qmCwp2luX9NcJ7T1UgvKLtFPwCBvCi5xFS0CP6WzYLKwzaJ52kL2 wIKhXy2zoC7fCq/zKQUE8sSMeemkrsRMpladBzY62edYeVWTZsebt64CBHCSSYvmTasbHTt0YtnR 8tLdOw83quxEAWSHJFvtVlfKBKzgXk0wRBZDOAn8vvt+vmdPib4czGrGjhs7ccIEtk5ixU/zFuZm +GFv2+5m3MC4ciZDM8c4JJIAF/wXYmafwhOqDj8fcC2YujfnqvfpTQDzzOq5jwgwBAPBpRuHFqrL limOlpbsZXkBYznEI0gsaMyaNfOKq66cOm0au+JAq2DZmCtKiQhP8ZNI5RzQ5v5F/RlkSPQyGz1p OBJFjENayggg4jpH0wPF3CqQn24FOozCA5GLtLgcYlRkDBBuaBSGT8PCcEUWKIkZr891wjGZiNlm ad5OW2izpSE2vDIBAzLSj8wI6FMegvzHjRszdtwYgnWAv+kUzj9CmpwQUhdTCy4Gdfv2HayOKgwW JKMc1yGWzgR8LrKUq057FFRbqrgKOr0ni6LrDCe+PFkJyZdGY3NyMknBQ1M5WVDwNNXRXYeHerPw N+0oeKkuCGC3Mo77UM4BoiBvo7Vw8WGhIkp2oyop+Q7o6oaocIm8nW9IsJ1lpbQLkiTMi5S8ctUO 4cHZjKWhefPm79yJWKapLAW6IENpfIjydCr8WRCf6ogIVI+mqQsxFHwB4ltRV/p4XpyxIMsZE5j+ HBLwOqrxAq8aLpAXeHWBV/V8ds561L/u5Oo3Nm/bjPpBB3iOjNpdlCAEEd6pHcV8fm2B78Rd5jcx N1YsW37Xz+6aP28BgUc6d+rMtiFUPuu8KjA1saBTpGIJXKgrlChF8VbzMJqPBNqhXVYOyyUAATVO fIyePXpSHNGd77rrLsDZjJnTUZcoOQAn3rHADnwhVLSAG8yle0tLL5p50WVzL2vaHBNvMu9RMiCP 8HwExkYjQpWL5iJvIXKBrATgCG7YhOCPHPMnVQNi1Nk2x/JFAF4hcHmuWmagan9GydEFZs9fvKJR mPqIuHfLrbfMvXzu2LFTDu5uu371IfZ8tmxb2aYNcKcxOy+PnShr3HJHz34Jqxzc17jyFAggTQdA NkwVRFFw2J18bCn7xf2/AL7o7k+jiKX9rne9c8aMmTh5kxg0TFA8wpDjCI6BFdYFNCS9kys7EQoD fSoMGnR1j+beaQPGX2CohnBumM4temERXvJ4EfCEMCi7d+3moBy8U4DdPJHbU6dNveLKK4YNw226 U/ceaQsmdkrjRcp5BVuB5K9wHxSVxbwr4a8iZ6dDs1ZnwaLmYQQGUhEwYtuzDzKDlKehfDQ5D7ij 9/XM5lXMo6iC2pkbUDjiR9ROpFSpgAaFh8Qyx/kq2VOs7mymKlW8gipsqxTlTAM/ewA3/7HfdMWK F0v3lIybMP6yy+fgTc5Z8XAjTZkmTciOceVA2WYEhCGrxmO93iGMv9xzMhEDjTk5zTRoowQ4FU+i 89KeRRsVMxabECLtckSMC3F24HXlwby20RtxOc8JoT1w4AA3zrrTg1fibxOIbnlokEQljdkAbCHW DbNBKIdSqyCxYF2/FDA3QVT4aFAvhcBDZcOJmd2nuVqaeZ6F9DmcHSaQVkhE3p4vRgkeVeuxOFII VbDSjPCfv4oWb/26astQjGtVz3U9r0eTxSe6Ln3fwAQNTPbaofwCr4p7/LXTOwW0nf/Oeh3VeIFX DZfk1xGv/oe3CZoG9YC2MCZJwAUVqsvQKkW1hRYyHqaz/7p10wiE1scACU5KiDY7EpL9aqg3c+lX YDn81WymjkR7UTvFGlMCwCEGMiADKaO6BDVOniopLd22fTtry5iXfvbTnz75xJNYDTmxBSMpHi94 j3AYDbkyG/w+akHJ4eEA9GZHJX66GHETNmpKsdUvPP/8nXf+mLeqQPd3itIconm860+VfR4/xc/8 qJYAcIAICc1Nse4AU0riJv8zKo2i4iZgjTQEkM3TIzRhz97ll19G1EWgFQzp2qXbuhf3b1xTdupk Vdv2J1u1Tqf84McOAR261nTpXdaoccXxshY1lW1BGEAE/kISVs9rr71mxqwZBItkK6rwmo7m1Zix Y975zndMmzoN7x0cG+Dq9p3b7//5LwiYSA9qHw3WBcaCA4I2hCE4BmfC2h1L/0ogM7pRo0dxcGCa BLRsgZxhpp00aeKkyZOHDh0GZMTJhMUK+kurMxBq+vRprHLQbwhPikvYuBFuLXiQi2m01kMYtSui PBdPp/NlMtwfXOVtOtg+O3kRmjUng+NxbmEegjMVW+LoQ+rN92N+jmp/WZ1Y3Lb7107kBgJAY6wq MEcVhEEJLUaeiVBJ7ciMWM1gfFqmA3kLuKMh6STRQ4cNUc+8d9vWrbiA33TTG3FBYSGDrmT2gvM0 YSIh42jZUSAfRnFWIZwsMenKtq5iie/QvUdXzge9ePbFuNkAwSmTJYEUrrIGQHkam8Z0Oi/PgnKf cDmFkOFezutkAvfe+M3x8yJzHPhsFX3DlW9IH5nyMnYa2Nemt3YKlHgd7h0aTq5CzLxR8GIar+S4 KmVAVafcMaCcLOWpslK6zA+UDaRMCvGEUfI6U/ITR3oK4RW0IWbCbqgVi0sqf0lM3lpt3qFRrCv/ hckrm7qeRy+cRcYCZXb+CXgd1XiBVwUcqEcgL/DqAq/+L3+vTiPvUJMoEk+807qmXU0tFa6cgahc ltUgjVLEXRX96h444DvahXutPiRQO1KmVuS44TmqLhlaq6vddqbGRUXh7WrhqlUhuGiDG+gBQDz7 zLNsxQN8xxoxK7o7tu/85S9+iZOlTt4Ui9oDNLDiTLLkRnv4EKG+spX97YQe+cEPfogpVygYTt4F +CmvAKRQRR5oA/0KqW6bE3P4xN17AiYe6qga6jNvFIyilEjZ5ZVHsaFHreV0wBbihTc5bSnkITUO Hz5i4sQJbCxjKUDEtnnLlvWrdx/c0+pEWYvWbU62bEMQhgyaNG7SolVljwHlbTtVNmnUtlkNRu42 gg+mKJMnT/RExm7duvbHh2fXHiK3QBCxja+/4YY2rVtXYCrPwlAA8vBFWb9ufb4h0i8rgBogYy5Z ZHfbNLs1QAxPIHvixPGf/fxnOEaetgwaOIi/48aOnTBh4pjRY3D5YGrBLlv8mDHtAgfDHkkoNwJ6 cPQ6oejoZcDx4kWL8cZm+jFi5Ihhw4a2bdfWLb+6DYh7XGYRmSlg3NNwEKcuT/ppJDekqsqDBw5q Hbdp0U3cxFDKf1ijXQVAUHxJ4a4G6OfjcEMOMTMTppO3No2qoUTA6vDhYfDNomJ0CIspUJHGoHvF FVeQk3voJy4eY5NpFZF9MBRj8CZeuIdnae2m8GzvbG+OhZoyZWr/vgMOHz2MxDPtgf/0IDHI08Qm F4ck2ugQdoKtiDL6WHrSVOz023Gh6wVpApHLChF5uMIj2Jdfdlnvvr0IZ4+fFAtXglqXJqhL7llj fhrgK23V7qckgbCeG8cX6X3FRe2UCZ8t3yEskrZkO8tOJ6Vrg+ala5JjV7Zbl4xO4RzFXBDghmC+ aeTiSTpTKjsYgU3JOo5nQ6wbvRDjvViECj4R+QQKQMGT+FacRcaCoqI35UytdZ1bAl5HNV7gVcPl 4QKvLvBKGTi3n4vXl1wl5K2u8mKlG60DhiY4rnvX+PxpBOJG+00seWvAJrsGTl6BuQHBYHchqSW7 vE4u7nXKlOMWaCHWThr0lrvE0E9kJ4HhveJMeFGRH2U2JOH6yeWWNsoB/BlIxJNcIIy8VIqdCUs8 JkCX6fFSIOrI888/j+My+wUxmpIMmjUcSmpeaRWICD8DFpssdLz0q9FNhtIFzTgtgSQQG1WovWSR 96HPhHGWGVcgBgqUn9YIeAKBgiY5wj1sdfKc/YW4FhB/AyQDiqJTCCdMZIZmTVof2de67DCmwZr2 nfHreMmzvEl1h67H2nU+kSKRl3eorEi0UfSgIYNTWwgLg528onLzxs24wbM/Dw+E8ePHAcISEEnx pKtxMnnwgQfpKWq37XIJeiCY5meuC+nQRHjCQwGWXSmyidlOxpmaN7/5tjvuuAPi8e44XVwq8HTX AMiSGbxFM9AMVm0naanAFFwiXXB7x86dzz373OLFSzizEUv5sBHDuuH5jkdTiiB+2uVXqYYwXUqg RC8jqqEr6TgS2EFkOe2BnZHjcwWSm5Bqe7b4sxKw21abS8GzW60FQEa3Qg+R1DlTE3xvacJoelks rnOCU98CadFAK0yEYVjYmXJMnjyFFQOGMhHZIZ9M+MmwG5HwjjhjEEuR9HQNk1ULpAQ2S4wZM6Zz CjTemrYDlMfiHD5uHJ73uC8za9Wa64IA9PDTsIYUFasHvO3Xtx9s1APE8eUE1Ybkzck+lC3ONwTl aQtvp46NGzXBadsAINBjNzkQ/IYoQjzXFC3s1lnIkk0c4F7ucTmxhzY+OxGJxe6QgPxXS/4gCcZ/ tPtgDtxzdu3s3ZZavtNOEvPcFcLk58MUsF1bvLlYhZBgLRfFkpP/RMenqVjGyIjwcDQs00Uv9hkz 54mf3PATiYolqbysjho16kPZdUt2jR49GlOFmzEKCKAcEtdVzkUXXUQtHnIcGc0iAQUk8RDKrYg0 LPLow0M5H/vYx97znvfceuut3FMds+jiTzG5aPX111//+7//+295y1sknidEl6IL4tPar18/Cajr glfZElYqDR7Sm+iLWpks0+q6ijsLeqDtrW99K6ciIIrUAmca3stQku/ToJ/nfNWLe4cnTLM//OEP w7o8Nwo63Yz0MgxHcdclV8EN6/KyjVBC+Z/+9KfpIG6oFIYjM5Es30Z6kKLyhViOgmEg4OgsM0aW 4nIAKgX8V4ESrCxfixkVKttY0Du1to5kskUZzjc5Kq0rIwQg3sHPfI3nXK4CM+RZ0XC5qnUo5Ytq +GenoC/Of8bfOgEvt8mNAWd5ovkooDhd48ZLBGCqQqVczVGhhOg2kE2semscUoFRoBiIG312fYWg oHF1x6QcF3n5wmKNpnxRBR8mdBKDkJ86QbqbCmIM+BAoR3CgQlX5iTZUxup+CkThWSCjCKp0X6Zq ACJfgTCtiRFJL/3UEpZ4cWF8FLh5CdP8Jqo3D7XgihhUzLadmQPfdL11UR448roOwE9rkTP2QrDX ZspDaRPqGexCDIGeZkcpm0fZL4m3wcrlLzKdMFYDidk6x/HjrNEDjuHwgw88hC879bRsmY6MIXBe l57Hh086OHLawbYdqKu6kn885WzL8jZ71g/YvKz3zq0VxNy44cYbMC3zASMXGxzXrFpD+2krbBw2 fBg2cfx2gCLEc/zWt77NOSCwWuQN8bZRSOFqvq4svAKCuCIvThJLCVb8IoDyP/PZT3/0o7/PWY5A oDjG8iVxTakofNu2rXfffc/DDz/KvgKmGUBMvIGZh1A1kxy2P3LhIUNDps+Y7qSOicv+fQeIaegk gZRUKqt1tdLwKWDC8AxOcvcemhhOKgmniXzpIBU7SMkRtdtr+cHlCBJo2vW8VXp9yBM6l6GHwKQI Hi2ag3Hxf6+sqAJuMquEjYoBvMpCiR+XvdIjdueJw8QxRRpKu+3Nt/Yf0D+h5zatcTchWCZz0SWL l7IZmvIRSyIpIhh2HD1FRhKAkm598y0cZEO9jD4yduva/cTJY9T56KOPfu+736dAWGpz3JWRuYMn 12qNu3Qo8Q2HDB3avFlTCMXvnHjY9HgsUFBRYGgKIa97HwOauNSA2I8cOYJcBNLGv8gao9Wk4d4V Cde+7DjGI00jMT9dRgigTHalTjcnZdUPiN+QAM36lMeUzP6lsQgDV9BJGgYaiZ25abbgrb2c4u10 7KgHEZMZCkE3g7unTJvCtgTk87FHH8M1n2SeixliEx+f/JO4N2Wk5waw8r3vfa9ADxX8fOc734nR oSDjF77whXe/+93FGf8lu/LPIenjnBv8sY/VWk4Q8K53vYtjPiMj6bnqIuxfs4u3EE8Jv/d7vwdI Bc8VpP/2t7/9N3/zNwWUg6v+7d/+DQBXkJiuh0IExufSXD9nsGKQAAJ+8IMfwKJ3vOMdUVeeyQW9 48DnKu4saPva174G6M/XC0mf+9znOLa2gb0MmIOeYsqhECaH7jABX1cSI2PF3AD92+95UklMe+ni r371q5ElL1d/+7d/C6omo+IRbaR3kJksjtn/uOj0j370o86j8pLMEnQUki9HwaCn8tJixnXr1tnG 4nJIn+de3LOz3yw+MaNCNXLkyAJe8fOP//iP3/ve95LFAqMi4qSRRbGsdQzWldFupd+L5QFOwrRz Ilf5hhR/BBooV/+bMtYzBl+bvCo8pQw9wc48FAMYDgSAAOkdawAQ4aAGS2G3ioqfvFLtuUassKrn vNFSG7CYe0MyAwuoEZ0XO5DEji6mk8uKQD/Wa3Vy07+CPApUxVKm7gFCH+PQGWfDhWA1rtEkzKiy DDWZLznGT8GgzX9sRAAqbxEAb/mptuaGJqSYbrt2UYWYIy8owUNvuAIf2DovssAxPuJcRELECsIX mXDXffv1A9zjGEC0Cv4GksOpAC0OYuMi5OKO7duz/jrt24PV82BJm0WPd336l91LtgEXsn7kX+NG LdsdGzx545hL1nbtt2fJksX33n3vvCefooQXnn+BrydhTIaPGIZHB4Y6PnP//d///V/f+tZ//ud/ /NM//RPxBmkdxMDYbNNtf0jFz4FPHpoACy4/tf3rpyu+ESopGMJfroSGq6ueXvD0ls2bk30Zq3q6 +AuXm2X/YdtOB82sXPHi6tVrWJQBL3IQ901vupFzf2bPnk11uDMc3H+QWCswjzKcZaVFDwK7ZM4Y CpiSKYejL6CBh3CMuSgXlkiY6TpMSJ102u+RN3/vuLCNTuTI65MQYKWFep2O4lMOl9Le0O7daCNn x+AaxRSCTqSxlAP33A4R486ipMS2KM9O6vgD3sfDm4fbt2/DA4cuobexuzJxAh0SBP0Ivt5Hkx1U GGqUD9Kzj2Lp0qVIDr2/eOGiZ5995vCRQ82aJnRORaJJ+lr5p179OgTQsfIDXQnTt8w8ZDKSBMHZ WtfpDwg3DhyK1SQs/nb0UTIoatGixfPnLyCWtgx3iqu05yfJFI50cXbn+AljBw0eaEB0iBRA84rL e+hnFwHfn2yG/5shqX1aTxhbpJxYL61ITMs88t2g6aeDLwzdxFIbPcVI5y1PnElykYWZjJFSnZ+n V9VVrFaxLWHS5InQiceU6xvR8BC2/Nem4Mvj17UgAdgOJFF8BQw1V2QEzoKrGN2cB5z5cY3gyw86 ROBBRcUIOE9kvhz4LDKOT2gBYXfffXcBVYAkrnvuuSefBYxy1VVXAQenTp3qIVOf/exnIYYDHDCs 5msEcIOr+Pvd7343iCcLxNNTwMpA5GzBt2prpLHU+KUvfSlPT618LuBVrb3juC7oCOymEAAZv/u7 v0sTuKZMmfLFL36R5wA7Cas1Y61kPPLII1JOT0F2rUyG/8Ju+HzZZZdZKTwEPqI7+Eu31loj1nHy Fncr6BPYXdxk5kX0EU2jOTTKiqjxO9/5DlqJiVCBlIocXq5gF/BByusaCwU1FicrHiZ0BLA7qCoe SsxV+D4UZ6Tv6s9YzGQ4WTCOzlquitlSTHlD5KohBJz1iDj/GV9fTS5E3igJlA2KAdUI70KPopxi 0Vb144dGnKHFTvOh2KUAbQij9ewUYXs4M0qLulidMVyGm5nQo6gll/U146l9AxWJObhMINYXeUuA byXsNNh6CWAF2dQFAaaXcjVo9F+UUzzw8l89kynE6mw9amxy2ONtOz8Lvj7RqIJa8j+tgtJSmIkM NPAZzWYsPQgRCFwGWiVAkRxpEkqg1aQkuB7nq5cfK08HuVdVArPSyS/ZWrwwlzKPlzVZs7DDcw90 37i8Q1WFyBstXtOkaWXfkXunX106ctr+teuX/vQnP/v5ffcvmLeAWDHE7Y4ewVOVbXnPPfssWuGF hQvpOAAEF1MpADfTg8mTJ3Nc0bveefs73nbLdddeTTxHyIYPpAzAzQ2NDW5TuNMhGrRo8eJ///d/ f+DXv6aK559/gRNAH3744XvuvQfLOqrlxz/58be//Z177rl365atgEY82gl/MXTIEDy804HhAwfi 5g72YiWCL3bJ7j07sk2Wmf2yGluv6yrWTqUaiYMzgaeZB2ahx3cYmhA6pTY+dvH9shwRvNIYaD7S WEtM8/IN514EySwhOzqnBYzCcEpoTryh6BkYAs0kEOYyHkng0FPM4mMnJWI+XuFitPCFRQwokCfr PETiICt+DpQGUgQOstjAcy24lAPEMew3eJGlkrt/dg9ORI888tiP7/zJT3/ykxdXrcKbi2hCFA4z baNTJgGosiroZAczaDIrja2ufBYKtyzLAYknPeLtZ0GIzGUrNFETQUTeklgOcznWTOPbNDr69GY4 4IvUrn1aJeCtVGVTkYT+SeyWAxJjHecsW78VTu8pJB8JVIGXTr9OYG4uyonPhd2qqVs/N9+al1ya wEHkwF/WjjAHMKNjNvvcM8+uX7se1M4TeKWonBFz5xVbpPeGVzAc01rBhU1RS2ReTkg/ffp00BXE YOINaM5zUTKJMW3mYVm+hIKvGQAOUFJQSz49tUBG/nqW8EDPPcf4yjeZZJx0BvKOoiDmM5/5DEVh a5SlpicjBnJwNhAwiCcB6cG7dC6mbgmIqq3RSQ4uiHkuFTetgFe19k6tnQXHAKDIDFzl82g5NAds CqkQY6Cbgs9+PQTQOinnguxaUwIHgd1Ux0RFzxkuWvrP//zPMBNufP7zn6+1xjyj8k3OrxLkM1IF BSIeTHiij6iRpvEc8P2GN7yh4byqp9X29SsfEbVW8Sd/8ie1johoqTPP4rxkLHhYQGExk5Hb6JF8 3oLBm8/4ssSjnnLOyF4reoVMbrgkvxqkvu54VYi8YQoKGLMl00GW6Vk6Qfnx+UBziOdc6Vbxawdy 25zOuypFuKBStMvD2kfhukGTUWuZGlf4ntAD7ryNG3PADdYL5tDsYwNwQAwlh593XoxQdRrP1G1y Pw/QvRcZaN2EbEMQkJJiaREFiqh4SFsoUD0dVvNaBbdAzgRtPHQmQGk8cbag+wqVcqm2lXKLzSPO qEiG5EcCycSCMXMAbWUu7pwd07INGyJPVeCN4J5UUmqPJKoJThrkbde+PVikXbtknrRwmZYKrGqy bW2bhY90X7mg54my5hwxD2mYkxs1ru4z5MSs645Mu2Jfs9bJ4nuMyGnHTzLFYb8oBm/6ZeCgQVOn TblkziWcd8OZ6pgq8aEGW2vdufyyS2+/7YY33Th3+gTiQlf36dJ+/JhxvXv1ppkGdNOpQzQZbRdH Klc8//n993/5y3/Hf//w//7hn77yz//6L//y9a99nYXRr3zlK/z96U9+yookPMcVAZyN+R9wKbrF sRuP7vYd2mNZpHB21XI0PeFusJEvXbx0y9atdjF8oIOkRKOyRmjnckoOPSuOjI4r6JoA4vlvSoEo UpR9HZ85mxzDxGkACAygD1YmiIcAznUk3NM9dtHsihkUxoRTFaVEKX5crnIQoJ/IPz+/9+dPPTnv +9/9/j1330OQwS2btrCkAHABcwO+wYUgPy5mGrg9cCNnsOEuePppjM0sgrGz9ic/+dk//9M/4VZE JEc6CJ7ANGGos2WEEFFhtArBGXvcHDl89OSJU4gok4qYDOuBrcdRfAdsERcN9FvhQKBFVIfg2Wrt 0LbU0coTZ/XORphwKlTMFfW6ltsiYwP2k5dO7tK1MzPSFJOkZdqeQRrdpaiaEWQbnSmFAFC1hnPe Omn3iq+NzYnLYh1u1I4jLFMpQ1g++OBDX/3qv37zm//F9hhWiDj3pyBvrR+f4ocxe2lg+jxtt912 Gz/zMDfegvbAWDAHC3T9JUMAk21shEDePAI+Iz21Ui42LcgLJZTMihAGV+VcXgGdqbS4Ip6THltj watXwquG9w4cg1QM7cUNAa0y1dHo3pArpj1npFyr6l//9V8XN5lpADgSTFzslkNiGAhqL3gFn+Ge yxHFFwJTa0djHCHxzJkzG86r+plwduWckVfMEmmd07n8lc/INMk9BvkE/IQz4beTH0p1kQp8B1Ax Haq1pWcktSFCkh8RDUzfEMrPOOpfpd6pq97/NbwqRN6oExQ/UrVkyZKnn346OXe+FLhXlR9rxJrc 0IKZRjwdTktlr45BJwHCGOrEZ8gvScNTdRglYPnG4I0bMRbKLl268u0mRPRHfufDt7/l9j/7iz+b M3fO3n1Ji2MoghIy5idn3JMd7wWKShEnsnoFu6QU0Kiz1ZR6OGhWR48auls9TV5W+VmjZGGue/ce GMV4SNztQEshBwFuFHSr4K+YGL3uDi3hL8/R2caDA9wAcQzbrLBG9kDhAjueCz4imc+5hDgykIAe WzZv2bRh085tO/EdX7DgmReeX0gt9lFCQkwhKqs4GA9Hd6jE7wIERpnhDhQTJB4e2NNm9bP9Vjwx 6nBpBxCL04KaRtUdu52cNPfQnJv39xh0oLLqFE7VixctIRQGLhyAI9LgxoDJEGP2nDmX4lVC+JHL L5/7ljtuvfWmqyeP6t6iYtcGjoF/bN4DD8xb8PTiisrGw0eMZNMXXS+dYfmOnhLKOHPLTJ7VAJXF ixeD/Ggmh/joQwxqwTsWxtKciy+Z/Tu/85Hb77iDGN6NmxKnPDv7phFYrU02szrNVRDhsqXLsTJy TD0b9RQMwbeb6sL1XPCtFHmFXNnj4d5gCU7qnBopM9GnIbQ+DPQmMvat8uNFi5avWP7kk08tmL/g hRdeYL2CsYNwijiNj+GkTgMt9VpyjE0pjMlMNhgb096FCxctfGEhtmpM1//2b1//2r99nfIhmZQu cNEo5AfMDXrmI4A5nHEHDIUkHiJRVAdkXbkSlPiiwapF7SQAy4pNeUjiAwf2Uxo4u23bNgRlxIRf XnYsnYOTSRbdigDwl/b6rZAzfGpExq50MTbBfPRgLCWFe0k2w0+drKhoCHBDiB5lu3buZmhs27KN QCjOdUlGer8SNNl5ArcYDXjFWhKS7HRLwngY/YWUkkWIL1Xumeavuyod7A4u+sjlwfzXQ1Dupcxz Q5lwmC/tokWL2EL6tre/9bLL5+ZT1qV+8s+DCZGxIbn8/thMPtH8BNf6RfKyNJ/ztxi/5lNaDu4H fP3CEeKMZBRTnieg1uwSg1nXGs/IK+jJ+1jna4xmnpHOPK9qrTF4lS9KEBzW7qiugZTni9Jpm1ry TS4m252XoOE81s83WbBY7ALOQ+ddX/7yl/PdimWX78+99977snhl7dTScF7V2gUKQ76QM4pHlFPA 5OLy+aiChmFIvoOKxUOLfoHZG+s1D9lyUDwEgsI8qXQKKJ+K6gLrdUlyrXJVF6/OQq7OKNj1DI2z GLyvZAickdTXHa8KkTdYGZ2ESQYXXlSg5luVULJdHTmCttAKLm4jAX/JouFK5A2b+EsyvnpoFIIh YBDVU8IVXjST1jKegLaBbtddfy24bdCAQbfddisHYWLHnTZt6ue/8HlOqSQOCWqe9FQqwhB/Y1/F 15m5NeVDBk+0/5nMbvZGTGMrvATHAhfoxJqIHiUl9/gR3nDD9W9+85uhGkRCVSF/osNax7+CSIJw WeGJ69pcOobSCgoUwxV/laJYyqFGcon5VP9QC4fhGFiHiw5ivX/FihUYI++5576f/fQuIrSAUF0B pxZ6hGkJjCUYxchRI4gLkWKZl6TNW5YvT7ixFu4rT7Yq2dh3xRPDd6zpzhfvJe7VNGtZ0Xf4wWHT N3QdvP7AoT2PP/4EziePP/oYYbRZuW/eNIEVopaAeumLm268+g2Xju/W7njJ9hULFy57fMGa55Yf 2lja7lDTHkebtj52qoLNA7Nnzxw1aiTkiVfyXSZ5YcflJ13EFE8TfopKnoXOcI1FT1wO8bn6qqsm TZrEdkCSgfYUzooqtpk2JgYLri8+oS4s2m5Xz+N7nht3JQRbd+eY5jns88DazlKoBFhWweV9PDSN bbQc/gbsLlBp9ggDDYVHFyMwiJCw3pEl4pcYMaJO83aWXa/zscRbPiTgd2E5zoGJ3r17NwcAcXBj WorRm5miKNkZCCOdS4ccMzq1wGNbfye3GIKztcoLJW1mYn5FknzKZksA4kdnkayYn9Am2CWXc2PK YXbq4gMPIYy8PCeNUwvZS9f37NkdKRBzk4YbJyTiZppAzHWcwvOwm7roZX2+XT1gwoXDNtMGXFOQ Ls3YSBdvKZOKJDs6jpIhiRKUQBeyYvVPMznleGCt84e4QgCUmRAqRwE7NIaNGDpn7qX59DY2X0jB vaPY0gquhmc0DgmX1UVG7wVSBXsEo64gACMuXivA7li+bzgBBSyqp70s0fBW5F3AW6nFsggZeEJj fcdJJj9hqJVXBU3Ol4mokJ2LmUk9NcYQLugsq87vGny5BAQxMp95cv29rMU6b4cuqNFXsKhYruhl XbSdhpFRE7jbXutqY7wil4Fo8O3Jw/d8xoaUUyBXxSJdv1Dls9fPK9Az4zdv8K61d/gyAL5pncss XEyoYCDLrSHnZ+xW6oJslnEKSDpjRtLXI5/FY7DWEVHPaGoIAbVmf21mfH3xqjD8AlhWoxFqQ1Tt UjsiqDVXT2j+quBFAOJCNb3Qlht0EoWwco0qZScT2gjWkBKdBHgiL9YylBbalEB1rCNPnjoJl1wM RtgQtWQTgeqWW29G0DX0+kWgEF6hICmT7Pxk1wj3opm8265ZVJyBVCBJ85hIIjOepRjGtNpl6Mvf MPfGG2+YMfOiD3zw/cBEzprJNyo/8vPt1STGW5FEQb3KhMZRmxCfJEdXwVdJjMJztbKTDXEVsBsM jYsFF8vWLFkuWbqUv8l/90TqEf0iiO9x0UXTOaew/4ABgwcNBhYPGjSQuY9cEt1ab7QiYcQmLUs2 d141f+DaZwdXHG9mX2I8btqsUfd+ZcOmbR85a1tl4xJcNTg5smR3CcqpW4/uLFZ07dJlyJABs2aM 69q+ZuuGVQsXrlyzqbysUf82PacMHHPJiInTJ0yfPHhk/+omOMKWDRzYDwM58XOYlWmntCNEJNID bTKKtujpREqBEZcxUuQquGHQ4MHAW0zd8MmM5KIr9x88wJY6kDcZcT7hU0uYNc6Tp4S8LCHnCKR7 iGOpwQTxt2AuZ9VkBKJpe7bT9dCgC8IoLrcF34HdbZrfrxCJ+HDY77xyJDqPUkJcVHHpQ7eo6ER7 Nk+ASwpO/yzTeaaBHYGOBlKM3RduTdZYS3O0H/s2TNTxzaW0kFKlXa8MhxvsYntor949sda3YlNn 5jzNW03+8fVwYPIXqvxcKACWpojyUJ8TmcYF2b379ML9xk3SLsqZxaptL9KQX5qwLtuuy1nGLsQL E8Bh3tJMCrSl4ODkWdc8rYeQzP51SCoV9Ah+LNz7ys7l3m+LnHQiF/IcYzwv3tEvHDX67DPPs/0g kkXG/Pch/6FQSGp9axV1vQpmkkxPBjFZQY21Up5vRZRDIXhaAw3zngl1ERDiXUxejLK6mow2gYDi eBp8BPCmgID77ruPPd8Ya4GAsQfujDXWSipom6K42LOI3RcMzbwiHD/q4tXL7ayG9LLIu1bXjjzl JnOmVE+T7cHiJmPE5dsCTESu0NFMXVAr+Q4tJhU8ylZRjHSwCEYZPSZAaoEkv3LBDvGguyEvLqOj iPttWl5K80PGV252xMyfXxyodShRIxMSkjGLc7BQqbOUKLaujFKC0xEMAakXLETUNXjPp1zVT/mr Icmvao0NGUqvKgEFUlf/Z+e06SW4jBobMmSIOgaV43N9MVXh6HvDrqF7YoGe9mQGpGMavAUBmYUs 4RIX9FW3rK4aukQAQRpMa1gy2ISF8ZKNgKtXreG8PYy1lMDqDJBu3PixWo79WPi5V4NiHcTqhqrD VJ9XjWrHUOFCBA2Ekqc5CpI8r4fCMzTWmLZT1NFjZfv27xswsP+1114tXLBqrgyLpksux42wI9ay NZUFjBPbgULU96ITs8vqKNxX0WeWH+IiaoFmWBe4KvlVnDY0JtitV8C4ceM5+pEPKHXwlqnFzNmz ho8YEU0Q8cgZLy3rcObk0a6rn+3z8I+7lmw3DEsWGqRpo/ZdTo28aN+sG/eNnMJxfW1x/NiyeSv7 5rp1bdO5XXn1wZV71i1ZsXTzzoOt2/ebPnLKZZOmzpg+ddzEMb1HD+kyCCTTvOrY0SN7SkoBxL37 9r7u+uvYC08EEsGTcyHlLdCbvBJ881xZ0kALwcIdLK9M4TIeZLLRGOiWVgwy9+Ijx08cb9WmNbtL cUZ/8+23veWtd7zp5ptmzZ5pgGqK1UpqL2hbtRxnUAE0JUyJkl2mydB8X2ZoLN0A8elivJUwekJh gQTaxTwUAfPXn4JRSvNbbPMtnEJ09kDI7XFGHOJKk/Ho4CEjziOrAouL++MnCbiy7QDpYBet5lqO qUiuSpK1C80lJgBlyEwIqonlT0BeKXcIZCOkBsjNRDrjKnH3U/BQDUU02ZkD1OJ+IvpnWqrZW/wa VEE29w7DrDuShxgDmXkWJOiH7SQkhpu9xk/nulyQI4aW1U7euGnRUit4iowGY5210rrOXTrR2FYt 0qxD6O8XI75jbOft1buX3yV7ze6Wvc4Boot9pVyZ0kHtT55DJhFRfnznj3EEigRRpmnsMu/tr3hS kKWejFFCZMGuUWuN8dBPkIbSyO59PAGOMBAK/EzMmKc8iK+f8oJazthkzO2PPfaYrrfYaA0AYoQW izoLXpEL3ImTABetA9bz1aUifAbym01tYwGvzlVnRS9jxXdRorij80wOL+36xUP6I2OUqX2XjgaV 2qERpqbWNmLbJmCicVTYuGnscLJzU6tA1ipmZ8ErymGOAcguvuqPGhlNhnJwMMjboZSX5GLKYTsp rZHQOtyYMQZvPY3l2wJnEKSCQJ8NFMhXW67qobx48L6Sz85Zf68anvF1x6vTmiB0Kgvcno0i6wOW KZ0iDw2rKnL0OhqLQeumJVWOpbknEjhCYhwZwdzCO9EAyTR7YwvnHPLWLVtzIGX7Dh050ePp+c8c Ky/bv28fiIvD3l9c+WIMD7UpP0XDDAOs3dwwPNDZYjLJ9uNuK6jIwL26d7u9L0AJQwiDMSWAEjAE cjwGEIGUlIBlsFbpDCwSLPLG8oUUwkdRIzTrtyPxclUckFdCwWEfxnwjA7+npxwOgACFgZnkrRMA 3uK0CpgFMUsYT4CEuGmQPqCSxZJAEKDbAGwkzcF9p1Y80+zBH3bcsAznhFQKfCRtq1bVA0aVTbx8 z+DJB5s0r6TrmzU6dmTLcw/81z/c9YP7Nuxs3Gf4rInTLiWEYL9erTu2q2zRvKym6mjlqUNlRw4c YRdfGYsnJ/bvP1K6d2+Hju1x7LnqqqvZizlq5KiBAwf1zM6sEThmEdZYY0kYMtuFmWJO003l2YY5 5x40BGqJ7vzwQw+XlpakyIONmxw7fmznjh1gU97Sj1s3b4H6ESOH4ws+9/K50y+6aNz4cXilsweU tguzuBGbKrrKMAwRE4v+7TKZb18IE1FjngwCe5lFsE+ApQa8bmgUcJy3dpACHGhVaBuiFTKQR2a+ VdQRTmPSMaZolFshveCJMchdlXIYKtv5G2XSIaBzCAxUSm0ddcWsTzKciXmFZCoz4sv4OvNQeAog dh4lfMchnxk6P5mmQ9mJk+n4zASRs5iDGVeasQ/BFQyEkxWJvv16A2qpQnu/s6OYgPGcCREnPibX CHBzBqllVKDqND0jTfpGpSZDhpZs53WaDKQ/i7DUsVnzpsQ/OXXyFI4xY8aOTqHNKyvLjiYXcGA7 WRwRMoTsVM207Y633PGe976bjxvRGF1ngwCNC7BdnJT5qv1m67C9LycVoZy2SDMW+hEXoFo/OPFR NWP+o1FX+rx0+UGuNWOx72mtBWJwtZDicrAg4t0Btqhry2BktBVnJLiBlJsMuIl/OTegbcJIg4po EcZvK214XabMk0oPGvaE0PUAej5W3IBHzxgU3HLkxivvLL1WzthNUeMZG14rgrdb6UT83GAjHQoP 66nUA3oMQ4k9mDUBEjd8z2hxv7wswaYufFNZ6+avNyB+rzP2ON2HzBh0soG9g+EfpA5PjLzJzwZm ZNUFiIKfyVkPgYLm1DUGz9jq/wsZX1+8+o21RrpRS6zo5WG3ai/fqjwc594V8AAupkTHAALcpjl/ /nzkFZVG9/OcxCgnlBk6EpcJAiShcp56ah72nlWrXgQz/fcP/vsv//KvnnrqKc64/sZ//hdb65K3 QGaDDDsWwAKnC3Qh2g6PZ2gOg6Uf3IAFUqvKFG1oEdS+RYGerYPNiUJ+/esHVqxcyeHk48eP52y/ hx56SFQaCl4JDv7kgQuVSo+qXZTDjSoWgiGABGIOicyT6meav2Gb1IHHh3meS4DAqOC5hRgIj+zE jmvbph17LGkgC9l7SkpIT+2k0d6Zp0SQxyVzKiuabF7dbMH93Rc+3OfEMWggSAqhKpo2b9GoS5+y oRdtmXRFyZhRlXuW/uy//vZv/uU/Hl2+o32PUdOGjh7Ss2vLZpXHjh85mjbgHdhRsm/H7pLSfXs5 ErN940bNjx4BUpcfOniEAxTh1qWXzrrllpuvv+G6y99w2azZsy+59JIrr7xizpxLL7541mWXzeWG aMdz5sy56aYbORUIoMP8DUGCh9yzKxezFsFSFi1c9K//9q+/+MX9mzZvSmf9rF3DXsw1q1c/9cRT LKHQLmJjE2OxY4eO2dwsufVzsA5KFAY6JbOLRaVyNcQ+NFn0uyKh25IOG0hR5lU/cOgwzi8ahGv9 pEkTRo8eBSJHLKOjHRfCr7jE5XLejuaVnYvMKAwG5mPUiLCZ8IC5EVf0ATeeWcNlMqcltEufb3J5 afwWdttq52n5tZqY7MWc0OmH8gZ5Yla5pOoSc9NMjfS6pvAEzoCKiZW3dcu2XTv3UDX+J2BuXJ4m T53MsgM9wj1BKs2SXFN6dme9qyPzwxQCPPlh2zVWEcOfI5YOHzrK6GJiSUb2e7R+yR3l9My2uobj pW6++ZaLL75Y2C3ylr06lSnkHBwFTGdNgeiTt9x8y+23s0l3GGNn1arV69at37hxA/JGemY7Me3B NsGaxqWXXgJSJxezeDeNKD8x56EKXcz9HhZ8QGCdwzBeQSEfomI/ivjwRgln1LIFCRqS0YM/6r/q KgerHnAt7xB8FgTUWnVxjdKZX7gHEPMEY20eJjakyQ2sMZ9MG3ADeZUPzX4m1v7mfTHlNhDQf8be scaGoM+6iuLrQT9qO6+nQ3mrS0mBw0bDm3lOUp5FL9M00HOtmx3rJ4n1HMYmV7G7dl0ZkROWDoDp SOZZkHoW8llPE86agNdRxlfvs9NAcX1ZvCrcmoPrMJ9RtIJrprFEa92BF8OckMcleTyhvhTHo+Zx 4QA9o8AA1nwgVOckQGMxt77//p8/88wzKC2qNnTUz+/7BcG2vv61f1+4cCEGXlVUTFLFQChIvkes MwK2NF6SzE2TUiKcEkNwaecTkQBEBB8yS0r47oC/f/bTnz09/+mnFzzzL1/9V04dN/iJc1z/RpOj PwRqVkSaoERHeQ1mAnHnMFZqrnynxs+A1L6NJvgz4H5AImGQKTUbz5s3/xc/v3/pkiUlBLLesxts yk/2nAlNgp/SRnY44IZFSuCh8RmqKqtLdzZesaDjgvsGlB3sgL/3Sz4djdt2rGjbc/Xuk9+699E7 73x03a6qngPHT+3Vs/2p4yX7920tPVBSemjP3n279pbs2rlrV2lJRYe0k3YgBlGw39EjGAWPE2nu AAD86JFBQwZeOufSa665+pbbbvnwRz70yU/+4Wc+9xlOr/yjT3/yE3/w8Y9+7KOf/fxn8Lm/+Zab 3/r2t0yYMA7acBDHL2jCxPF4IoF+2Dewds36hx95hJgbtJ05GrM0Fk8wh6cwNXjopkaentjwlmO7 AbbJLTy7nCyRRNmQJ/JcqYNpcAP+6HBsLgGrY4SfUNUBz+n27QCO3HBUJE+Affx1nhNQPsTJWhQG hYo0saqj4L1k8k+zxMyOexo66wAmDfxNTu1Z/B/S58e/xZLXlQRnm2a0diG+gFuBzAthTAZgi7Ln ZFKeCLUlWJd3L2Usmyo3r6pgIpf2qirSRM2bNn0a5xyNGj0S7zI4indJm3Zt8O6AaTAKr3LAd4fO 7VsSjLsVJ+C069GrO4bwLp07Z+j59IZvLOWwjX0JrJy079C2fYc0/0km9CzmKQry8ssuv+GGG668 6kqmZ9izZZTrUawSELwFAM23buXKVRs3sFli7cDBg9hbwmmsbO9m8Y2LrxB2AUAe3xkubgy5zV9i rS5duuzE8RNlR8tYWnCmbRvzc++CYeukxb6W1TGFQ0iYSSLV2ODzH4S67kNsGpI4nyYvG/Gcr667 RWstTSRXEBovygHHgDDyGyvrJ+mVUE7e4k2EOjfXascNSmpt9RlZV0yqTKgnzEu+TGcCJH6FTba6 ghgptRIvecz266rRrqwn5iMZcR0xnkn9VnY3Ysbs4qzbWNCQsy6ngRkxzzP68m5RDZQNwbqXNJ8x oyFQipF6A0k9C/k8Y5ag/IzE11rUWVN+/jOeZ7kqZtcZm1yIvFFLamvUGLpBVaGcqTu5z6NPsWbe LksCfuoOQSHoS6MTgELcxxZoD3Wo8gYPg2lYnefTAKISKxDSGDBhIeowyQhKSKMxj+eh/rW66Qka IckshPR7AYMAwSxWsVvHfA4lNplcwLXvfOe73/7WtxctWmxG2xvNlAPB6zxhpKGlad9hN2KpdUeV os1pNYa0WbNm0jrI0yc12FjQQ1YUAzv/VjKi+ZHSm3hLXri6e+eu//7BD//qL/+/P/+zv/ibL/4t swhWFWimHtJczk8CWtG5Wt102uEelvIQ54Vd28t2rO2yfdH0I7v6Jat3k8YAW0Jl1DQ+cqzZuq7T 946/quO4SVOmz5jQtmUlhy1u3b1tx46tO7et37ll07bNJTu2nmjXrtfESSwNDunVq3eb1u04Cx0P 7COHy44c5mC/owSXQLhAHsOGDhs1cjQ+2VwjRowcyv8NH4bbBoFxCEYOG5ENQBu8pbVs6uQhZ+a0 adsa3DZ8+FDmCps2bMQ4icWUWHKrXlztIkN5WfnRw0f3708ORZmxtubQwUPsEMUF3IUUux6ekJj7 8OiNaRIMMZSKlldHAUVRIDgMGOcJl8R5JHAeCWChJQMFRYQKj5Iv2C2WIqEYVYCBaCluVNnZrngB JeQq5rZqyhHpKuqMCrJwYtGNN74RtjiPMgF/vZwwOKIDAsaAsu02P8B3MESBcSCYRdjNE2kwlyNC UC4WB82B6JjE8RfoTEgajj4dPWY0Oy5px4CBA7r16IYsYTHHGA5iptQsJHy3dAx7+7Zdu3Xt0Cmd icO593379enShbO3sKwnrE/DYDBe2sSV79Gz5+xLLr5oxnTP3YQSdjWw6ZaE3Xt048Cg3Xt2GySR /SQMf7qMv9zz8MUXV3JIE+d0cng7bjpkJ14Q028BN2m4J8hMZNe3h/Rf/Osv/d2X/37Bgqedeom8 ab7gO7gRH09Z51v5aTKHrYPOeV0D1Wf0XcPTR8qCb45gonhjnOl9no/REeUA8vBMwHRyRotsAZEF BDS8CRqA86CwHtNyHiKfdY35jOL+BvpUGNY6fwCkg9er1qDaxXygCUxsYG/9UwszIrRcaJk4HTNf I58I/MXr6sp81RyCgzNG/Z1SK9vlVTS54d16rsQj397i2pFkrlrt9A0RD/cPNJBUmEDfAbvr6riG 1NgQBp51Of8XMjaws87I51eDV4Ufeurg649aRXsBHFEGAgIDArp07qWUBx4Vl2ewI607q0L4qWJG XfEEMEGZaFazkyzsZDwnJcn4anD2IWopggNYSx7uS4AmLtGMdfFXNA+CBDui+z2vh1cgJ+zumEhx XcAMhv3PZGGV1CAtYtA6rvmch5jK3N9G+QE+4l7yRFfSQ0a4R+FUzXSCgHfZAcgjAJHQIxw0e75R 4r9gbLHQmEWGm9E0PlQ4ZHuip1lT1sdZMfjlL3/1wIMPZsbgdP6ftYiq7TKhkgAijJciA9Jr42Sz 3L4dnUtfvOjY9kubNWnbqiXNrK6qPNWoaVXfUU0vvrrPjFkTunduvr9008ZNGBDXr1u7aePqrRzV t3bt9upTnQcNGNije7tePTsPHTJ40KChHTt0RabKyo4dOojjRNne0n0bNm4AwVZWnII+nFqSNfol /xqnCkogHQIaA85pX0273zKnXuzRffr1wV2BFQ1OV5z31PwHfv0gXkw0gY4jtPOSxUt/cf8vf/iD H953732//MWvHvjVg4Aq5VycLWfsOAU4OgJ2eaKK6d1yJ36icGZxHDiFMsYn6umnn2GpZOniZZy1 TrRxtj7ieq0/erbycTpyi3lDkMLezEMnPAAaJh2iZzYSwwsT21O6XkQMDaYZQM+Pfez3//Vf/+0f //EfQULgdRI7T4iLvChLFp00e9v1IUshbA5q5VOehJyL+51Rc+ki4hhR/MjlahI3PExT7o7tO3Rm rwRrFD0GDRnEtlq6jzIZjB5qfSNRhG64fu7cuey1BRbwZdAzmwRdOncxlA3uOxMnTpo0ZXKPXj0T 1E5VtkA68M9mFYnmAE0uvfTSiy+9eHy2HgKIPXokLV4hRdikl+OLtmwZWJm/hgMScwO+mTKBqjFg g8W/993vcRTiJz7x8f/65n+dzE70hFeGVnSHq746NJCWckNpHIJDITH0FJhA3rWCAB86VMXrTvsR EqrgagjAKv4y1A84CtLn+9qMxq+o9aBKz1IBz9Vqc2Uxnd4Epb1CAoophJhipw7s62gHYDdW26hR Q29xYqAPYTfOLa9oLwU28JwgvgmQylQhT5tdD22YlmlOXV0Tz0Wx+NKY8Yzp7Ur8f4p72U2T9GMD Zaz+GmVC8fwBh5ybb775jHQ2JEFD2ltrOXVR7mZHmHnGEdEQ8vJpimtEgOn9ug4hKu6dl1vjuRXs s6i9gQJZXPL5z/ja5FUtJhbhFyrBuA2eZBG2ZD61+SERAE5coibmUhOHKQg0Q2mkYUGcv2hltbjq R+WtpzVqTsynPU/FBu/ySFEQI0PVdtxIWBjmVWk8F/23b9ceBPynf/qnnEb+zW9+A2XvgSyiIshW ZUqwTwRYQBRgECHwKBwFGVgkD3zFvjY/zweyACb69utLxh07dlKUvsUKn+3Kg+9gbMGrhKRzx0bY 6oIPU9Ajr/jpxAaSnA9QhvwRfHNPsVpkxeK0XYcEPRkox7yyoiVxHpr1a3Xqih5NfqdzmxGnTqaD UcCQh0vbl+8f2bVn1717Vq9euXTtqg2b1gNvttKZGzdu311ypFff3h06tsDLnYgjXbq2HzJ0wKBB g7t07gaApLpDhw8cPXr4yNGyHdtxXN6Dz6yn+NhAe1/barpatAQ27d69C/LoGJLxjHbhrQvve/Xu PXjIYAyrFGvgeZlAu8BYGzduev75hU88/uTSJUvR1jxs1zaFESQNKcXHiCU16qPsJFOUqUjwkHUM oHms2yhyoDGqQ5aIHo3F9IknngD3z39qPrMdkJnuKwJWJdZc9oVSpycSJJFSzEpidhpcceXlU6ZM hP+8dQDaF3YKdCaRa9mS5ZTbb7+dEJz9+ve/4Y1vnDV7VlidNXiTHe8XQABgV5eVEDBlQwq5gjaI cdeptnZ+KhVOUAXlMf2DsKwjkjjxN7nu1KSuoSehkNWfPv36EuYS9xJCAcIrZjJ9evft1rXbkMFD x4waO3H8pPHjJowbO54FDXjLjJF5ODPkWbNmsdzBPLx/P2JjDmDmjDNP6zat2nVox5YD5JSgJC4O pL5uROz23p07dcKJn7ePPfroN77xja/841cefviRzEmk1B0COsTr9R67TmkI7jrMyr773e8dOHAw Jnt2mVaAz372M3/3d1+mCa4MwDEFTFmtX3UVfCviZ2SEEtZMkFLobEiBteqzs84IRACO8GnCxyBg E19+Y3pQbF3OJKQho9jXtpyRFQ2kHB8ScDMEiO34y5QSNEPfhauAdWFa5iEzBICsDjNMFSCbbZd1 GW4bSKRGYi9qp6Uwh7owmtbf3fHWA9vZtkhGabMhOg3Xj+BpBSlF3hLAxeTQG59HcL1AwNQIuIQb UBsmf6A/z+FPnnsNbEJdvBK/0iOuQtA6LOXY5qnUDqpVHvIsDd7SCtJDZDyJm3MrV252PGPDGyge dUmyz1+WR/hZj50CGs66nP8LGV9rvKoFeauJdR5F9xisAI2LwuAeLavRLrQvTRLiuHcwILLPVfOY ltHrbleymymQ8tGy2tK4Ifvb3/H2z3z2M29/+9u0DYsdHX5esbArcNFoFNgl7jVQBZECi6lTp0yd MqVnr+5Tpk799Kc/xdfK/WoatMIFXPqtlPIvueTiD3zoA/gf33HHHdATqMVWyARnAnkEo9GUVyx2 A34zcyBW89ORQ6JFeZXMw/wUgvIF9JZfoK3zP+WM1RUkI3tgPpPJCugRZlmFXii8ggnuBE3QNrOM OpHIyEg+uD27DRnZ49pWWyfsXnrq+KnqA/ubbl4zsKJydE3TA+vXLlmxfPWmDbt2bT9YspvzJXeW 7Clt3KxT38H9u3XvDHcqsJE3rurUufXAQb0TCOvaq3mLNoTcOHjo8LHyE+XHjpbsLdm+YxshObDj Up1DJQv4sJu/QBNQ1I/++0eYLznSHGekXTt279q+qxR/8r37oa9Hj570Kd6yzqP4q3M29zQhE+OE DrVbp+Y3SUJrx8EZ4awNF3/zVybAE95qDpeHTkdFq9H1pgfVpZjrO7ZDdnZKYhopeeQdvW8D7bLw 4YYGhknPXj2uue4qNNDsS2dPnDhBM3w4JNjdEo9pm3WVPn37pOAzjRpxctCggQNJH8IAqqO9H/jA B/7+//39V7/6z9dccy3ZhY8UYgMlw5knHHALsoPC/YixaTh2J7vd01Ah2sglyaUqSMmKTVZ8+iUd LtO1ax96p2fPtP+yZSt6uKqaz0h1TeOatH2gCUOpcdfO3ZiV0VPMOoYMGjp0yFAOyYLV0IYmY9qT Cm/dslXrlu07ckbPcNpy1RVX9ezRkxrTihxO461bMp9i4yZ+3N///g9++tOfITnMVpxBaRRwNsIV 7jrcQBXdSvPhJ2kcy45r3r7xxjd+6lN/9La3vf0d73qHXMp//Qq+6bX+jEEab/OjFV7BRgPX+HW1 i1/W9UoygkgMnUbANRYBuNg/QxQIPgXgvLqcjMHc+X14r4SAgiYDmpkPQABkQAyQLojJO3tQI7Op 3/3d34VO3GpZ4iMxkB1pIeZGPRbHkNh6OIzbBkV5UTvh8yiQxRkm/wW9U1dn0QS4R0czDcAnB8qj IWBoHHjq6WUPppG8iFfNDbMR/npAJv3lq7ztGY8IasEP22gzXEyowOIA/Xe+850eRfSyrlp5RdPo evhMYEGqoHXc8JA5RnRQsTzAUiJ/F1y2he4LbseNdJ4ruXKzY0Pa3hDxqLWcyAhzGuiVVE8bz/NH 4Px/ds5hja87XjWOoKdKAFY61EDys8x2hsXOKi2CqHCeuGlStRTy5zo4D3miDoMXWo9AFTxBoWqo 4ycl6NvAPRUhryDv/++v/uqDH/oQg5k15G988xuf+fRnwTp8tviqqqW4wmDsjXpRHRkm58CLUAKM ADqQBrv1H/zhJzAHWiMnL37iE39A6BJRlxY+5QCqzAi24Iv2/ve/D88NtC2mte98+3t81ASp4i0T k0t8bJAH/mLq5hWUADXYWqgXAVn42hLsRYYE5NJ4Fi3yxgSBlRWsPMP5aQJrF06ZxsTWyF8dA+C/ QSd4SOvsF1GmKYXjsNG17wjOALvwz+HCADlp4phe7Q59++/+8p75C7tPbzp81LDKA7cOGtL3ZPmW TWvXl+w5eKwM7Na4gonGsQOV1R1mveEt73jXjaN643ffvhmIq0U69Jt1hZPHq/aU7Mefds+eXcdP HGnZonH7Ttig2yEfndu3GzJwUPuOndgHWH6sDIFUALBSLpg3H/9swCXAHY9hijp86AhLJWDI8RPH 00HQjyA98/QzTzz2BG/79e9HdzjZEzTbTdzDAcXGGWAKc5GBdQNZ2AVmJAviYdxAzaWiVXJ5oxuS bLdP4ytgvzi9yd/YWWbX6mxK5Zl6P/7x379kzqUMEwhjX+zP773/8BEQZDo5MmLVObujdqLBMF/t 1bM3P1etXvWVf/hHNpv6lvKZBrDX8POf/9yoMaOIuvj0gqc/97nPwzTt+pQp5nbCGTNbfwrKlTSn at67HiXZXE5mjB/ifIBk7DTt3bsnfOvduw+7J3muWwXfluHDhnOevIXLK0tu2bzVxs0b8ADB4M3z zPP7pd3VjRovW74MBa+/B1+GSy+dM3DAQFyTnEVg8163Yd1zzz6XopuXH2eJY/HixTBQiOwQ8yYG jh8KueRDO8UnMTnh+Z/9+Z9+8g8/RdW/fvBXb771dhL4Zct3dHwJvcm3q/hnPnFBSsQ4/0TO5K/i J0EJNwxzMCKCWqz4yYhlUWurLgf5jPwEyYHY3LPIK5IVHCkfwuBB5ToWF5cDAZABAXnHBtJTcmQJ LtnYaDKwDNAJfAQkQS0HkZiSjAWnuuQzUjIATs5gBY+2uxGwIOyJGfOsKGCpPMzzHFYgVwWkKjNK SwyN4s6iNIBvgGOwL64mBSJR3KeCbOzH0Za8vEUtt912G/Zv2RW9Y+vyjvvwJFx0CkiVD2SvS66g H8RM86Ukn8wDPu0dSlAYSE+ZpC+o0ZT1DJlaCai1nCAm32TvISmfxepqFchoi1lsXTA52FLQ5Kix gC2R0aUGh1hxi2BCAfEFYzDfO/XLVYGk1VNOPmX9X49o7Mv97PzWM77ueFWIvD3pBj0KdoT74gwu D0MWLhsfwF2JXsJQVW9eZ6vbkAnKJCPbDfkLsuGnNjxtUZ5hcffdP8OIdejIITDBkUNH+ZIuXPgC x1wINUxJUaKiECZBsDTw1wTcqxrR9BBPcwgU+Md/8oU5c+dieSXKHlstP/KRj6xcsZJkFKWTieWL QakUDHfRjIve/Obb9uwuBU6MnzD+ySfmMbMX65NL6CYiUe41gvKTYhmZ3FAOAROGDhsKfgXu4A1M Y3keyFvQk2+XrYtGOZ8xTcAIGe6TyGtPyYoogZ9GWebKXKVTe6NGFw14yF9hE90KzZo2uRf60PuE TZ1zyayZk/pue+HOO3/w4H0Ld7fsMfLSK64ZOLB/dXnJlg1rd+wpBTJWHsc5ofrYcU4grx48bMp1 N79p+rT+rXGz6dit74C+RKsgxgbtYzGjUU2T/fsOb1i/hdjehHuuaVLdtn0WDySR2ZrpSudOnemW YydS6HfaCIWIDQSnLQfZaeH2EQdqIjycX5P6saqS7l+yZOndP7sbMUv+CZlxGl7FfImMlEY5iB/M 0cZPXgqXM8w6qCuCeJCX8pFt0J4gmxLIxQeU7Dxx0SbGgt+g+A7GJ8wbJUeMK+CzK0N0YTvTn7/6 qz+fc/lc4lpS9cYNG3/wvR/sP3CAJgTcJ6/iRzngWix8t9x8MzR/61vfuu++n5OLVlMmtMEidDjH u7Xv2K5F85bE5vj4xz9BKCHRM+2yFVq7A3lLnpetc4YQoqW/u8LGK110tMrznNknkRyJz40POl8S bN48N74KyYYOHpqQ90vBZeQYF3smN2xcj9c1XjEuXFA4lKRjkho1Wbx0EcMHGugdNlEQMRBrOlNi v7msk+Ct8cLCF2gve2pfXPHiosWLKUokHb1QjLYD85mM9H7luHFwYfe//vob/v0/vk5VX/nKV7AK 59dD4otfrAhDSRe8yv/MtvwmMYCfUoLk579vcqYu3VmAxs5hRqmKrjlvBHAUYiDvqDTPgVevyWfd xleDVyJvXESMSZfv2fy9x0YWI2/b8n+EV69x8XhNydUFXtU1lM7zl7ZpcovMaSYdfI1Kq3+nvr95 PMFDwZnqX+jAvBnvTErjrXED1ei0U2AhfHT9WrAo7KBGoA8uvB/+8Ic4GOfY8XKgFYr2Jz/+8cZN m/KfD0FAAeMCRKoyteNKoevg4o9D2VF/aLX+/QeUluz5u7/7uwcfeFCsLG1iaPGZjSVXm1ZtAN8Y srt07cyx44899gSbtMxSoA7lA8RQo7Y9z9dM557sTZvwVq5cySm7ICfhsm23df61QH+KeMQ60lOg AoXdPJSYhE4ybCRXLUoiNWO7vO6N0NOtbHaKxMB2YVPCQJlfDQ3hCZAdtISf7oxpI4/vfPpH//nD eYsPNuk6bNJF142ZNLLi5Jbta1dt315yuBwH8ZNA5Ypjxw/tP9Gq44CZl1w6bnSPmkoCeCdHZiqi /szTA3moSVMg5kCt8SVoUlHJVshjlScrkvdB42b4H5QDuGtqcBto17Z98gogYZvWUMIcIJvgwZkU O5A+o8DkhNCiJUgusaKigm2eL764Cvp1jA5cS3O47CbxogiYLoMhLvcbeca2y3xFLrxQuLd/yRgl x7dVwc53otl9ooxF/+b7yPkeZcL5aVOnEt9u/Lhx/fsOaN221aGDB3EfLy0pJbOC4WzNuSgXw2fJ 4iWYJ++6654FC55mg6Dd6nBguLFKgONKn959eL54yWI2m2ZWvRRpR7TtTIMrnF4U4xh9ioRExkCL 4eYTWSQy5i+VYudjocDVBkvjgsO4a7dt3TZjym8M3g4pgbJ/6QUSK7HMqfCBpijK1OGt4lQF8kPX J642aQY6P3DoAOCbUitPVezeU4LB209NDDQqiLlrjCnbKICWvTGCHCBcmzZthsPznpp37333klin dosygffxTSi4D/H4nzeJJ8wYcZDlK+EeEq7ikN4KT75wywnAV0f5hXb3KKGBGfNSfd4IwIhLF2MV xoB6/pt81jWec15hHGUGgpmf3cB19S/PScZlKMC8SJ8H8Xjt8OrlCvZZU37+M55zubrAq3pG0/n8 0jbFehSk0CsamNV8GsACFOquoFolNAH+GyQGrJBLE2+YewXroj0Si4ZVyWpB0YnI3odkwUhGjIL2 7TpwGOHXvvZv3/rWt/3cBzYNBJPnnQ9VmQF6TBCKkxtg+OpVqx5/7HE2wH3zm9988skn2Z7lDk4h BcSjUEWlXEIubGaAvPHjx7Vq2fquu+4GsqhxJUzgFVco49CLmki5tPZJkqIfeQOZBVzLd0codR5q UI+8QoqwuPPcEqRNbkhkYG5BjD1ryQHgeCWI4a0d5+QK5mDrxWdm0sTRE8e1f/S+e75197qyDmPn XPfm2XOmNG98aOPq5Zs3bzt09PiJkxWnKoFKp44ePNq0ac83XHvr3LnjWzc/daI8RTumlykwOUwT urEN0ZebJzfiE8eQqbQHoGkLJObUicoKSqkEooF+qjjHlPApyX+nRWu8gW1XAZOFmG77A/cjjSjs FctTYDhSGhxDFmnFly1u11S8bbIbA5zAJOj20mZH7kNoBZe2IvCcILhADOyFwOX2i5QrVzHECqSI eQ4bCmfMmA7NHMuGIffgwUOc5lmyZ/eaNesoRIjsfFJSvWgaDd+3b28yDr8E4p1RcKG8CTsNn1ev XvMP//D/WHXhjKJBgwbBBMYg61dOU/nrUM0PNIl3/iavfBJN5megdn3E2b6I/AwbNhTv83Bak2OU 4G5CSuvQvmOyZbuj9qXLwmE1pmvW5YGkkM0Tps3k5SMTsxdIpRanFkSF37V7FzNbXJKY3R0rP0YM ezbs6mcvqdYg82OYRHOgLfrFxDLBTmRmweSHLbMwx1WC6E2nxz4RhXtFmuBVvpncM83p1LHTv//n 1//oU39EcoJ+KmnMLQtS5n/m+72eZMWvzjpjQVFnXU4DMwbyDo/kBmY8h00+6xrPIa9E3nfddVdB JPWCKgJ5m+ysKT//Gc8hr+JLeH5GxAVeNZzPF3hVF69+g7zlkT6vOomqLAMc6AuLpsETkeVgTsSY NHEiB+ft2V3C2jEKSQWMOiQj6pAS0EBazVWorsu7kmvhoqJkBG3S+NlnniPeF7CA8CP/+I9fsSjt 1tSr1q/18xpwNvRf6MVQgUY25oA/TjeENmKWuR80EqhoA8FrogMFEiRv+bIVxMQgZhyGNwoJtR3g o0C1R9NEt0FMHrJbr5dQQBZFGtsifwKxCSNsr/1igoBiMfcwmRn5q7WbJuueq/u+Rl9Scq+HOhdP 7EG9L8jLQ9DPmJFD+rWvmvfkigPNR99wxzvnXDGxVbMDW1Yt37Bm+4GDxxJkO1VZUX788MGTzdv2 v/5N737XO27t1qma8DGg7iaNmL9xbnj1qROEgSN0YNq/yA49XJuQH+Y73Xp0J6wzkBvcffLkscqK 47AD2jE9c1Q8xLdt3a5ZU5BfE6yk+BXglpDM3elJ07LyMo6LB6IxU9i9a3cGkNKpqEZzz6TrtI3f pjmB4UYvZ427iV2NUzA7kbpMc/7JTWA1Lb7xkxvBujyU53ZBPPGtHZFPaXoeOjslCyCVJSOs/KPH jho0lKMwh2DF37u3BPJ27ti5bNlKxDOQsQIjPTF9dYxYddBAcxB4/DQefvihu+++i82p06ZNYwiD TMnLW250yopRSQlKYzTKkoWnPgx0Lhn+dVrCmKUtxNHEFx9u8JOHZKGllAC1jPF9+/dlayntOQ0n KrLM8D7XAM9P8oKhIRWxkU7utaYjQvS1gQJTmjQTqyo7ejSL2L0TeoL/+aFhX8SQl1fRNOkJDjic daSJbxcJQgxMH2PNUcnlE2+8V64kCT5Mu2jqRz78O/hEUcWdd97pikc9x1iaMQir7XNY+7OzzlhQ 3FmX0/CMeZu3knaem3zWNZ5bXrEjqCEnROaTnTXl5z/jueXV+RwRF3h1Hj47Z83k15FcnUbe6gYa jCZTR2ocVaN4o3ERaIJXCWnwH0ghC7p0wYKFjswOYEsHNZMSRSuE1VeYJ6GBVF0+VJFTVMKFzdPC Nzuo7r33vkWLFpFGgxzBDbjQo263qrXXpTz0XB7vxsPke9qyJYd6uHmU+qJp5BX6iB4EoxpEVcAl pSUAOwGBajgUs/V6BRaJt8Li/LpBaPdgeAA1s+eVNFRpaKQQUbKc1DbmHEDradDsKwXXosySHDay S5J4KCjhFXlJpr2fizTJA6EiubrynB7kL2bvcWNGd2rfZf2mfSNmXH3DDVM71pSuXTp/5YrVe/cR nQ1EeKri1CEOrGnRcvhNt/3OBz90x8jBHY4RV7n8eFU1sLuipnEVniSg7wriEeJYUlHdrWt3at+2 dSsgjADh/fv1bdEqWRNPsCk2bSMkMl3zpk2S3zlhT2ADEkJQOE6sIWwFQIvYglu3bd21cwfO0AcO HkAIN23YNO+pBS88/wJHfQOSQDBOrjDXAsiif4FAiQ9ZZBIe8jcTjHb9B/bv2aMHTi1GMuEKp+r4 EITE2sVKb1wKZzA/b1u1B0NQxfTR4/Yj/tBpbwAuv22Q0LYE4GMyRHgRpihMSvH2luCQNO4RLU31 Drf8aJUY5Y0GIkhszoQblMyuR0IQQgM/kzdUaak+ZkqCRDoilCJfWTiXIheFm8w0wZAO7TsQTJNN lnQf5mophFQq4i/p9TEjHxVZu3yLKaKhFTXwC74hFZkHcJNGLxSfU0XsBqYWJmAH9h8kwiOeJ86L ZEU0zZ8FvePDSEkuuRGtCz7EMA8oHxnzwmBeXsWnT6460aIrkxmiuvqmm2/s3avPfffd+9BDD+s6 7ye0+MrTH42qNWXBw7POeK7KeVkE5JH3y8pY0IOKsXLVEC4VC8nLyvhb4dVvt8ln3TsXeNVwgbzA q/+tvGoKqApLDI10VVetjBpAdcUnDG3hJrx0zHKPHkkV1ZD+qMGM0ZGAWnIZA04DDx8v1I8qSnjH jYrWb6Jft8AHbl7UNoZmIrgYH+Jx48YOGTKUcFGgQN4W9ISFmEutFoDVe1tX8CEWOkRedaF/dT7h 0pRIMh5Ssm3JEyyciow2JMCKGtrmRxtDGciQeK7V0Lc8jx6xal6RQGrV6D4J4JVncqh8GxicceZA 6wIQ2NEUoumX9KRxxaP/gH5sDNX8BsrB83Lu3Dllh0qXr9rQa/i4vt3aHti6atni5Zt37y8/fuo4 XiLJC+Noo+q+11zz0Xe/65o+PSuIHo6RnUkB77INpDQtHZHDLIGlg+TZcPwEkebwYzlx8nh24syx Hj26tWnT9lQye2M9rTh5ggAsqSPomePHjjZuRG7O0nuBHYQ/+9ld99x9z4MPPMQROWCsdDTpjp0r Vqxcs2Y1vs2elgrxbVq3Ab8OHjKQI8EnTZrIcUac5IJ7OKQ4i4Mu+twzzDt1SXuIqSNDb8mIz1+h m8LjX7lnZ0U3RQK7z56V//amfUf5MXu0Q50I2e/0giPoxPGThw4cPHj44NGysoOHDj7z9HOPPvo4 MxuSOSEU+3qv5EiVRcUVVGVTi+xI17ZtqdFN9wx8hi37FtzyK53Kv/RE6yzQJREJFh+LfUP+TSDK 55RKTtAhGBKhA5lo8Y9cbdq2kbcUnvZy4AJ04jix2A1EGCPU5ij5gFGSeU5tDFI5wF9mVjzHJYwW +STrtZMHDhBbHd+bfX6+5ExwySeOyjyv/BlzDLvYJ9HpTnHzySjNaY/PC0Z6VOqNfPYG4g8dOrx0 yTJisHzve9/nq+iXhyYXf+KiL0KuCtLU+pNazjpjvsBXUs7LJQCXZWy9mFpebsbgzPnP+Nvi1W+x yWfN5Au88itxxqsg2fkcgxfkKpjf8M56uSOiKRg6XzqGJVQCOg8dFtAwkCs6A/XQqXOniZMmDB40 GM2B8wYazkDdholATaqHVFeqIi9VVKDh0O5hLYuKUJkoY07W4PTyZcuWT548EaSxYcOGPIAOrWmb VdXigEimNpUGbrQaZkQSNvoYZRrH1+zmEgSoxaU2rz4lNbBUHlepVqUqsJdt5G9YowNDkEyUk58G 0F4wKFWjgCOEgszM1xsc9ibqDUghAfwV7Vma4Ns0QvCAFPY4z7khZl+Xbp3ZstahfbtBQwYDjjm9 e+bUwQuf+vWLG8t6Dx7eoW01p3Fv3Lp338Gyo8dwEYabh48e6TR96lvf+96rjh1f/cILz+Jz3KNH rxQPJK1x1CTn7ZoqsHcmBzUZvE7O7xwv3qtXH5qMFJWW7Oaww65dCarTpOpUFX7fx07SR+DtpnRh efnRps0aI3WgzewAwpIDB/YfLTuaNhscOrxvXzJ7A19Ye6FS/Wo6deo4cPDA0WNHE/uZs1h69WZZ piPikHw2gNRZkPLMblrD4YhpaQLYzVShshJJZvZIMsWJK0ykMjykReYHmJOfykBM+XwicOTeNRCz mEbIpRt6thyEq0858RO5OBHzmWefPZhFuxdt81dLsD8dVoHqYlBIlYWfRsMZUsZLh4z4QKfSt2xh 5AYB3IikQ9JiycVtrCFC3DBwTCwETx5B2RUT4NRqONwoRfQnJedYTZk0lW2Xbg6J4YClv0e3Hvic 5D8XiiiFe1QnhPGWQnAfStKUrZhRDhdfG8o3rzxhUrd/337m/0aHdOznWRQdFF+b0IJ+KxzyBd/c 6GKHVXS0gyjGYMiJ9YZsmN5CZC8XbOSbRvAKGgKHFa28zdti/doUqGqf1KUYXnnGmJn8tgg4/00+ 6xov8CpE8YwCeYFXF3hV8CmTIa/wO/O6k6umnuUeFwZs1oTxytCepJIT+dk2V+HTeZO7dhOyA+XN ajUJ3J+nUoGJ4oOwyclZSuCvdjXViek16+pu60V2CiSAtLEmBg8eCK7Cf1eIKbWhe0K9+YRawiKo eczEL5kbG7NjkmOrL754NskwmCXnkwydsNbPjWY2KVdhB8wtULd5zR2qV00snTaQS2ztvQpYSOdD yaZGsBeRU6+++irgI+CSV2Gizit7S5A2n0cheRAQ2EvDfFgoVf9UpwOPIED6uTC7MrPifEoOK0E2 yNW5Y6fxY0d2aFE2/4lnSo93GjJiSIuaQ1u2bd+xs+TwQWzeXAerj3W8ZPpb3vL2K2uabFuyZCF4 YuvWLWXlR0FafXr3w6eASCZgWpAth+l4MjywETdeMHvTJs369O1P7+MegMNux47tObMQEUmuCcmE eYpQFTWNACU1J06eIMgJe3vxZHBSFA3xRKQsBstAPKBcuMfg3W9AP/xoPcgJ3mf7CNP2X+RC9EzT O3fpBC7HB4N49WzOYz7JfkTogUVKjh0k3/JP4iHEKGnB87w8RC6lQrniRsm0i8W7jL7seCmQ9gFM 0ZwFCkTGrUs7aMiPXa9cWa8/uUJiQxLE02LlNNPDnz0tKJ2CXTDY0apYRkuVChe4eIsMuFeVQuCw 0QMjSKWg3IvnGteFy0T3oy0UO3Xa1CmTp+LCzioEF0cfgZjlBr3DpmpM4/mvkMSEhOtgHbNHQ9Y4 zfZLIuZ27BMcCcy9t2TvocPphNqCgWNLXXDIDyJrd0A50YrBFR+l+ODEsI2hFx+lYGN+VMYnKDgc b2NfQXQc7JWYulRRnlF5kuL5Ocko62oF/eeHgAJ5iJ+vXpPPusYLvGp471zg1QVe5b+W5+pD9/qT qwLk/Xsf/d1WrVuBp43FgV53fdmvsNoOtYFJiXVqMDf4wHhYvHX5W7WEbkOphI1KeJdHnBboX5FB sldlPqBqR1aNOYVj5swZxLMDf9//i18dOXz4JfScpLdAIwo71MGCm9CvohB124QJE9/29rdeefUV kyZPHDZs+PZt2wHfotKIqRcZ9UwNXCtg8vKhzAmYpfoX0sUAU+/KFu/FZ1GO1GKJx7vmk5/6g0su veTq664B6y1auIgs4ssgyaJsnWUGeVFyaG4JA52EtVLXWBNYgl2jitUtAYDEcYBAKziCGfjggYOD Bw2qPHlg4ZLVhyvaDRsxpFnjo9u2bNq+o+TQIU4tOVh5ovWoYdfc9tbr2nTYv3Llsl27djJNYkkB UzQN7t2nV89ePfFOqCRsRjKrM5ej3sy+nPbkcdQRiySNQNuEesC5Yt26NdBCiI8WzVpWnEwRuk9V 4vt9sqYp3E6u/6Dwfv36DBo4iP15Xbp0zuhMhyZ6fjhhI2MqhZW/Y6cO7EbAe5umwSgA35HDR/B+ gDDai7i279C+X7++/QcO6N6tO/gP3gB/XfmBJ0ZNie4LQYrOLYatga7kszLjykMeu9uhyrMpnaxm U9/Tu4pDIGNMBTSMWkKWQv4LsLhSYe0OzLTakFVhlsCFJnBUKhiOa4WH4cyszFNsw9XEUeNbH/pT qiiEDQP9+/fjBCuCcjJNIEYNnxeWFPhumB6YTnR2wwt6FUMrGRifC+XZEJN0Lj7lnHVl7Br3MVI4 szj+xqfAAZvvyhh9jiDb7uc7KKEov0UxZCJx9Hs+vfdRsr0WwuNgjIchHvkquHdbcPRCEFPPTZB3 DjMGtb8tAuqv99Vo8lnXeIFXBayrp3cu8OoCr16Nwfu6k6tCm/ff/8PfTZwwnvi1OHATAhvEg55T nWg35Ub9BEpwl54JwjrOW5fp0YsGi9B8aEqtaKFiUTBiAo3NpKRYU6IGd+zcQQJg0N13p7Cm+mao uqglUFE8VIcFBImfPtGFg2BNQ4YO2bVrN9Y4TKfs+WNbJxpagEuLLNa1bJf1VbehQfP4QFgjT8KL oEBPB0mRUd1sRh6ebktNzR133I5fBPHQwKmzZ81evmw5zjyuPofKN70/w04W5IX8WbKWQq2SceA5 bMwvBegvS0paehqmp/jZrQhMAYQCPbMzb8CA/s2bViyYt7CipsPAYf3wvN25Y+vO3ZyreKL8UPXQ QZe+473v7jew0apVy9j7WFJSCiy+4so3cPw3tluM95xlSBh1ggOykMBCSGbgrIShYFqe4PqBIZqO 79q5Mw4hGES3psNxjnMKOlQ3atyUFCdOYak+UVNJYBPstScxlvfu02fatEljRo/EGYZOZDMnDEXk NMrqMI0MJ4ei1snWS9NoKbK0/8C+dCIPKLAmtbdX7560FEMwMx+gW6s2rXFKxvUF3sIWnijkZuch RWFBp3z9cwTQYRrk3r5QnALtWYJITrDLJbryVdpIWl7esUNHDl0imHenTp0ZGa4CUU7MkSxEXOvY iSueK10hrgHsFFGjB8bUNCYAZtcZKY8FKYqHnl+rG7dfA9JYUZoLvRQbJOTZRnHh2z1q9MjxY8cT xDOteLx0kYACQc94u4HFa9VG0ZBoTgyEGJJ0nLNE/VKYd40dM5aHrI+xfhJfhuiLmDzHfMM0gaRN 4CjLD/mCpgUHgl12ZZ7mILKYfruP5zESrYvnSG98GQrYUv9PeZ6vq4HZa814rsppCA3nlvLzX+MF XtXK8wty1RBRDFRQPHgvyNX/YrkqRN4cuI2rA6G1r7v2mukXTd+wLh0ph7oVKyAK6uyQCdU/cAT1 LLDQSIxaJSUQR69xAwvmMTc/heNayGAxhaA7LUHUiFLnmEki6XqsptpOVcfbvpjEe/UyrIGKMzBN 6LzAppINACXMMJZR/BbS3KBDB3Ahh43rKqrZjNr5S7HpRMaX4l5LrbWH8vY+QHAeS/FQe1so77yq VsUGXCMjBGCXnXvZHMJBUAf6s1PnLti8OdJWngh3ZHvceB86O8ZwgAmnOgIm2i5Ko14Ya8dZgjZv YTflgTZBnym+9vET+/buZ1WkZ4/uJ08cnvfU881bderTD9vwiZJdJQf2lxw4sq9ly2HXXvfmK68a 37gJrvNl8INDW97z3vdcNvfyiRMnAdmXLV9KcJhBgwayZROQRNxAnLzT0YNVbLp0r1vah3nyxLFT 5SdwSBgxYhSwePOWLTh+9+pJzd1xRyED0VMA4MlumnI1pp/wYak4urd142b9Bw0GAkMwpWknpi3s 2sz8iaubNT8dSgI7KCexl+4uxYWfRQ78LmgssguSJosbG3iGjb+0dK+Q1Lgcel4JJYmtwQDR7wKu gmJDHkI+VTmuh5BRS7D3JFYq7ETz8jftJ54w/sqrrrjiijdcfMnsAQMHpMnAkaMIqrJkOTHcuNF7 Ow++vfeh0iUlkYx7x0gMEL1QdOTQRceR4pCUZuvirWUGSBVwh/h57zAPGz8Z+w/oT+x/Ts8xPeXD 0nBfwWidrytfZsFnNy/2Maw8CBPndUznPXv07NKlK0cv4TleUrJn6ZKl7uY0o/5jEunYtC4RtjQE W6Ih8TBamn/iQ/vdWuKKMRutiyqiIfZFvpmkce9pjOUCJtT/8xxmzM++Gk7DOSSggZW+Fmq8wKu6 Oqu4dy7w6gKvggPncPC+7uSqEHm//wPvQ5PQDM7MA6H27NXjhRcWGuTBHXhcYtCw9qnmhXHRfjSu Zj80uqA2QIAOD7GfjASiJfWf/uK+FdC7om3hakrquuzyuX/8J3/81re9lQSrVq0WfOd1p+ot3x+i HNyYhxAsecjgvn36ErLtrp/dverFVRRIyhTKLluF1/TuxIBiY/leyBLNFIpFLd7H31jf1wMnVGle TwcSomSA/rChQwnBQRVDhgzZunkrIX6NcEcWeJJH/PmWinWCGMuXVJlAAGxdBVw0sL/0OpDJ0SKY CbUAVqJqbNy4iYjI2dpFB6ZjRw+WLHh+Yct2XXv37XGy8sS+nXsPlO4vP1EzcOSEGbOn9+2J8bIz sRq7du0ya9bMgQMHVafTcGrgNk4g8+bPJzI6IBr/kDat27LzDvCNPGUuBjWNGkNqijbI0siJ40R4 aDZoyBCw1LbtW7dt38LpoT179MLrGMN2FQlOpA7CEI5HMe4qm9cuX/r8gjbtOgwfNQb/7JLSUvhA AmztuELRNHxdcPvG8go3UruOEEC8DAnHzkqYwwx8s8CS2ogIgwlL9pRs2bKNeRdShwxQDgW61MOF cAK7dWJ2rqKg5sEoHCN9rM+QxWibaRnnpcsslkl6BI9doddec/WIUSO6E9kwhQSp5jUdxLzXaWEg ZgXJyZJQO5AuT6glJlG+Ffe79MG99ToBcK6rWzYTCc+IUXJEhFLoADSvwhZvTWNp5uInD00gie07 tBs0eDAR9JNDUObA5kAjPe/llY1ycElhsX4qfih5ZoQE/+OeqQT8HNC/P03D8clVi1iS4sZop34x /I7ZChfcvOdvfFKimd7kP3TxXar1efRyPotVOGDjk2LJfgALWlorN4r5E7Tlvza1Jjsjb19rBNTT itcaqb/1zrrAqzwHXmvicda9c0GuGt6trwtepaiCeUI5nHL5smWnKk5y6Ax4ZeKECWAMYoThq9uv X78rrrzi4tkXo6vw/UBnqOP9+5L+O41NeYja82h693KJD3S35f6qq65621vfSjxwjxtUB/MWvah3 BFlCEUohf0X8OBi8933vHTV6FE+mT59GULlVq9Lmy0CfeSXkQ5+4ps8JLCCtDRs23nnnjx995FGV n2gbQKALgQ9FqK6nU0goaUsruMRAPAzsJaC3tMAWAuIwiJqAjNSOAZ4jvjlWZu/e0n//+n8sX74C 0BaAphiRhLKXkmg1BUJ5iqzXvkOKkleTHCc4tiRgGSl1AQqAzhPeapqFElwv2ImIpywMwZd66tTx O7e++MKStU1adevbp3ujyrJ9O0v3l5xs1LhV7/6dO3XGZH0ICM1uSuBOilNJ9PGa0zZFPOWff+75 hx56iD7C2aNtu9Y9e/YCy8FujJ/A34TTssSgJkjCCZsI4WB3NnriuLJnzy5OkGcSSDxv/FSShzLn 8VRgh27fplXzzRuX//qBX2/eWtKla7cmTZthKSdYB2TDSZoA5saBGw8WMSU4m2YCEunhxk0atWje jLDi5UfT1kwQOabuLVu2Llq4BLALW8gOtW5CJVcYm2kdINWJUIqkePSoPiH2IzKMzBuZWzDKKODS XK0EOoPVjO3YoRacLiZMmECkFySfaC7MAcqY/Rwtw2WCWpSZQG+i8IC/gb9F3l4iWm3VND82QUq5 GJfnzMdoEX/F5bxS2mOFB/IE7oq3jXJS7exC6eVnyxYtU1M7dmDWJCVk6de3z5SpUzB7QwVjhmQM QJG3M1v+mjJG0xkxZUh7jKkc1mykPb9H955TJk8eMLA/EzAiDNIoJz9IHK7nSBSEQgPEaAt3RAQc d2jYuoDswX+7O98p8jM/Bn3iwzyO9yEcs8kxAOPbpawWMKH4yRm5FLXXmvLlln/+CXgd1fhymVlX 17yOmnzWpF7gVV3j8YwsPWOCC3KVUwS12G6KOf9b/NL+xuYtET//+f3PPP0s59a+/R1vHztuHBa+ q66+8s1vvu1NN9900003XnLpxWPHjQFYbGd73R5OVj+9rh2gEEXierewgL+s12tz4qd7qoB8V199 9Re/9P9d/oYrbnzjG/FtIK4WWXRE1udYa5xQOEGm7LIQysQxd9as2UQ4Bmbhw8AJ2wsWLEDVCZJU bKpn7bv5C3MXocGfeOLJRx55dO2atdYY8werKJhRWFrA8aAkjxUkkr9OIcTcUhKqXW3tw5gP+JBG QQlQjxUGQvz+/L6fMzEAOotpzCV0C+nxVV7Uonwyzplz6Y033Thn7qWjR48CCwLDQDtkAYGRRTBH jTyhaimX8zwXlGdHDBIAuu3Agf0nThy9de2KpUs3NW7VpVf39k0rjwJPDxwqh6yaqpP795aU7t53 +FAZKLpz5644Z6dDSbFwJqjbeNHChTRnNQeXr1mzcOEL69evozqCAxLRAnN38jupBOpVVbvnsppg gnhxJ2xKZJKBAwYQX2/btq2kIvZIh46duOHfieOVyVWlydHly599+oXle0uP9us7nKNwOEI8Czi4 B8HAbk1zQLTdunVFnmAx7TqBsTP5MtU0A3fj2l6Nrb0SKziZVq9avW7d+v37D6Rj7Y+n+CceCCXi FH3CpRBUGAVkN3Sd/UIyOMaQ8ZBzQZXzT1dyECFdmEjsLI4syi0/6bVu3bu2xS2jXdvysrJ9pXuh Cr95caF9ZPoQvLgJ4SSl8ysFBuQNMRBA4TpqC/SFyzxxYgDydpFKVysnn1YEbZGRMnmiEd0GOsHD 72v48GEXzZzBcsew4UNpAQKAEFE1Ejj74tlMzpRcGUXsFt14lMPY2mHr6tJMkd0br4LETk9kVFVN FWcoMTXi2E6e8NVyYn/pnEs//Ud/9MEPfWDQ4EE8nDlzJvxhcYMmE9PJTdW6zMWod6zFjMUBm0fe dpDExDAMOn1e3HeWaUPMzk2tyNsSittb1Pza9c1ZZ2xg+ZGsrorOmoDXUcbXGq9Q4tmZWYUXX8jf Oqm/dQIuyFXxZ/Z/weB9HcnV//A2EXVxsUPukksvBX8JC7B5dySQQIeOhJ7ARI3FqOxI2fp160kp ygyto/lN3Y/2Ameo41UtGsko6J3vegfxfXEnbtG85chRI55//gU+By7Hg10wVQKbyK4frchDsVB7 kXLs2DEcj9K7Vzp4+YEHHsAXPD8NEGpLTP7SFJe0cnYAtRuzzCjNcSPB/DU9tYQZLK9m8uqf+zA6 CrMkO+9gGho0n9FZClXATFqNlQ6fZmJuSKdYxOYHVTI84HselnGP9fSWW2+ZPGUyoawvvvjiGTNm EJ8RMsCjMTkRq5EYUqkCVlO7kAKe0AU0HFBFWEAuLNkb1qx8YdHqZq06gA6bN2t97FRjABpbHemg Y2Unyss4Npy/BOM7ha01YbUWLbGCE+n9W9/69mOPP67vPqgOiLNnz26mVCNGjOxKRMsaAg6moy2r qkHbWcBBwPypSmSDknFAJkogNxs2buAky1GjRrJdEmt1ZVWjyqryg/s2PTv/2Y1b9rZq3n72JVfO uHgans9AczZWclER8I4ohHCSeBs0jdrZMJoWPfD8bn7ahydmPjoakcZZB23X4YSfMM14KXIM3ElK Chc+ip8cKYb+4K0Xr8B2GJVlO1Ub7d5y7EFN1KcdSzCiHykjHDUHA23A3WfTptggYU/Z4wHULIHS NM0GMbGaIUnpDJ127Zw5kDIi9tBAN6Q6QbUE3upCo4jyXOStSAcc557hT0Yiw/Tp2wcn9cmTJ7HB EeGhsDTlPnyEpk+eMgn/GWmW1QiGQs68RVY4uFwWUyxDSvPjJf9VdTgUw3Q5g9HdBDRk8aIlmzdt dqs3JbOm96lPfXLO3Lms4E2ZMunyyy+/+eZbMSiwZ3bKlMlvetObmKQw+2KjC/yms1wBCFt4oG0p t1F5o7gsqhWFFyN1nigktkXi60HeJotyGq47X0nGglrOPwGvoxpfU7x67LHHbq3t+v3f/312kzDM MYUEweefya8pXp2foXTWTL7AqwIOnHHi9FsU7Ab28mnkbWrINVhvOjxl0ACgdjKREsUtnfudgjGj GIgBd+rkqReeX7h23Vr0KToyEKc2NoFsLK/70Rc3qFDZNUfI6oGDBiY9X1WBwWnVi6sXL16ioQ6g YFxt7pPvwbF0rEwoWtEAqAwFPWTwEFDaT37801/c/wtI12RbDLXzEFwyNNoFhaIZDXiCG1tkYsjQ PYCHYfQKrZ8H0JYT4NtyhBTyNlSm5QeYzkuVtIELzS4otxYVs8+L86rsqS7Fb5k5Y9pFU3UkwKDZ vl17nFjYtFeKF0sWfN2SozkQoxWTEgTcVEW/zL54Js48HKyD+09p6cHNOw637tS5f/9BPXsP7Nit B1id8ynZiApGTp46p04Cl5ky4SNBdsgA/v7i/vt/+ctfckPJmhLpUAArJnNOPu3RoycB/cBJeIFn EEc8ymmV/CZyDgWegJ7Bg4YgUsTkGDFiKDLZqnVbdmqeOrl/0YLHn37i2UMHKwYMmnDldW8cO35I 966dCCAOzMKOTi3MNPDW2LN7Dyh89+6SHdt3HD50BEN8y9T5LTnMEqqyjZ54muM6koydkAr0wVJO Z2mo5glcRbCVagYIr2iluDPhvOy5Qe4MCUd6ngvaKC1AbWJOGZtQT/epXebMh78s/mzauHk5PkYr VmZO9jvglR2trMIKna0VVPNSO9ntzZDSMIGTHgL04+KyF8LN2uY45JVz7f0KvILn6pPOxw5kLoE4 T5KNvw8bsrv27dePruGJc5XDaVZyFEKZpSOEbdvkdw02wcmeKkDeep9LrZMHnvsNCVQtB2IESVX8 jdERabC1sxBRWlqyb/++zZs2sUWb3heLI07Tp0+94oorO3RoT3X4L7VuwxJQ2o0wadKEuXPmTJky ddpF0zAKvPOd77jk4ouJJ9+3bx887piYx7k88gFSHUcxxfLeyQ8sKkDk0Zz4DsQYjCaQi4a7DaYY CsQn2qJqTXNuMxbQcP4JeB3V+Brk1cc+9jGo+td//VeWlOPia4aAsY/oyisZBR3mzZt3/pn8GuRV 8XA7t0PprJl8gVcN/9C9vniVkLda1gvNh6UHQeG4GWxZKQZzcgRIqg+ljDrFafKRhx/FPRqd36tX b3WMsRF0LRUNqDujZNgndCA93gisSjP43Q7VqmVr0MZzzz3LF4HKSClK0MSIegYoWIsqR7yyfds2 Qn88/tjjfDvQdiADMUEAU/Wi+EDIyyVqCdWl8rPkoNZkXLzyL+YB6xUiyKioi3sRj4SpPuUD9wXI 27xRRZCX55VpYg4QWYL+mCFYVP6CQlg3ZuxojNyds1jXTZsl7wK6tUOnDgf2H9iwfqOt4HIi5JTD Ta5mpylMtS6aMX3mrBmgcOJFdGjfkdjZnbr1Rlo6tGnRrm1LADCIvnWLNoBuPLOBxbjPErDk1Mnk +qynB9E5QHK8EnPrxCLGok+BxcAjnEGI7QgyTMFO8Pom4DOxS9Key+T6TXKM6ilQd5/emOGJjNim TStic2NX3b5p+QO//OX6DdtZRLlo5tXX3nhVp46tmjapxsILbgYsZgccHgN1IbH4G3ARR5LWYWhn z5+AOOt9+jeBRRCnXr/hlqAsJR+VEycQMJcF9CThuU8oAb6xqosxFWd0BoKWY57rAm58Qx08PORV udJQ6sSVXhDEC90Er6Jt4bsCFrM1ZY+fAnFZGgOE0iILCfTz5q/lU6AtJQ1NCFwOAbyi47T6hx1X 1G7YEx7GzDaVxtJD40Y4JOGXBNsjDR7z6ayco+XHy5llHWKaRKz0Vi1Phw6kuZST9U657mcyB3p4 SKMi2knxl1RRrxV6+pyitm3b8sjDD//6Vw+sXL4C4cHVGwJ27dzFaQDMbaAU83zXLt0wzCd7c2P8 nNJKC4tvbESurK4EjowYPoLFtOHDR+BZd/311912222cb7Vu3VpCkSICMD7GXf67RO0yTSJF5I5Z O8jnfnC8zzfQ8c7fWpF3/hNtrrqYUMC0s854rso5awJeRxlfm7z6+Mc/DmHvete7AnYTP/dXv/rV 9773PRxQEOmJEyfedddd6PQ8/RfkKhTub71bf+sEXBiDr96XtimAJt/B8BpdCF5Zt3YtLhzPPvvs wkULly1btmTp0ocffvjee+77xS9+MW/efLDbyJEjOe4E5a3xzyVpDc+BXPM4NXQ2QGDatKkoNpUQ yBvH6wXzF3i6HopfaOhiNKoUNCCoDb2rwgO6QSeVGnfPT4ZaLe4DUgtc4nKR15TqRcGoDwO75BEw b0VUphGW5WFxWCWFU4IJoVusKVuy/LFRYl9ZESqZLgABiIZti1Bek5gePvJZSrx5Sc3XgA5HjBie HKPbs90tRQXJaG6EszXIO+CCZVq+NlTJgMYBA/tdNAPY3RmTMMmwXLbr0G5A/959e3c9dfzYEc4o OXUKA2+Xzp3atGtb07gR2JXYJFgsmaUc5Zz3srQw0qJZC+ZXKUBek8ZGaYQP0QUwM4tAUoJBdMCA gZiMYW0KYJJWV7Jz5rOtlxlSJLROBUdrMqfLrK2Njx0peeKBux5+7Jkjpxp37zriTbfcMXP2KGAW 6L9Zc+y4KZwIFs0EqhCw7CIjLOVMnx49e2SuIylcyWkE3DiFpYM/IHXgIIkzl4lmcIO/BvbxCelF 3nQBkJqfvKVkPIbxT4DHotvk7HL0KKJLCdSlGw8pxbUyXJEQTNt9InI719EketMCHbA7oFsMipCi PKRTzLR5S7Pp9V/Xn8TzJjXnQ4DBy/Vxp14nZo4vZEBptxBn15KEZxSTKpoGtGXvx47t27Hcl+wp JRp+AqMpbnoNU3Rk6fQQbpJitsAc8urZYtsdWVQH8i5ApYFord2mFaTxJ/QTDP6xxx5/5OHHKBCH q0GDB0Iryx1snDh8+NChg4cQZqpg9rF5y2ZIZ0qQ3JAOpxkCnyDwN+VANvX06sl8rysW/969+xw+ cmjp0mWs5zGRcWAKlGWCnegMxy5z1EuVMxnTOLniPhYrzG6jFNd80+LLlv9KF9znP0Tx6hVmjDJf YTn1kB0f2/yN/esYOc9NPusaX5u8Enn/y7/8S7F4PProo7fccgtj/5FHHsEwUVfDL8iVnPltCeRr U65CWl4N8fhfNgbr4VVjbHX51grj0KNsU0N5JL2SxQIjXIGwibcobCbNIA+UBwZC9BYnj2jwVvlp qOOGK2Al/USCFGSjfbsPf+TDt9x8SwXevVVVnTt2ufueu//iz/8iha04eZIyAQpJo2e1UwIOEkIK P9B+lANrBqQIpBuvSCmkJr3GP57wU+sdul9sEeDGtnNpdpJyMoq5XaaP1WQHpFpTwjR1O/1Q3apr AXPG7wvDpLXksZTYwqZRY3bs4un9fPQFJchbTWJqaAqnwHBlsXzSYFzmk8rOtksuuXjc2HGDBg1q 2bolnYjR96677t6wfgMlUJ3IQCJdYRDnUXIy+40adt3116djHauq0kk0LVqQNHniNm5y8MChdes2 EfGvUZMqjMdNmjct3Xdw48ZtG9ZtwJeFloJd2rZpTQxBPIBHjhyBNy31zF8wn9UJplh6nthS/tJM 0Pllcy+7+uprW7VoW7K3dM/uHcdPHcb9o2mK290MNNu8WdM2rdp27dK9V5+evfr2bNm80YrnH/mr P/38o89tbtehz7WXv+1TX/j9/gPaHDx4BNcPJia4cFP2gYMH2c25dNkyjinFVUC7NT7rXbsR4K5z OqO7phFzBTiQIgxWVnHEzs6du1euXAmFMA3ChKGEpYNF8ET0aRhvLcGCbDpl8JBBmI/pKCYqnD/F EbBMKpRVciHPjinDejh/E2cHbjMxD7mxl/lLH8HziLBpGicACozIz663WKXIJySjajzHtOK7iERz GK1MayktwrA4NyAmDM/1X6dqxxFokmkM5TiOqI6SLU28noHMSmLFJBHN6uc5Y4DsPOnBOUU9e4wb N27UyNEuCBC7Pb3KXH0wjbPBI5Co85l+ffsZpdthZVu4sTobGB/9UI0+gVdLly790Q9+RCBLfK7e fPttUM6Bu489+vjjjz2BIxT9OCa7IBqMTpj5GTMvYsKwZ08JwdQHDhgMyzHgI/mE0KFdLBkhzyzI 3PnjO//+7/4e8vl8QYnrBvG1pAn4qFx+2WU0HBMjUsQrqoDV6cCBUycRDFcFEweyGDiOOHvcrxBZ uGHlxCd16Xs5k7/yXyH21VEmNOQTwIRRo0aBsQpgFs7ufMnTruRs1501UgJSzVAtJsByeMscPl8+ O0n8maechhckK6CcqvF5IMiVeaHtu9/9bkEWiClub74uOpeMpIEwxiZm3TxhkRcTL8TDljyvIABu U6MfpVoz+tDsCxcuzLcR0wYXrIOGujpL+vPdAQGW5sewOGNxlmhv6JqGiMf69etJhn7PNzky/uAH P6Ciz33uc3fffbfl1y9XEIytrbjryVhrG6mULPQvFzck46sC0Mf7nJviumptdXFnFciwAlnQd3nx oATc2YtrrCsjQqv7e8EYRFTe85730HEWjhWyYNIiqe5mLa7R6hAVfAhNk6e5uFsVYxU9F+76uObz 7Qo2Rq9FObX2cr6WhjdZwS7masFIKaiR0XfzzTfnhzNEIvn1y1VDJLkhbQxeFZN9fgio5+uhOBX0 ciHyxgSOUlHJASCwAmLbslAeojB4jvZFnXOkCFqZv4AD3HZRJC4cuzmSZJrWQlPyBO7gh9Kmdav3 f+D9b3nLWzBJYlsCeT/40AN//qd/cfT00SdVmnvFFi7Qq4CtmkuQYYEib37qzGCaWLsPe7OGTFoh 4hFMq+qoRchCRnnk0rxpeK6CtAonFYISEYAMlRIuIb6M4gKJyhABRMAX08vYAOWSQfPpBRsC2WA1 YJyN4q/GNkE26S1Z/li4ZEMAO/s4EHHOnDmGX1y0aPGa1WvIyyv6hZQUoiON3sn8pK7M3N6xfYc2 fDHHjB0rxARw01kZvKti5xxAZPeuEs7XZFtku/Zt8ZbFmLt+/UbKJxYHoB4TMm4hrOxzDs6kSWnv HYUsW778ySefcPQ6y5J4+gUEcPHFl7zxhhu79+hFGMG9+3bR75xYCcZIKyEZ+E6BODp3HDx0ePOq w3f/6D+/8s/f2Hmw2aRxl338E38w94oJzZpyFk8lIUtw325czTmZFU2btWjUpPrAvgNEJed7R8RA oBItJewdR8pzyT04zEOi3JWWlBw6cAjLKBTCJSAgCXR6Tlb/l3xLYJc+8XDD6RA3ffulT1WGqSr3 7zvAzkggrCIEY3VK0YdEc3KxACuH1GX5zv2c74m8Rdg8Z/LAXyGywqwAOyf0RmFAYJKZP0PeetfA VWSJeQgXP4HUOGHz18INpMgFo5RVSuCtuzMVOYXWSaatI00MPSiRVzSBvsMHrf+AfkR15HwodhpQ DmSTfuCAgUSKaZK516Oldu7eybZLN3oyGQB5Zybn31z5geZn1NFXkIYnjDVWz+784Z1LliwdO37s W956B8sRq1et+tUvH1j4wkI4wx7QkSNGsukWPuAVRTlt27ZmbgZ6GjNm9Ljx40HneJvMmjXr2PFy vJtYmgMjYzL/53/+KjsWaBcshefOw+0mOMZe0k9/+tM33HADOzSQnxdXvoieY6r1wIMP4BTHQz5S u3fvcUsudDKsnPD7MeFjwETGHolvS7EK8Uk9SBRiwHOkmTp1ah5NAmtAWpg/v/rVr+aL/fKXv4xS /73f+z2MoFHsunXr0JfvfOc7iwkQrvH2He94R/6tIK/4or1o3y996UvFlGOR1RG54CI9cDAeQkxd fPA5fsw2StpGjBhRIBX+/O///m/ehpnJjzN7DaGBlhZMVIqZHNnNKK/Iy/Xcc8/h0VErkfD2b//2 b3lVYN6yNHKRtyAj8O6P//iPi7NEsjwBtVYa/RjI22QFGWVXvu31yxXno5GlWDAAo/fdd1+xSPD8 a1/7Gh/2AiL5FH/0ox8tmF+Rxo6GnmKeSPm9995LmcgwV5SpYNcvIbX2b10ZbUgBr+xoa2FYxUTi i1/8YgECVqqLa7RbHYB1SX6+FSHG1EUDA/FHGkL0UkvxjLEe8Wh4k/PtLeAt9TI8891njcwrvv/9 7zs3yF/w57Of/WytHdRwSS7IfsaMBenrF+y63hZ/BM5iDNZD+ekwfJFi8ODBCeJ0IGJxc/xln3nm GdSDOFKcyo0YFCUB7BauoW5V7SRQqQgiwSKavjQTxiJsZqmtzozpqYE4ifIPdctzDG9oMroQNQxQ cJNZVC265bIoMnMvOM4qBRz8xjROLgMFmACdBxnCIDS0RiYnDFYRIIZihU3B/cC10U/5DlMUQiDE ScIywWXABbknksjjiXwaKxWaxw3pgxipjTJV1fwVcnEjGMK4efDQ4bVr19GPOONSK2iSkSyE0t4v iMx6KrnwQjP3hHIsO1oDJMKAB6C0ZFu0Yzs+01uJVDho8AAgOfdlR49wIk2nju3GjRvZpg05mu/a ubO8DN/v4xxWiQcInQIEmThpIkZBtyFSMrZA7RCCUYwBTz+9gD2aN9zwxv79B1Jyye4StmJWnDpO jDj+gWmPnThZfaTRrq0bt61ecO8vfrX/aKP2bftMmDxnyIiemzauA05379mjCWi7pvpYedm+A/uZ 4nG4T/++vbp1bj9scL9N/fut37ARtI+F24kZzVcsk+RghsRYntZk0o4FvmistMQ8SvlRWmCs8xYu mpBNR6qAqjjbgB1xaseo7IRTaGX5JJa3jpG8PNB3Al+lTqmIrjexvc9fNBnnQcI0Rh/mH0OPk1jp pSJL5q834RNie5VqC+Q+1nYcAjElKBYtxxqVcm4sYJ22IF2Y+lw4cp5s7Q5PacgYmJa5MBvjG5Y2 XWZB1lltSFHmk9w2ofeJ5ZL5ArVnhkBi4HiMDimRG/mv2G94gltSKixdfIiQK2SJGT8IftDAgYOx aQ8YuHvnLmfgFutp8zxxKg4ELz+WdgY/8cRTzz6bwptycuq99943dOgQDg1gSoBHyvMvPP/E409A KkzTGd01ATuOv8OGDZ8wYSILg3zERowckdnhUpeNGDl8w4YN3bp1Z0b4wK8e+OEPf4hx3aEHhcqh rR4+YjiDFIgGxC9obL7hdd3HNwHogIpFVRejyeK82qoF62e8wJGUXE+yd7/73SF4JKPw92YXnZ5H S7yiKLQ7zz/zmc8A+hV7rHo85BXPwTRWlJ8A0CjgC7o84A4ZQXJnpLwgQf77+bLy1pqRZjobKSgK GQPZv6zyyVLrbCQKOVeU17V2UUztGWtUJArgMjZd8CJKnHnRt7/9bQEiD+1fIBoxhYpRI2mYqPAq T4YEYEwtRp+RDCAYApPP+yd/8id1WcRNlpclpYuHBU3GAqWsBs6Ge0g1D0lPw2MdSQBQa4870OQS vvV5dlEIVTM7pRXFA1/YjX2d2q1IOmH717/+9YLp8Rk7i+wU9Z3vfEci62pyMXPsPuzZcAOSiDAt MdYISBB2M8wp3J4lJXTS3aQsmPAXM7nhw6QhbWxIaWddzrnK+D9iQkMxy+/seAOCvfjiqgEDBuAJ oD+Dqi4usAV6d/PmzXy1gRpiFB1quaEcghIzb+Pw8AwXggVP6yreEgvDY71TALkEwKsxiRl8zVjI aDUSAMGB3RRF4dQbq9uCS6YHmuJIgE7lnuoIzTtt2jRo5jm58M4kpt71118/d+5cXNI9pS+dL5N5 DggUhJvGWNAuzkX5mqMonHto5nIdwKElfAk1E/wRAwli9JoVEuVHlBhI4cuPVe9J6WZEW81PCuFG NJPvAn4GQvJe2qiahsyePet3fvcjf/RHn7zmGhZza/aUlNhYi9K7QE5arI7FXPxMi+PVyffgRa6V KzdtTnE2ANn8mD/vqa1btgAqmjRrPHBg3/Hjx3br2h2cjasG3sLDRwy+aOb0CeMnMCWDQTDg8JGj 23fsXL5y5bz5C9auXT906DCG4hve8Aa6Qw9j9/9BEtUtXrz4pz/9ycqVyzt17ASU6d69hy43WQAS /IVbEmVnzcJHfvLDHzy3fFtNs04jRk2bNG1SaemW9RvW7SnZDQRujcU7+XUc271n36Ejx2saAZRP 7tiyZvum1b17dZ86bRoiDb5h+UDTox0tisIvPENUKfqhSNQEzs0yI+7p+NbcaLrmL5ibSQYwHQcD tkMQlmTnSzjPECKxu1QLseLhJUh1EcPutmvopmx9KblzRC+THUYxQDzHB87oxALxMW0zuyPFikJE nZryU3itYEtAyIA4klcSIGq3BG4YOITyvOwNl910803XXH/NuAljmS2nY40IK5kFIHJCnhib2xGR Vi2ySyKhzml5Oj20UWNGOdMw1tb4htAunst5B0h8c4oVUowgB0jyMj9yhEIoqrR0L8zh+B5CBI4d M65r127sJBs3dqw4m2Sk4atFl/HBwRsKjcIqXHISS4d8AaOb7N6zm60snOU0ccLEREvj5Gt3Itso THe7cZbLe33J0tIcs9W0ReI05ay68N+YsWMADRdfPJvtyrfffjteLn4egd1ve/vbPvP5z/zlX/3F l77013/9xb/6sz/70y/88Rc4RaFgjJ9RiyhUyg+XEDDcP+rJnnc1iUojvU/iJ8L2hS98oVa0FMlY Io8LMlDDmrvQwXkyKAqVTFHob3wPgnIgOGZgnmMgjOV4dweCVLi0tKHIeUJFixYt4i8TrQJS62ly Aa/yDTwjn0kQpBbUCF4sLgpwVmzxjS9A8fefJyxBkKBWx+tiyhtIfHFGqBIWA+Zq7dAYXHm5qqs6 JQ1TaF5yPvGJT1D+3/zN34C8GZvmpV2YS0F+vII5xQyHGGhDQRQQQHpkr54OIqMS4hXiYevqEQ9I ilxhxy3oZeE4GDfmexQLlES2IUxn+jyTa61RLjk285XyRCL5IuXHjo2FFU6hWZUKqYBObeqUGbOR hosH2c/YZGt3oMVF83/3d3+X7LQaCJ6vkUmIsyyGfEgUHc0Adzjn+67hpBb0eP0ZX8lH4KyH0ivJ WIi8ObeS4tLBgo1qUCr8XwBHdbCoNwWaaJsAk3GORYpoLzeiYcPmrJw//MM/+OQn/3DmzBmMu5Mn ToJdyMXQYgMcDgDl2bnomYEuCa5GNT7KzJ8oE/3NE57HMKBeoYBPqJTSwOsubYO2L7nkkuuuv+6N N97ASRnMdMEoRATDhI9yHZ9dLDRTgjF6qUgVaIfZLlGISCiUvUDB1pElkJN5Qzg0cOpRQHr9BGyC eDcwUGSM7PnPMW+1quqPAbU6G0iPJav485BLRBVAnBX262+4/trrr73y6ive/Z5333HH7UMGD5YM 6Kch3tNSaRCuicC4p7Gc6bh374FtW7atXbMOkyTjh9h869au43j2RFJaiMAYzZFGXYePGMb+uaqK 6gP798ODfn17E6Bt3LixGNoFuGXlZbv3lHBIzaJFS158kXHb+fLL38B/2G7BH/QdgpRJUTOmW0S5 ue++e599dgHQEejTrVvvNm3b0fPMGvDiqSzb9dRTj72wYjMzmi5dB4ICBw/usHnzRjwEklCko3gS 9sH8ymSqQ6fOLVu3OXHq+MZNG+bPe3rj+g09unZDMJBADnZJ+9g4xyfrJsGofkFwFfE2mLeTLsGo vDKlN44OEjhpISOoDgRGgQJungTMzX/NnYwFuhUlh+DlsHiS9xgCyqTDxOkZl8XGwHSKqBM2F2+V z/hm5Q3kafRlbg8hBpJkaZaQU71Emew0dPgQ5reMLKZGuDBNnDihV6+esd2QvITqJ+b6hEkT+vXv x3CBfkpQBpJ7TDoYNW3kQAqlCw+f5559buXyFzmZ6/ixFBUH63jTxkE2s4fkZp0cjl5alUrbsLOf emHtP7Df84yA3WxNYb0FYYByqO3StYszTCb2xDD1LCF+MocE7mNjJub9HW95y9vf/rarrr4q3b/1 DpAx3y5C2Pfo0X3suLGgcUQKl3T8/vliMAQh3hiLfvSomguxQXES7om/NAQUsn3HdkQxbdZkspiO iUohdOiXdu3SAQLQMHbMmNtuu/XWW2657c23XTr30pmzZuFwTNAn4nLGJ8VPU/0fdyXHkeuFByp/ AbtnzIidgpQFLsj5XHkCQBgo12LbVUHtIW/m1bZXAEBR2xSFIsd2k6eclHASV29uakVmeWEuyFh/ Y4M59VAbaYpvCurKt5F7GkIDgRf5zkJaeFJgCC/uLMemF1ZMeg2TYTHyrj9jPZTzSs8BHDy4MKzi s8FsB/7zs9hXuIBRdTU8ktHMAps3WVjVZPsmMyKCqBTIAz91PSJBcZeB6uAYSFebQnQWnIRgmXkW IyLP5KC82C9CegqookeYBN5zzz3F7jFwj56i+WfsHT3dQaIFPWXGghrzg84pa36PbJTASgL3OlWf kQBzNbDJ9XPYVhhdIMQDOvl0M3IL8vIQLlFvGAIaSGqtY7B48OZ5VWsvn105tQ6oc055YcejzjnZ EV9ecCpfRk6J12uCRob1C773798PS9Kll3JE4mgQsPA0tDjxBC6/4nKid13+hje8/wPvAwiCw950 85s+8IH3v+/9733Xe95JQOXVa5glE8wrnefMWj+b3jJgkQ4xIbFHLWr08kYApFWPv4FXTA8EF0Dg osxiMSZVTmBB0QKP2DYGosYKSxxx0qCwtQoLrYTyUSwlhMOG/cpPW8ffzBKZao8xI1sgjJLdFSeG 4wlVaLLV2JmXkoDI0bpgr71OLyC1WtSE1IJvkbf0eOWLshAoNKIIPwE6HTt3Gj9hAj+hzaK8aIvG Uf9aLzfSTJcAa9g7RGDpZUtXrFi2YumSpcSswKcCmyJBHljWT3AcPF6yC0/ZgQMHtGjWklNgaHun Lp3Gjh89ccrE/oMGtGzT+uSpqrKj5XtL965bkyLYzJ+3gJ6cPXv21VdfQ+jDbJ/u6aM0cdWgUuDL Aw/8+rHHHy4vO9q7N8cj9iMWRavWHZo0OrJ22fwFz724/1ijVs07jB05Y/bsqc2alNEW1kt69eje tJHnjOLj3pK+7tmtC/1B8JRNG7fuP1B56kBZdcm2Xq2aDB2A7zHgu5PzKHgIXD50+BAgDq8YHmIK BQZlodDT2kgMeJijTVfUS13Ox1wwSUbTl4TKrnHU6BDsTwVYSaBYrekKoaLlbFD9kk3kTk8+lXZ4 y3iERZQGRmGVwA0VioFpuLFA/tq5zhhtCImDAGuUGO5dpaFuxdVcgng5wEbJYcOGEmmUHbf49owY PpJ14dmXzAKkMgZpOumZ2MyaPYv9lMSAZ0IFs7Bqs2CCI/WWzVteXLGSyRtnG5E0k9t0fhNeK5x0 s3zJ8vnzFxBunp80BvYkCN6kKT5LtDdxvaLSyDDp1KUs/DvcQAhZduMzBSsMUpnCHe0/CBrGD2ft mjV795UyV6Jb+QhQo82hu/lkYYrGpM3MYcrUqR/68Ic+/4XP//mf/9knP/WH73vfe/7wk598+zve tmnTRsS7edPkI8eWBjxlWBWzu+04fXXsAoh56KGH/v3r//71r33tn/7xn773ne8h6gwZzLWbNm6k FQTaxPWcckhJ08mcJm9l5dBZUlKKCwqGdqaINCe++wVfiQJ9YFcWa+7kN79zJ59ltJ2fl7oy6tgA qiiosZgAigL9gAAK/DtrJcDPtUIs5i5ALcIF8F8xeWR05lCPa4ESW9Aoa7TSWptcz9vT461eXtVT IwwEFOJYwigI2oCPfD3Cw7WuzsrzCoM3HVfgltOQjPU3mV6GNi9tqFQKqfj21MrkemoMHkaNFEgz QWPogsiYt++aJS/JtBERRTCovZhypnYU+P73vz8EG+AbgRGLCcj39cviVb7tkbFYckxG/9bKZCaW NKR4DBY02WlkHnk3kFSRt7UXEGBpsPqMYzAyNrDJ9Q8lF6Mwz0exfPMRJ8a44SkLSHU4+y1qOKln 161n98Es6Kxavx6vBuW/idZnlfPnz6dTH3n0kaeffpooAbHb0lYJETKbNFEd0rEgKDl+AlMEJSpv frZq04oDL4+WHcHrcSrhLaZMIjjuzItnzpk7B0vPtddewxn1Tz7x5L59ezdu2oh7wzve8TZMaKgx +g8EQwdjo6Io9FOMN6Gn8BFKqFGfSydzFKKrQNKLmecA94QMw38UlQltx8pT/LL8djHBOpezNwvX u8bn3ojPNGZTbMwHopNQw+hybIEpkF9GDLnELjYhwLevQkDzCD5mkCagFtvuc+mJK2ZgDnvFOmyc KOSs4R2Sna8V2z0TS+QeKSlWWOYcw5lVADWAhbZPCnFJHdi0fv2GtExRnk4+Z/ni6QXP/OiHd/74 Rz/5+tf+/T/+4z+emvdEReWpAf0HdmjbiTPk6fc2bVuPmzh2+sUzRowZ3a5TJ5pRdqyMk03Yeshh 8gvmPb1rx25mbqxGTZkyxShybMcFISE/oCj8AZDBe+67Z0/Jzp49ew8bPrJ3n867tq18+OF5W0vK axq37T9g/JtueuOoUX06d+6IAzmx53E0h0ewHGYDNnEp4WjNvaW71nKQSumJAb0Gjmh2ouXSx08s eabZ8fKunToyEevcpYuNTUKNtBBoJRngiWyBq1Q73Z/goftl4ZWrEFBoxGuRq05KgW55KDhjUFAO NzBWsK7wBCyW5057eM7bzEyeRhCzRwLe46JADET7yIzc4yPBNw6rLXjN4zCVFrF+/usWaN4JYXwo FXIlKp4r3kiIjijadB1KChWtxGcak63E4JnBv169e3Naarfu3RAsRgkbavsTPLt1SyzcCfG3asUE ftfO3Vs3b12/dsOSxcuYdD380KOcmYUgkR4S2HTIdfjIYVr0ox/+6L++8S2WLB977NEtm7bgtLNm 9eon5z05/+n5eBNt3b4VVMrEY/PWzdt3bEuRatq0ZQLA9wc/H071An8TdYf/YBFlMn/7+c9/cfdd d3N+KhcBUjPIe/rChs0+TohkhkkIS/ywmYlRGp5pH/39j+IHAmbiE/dvX/vao489Cj0//fFP09Gn 6TgnPjJp2SG2CPMTdnl4Jys2v/zFrx5//Ikf/vBHf/EXf/n5z33+r/+/LwHHv/vd73zjG//5g//+ AZxnFY6VASD4Qw8+9PgTj/O9RbPix+XmB1pR8OkvVicx2KNPC7JoVvz85z+fx4Km8StBRjwB+Fih Qc/oDg4B4EgDj0RFUU5B1fmfDCL3F0ZGKa8VjkdGI0tgSvSz5vOC71s9lcansiBjXbwiGdABH0V2 EFJp2AXPyOQ8DcBlPSjsLF0mtIkG2+shgDTAYlQezhjFTa4/Yz3iYdVMmeLCER8UyxCDyVDIzkj+ nnWNIDknbzQ/Lw8ivGLLfUA6IZoYLt/L/CR6DDIJneFuBGfgLcIcDK8VYDVEIM8io27iSLLiwcWN 9ywZKcn1bH6gRlhEArjhCkMD5Sp4xdee6kI+8wQUc694XOSbLEuZLTSEVzF88uLx5je/GYFhNSP/ 0XDIYF6RMwWkysC8rqlr8J7Fh86iglf5n7V+Pc56KL0aGU8bO6Novv4oVyA1zQBYaA2NtyIAX4Hn sh2Nv4kQZ8Q08Aq4h+MHO3dMMRM2btgIpOjarStlYlasrmQj1HH64/lnX7jvnvvKy6/A/EOu8ePG ATXQyvv37zOOBJZs6nUfHjfCAjUnKjPiK0MAJSerW0uCVLT39JZSMNeuXTxMB5NXVe/bt599Tlu2 boES6E4onNAZGXznr14BqFJ/ap4MJe1NMKFgJuBziMl7LcNDC5TsPO6x5OCn9/6Mvz6U1XnOm9KH pBGK5QcGhdBftJGFfTAfbu4JoCeoXZ22AHIifftUJnntVo243FiXZdq5PI+fUMdz7aPJ16JJYw5J eWbBMyzxHzl6hEJY6KebCE6CoZlw2jT/QMXhzt27Dhk6pE3b9i1btd6wbh2+AFUnT7B2T/mYaAkn h1MKszIW9xcsmI/LJqDc8x2lik9V6iw6um2b0aOHHz+yauG8Z1av31NZ06JLh/7X3nDLNW+c0aVz szat+jZpDIcbn6qowrcEoAiDCEkBusT4uW/v1nUbdnTo0H1s16bddq5odaD01LHq7dXNK4nM03cQ gupZTpnZshE+BPgKZZbjZNSUz4g0b6FZmRFA20F6WoubSRY9yysfKgOyWg7HbMcbHuoOka3DVINu yctEES+EOZfOwepLEP1v/Od/7tyxS+aLwnVvUGAox+dC56hCCp1BxYxOqkL8eO6cUAm3vc7KfOWl AxXjkXTJ0l+Npb9Z5s1MEPSmjHREEjeSLDxjJQONRQzepWCgJaUEismGamvmVAiJZyrd+aM76Z2x Y8chkwR5YJZFdRVNKvCTBlhDIaZi3KMp5yjH8BxKB53u37ufAClOA+iFbKNnHwKGZKdvtgStQnmK AnTsxMGDhzC/Gdh0zZq1SBETA+jhcB/y6qBFdSzVEPmB2TJzdEZ85hKSdp00Tx5Y6fvQqWPnMaNH f/SjHwO1M7XiJCY6kN4kCt/119/QpUtnAvUQLIVRn4SnUTpWCXFKZmwAevNmdNCyZcupCNs/4y4z 5+9lFe4973k3f7GOb9q0mXrZu8niDPwkLxxGnIpXhENR5Ud63Neqxpi1Ar5xjcWujL6HISpd4Sw3 rPUb+wyXg7oUYTwHt/G5JmU47OY1Qj47afxUWheGLqoGTeLAHR83blTG9XgYn0WTI0vxpkarrjVK mrl05I0LDAGUBJXWz+R8Fn1hqVq07XwDgNvAEugL8mo7jyz5j/8Z+yjfI6qJyJIHSY50nyAD0MkF 0nWXakHGWiuFjXIYeK1Flv5lllvc0lq91S0TAtwErOE2n5d7RBdWUAtoG1FhbQoPmbp83wvUX0MY lW+pmwTqyeV4LJCQM9YCb4XjsIhmQjxDIz8EzlgCCSyB7GcM3tKQ0qjdeUKtnVVrCcDoGE2IKMOZ v0hLhCoyl8MZRB4O+sWlNXAgmLHhH7r6G37W5ZyfjKeRd3wx3UmGpncxPcTFRvIK1eWRKGhtNBkK Ce3IR1nXDqx0zAWHDBksMkZXYTtn29m0aVNQVzhftm7dBuWdVlhL9/Jx6da9O0qLBeUDBw8ANfxu 81zYikLip9/osNVJAzUahsyYfTyEgDKU7skT+EigwjXGQxIqDYKN6EzJmq4NUyDcFHxE+WEIF4hQ NX/lQ3ifh4iIFPUZgBuZK2c7KoJmqLIKCnRDXkgVpVmjHBboRBfIZ7+D+eEamEnALXlmzC5ENmXE xQDTL2lYAUiz28yhJjuO/nRElChZ/Kf5Vvp5JTrhhufJKPjShjxKtgmubMBnfFIT2qqs5MtCLpqM th0xYhQW45279xzad7B9p/b9evdo27IFp12uWLG8dE8JIO5w+dGK3ZWHjhw+im9KWfmUqZNvvPEm It+hnpkd0Zt60EIADEzOB/tKTh1t8dyj9z33zKpT1S0IyT19+rVveesNXbq1PHX8BOcEnTx54PCR U23b9mzRshWmd8A6duvkdX+yfOv68qbNOo7u2XLwoZUt165s1aRlk/Z4nW9/ccum8TOac3xPJUcF ZcZm5MQa4SGCJEoL8VA2uHxolwkEuexWeKjBmCea0jWykszuEfVG54rF7XruBwzshS8+h7xkBrPb UoiP6qqrrrxqw/r1d/7wx/ku0wAfMmDtlGMnSmok0OCtsGUicXo7JlkknizehLSTzKUkbjTwOwaf e/b55FTToiUzusxLvumxE+XYobdu2QqsxHECeTh48ADfa1qxHrf+hYtKSksoBw4I3x017EPFDRqv lfLyMhCtI8jmyHB0A5Ige5lOc+Yo5ffu3at1OqYmOWrjvZZM5hzgxNisrCo7kjyODtcgUWXM2yWe 7w9lugiO2xelQXO2OSJNNddtWI+jJB8idAkeKbiiEQKFJSqaQLKXRjdT+qMrV+zjs2Undu7c5YMf /CC9AxmcwrNs2VLIO1Z+jC1dhBHEbK8PUjZMkIcUehXHcSihOfDnxhvfeMcdd/DFw+kcqzzHsuIu zy5VqvMD4k1d6iT/fahf5fAWTIM7gdFFIjE/8zsvMUWfEf4aoAOoVOylWkxDMeqFZsNsn7GiWlv0 sppsCfXHBqm1FsNK8Ep4AVrC8QNHOJYFzsjnSMBuRcA6tQO+wUzwth7oWVAs8Bf+GJ3jLJpsaS83 I+iWxoIRuQpcXOppNV+nPIcxoNYlGA1vfgHlTAiB2gBueOjGSuYw50o8CnjVQCLhVXHKwGfFrwow KCJR7CbeQNGi8Lw/WD4XBDSQfsUDsdSFNSivn4aCz4WJGctO2iOvkxMnn3UVWBBlv/56X64k11Xa WZdzfjIWRhWkV9SCKuMAfzRPvYheAdQmE/KWLShuTESkRxVho0KjTJo8ifUYVupBZskX8xSQqC2a ldh2Kd5FFfEZ2oJIiI+B+RPPE1wOqAJ35N27dq56MUV6DgwqOE6mrMzuKOIRffIXqIQuh0jhIF6e gDaBtfvbSAbgjpjHNgcNiqGLMiM9eRXEpOaz0+PELjZcgJV53KYrRDbI8IlYJ9kvq2twxuCnSEjy pNCKzJhnbDzJU2KZEhDECOACcnmjSRWABZ95ywQDNtEXAGbudUglMgNzGPxuJUNOwihKFltbLK+c 8AjHyQhoEHnLWO7pC6+w/pIX/jD74uOSAn0cO4YHwuCBA7Zt23543/72Hdp27th+4vhxnK3DzjPi IrPicYzsmesuhfz/7L0HYB7Hda6NRoAgCfbeexN7Ue9drioucpNL4pbkOk53yr03+W8Sx8l1cuPE duy424mtbsvqvXdWURTF3itIggSIXv5n9wGPVt8HgBBF0VbCFf15sTvlzJkze945c+YMwA6ZOfvs czBkPv7441i+01B9uPv3HYIYDR48dtTQZU89cPNN924/UN+rz5CZsy++7rp3TprE+U1HGutA2nV7 9+5qbePcylF4grS2MPnB8l3CekwSO6N4wMwxxTMatw3aVYlDeCvOBUfqW/q07N59YHRV7dSpiUc7 wJPmwEawETLJZIAQeXAgXSVIrN3cB3/E2STWx1fmyBnFJnrTTtcm7QICrFZiTWlfcINNFMeWBZy2 OH4cHhrElcORuqmlEUzJJIpQjI8+8hgjDsZKiVWERFmafRrwOlmaOCrASp2wWwTsW2gT3fLK/rVY U5LFdnHjwE96Z9Om6dOnTps+jYAhnDADsH7+uRfYFgJg9eIopU2bNjOOcO/GMZrSKMTgPHFRaSUR CXcmu+vcnSnljkFHnJyh0ro2+nfP4cOHCPcrnsbIzZdnQL8BiTFp547nn3uRNQEknBIMiORGDlnt 4hiX00U/Askks7mZAlnZ3rptC94pHK20YeR6Bi/2ACLz0AWEJXr00cfgA3qF9DCfoTF//nyOl2Jw 4WrOVopJkyYke4ibWsaNH//PO//fs88+hwsOlIPUmfth4OcehqdO8MwfBjFhcPsKe4vZd5EuG5Yl B1SlPnLJZoOqKhhoz3Z9qRtCDHISR2xddLZr3PAKEMOfgBgUJ/gJlAyyRBl3HTXCqB3ZANvW1SEB 1KJ8mobCsZcD/VHhAKlsxmO1r4P32ZK7yM5pL9m3wSKinjEn7DCjG/t8BYvgHlZGHB5Ez50xOaco sAh5QbHUghbLwbLZMZuTEaAPo0D/+ZOTrnu5CyZEF3TNZ3Fb1lnimDXSTCPZ0dfgS9rLugq/FpXl Vc5hMd3scQlAShEYZZVtmt3Bl8ekPIeAIK87GT0RpkO56lA86E2Ex9387nCFyUhUF2OnM/7ku/6b MqsCusPb7EbY7jTZXsiKMW3xc8Fzvh5YyqxX3yH409n87Y2Smm1ON0k9JgeOu5y3LmNubBPZpLpV S/nrTbwCPyVnszUkxua+FRXsSDvr7DOvuPLyOXNmY/HC5ZqUwARmSARyxqkAG/dPf3rjP/+/f/n3 b3/n6aeexpPkwx++/uxzzkJfopyGDhkKTFqxfKWIRFcQTW48CbOiNHD5BBUbCcQ3Ym6BiFoWeKEb rjgjsbr37w/4RnGiUwMnURekYqNiQEKbIEk0QCGiZ/Skq9jBCjmjSiCOyuLTF0+eMpk0aFAteVy8 CkCWHXgxeEKj2DSeW76syA5sC6QttAIi000q03E8u/DCCzjC47r3Xfue97x74aKFROlLAZbZi0CT KW6oN95ZwO6ozmLtWY2C3jgVAStQHbziBgQjUpczZuFPEntECyv4jz76yNNPP9VQXzt2DDsjKw5V VVftP9CrZxlh3RadsXjazOl9+vWFt8T/AONu27592dKlIEsWQObNX8DXlgA1aTDKcXQEAOiC889s PrD5pv+4Zcmafa1FFRPGLb72mncvWDCimIkDQtZQW7l/z6GqxpKi3m0F+NhU1R5pKGgtIJZES3PD oZrait59ZvdvG83ZTRPOKhp/WktZr6a2okO1zQ0FPXv3HYRHdz8OmhkyZFQSzGIYoTCSaV7qaO4F G/UwURodFFqIuWCaztzcizu1KMOQWOJIRsFRKcpOaC3NQih70KCBeFP06tMH9oL4cXtIYnqkTh3J jtU0KIeF8yckIWPhZyyYdhwZyNJXIux4G10mGTGU7EQhuzfKHkUZTZ/LADsYnvHBvPmmWxjFf/e3 X/7rv/7rf/navz722GNsDQTy6m/DhIrlJqbl7Gh08hmAOyrlIWONRnHpReMw1Ogrh5VzLcG8dQoN AZzDip/G888+/93vfu+73/3uj370Y7xBsKBjQk58nA4ccOOv6TXweGCnTIMhDje+CJMnTaL74A/b M5ij3n3XPV/96j+xb+F73/v+Lbfc8h8/+QmxvY1czuZvNgRzNs2QoUOwgiNc7PCEbZDppJSxT7RK HsJ2voSXX3n5NdderXWZEQFYYYkvidG56uWdu3biVAPox0AObZs3bQT2kQb9ysI390QNP6YWiQTx 6cjJwgkmDFjgMpe2qIjHZ6QwkAQhFyEMzIRpvLMajbbRhfm2MwIskIpYZKcWUFoW3mkwSw6RPa5L XfhGr+7ngjynK3Km6zZmyRB58FnucDGhw3L4euBTQY1ZH/qcpnWfgDfKEzFT/tVFjTGs6FykC4iJ pGVPSgo+d4G8c8Kh5BOA9wuAmxIYI50ZvN8o5TnpJS/wdGdN7oxFXY9BhxvdyoIAA41fvgY5qzHH 7FYLQUK67tZjlmN2XYOyCxTdzBi1a33XPy3rpeZw7s5E643W2DWT36i0v6GxfKLGYBdNzkXeVCna Ey/6Z6A0NQ1QbMGChZ/97Gf+9M++9MXf+91Pf/bTnBV3xZVXYMvRRov3JBv72LEEgECjoM+xa44Z OyYBBg0NuP/OmT93+swZeDVi8EuUfUEhwSVQ4Vgr+SKjDj2/OsxvKGPbENOAwNZQyD1K2lgi/Lrs HhhdQxpFufUNBexJPeDsaB1ZDGRBLlzZwLWhpCEGBUzEAz6R11xzNYVoGD4KwBJ4QeRp4jnMmD5t 3vy5EyZOEDBRkZFJAn9kJSkgtcgjxIL7MJdKnhXRLrf9AUzZirr49EVXX/Ne4qABuDnv42M3fPSS Sy8hnsxVV11JL+zYuYsg3DAQX3x+cYRlKxuoKMs9GhuEiQK9YBQwRfzNn3AUP11NvMCvgHeB5ASa vOIrCTZiHDIbvv/++/bv3zduPEFExjIHOHjgAH0ydeqk088+febsWQSDBF9BD8cEbt+1ffmyZY8+ 8viqVa+MGDnqyiuuBOWwRp+exX3W0JJdP/z6P9/77MrGgtL5My664YaPTpjQZ9euzbgVFbY2Hz4E rKoq64mJsfxQ1e6qwwebWpsJLo4bS+Xe/Y3VNaOL9w+t3lI8bHzRFdcUnnte6bgpRRUD9x2qGziI A2FGIjJAzYb6mtKCllFDB40bM4bwiMnegNQvAuboNRSQUWgY0znmbwgGVxqeJYkN4pDxl/7icjgo ovzCNOUqBpRs5DhKXC+QGDoFiEacRBwn6IVVL7/02KOPa31vtyqnfAZK8ptscAYJHr0hfRYui5gR dZZ3+CWZuNzWOaCgDUrC6kynS634248A6TWWm4sbApBg2F6/fiOA0g+CkzEKhA9Mz9yTGlNf558U mGwNORrI0rcKv28dHcFtUiqiTv+4GKH0ThJuv7gYcH/33fe88PyLHokFhc7DY+JBe2k1WNxjBzCT wwcn6mmjWlh8S89YZQY7CoIxXaPveUXKe+659+mnnyHsCY5zjOvPf/5z/+t//6///Zf/m9D4WNlZ Z4FOADQcLiok4mGyGYCKoZDhefY5ZxPb9PIrcRS6BCGjdpZ6mBhQ+y9+cce3vvXt733vu1/96ld/ /MMf33LzrV/72r/cdedd9hQN57MDH9+oRsn5uOvDnWxQzgQtyS8T/giYunD1xuDdmcktW2DXoDaC MESWMLV2qJaEZV3v+3yrVbjm56zPfddttGlCE/LGSSX5bM+hHDQGUu/skL8cJneHhmPWmE3QNVrq DpOZMNBTniUUJRtKsovCfdU1qDUydHccot5Qk01sMMQOTek5TBZWdhFpxwK75hVTFNoSNu9udquG g2NW3R0CSKMhoEPXoDckVw7M7OpWdr9sfl8cR+90Vkh3BPLXk4AOKe8AeQeoohniDH7VwWGFmj1n 1gUXXUAEsUsvu/S8888//YzT3VmVRKstKCCKFnsclyxZesvNt9x9590oueuuu+6LX/zdT3/mN97/ gfedceYZlIlUUSBqmmGwdfvWJ5982ur41RwSepSqNbqbQG0dqlq5F9OIKiKBiQPl8EpzGpdwPErz CTWKlYFTNESfS0rGQfN3v/jFT3/6N//oj/6YFTZZoUkPBElKjF74r6d2vsIZM6dhGwOggAYC5Ui8 V5byeOJDf+W/TbbPuAEcwBYIA1gD7nHsIVYMA2Ds+HGsYnP4EW/R/ZMmT+TEeBbdl7ywZNnSZSuW r8DdFk9cXBekwWEWC/phj5cVTlFcc7DT47gVfeUBEKAZ4I5r+iaT/7QXBpIGoPPUU0898MD9mzZu HDJ4IARSyP69lc31jSOHDl+MWf70RWPwrCgvw0wIXKw8uP+VV1599smnly55jn4497yLuC4/f0G/ +q23/eDbNz+4tKqt/+TRZ3z0IzdMP23Irl0bN2/eCBmFBa211bUFhWV9B/Stb6jZv3tfQ21jDa7G hyv3JiHaqno11g89sKVk925IK+jXo3jo4JIhwxr79DnSWjJs6KjSHkVHiFJXW71tz75923YV7t87 sn+/yRMnYHsOgyszCmCfod/lnkCQvvDcdZ0l+DVIswCUxOhs9zkgVOQSvGbXZORY7AfYumXrsiXL cdvYuGEjv5jcvvOdf//+97530003ES7D894VTkYNXzotTyJvHhphkCte8ZALgA6jgH3JxIvAdXsI urdfHK9kKgyueNj12aUeJ7cOGceLMg9+TkMoJhH6YqzZImU4JI37KMGHMQD9qvBQhK3fi1u63SwB k2EjLmoefSXDuUC3zJmZHqe+SIO4B7Aafz1GVnwQlEk4o9BqwnfJZfUrq5ctW8Ye0PXrEidsjkOi BKujQ4lVMvO0GcSqx6Bw3bXXzZg5g6N5Lr7kEtbKkp2YrW24RWFuX7du7YaNG5F2NDS104okrE0v Vi/68D10VY3pADViXADZY03/5tf/7aknn37xxSU33XjTQw8+zORi0sTJYBEuhvbsuXOiX7qjRSKN Xcmvxq0ubKiRBSWqQZqq87UvoNBoG8dBRjZLvtFO9R/H6wTl5vJ5d/xiczJ2n85jZuzM0HjMjLCL 2A75fiM5tFkO3gh449BTWa/ZrltxTAI6y56fkTYySSN91x78x6xRSbMoL/uO49LSEPi5CxS0Grky tmAXjYWH+O1g8D4mAV03ucO3+QbgbLJsjbals+glOXKS31iLpS0wma9BzpFSHUpF9qFzmK5zdUZ5 9jn0w3aDP3bIkDfDZPqRYqnimOb57pB6zFF83KR2yO3OuqwLMo6bgJyMucg7MK5KEUWoLwHKBub+ 7u9+4eqr34uqS88dLHL3FToXramJGpszm6sIEPa973z/jjvuoFdYzD33/HOIBIwau/jiiwhgggii hxInx55llfv3E7br37/17UcefoTsYBdgAfXSi/zqXU0VAQICSUunf8ZauRo3EECgSRGAzgOoRmz2 SaCVxBDbHvkB1UjVLnC7g02ARS5Mm+981zvHjB7To6x05qyZ11//ofETJuiBYPdAZ7rXM+EAUEKg xtukgSkayM5kokfNLviIhmTnCWFAtfkiFXJhhC7t2R71OTGE9+6THC2SxnbgVYpgkgLx31jy4lLi uL20chUDg1cCLGt08mCBGj7DUyImFU48tNwzqYBdmLST2G0HDwpiwg4qMpN4CCAjpa1bv+7hRwgh twSgluyqbik4sLsSF5ChAwbOnz9v0ZmLxxLtmz2RTc31DY2Hqg9v3bT1+WeffeKZpwqKSmdOHlVQ te62n/7kx3e+uKeubPSABde+9xNzFo3etmM9EejAlyBIyO/bj8DbQ4pL2HhQ3dZcUtTU49DhmgOH CI+8i/jJ/ar396xpK+g1vHD/5oIVjxRt38L+taqevfoMHjFo8MA9ByvBonWHqw8crqs+Ut24Y3tB XSOrMamvy1iEVsckowrGPkXtr7Q39VzqT/g/4ic659HWmwJTnM6Tvb/w1rkTvBIl6/MgXOYKAE1z 8BK+9577brrx5ltuuuW2W3/+/e/9AIeKRx5+FC9kcbPZ9aQXbVuIE9SowieuQsgoS8BPAz8Q7uk+ 0mgbDn8Ss2jqlux0XLcvMSkzgWuzUhpDT9HKjkRLUPgF7t44LlLsnsxYZDIXqNplBDjPJcKmI0DD Lizwlif+yT1+HahwkpGYt3SBvish5FGpMyJ9b3QE4sJqfu+9991+2+233fqLp556mi8Vb10ZcHTo osbx7/2TbbhMMlsZ2hAAI3Arp218sv71X/71n//5nzkOWns5DGe6izfdmtVriF+OOzv1MjgSgWEZ sLzc8ORMGyiHaDAY3UePHkM8Qzz79eOqqU5M+PDtOFSCGT3V4pixAv0Q6VbBRDenRkNYoKq7WY6l 5VNOB4nJsoe2iAB4Hid7R0aemL47M4cOazym5u6M1MjYNSTtsHeOo7OoDg7Dh27uboQqkCj8fJPi IakICbsYGXQQ0MV5OsfkFQkE7llsSpnY/imcCIb5kmyckK4XZHI68bib3CFIgpPubeii4VEjrWOS oC9+DlXIKqu72SkHCfzc5ctDPpe600Zz5W9c5iGbNBgj+QsLHfLKHZ9dj6luMlnLfTh5OwblZP7m ZliNmBneNH9gdrPGbmY8jjF4YgnozpcnW2PuDkv3oSNAgl1u0G3nnnsO4OmCCy9cMH8+UZmffeYZ wocxhAlXkmo7nCsSKxpqj2AFjzz08OOPP8la7QUXns9+F7YW8a+lraW5LomVAX40JVgQJXf/vff/ 8o5f4pECFHB1XhAPH1HJaCzsVaIBnpNdWx1XYG7FPdVwSVtIoHYnAe2MwSAGAojwkHL0yhUecZEL AyG5kgApNTVYB+1InqDUmWnwF27kgAVkfeyYMRvWrxdVUEuy/r5vX0vLNOK6EELkldWvEDIP3SxY cToRYmFbgn5vYqrAjXDHXycG4WeM606ChguT/ZSoaj5t4A9RIE0GH7AvEU8AzpKkGLKnawCJlzyz Jm6iQJvM5eQqbPM+EXCIk4ApIjngAjyhmTDHVoct0ymBraC09HDTBAORAAvunt17KOf88y/sV1FB XGcimuCJ32dgPzbqcdJ7Re+KNWvW4lDc3NoE+K5tqqtpXFFeWty3eP+dN93y+IoNOyqbRw5d9O6r 3n/BlbPWbVqGdyzsZAkFmy/HpeCwX9azBzvwcCMq61OG2RLAzZ7LltrG0S0HKna8UjB4RsHp5xVW bW1b+0JxdUPtsGkHCyomjxkxaPTwusJkg2dDXWNLU1thSV1rQ2tBc1t5315z585mCCCQNBZhoNXK CWxBRGkUDxUM6kzOmExPQedba4A5+KNvhqsKYdhOZmVpt8pt+R84lSfJtuMtWxKJ5aDEHu3bA8SO 2suzA7vDr0zOQ/GlbiqWY7faWbSCXwE3NJNXLJ6FzqJYiw1hNrtPbEUQpvSaxWRKUdy7PuCE1ofy U8FzfcDZvrLkpbxZi3IlMg7ppY2a0mP4xLAyY05DTEYh6Sk2eySD7FwAaD44zAeYpWAUwI4A0K8+ vRqRxrEk7emiloIkFtCwoayN9Hj66Wfxh+ctHytdzAkuzjSJuQEofMvWrdQio+QGzUFO+KIm8Sh7 JB83Ao2PmzCObdl0MV+nBx5I9i1luRpt7+LLHh0hPuD0Cms8pjLQqMZKdI6DBF972oIXRDfLsaLs FkbKpBAgC+3NCQ2howvQAV9eAnoIxBl0JP6Lv/gL0ncnMEg0ucOx0B1eRUaUlPd82904KM35Rtkc XBUlxE13eB6JqQUOx/kjXXcWnj/6nbPfIOunccwa8/FWxLcBU3IseRcW+m4y2SiBWrJtBdMJehMo Bjyli/mcKmaASFJiSPYIxmNe+QR0s7tzPk3mcr+BR5271NAh93J6GfrZOPH1r3+dLHq/MHgREgON RxM6rDHKF0PTg10EzMkf9UzpqQiawa8MGafBsJQmwF64nZWEDjtLRyCnB9zkzB8E7kyzEQNuIgK9 lPA8RrTbsg2SGNPFqBHrA3SygEMWGqgYkBgWkZ7ez5GxDkk9piT7YQwVE5zPft55+CbL6VomTyDl ucgbmx9xAKkebZSAsOIS9u0RS6tPRR9M1OwuSnwZzz77Fz+/g+NUZs2ehecm0JKVbHQhYb/4nTp1 Glao0rJS3B76D0jQM8iPg3XgiKZlqEeDskEOrfPsM89u3bIleYq9p6YmwZRpPA0uUS+56DYxtObh UPA8USvzMFbJ28lO4aAm86zyIL2x3sJord7lCcgDiyCqUbhgydCDjRAHgGlTp/csKyeQGb6ju9Ig oGQhDXmpml1fILGJE8djj8XBg0BjHOXjnjMRRg4CyI6xDr/aMM3VapigpwG6nM2UhGvEKsghkfjQ e9In2dvxDWKZMIefpE9R6ryFPJCB3ggBbmyy3WEznY1wr0FXe7YetDCfOQlGU4N28yQwhBg94A73 mjANEZNWXZcgm6LCwUMGEY2OV6zsb9+xvbGpvt+ggfjF9Ovdj3DdG9ZtPHBwP6bIopayxsNHHnvo jrWcofLqLmJ5VPQa8+53ffjiy2fu3b/u5ZdfcnaEmR/3Zg5P4VRFXFkG9BvYq2dTXUNdTf3BpmRb YNOAhoNDdi0r3bq+pXxIUd/exf2mF+7eUtBUU1U6qKDXoIkzpvSq6IlpovZw5Z7q+v4EYayua+xR UXektuTwYWYOM3ogvMmqhSAPqcjiToGj+JvvUyIk5WVDyob0rE48cGg7TWaiQgIkjb4DkAnHHbTp dCiZPTolk3vKUswqCXahnMeULPs1UZyyUt3Fx4JkMbOy48yuNxQ96KCzfOcMSkUMVWU4BoWfv4DU 8VZSfauQyEAHF5ewG6kGY8UagpZvC5EJTiMVS2cvXvwJex1x3DtnDmnkifz0QxHjN8u3IM/EskIQ 70fJewTI1R5QOJtVkrjyTU1zZs0iMCekujObZAerqsjCugfDFJmRn26tZnmBg3KQdh3w3BZCAiE4 CZAoIu7TdvzEmBNtB+ZvJeYP4VB37tm9O5rc4Zchp6/lbTx0YRo87cP85mcLJw0YiAGe4/hhGk4T DL1+zHLMQnT2HPJ0N8/3Z+AhtWP+JH5fThZAW4fHZWeThbDl8yqntJw/8zOSALifTQYg85T1rgvP sp2Ux9FZbnWNWrrJ5DckHiTOxpE0Lz1uNMCu3Q9yGpitN4dUkTewkqmUAsnYIQQKswXOK/XI0rhI /LnPfQ4a/BB11l85gp1N1vWnr8OMtkXAyk1O1A4L77C9PGQeixMRsmqUkqCEJmDNVZLz8+bLQ/78 pDsZ4dXf//3fQzbBeXKklB0aItouynGmYcbOAm4Cqb/whS+QAAr53AXl+SG6eUsXMzw9ZSXLio98 5COM5fzuhj/Z+N/daXKHItGdjMcxBnO6/o0K5JupsRDnwuwYII4pq6V4uwKbkqCzI0b80z/94xVX XHm4+hCAQIjGJ/2B++7nuCmQFnAc/UQADXRh3359mZBxcjsEAT6SKA1tbVpAGxsSpxFW59OF+B6Y hDEb333Xvffdcx8e4XwQ1fpQAmTR7iXu4ZUr7KEpA3kHHKcWs1AFdamw1XPoMweqPYc6xJcAjZju Y9sUtsnAChSum6lPyM5SP8b7P/qjPyKQCMenf/0bX8eXhqK09abWMqAABkUUc3IiNIpWGoI89LSg AarEB0FwtlEBHSiT6Q3AOvEZ7d3bzYuXXX7pO9/1DrYAYvEFFxL7XPSjUY0bIFTSZbt23X33vS88 /4JO5/JEEKObrMcT2jojYCg9QkmNo7oxUGlyVk56mgmwG9QrHvLSrULfEvNSGjMuDgqBgZQJTCE7 m/6+8Lu/c9WVV8EnfM337q18ZfWanbt24Ss7ePDA3hW9Dx6q3rBuM0Enq49Usdux9uCe9RvWbNq+ D7/08p7DP//pL37gw9fsP7Bu9eqXuWAepv0x6YG9yATCOW3KNHbucuwkM6J9u/fu3FdZfGTvxJ3r x+zY2rOxrXnkmJZZ03v06122bVddy4CNA0cWjRo9ZuoYVg/wy9m2Y9OBqoY+dYd7bNrUMmTktqLW QSOGjRs7qri1gFMYN6XnRHJyJ1vuYAJHtAD3aSmV2i/Dhg+Bs4RIxBsFGdi394C9zCyFjHDYvbyw UVim3CrSDvgcHBCCapdlP0BdfBE6/E7lPMx+JS3KHlQw6EEtviLXGHfmIo0z3lBO0hkkmZcGKvC8 tV3cOA32T12fMSEbDYbnlKl/l2wRcPMrr5Si7CwF8Y7vr+ZwUbjJ+FjRUwhqiHQg3WiFQ0/juiWT 3UlRJLa9FuJXKB2MQzDWg7kJ/sjeX0Sdrx9CmwTxLCrCdYQn1O5kFWkhFzoPVxk+MuBpXVxoFDf6 aPGdZGM0GzbA58zSsUGwd5NtwVyEacv2l12ZZXhwPh9HUixEsqczjExmhOcanzRHZTPynLfZLGI1 zeFxZcuhcO3BUU7+Wnxk74Jy6kVVx4o5cA2Uk0N5NJ8b0mOfpgnZvXHBKxpC26m3wxrJSPas8wwZ teRFG6Nd2QFoG+WS2aNGs2dZl99ZcZR61zzPZrQTIwSyGe1BKGSy1E3xwOM8/+PQYbdmmZwjHr6i Rghg4zuyretzlslQ63kxTCFzaqQtgbzJS+05HvxRDiKUL1dRWnQWQhIRDEOwO8uYI9tKCJ0YIyg7 lLIczvayNPD28ssvD2mBBuctOWPQDRs5ImEbfaVXdJbJEhmnr+d3meKHICVuuunXm2HCoQem7HoW CqQGcGO2jwWcDr8egmwmS7E7NlpqeoMvHbPGbAhwmqmvThffq25K8nHMtLv5wTyBBLzRGhPkHR8a Mn/+85+HmqnTp3FSys0338wxzn/+P//88isuB0lrNNUaR8fjS0AcX1AI8sSJEsR0Q4d7boIgEk0p y4jezeGUHNhGGIFJUycPGjAQjYVHCo6SbFRSm2p5In1gXzKCXaiO5zo58ETIqMBRNRuhdAlAY6nF wzinfnUjoOqZJ8Bu1CQpEWKqRi9ae4AJ9a44HpWsrwV1TZlKjLvJmzdtYVcWZYY1Tuis2rYK80qM dDJtQON6bxvJ4tK/RsEcqxuvgHdGNNMDB8vgO9911YJF8yv6JCFZWIjgbE6rs3Vc4GOo5dxG5jNP PfUMxt+eqW93Ul1BIa7IGMvDD8Qe1/4qdtcMSdN07NZLGDCByZb77NKB1cklPhmwFGgCMYwxMoK8 md5QPgkA6zT8uuuu5dRZIBc4DvC9cwc7/vZs2ba16sihQYOHD+w3FM+grTvWLHnh8eeefHbThm37 KqsamwnyOOzjN/z+F794w6AhZateWrlxw2aM5QChxIm8sYlI0mCY4cOGce43m0pnnnYaJe/YsqNm z/ahW58a8uqrpf2ntw2fXFTY1Fq7oWftgbJ+E7YMnV07afKQCaN79u5JIIs+5aX7Dla1NRWU79zY snlf5YgRa2sOjx8xeMCwPs21BVjTW4idcvjQ1i3bly5bhkaBjU4OaSl2WviJGzjm/Po6dmGWstpD /ET8NUiCbgB8I7Hud1QChd35H/Sc76yCGp+q7Fuzv9FXHX7Hs2RQrHIY3SoEtwd5GK9MEAQ40LiU eVG7zfSKVz5kxLkb0n1Xzty0iDs/lBK/G3r4KJ8KKm9hvmOHe0P9OCXggskCMmNBhkJyxGVHqFT5 JbHh9qnNyc6W5QBPnAlILfUyMHlO/2p35x6bN79ULZ2IPeOXQJ/IPPZvggbyBYAG3dIweBcXlXzm c5/+rc9/nsWrhAOtBS+tWrlyxQoCk+/cufuBB+6Xe/myoQDIgQ7TnNiMv3ICFLaT2eTjrvEUr7ov kKd4ddJ4JfIGUjtp7Gwoac4P5J3toOMeESc/49tLrpIdhFJsr/zGpz913vnnAsdZCeXkiNFjR+O7 A5ZCVlBvajXQWHLebGHbuHHjZ8+eDfYi5K0wEXVISjRQorRaW6oOVr26Zs2yZct3carhnt2c5/zq K6/y50MPP8LusQ0b1gtJVXLeoOpUYGplNZ/KLzjrW0xK48ePR5eD/Ayppo1KZUzisMOJjAGXGGVF uihFGguiIk3o7+CDNGgS1ghHylUvrdq+PUFggbOVrdCCThu03om8BdZa2kgZ8MtCRACWYBoue8FN e9wcNUyWTps+xYOmI6h24vZdktgLCXPmUT8EN1u/bgN79dDvk6dMuvDiC8+74Pw5c+dgawS7swfQ uig2y0zRjIjHQMjMi7iAj7SamWtYB7NyQhYayMyHJQ5IgmB+PcrEGQvluFmNuHd4byQMLyhgFZ5P AI0aPWbU4SO1NYeqe5a0FRdW79qx6tmnHnvhxTUHDlY3t7QNGjjy6qs/9YlPf2TE2IrG+rqBAwaz pW7MmEQUyYuTN/MFGoJXT3p8fTGAjtDcrfVHBlduHLb8kZ47K5vHL6iZNKO5oqjnnl3lu+sODxi9 pd+wvuPGVgxI/JcK2zBzFpSW9yltqe+5b39B70EHe5Y1FLT0Li/eV7mbMz1hf2tLbVtzIx4Dffr2 BWpz1iBBoJnmcRoUfLBbdZLGcyCJX9GSbOBjaACtYo8jfNC7KUTX/lU+lZ/sq+xDc3WYJpsrJ3uH r3I6LvtnVgIVYEdNTIN5ov+JUhrYOjsYHUEKsALmW1E7T3jLxwHwrTtTYG7lUBeXmPLBUpgWFzIp DX4ErEhDu+Xz0C2n+qn7BXBwye0Yp1Znab61RaQX/XMf/mbSb09ZILnY14qEGyCcGpN4gukuCI/I VSR040HgKQqLACOIvC4s+AllDnzZZZfMn7+AbZesFu6vrGSXOfuh2fOAVbqLaGu2pUO13UW/Bx+O I2NOsSefgLdRjad41bUQHvPTdBzy+TYSj+Mm9c3IlUZonJoAbF0QEMk6jLR43JSf/Ixvhlc5uvit /tK2I291J5Xhuo3BBqiNRsFLG0sv9yJpNI1rPWAy1A84jTjWrEqo/FyCR9kIizEHsrtu5YqVHAWH 6zPGHtYrNm/egrF8+fIV/KKuyJU1/ar51Nwu3HMTsDtQKTdWB/ImCyrQIzlQh0Je3qLexM2hdbRm 6XxJXi3ltMLS1K8QbzA4IYgfAmcU2rfUwfxm4YXidbR8Dp1pN+klc48UhZs3gFSUo163LsvUDqfV 3BgpXFqyiXU9ecoUwqhxPB4HwgMeSO/i4/Jly9e+um7Tpo3Lli5/4okncZGmjZddftk555wzddq0 SRMn9uvfj0AYSeGFCUlhYqTewFgRfA3FD3x0Ydo1h8AuOYgNXgG7k2gPRUVG9qAv4CoEA09jMxz9 wuoCviKcukJIYw4OxKsbaDttytSi1uoVL9794D13PPjg4y8u3cB5LPB45swLP/jBT1/7gXf0G4iv 7eai1gqsy7gewPj+fQf3KKV3MKAmzHGCxIxi9Jgxw4YO69V0uM/WV8q2VZW2Dirs1ae5d11z7aYe +w439By3ccS46mGD+wysAPMSqaS0uKC4pGePnsXF218uKRnUNHJETUszonGkrmb/3pohg4cRUH7v 3p2sBBQUFg0dOoxdgSzvsDpQXFJU2JY49gTw0g9+7569ME0Lt4hQAzlXzLtyBnYOMxXUfOWU/7DD Jx3m7bC0SOmNnetXxichq94oIXGjuDo6YrqoJItisw1x5ilQRjyMcU4tImZHB+ldVNE5x3urkHux u5TEepgok45KhjldwKfg4ksuGtB/ANMeJVysHCg8cjl+pdMbvzP8+rlwdDgSkTF5Ep4tenA5bLXH cwPlzgqcrpMXysHcfC2xeXNjTButA7xNwjKWluEgjocJEQl/+Ytfcj4R4SMZdCTOerdnezA+0Z2J Sn53++S4M+YUeNzl/HfIeIpXnYnfMZ//dxCP427jm5SrgNRgNj+bHX49ukDex035yc/4JnkV2U8O 5cm54qGWqPu6912DDTsxuLKSnsJf6NBqRTLcM1a/vPrggYN9K5LNfzwHy6YRBhN1eODgAW7QfygP 4nsAuF9etRozJxoIjQIuUQNpSNZLWG8KBCLEQn3GpaUt6z8aioQbEDbWejeHYXClWBSwGzTJBfiz HBUtNxqPIZimUamn7jHHwDSl5RKSALuCA3JpqpROiuUSlKhis/BF7Uv5nJr+jndexekbBkgRMQTI yEKWaK98y2IdSVVf8hwyPDaFX6IO4/G+YcPGJS++uHbtulUrVz304EP33H3Pk088SXhgYPeKFSux UmMcnDRp4tlnnyUmTq3vPbAN4zuBn4bYwoZ4zwVQ0DUC+GjABzCQqwH2hZzP8tMZAqsNTL3gG10A w+locuFwwpZKfJtJQO2awAncAc04muhBzsXh8KNGDn3qscefemLZmg076xuLy3r2v/baGz58w6fP PGcR8UYO7d/XUNNMuMCmloaWtobSHoRQBB73xbWDqQkTJihnHsJhhJMmTqooKSrbvbW4qr5k2nmF 02e1Nu0uWvtkr43rC4oHbR0xed+okaUDOeeygYASFeWcJd5GmLeS2oM9tm0uGjW5eVAFUeI423T7 jl2lRX04xnTH9g01R7BNjqCDcN8ndGACPzGGl2Dqbt23LwHZtotLpMishv+Mi+f0TxBm5wbUC5gb LJWxweQY/9mHztayWY6pzzpMkK0lp9Ickc7JbhMCc3Nj04TgjjIHrMPE7E5CHC/OzJOYHqn4mdEE IlcnKjwXMfsF4FcjtNQ6NITIXHCYjkD2iLh/4YUXDRjYH1dTHBIdOyGxjmK/APHNgX7LjE+c9gWe +M2RDCce3Ei2n0Hb6L1tsSgySjMJIMy5PWjbJaD4+kE2Xums/z355FP33n3PM888Q3weXJXcD+AJ 89mLArOfaNvVHQF4Mxl/5QSc/CYfd42neNV9gTzFq5PJK/y22U6ahd0dfj08+z1xZMhcb+brcdxD 6bgzvu0oL8ZbIysK+G+wGxKPBRZ3wRC2x0kAsIkDkLEq7dm9l1VXPEwwPbLhj0Vk+IXl9e677j6w /2B5z7I9e3Y/eP+DTzzxlHZTNApIVH0ZGkvlGjpVNaaTRngVq56zPDUZv4JdiMeBBBgHsNM31MTq MBN78UpvVLQg0wDeGoUDqESNGODdahZWZxG29q2AHdzQCtME09KHLaM4f/HKK+YvmDdh4vhx48YS yhcLlnwzS4ASb2y7TBCcWYtYBGKcdbgli1eHqg6xo+u5Z5978sknn+V65jkU9sqVL6HdPVIF1W4U BS4w9/QZ0/vhiJwiHlhItMGdO3A+Tva8yj1osDoRDN0EuAd5c+mWGl1jmT6Rci5xDE1zASHdiroL Bl511ZUf/NAHzzrrTJpBgTRRzovAtFIrD1wcIzjztAW19UXA7mmnnfGxT3zm/R+8Zu68iTW1+2oO Ea2kCS43Nh+pa2zoUdKrZ2mP+vqq5pZWOo4tlYhG7z594PWUSRMG9OlRun97wc7tRYNGl8xfVDh+ REH9vpJly3seKts3fMbmYSN6jhxRUd6b045wfefkzGZM2W1NPbZt61HYmzNLC3qV9upZDiivOXQE l57SsqKtW7aV9SQKRwWipnN8D6B6aRkNqNx/gDMyaQq949SUyR4MRw4ZCNzLIloK5NJlOYu880FV CJKMPSai6k6aDgtR0nK+UPapV5aSbDKF0ychOVksHg+zck5iQapihpA4s41vKw9jgDtGnEgrkwqY iS3WK9B5eo/AFxAe/sqrrmRhh3u2bhCJSCgcbPcLoACzHMS+FD96JAg5F0NHG+MewkTkvHKyoU06 pg1RjiX4lXPUO7klATQrCfzJc80EyY60rduYxeGqBGnRO9lj1SVP4vMlJ9tl+W/fZMb8z9RJJuDk N/m4azzFqxDFzr5OIcmneHWKV/nq6c1/6N52cpXs3M8yYu/uPevWrScABRCYY9tEafCFX+w06BHw XBKz4siRJCORvOsbNqzfcO89995///2rXnqZ0/g4MfGVVzDorAUNkwVthNIVb4V2EdUJTL0Xn/FL sege/UDU3GFYEpVKLW/dCIgOwxIP7oxtXrzVRyXKz4JIyABZAgIASeSlHDCTy9zAApUxRWn30tBl jVq/hAivHzxJkgkTJs6dP6eopIgDMpiT4F1DYG9Rl79RgiLiZECwJVusWthtSwN5CDgAIc5MOEgE O++okSPxn6ZwpgyJA8XRZYQUphA5ZDAHW2IipuZt27e9tOKlndt38oaCAxNQrOsP2rxhS2JZP3IE dklAWN+js4JyyQOyMxPTB4k/L7vs0g9e/8HTTps1duy4qdOmshO06uBButlTaQKaCEmT2UJ1db8B A8455/zzLrj4kssvmz1nJn5D9bUHmus586+kiZlIW0sy98J+XFu3Y9vmfQcOJO4i5T16lffB1j5y +NBBAwb37duntHZ/wY4trbWthYOHFgwbiBt34b69BTWFNcNmrh86lsN7+gzoU1Her9+AQQ2N7EOt w2+7betLJS29ikePbypsBlMXlhQ3NjRV9OnVu0/Z7j17e5T2GThoyJGaw8hmv379iT6RIK3E07eF ICccZaNrMvgbXgG43d6A/NB3TipEVzofawzOot4O9VM8VCSyozLkJOf5McuMwRJlZguP+5hJWn4X 5IWsOgadTSnS3DhfDVAu0OTXaa3Smy1cZ27S66FBSrK790PIy5+ukjkWHCZCcL4qyCfwlmWrWXNm Ext+585djz/2GEsrssXESqzwHTLwS2G3gMhbv3BeQRWluT/bybYCT3a9zHno8Jd4aYg0/EliEbkw 3c+mhZPM74bc9gPiZyHcabjXO4v0Tt64OoPOOYKR318nJKPEdwj6Tw4B2Vp+zWs8xavooA4/IFlB OsWrU7zK0S8n5Dvz9pOrHOTNEZWcqIyd79JLL5k8ZXJE8oI7PDTiXkVFcmYfoTPAlyhe/LnvvPNu 4BegE68GDztEqRipF00DzCUjqE6rjxBTfRYGJJ1PtE4BZUgDBCRxmLFVRao0n5MGvIgBO0WlyaVe d3+btcSHwHu1KZoP9QZVFIUNjCe4Y6LgIRKa+YVmNK6rzLy1cH3HNbm9fvCgWRO0TVwX9uGRHZjx 0sqX8GwO5SqkEKMEwrZY1a0aWqCg8jbYiPCXSnEBAtQSNfOSSy6+8OILrrzqKg4EnTZ9WuIFDh5N rygKOvFLAR5gyia0ApHX17zyKqTLZGkI0EYu0tPeQIoiiRzyxOJBknVBrWwhCxRecunF2NrTZrbQ iZQBDII8lxd47gKIyNsJDNi0qLhw2PBB06dPaWyoZTtAQ11zr/KKHmUlhSX0VGtBa0HdkaqdO7fu 3HOorbAfESkb6o8UNLeUFFQf2HegqKxf35KGwv2Vrb2HFA4dwwyu7eCu1h1rC+vbWsdMPzx+csPw 4T369SktIQxLv+IebTW1h8rLB5Y21DevX1s+anxd/141tfVsEK2rZ75RUtG3N3CI5owaObq4oPXQ 4Sr2VCLqnJTDZAhQlvh5F7THoRN+0W9AShui5wly7k5Tp3N6IAS3FcIOUUVWaUX6DlN2+DY+ZwpY TsacJzE0ctRAPozzSRcFBswVX4o4A38r80q4UiffSOnMGf7wq2D4fYgS4lthdknlrfNqxyZyazwT bh588KHHHnucG5I5c5YkGSLeBaaDvLnXD4R6ecjnzFMw/arYXr9RbreIIU+lPLdw0zjZkDx+p02b TmBWxkQi2EcX6HSkkXjXSZxp+IWZddosZsiMPmWDT1OM5c7QZ2edewIzdiGo+VSFeJxAArpu+69V jad41X2BPMWrU7x6Kwbv206ucm3e119/PRZrNMHZ5541esxotKNs4he1hK7iBt0AjKvo23f0qJE4 t75CyJI1r6I2VaVALkJeAOiFdGg+nadByca7DcUs3FQhofDcg6Vm5VWoN2sP5Z3V4qEj1Vgs+qM+ jWytjjSx9/4KFCic6jB9cY9vNFqQGYV+HTwhuxgilDevUJmxa/P1cIQmJIFfCEdCTBiicKxetfrB Bx7EbUNwECgkC5ikRzgrheIMwyYAu/nlTxhC1cwIPvyRD3/4Ix+i/LFjxo0cOQojMjOgEcOGY2Vn jWJ/ZeI/A8ajQNA1pdEXnF9NnODVxM/eucuJkOyV+KPAMcFDoh90P30kIIiuEU/IOs2BvhJqiFpg uwd9z5w5Y+y4sSyzIwykonYiejIHII1mdY3Bgo/YtQajCMYCE8ePG1XQ2lbX0FTX1EwjOOQSqMsk gs2O+/ZXlfYZVNGvH3sjm+prDx3cztbSmkMtoysK+2x7ue1QY+H4mSVDhxSWFLXu215w4GDhoDFN 46aUjBzed/jA0uLS3r2YERXXVh8s4gwcatq8qUdRRcvQgTvqDuL4zWyrqQW4j62xDWf6vn2xkPfa vn0LpxINHTaM2POELCSAuhNFQ1KOGjWSo0yZqBHYJDGmlianotIQ454y89THN2vwDlntEN3KTLnd IebIIsK4N6UlR67svcXmPAkCchC8f3ZRVE518WWwliywVrpitqnUCbi1c7vwIiwOYBptUQitzqEh Z6yCesN/iRvGJZu2H7j//iVLlyL2DroYuSJjka7wFyRNvW6f0L6um5CGbW3S5KKW0xeffv2HPsiJ VizsaLyX1TbN5ls+9yTgnJ1rrn0voyCNL5l4bENMOn7LJkyYAIjnoSZtnuPXN2/+vAsuOP93vvA7 M2fMJFwpAsNzoyXmd1mHUpF96Kg8URlPVDnHJFuunkDKT36Np3jVIc877NZTvDrFq9AjJ3DUv+3k Khd5J8dPlpZ6CCVb5XR9jlahQgCs/AIsQFFoGiDgq6+uI3iFJis0ByYlPAGwIfEnWERNqTlQxZav v0nAKzSf+g91qFkrlmhDWClNIKjyC10IVdQoMEomBumVhd2WoEoWaxpqgIbwSxa0L1WLloSetN1k ukFLfxZtHEUGCSYjTYq6dr388mrilLMCoNNITvoA4rYiBcrtdmiaAxQAwv7Zn/3ZZz/72cmTJwGa wQeUw7n0H/zg+xMX/PR0wwQLppwECdZU1yxdsgy6C//DAAD/9ElEQVQfbkIlgCAB8hhlU0Ms+Lt9 T5hTGjJShUZrMZCsENDAhGQPZor7RRI+D3ue3OO56Ef+QxubAXQQolIIY9JFSJwy/KKLS+DGCy++ mG76TNYQ4C0NNNCePeUsiye8Ym8AYIwzKQcOGFBzKPFZJw0uAAC2uiONuH8MG9Z/4KCKHoWNu3es ee755Ydrek0pLpyw++Xi3dtbew4uGjq8oLywuXZvW1Vt8YBxzaPGHi4q2LGHc2sPEXal/4CKI4f3 1jcU9Srt07Z5RfHhw0WjJ+yoA3gV9undq6mxmkDhOIHXs2Hv0BFwWiFRV47UDh4yYuCAfokBvxVG GRKeCV4fmjyCQOR9isaMmYDfeRpVsBYLN043LJ4gUbBRa64cDil1ApMvQtlvcQ4aNm/2N4uPo7Qo wY6LCVKHsNvSoqKcb1b2VQzVHG1xzM+cCWy+IBhuOH2NGWz4dcRnQUwsGo4SrNqhZDkKrf5QQlvk B88lvyGUECsqMWBj8CKHHshqgBo/R4wO9zVqBecXmSSs0xd+93+cdfZZgwYNIAK958z7WUAyuefX gSDH+J03b+55553DlwRLAqH3R4wYmUyrC4suuujCGz7+MWR72rSp1153LQewAMTf94H3sUZ06WWX LlqwsHefXk89/TTh8ynHg3s743zXsPIEZsyKWXewbA7Bx5SQziTq7ZjxFK86k5B8gTzFq1O8ymqr E/Whe9vJVS7ypgHGZsYHAHWFYjMQWOg//THw8dC7uqG+ceDAAWg4IgayTk963uoCIahCk/EWyGVp ai8NvahJSgsHUJW0+jUCdYWhK4tgIMYSSOyNUwKqQJWiRNW+1kVirc5eIs7AfNy7pYm8qEz+pFE0 3xOn9Dh3/dorv4OtRZ8QUCYH9EC8bqNBZ2SUEp+TRTNqQAq2Uf7lX/6vT33qN3DjTgOlj3nooYdg 49AhQ889/5zkMJq29mApR+W1gOkOEGTK1MlnnnnG7DmzMdweIoZJU1NiER8xAg+QESOG6bZOvWG0 DhtkUK5BWlgcg0GOBXzMwjgxByU74bFA4p2DHgCmQwYPgf9MGHDCWb5sBWZg2A5/dGuhQCcATgY0 f1I7uwIIj8MRlRyRU1tXX1PLwkVBWc/y/v0GDR40mLNPm+ur1q57/tnnXuA0yUUjh06q3lJOFO4R k4v6VhQ3HWo7uKPw4OHi8iEtQ0cebG1e8dIKNqIipVWHD5b1JF5kBZuBSw9VFmxaVzBoeGXPHlWH awf0HdjQuP/gvsqBA7BtF2J6L+tZ0dKK3NYU9+CU+Lbqw4fA3cx12AKX9B1nxZciaWW1R/a+8Mxd e3bumjV7Yd++/cXc0E8rhGJKRYDm7E3gb5NllVMk6xrrhBk4m0yWxpW1EHdYWrb2HDIU1zeKgXK+ p8q5TFCK6GUn1TyPUaPwk0B5MGWMHQG3E1QycuOOXkaPExsKdIVK+M5Dox4hk8JofbcshF+RPUKo CTzmBkEbT3jOQJgzZ/a73/MuDlutb6jftHHzli1boY3CtSwwGLnXUzw6lM/FkMFDqYINzXyFkp3H dfVDhgy+5pqrF59xOkI8d95cfNIYF2PGjp4xczpbftlCMHDQgC1bt/7spzcyH6AKrB45nO9+R7xF GX/lBHQxHN6iJh93jad4lWVd171zileneNUFB/5rj8EkqmB2ALhvCb3FMX6qMVwyVKIBH9FkLtei pThZkD8HDhq4fu16z1JW91MOagkkKhYJ41NAruymK+5RVOQVnHnFeq562hJUz6HOBbIiOY+Y0Wqu 0TEfW5AYwrDlg6rVwfp2c08JKE6eQDCGZ93fcVCmCjSi6IEn2nq5lwYBhAzkxkbx62q48MWbLGqP 5yRzbsAT6oXVf/lX/xvHDQ7HgSHoeBw21ryyhkKJl3LaaTMr+vSDAWZPYWsLmhvX0rlz540kugpB G4YPSTB0dU2f3n2wPbPAzSVjxfpktAmyUc94Abe7HuOVsxQhdbTXqr14LhIKg/quncnZjdOnT4OB TG54zvbE9XjDrF+vXwG/lhlyEuAekOQJPvsP7O/fvy9hyJlUVB2qwZJOCJ3ePcuxjL/43D0EIaw9 0vf0qZNOa1jfumdry9BpzYPHEdW9x64NJfurC4dObBoy4nBz4+q1rz7x5BNr1ybbfDlkhaO/R44a M7C8tMfu7UUVQxqHjd5TW92jpKy8ZxFHT/YqHzJgQMX+A3urDzWPGjOysIBNfjiYNO/Zvevwoao2 8HZRYbILMzlusA2vEzpt966td91+63NPLunXt9/C0xeMHTue831cMHGGEzNDJccrpjRyzzTexKsO PzfmNVeH6ir46Y2TOmeYXYP4Lurtvl7M+XoKoAN2xwAxmWZmB4jrQsJuvzwQLPdCDmPQsbGEySSC MWToEOY/gG29R+JzhBgz/OfOnXvuuedMmjQBVhF5ibUgB4s1KvZWKuzmLR86V2OckKdgPRmzQ4cN YUxxju9zzz2PzZvnwGLM1VyAb03soHwoF38j/MzB2FzOkhevKIo5J52xcNHCESOHkx7y9LvDcnFg /36mqS++8CJxQtcnm9pfYQRzyDlv8znfzb44gRlzxObkE/A2qvEUrzr7yByzE4+ZoLMP1H+HjKfk 6r+wXL1m81aUR44YieVz4qQJrLGyWgouB7oFagwQhlo6WHWwd5/eWFWxs657dR1+irG3CSUEkEKv AKQC56n2UEiAXY1YXhqx3I4pqNV2FbhWCB66PIaiJfunmg+9SDm4uFivqDcgsugH2I1HBAoVq5WH XBzdNlqRGKv27SM9sBsKaQLZQcA85D7Iy5GGABZWF6grCz4CezkJsYSYhHDPQ9Q2WPkzn/10b06B aU38dvAbee7554CPSeiSouKRo0dBqoY6XWLAFonPCfA3jWIOdIafRJvB7Rti8Bei5MT1JL1i/hMz AW+0HWrwFnwkudK2UBq97wFJdk10oghGQ6OtThc6DnKc5KWXXgo0wVjYq2cvCn/q6We2bN4E+BF8 278By7K0afnGpxZ/ANA2CJ5z2Q8eYtduZeX+HWs2LFm6Zl19/YB5E6fMbt1Vvn5V8+H6xpZiPHAK a/aWH65s6z14X/8RB9oKN23d9tQzT63fsB7zP5KAOTSZxowYTiye8n4Di8aOacaQXtq7rLzoUPX+ 0tJ+w0eMammrqdx7oKLfANYqcIvoWd7rSE21XgecMgg8Liwown+msA2hagPBrV614hc/v2fzhp37 921vbDh42syZ06bNgJH4PNA614VkkUMmYHfcB4wOOQnOx8QmJC37JFSOD72ycm4Cio0C7VCvAPFZ NB/kZWvM/+qJUzv8Gkb5MTwDf5srMjpsYZEOzcgzr9LYl+2xjJybIVpOtrWR00Bg94jhw8oJL5m4 wCUJYn3GgNmUgOBdetkls+fOZu7HGJ895zSWg2g8w5y67JcYpJKqGPvBiZFFQrA4x9ZuWL8Jb65N mzdJD4LEF88TcCGSDwUDhHttB5TPJwXpRepYAGHWhwlgypTJ0FB9pIZDc9i8zroW3miskBD8Z++e fT/4/g/XrV03ePCQ008//dIrLiFgD4dZdsHkDpnfda/Z+6ahFubzzAdyyumsxjea7K2jvLOG//rU eIpX+X10Sq6OOTa7nyA+rW/yI/DrP5SOKTbHTPDrz6vXeZuguj77uc9uXL9xwsRxY8aO8WxIoWS2 t4QUnAyPdmlpann1lTVr120YMGAg2ffsYStSC3oODYQG1ZVCBKDCExOIv43ChtLVY1LdJhZUmZk4 uCyOCaQbIMYnVKfdVB0cWCQQAGSg7BNzbBrZAAMzaVCT2q7Q4oZJIT2mKUxZpDdSNQ7cFB4Nkapg SCB7aUsQc3pp0tN6J2wN6MO9KcW+4gxugPiLFy+aPn0GhlVgd82Rw9/4xjd1Q8eZmnkOsdRV/1AL ScY/do4heuAh3tWbNm7inlwJk8t6AhvZOMiuL8zxMpnaoY3G0lOiFgNx6M4uVTq/euJ3eBxpzlck rJosonb95il50uTJRDgBOpNsxfKVv/jFLzDwac50TiWikm+a4WUCl67AzJ3oF7zrp0yeTHj4da++ svzFJ3ft3t2rYtqiOYsml1T2WbeyR2V9aUNzW/X+1oYjRW0tNcXlyw61bm0u7tm/767dO1a9/BKF UBfUAthmzZ45acQwPKf2t7YQ9YQy8QXApl5b28Q+zpaCuppqJmB9COpdySGW1UyB+kEdMXKA3WlD 2MaXnEHIDk7s5LU1VffddfPjTzzb3EacwbbKfftrDlWOHzt62ozTCooSt+OEQUdNuTDKKUeHasnn WZScncgpMMpVTnaeUIWJHY+mtFNC5MwbybLfoyg8C8GP+U3P/+RFOdm8JouS/QJwcaOHEsLJhRvV 6DGjiF46evSoZHvv4cMmcLxouXcoKY2cU5Su0uCQXV97JDm/nYFArtg/MHLkiLPOPnPEyBF0GQOc EKjlPcuZHTJ1Qxj8mvlRMmIJtcR3RibbWYorLnNr1qzhK6cbG2Qgut7zinqlENmgQM0H3lA43v/c f/gj1//hH/3h3HnzGBq33HTrIw89+uKLL/KBJfb/e997DQh+6ZKl5MJVbNQY5HQYIvfUU0/nMzl4 60evswT5z4HaV1999W//9m+ze+QP//APr00vDtd4ozDxuAn49cnITAxXH1iEtDhS+GXixCIJXzk+ F2+e1ByuvtHOevMEvI1qPMWr/4ZjsPtNPm5JfrvIVTvyDhT7f//xH4CERIDG2i10Q9loKMo2KVGE vXpjrXnwwYeJHIeSRe8QTouUeJiQGOVKmjCR6swtxhJniBg0DYbyDsUWdllVoBn9XAakVpH71ktn FXFtFJsFN5CEXVzUiyJHfWJhJSN6Mfxb+BMySJnulGpF9WK4CoBopVJiLbIl2wr/FFgH4DCX1PJr gqATWMA9ZHDo1Lz5c8eNG09Uur/6q//zxBNPQDDp2V45fvw4boDg7EGEQrJHADKoxVILHAElPP/8 C9BMUUJkSjaAWhIT7+gFdAgjt/Hv3HAm92QmZVK+6xLOkXQxAuewmdZIKbZOy7ddwy+RTTiMiWDW K1aseOTRRzkWm8LFNJRPH8kEPXOCgSJywTeUAGuwzLHhccqkiXRE1aHqffuaRlUMOWtMr9FH9pQc qG9ugbcNPXqX11UM3Nxc9tD2mm3FFbPOPH3S5LHsd4Si1GBPEJJRixcvPH3GjD6l5Rsr967bspkZ I34LJeUljbVtfXr1a249uJuTdQt7sZmyuqaaePYDBg0kiniPYg4nLyLOYP/+vRsbWg4fqt61e1dT SytLAFvWr/rZ97+9Zt2u8j79W9qK8NTZW7mn+tDecaOHn3X2OYOHDK2uOQKjaIjSHlApi7/j3pvA piHMCpg9FsIfpWUlXAxhegcXf3rjdDeL1bIY3bqi8Jxvln/G2LSnchJHdlNmG9hhaRTCuPNwIjwr QMmXXX4ZVmG2SgKDkROYxitnrVIuB1wPSaaXjc1VVYeqDh7CKd9IJrKCSzTPeGHnCZKYcIPJXlMz ZmZ8RRwyihmfHOhNfFcmTYJLTBsRGAj2G6UkK6VUbS7/5Iai2MvBd4Ovh0e9ejglBBujUA8uRhxO L5/93OdmzJjOx69vRcXadWs5K45Rc+U7ruC0qRHDR7KWhavJ1m3bmOcTm5UTf4n+iaeKHZpzxSe6 i/7KZrzkkku+853vfPzjH+doaHxjQJZ8FogIdPfdd0NGTuEd1vgmCYjsb5TytyjjjBkzfvKTn/BB gAOKK7/nnXceXCJUwO233654h76INP8NedWdJr8ZXrn24oSn++U4TaIH6TvP4uhmZznp4tfVnu5n /JUPgV85Aad41eG38c1/onN3WH7+c791pK761bWvpnG7k1PB0T3qwqhM5QSQ2r1nNyZTTD2Ah5Gj R159zXvOv+A8TvsDdmgu9dK9JFS+XzSBKXoo3S/VfkYGyVC9bgcMXR7m1cAW8U0MSEHhlJMcHzNq FGW6kSsLU8zLQ0ozCh6KE/9jDcABlL0hIzqVsa1+zbZdrB+ghJtAJFYnWhIQuG5O1fxqS4upgimF 5tzrgMEa99at21PV+Nx//Md/PP7441jFaA5EgkNQz4MHD2JKQ3ckYRlSEzd2eoikIQBc9CpuoyuW v5RiFFAy7qRJwD7+lM9URI2UZjgRD60E4/KnW2Ble9iktXbbIqHP4sWL3/+B9w0ZOphoNs5PbIgO 67KCNoJuXyXkzbr1GzdsxOmIjGR3u5t9Z5bs5ERWkCzCUJCMD+XBqqrxEyecdd4lPYpLDx3YUlq/ v19bee+KIbUDKg727r2tpNfzNS3PHW5tGDTygssvnT17eo/SIk7YmTllKqf5wC8W+mdPntirsHTT nr3rt2zeu28vM8OGxoaBA/oPHji4V5+eVYcPHDncMHjQ0OKSgt179vTqWcGu0B3bd/Tq2W/M2BGE sN9fWUUf7ti5jbzYvQf2773yxadvv+3OQ7X485Tj9dBU2HakoWn3vso9u3b061V25lnnDB8xEh8Z Wy3gkz8KQFa2s2og7iONGR139oKiFQLpmLJAr5iI+lAZs4RsyiwNga1DqqPGKNYnUVFnQC0nWWQP Ygw9RCvGjB6zaPHCoSOGAn+RYYYbsy7GmvFGSOAk3JUc/bl5TsokyEgSWCnRuwJlBJtTpa688vJr rr0ax25C6e/ZtWf3zt37GbklxaDjjRs370sXQBxoaclNLGWg/oFciCWW8qvecdVps07DNK77WfSX /DevVgA/UE4jIZi5LiOIJ87e9Y0hMalmnTbz/PPOw+7e3NKE89XKFSvZhr5g/oIpU6cwjR7Qf+D6 Devu/OVdG9evZ4wQyxXKN2zcED2eo3Szf+Z0WU438eeXv/zlP/iDP+Db67nQf/Inf/Ltb3/71ltv 7RB2x+e0ixpzXh2TgM6K+hVmpJve+c53zps3j1CnfPegBAUHo/jGsgjAtOREtfFElfMr5FV+E7qW jTdEKiD4xhtvZO3lHe94x7//+793X7BZtPmrv/orMiLYxB7ofsYf//jHn/nMZ8jIzJM9993P+GbG 4AkfAqfkKv9D181P1huSz5MjHgnyDihJlRdceP7DDz7s11/M7Wos9/qEhHpOvQL24YSLC/LESRMX n74Y7UKiRYsWNje1oCOTnf5DhuBU7ck4FIhK40a9FSYlFRsKT88HsYI4NYAplUpkFgQH5BXHUx2o lLo8HEenc+GgCTShaVfjK7xhwwaqs1GmCcDBDepZ14toshZZ1WoW64gjLUFGxZ+2USgfoMSKAhIF iCExNQB2wcTA6AMHqoYNI35CAm25cNhIzidqaty2ZdvSpUvZdslSw7PPPPvYo489jSf1M8+CuVet XLVrF4eGJgZ1jMta8WUjzdTJVcyte4nWbiG4bjYB7Kw0pkx0B/4qF1584d/+7d+85z3vOfvcswvb CpYvX64rvK2TA3ApCaiHpTHxe9mJk7pru3IvAF8OgpQJesIEe0lPUbid7Ni+HVS+aPH8wp7Fa7dV 7jvSWNOnrHrQ4M0NJc9u3vtqVcOA8dMue8eVUyePb+QAzIN7iY9Yd7iu3+Chp502dWL/vsW1zau3 bn1mxTKsidu3ba+rr2usbyjrUTZu/BhOjG9qZJPxsLLywn37d9fXNQ0YMBivGQLLjRw5rK2gaff2 3a1t5QWFLeyCQ3Kwiw/pV3bTT36w9OXNJWW9sJy2Ig6ctNlWXNdIrMIjlbt2ttRX4fU9cvT4+ob2 OSQsigWf6G7HUVaQgjnBAedvmq61AbsvIgamDOdS1LNi5pMYraSU/4pf1EUC+y4GS3x3Ynx19nUL 4iU4mpbTxqABsl1KSpy+hg8bMXIkjerTJ9lazbVv795NGzYRM59G65UUBNt2PZ2sNEzRyC0xQy64 6MKrr76Gw1NJyErLypUvbdq8edOmzVi7mUThXa2FLA1nkviKUPjUqVPYSMBw4NSCy6647B3veseY MaM3AdI3b3FuIFVWZBMUdbL7Kus6RYFUYdwenqf1MPpaxk8YT3RCtkEzth9/7HHi/FBgOoWoPHjo wG233P7www8z/FIfueT4WMrhC5DPwOwnOis5OSn985prrvmd3/kdbv70T//0b/7mb0AbTl2OmbGz jo7PbzZBVoTi+ZukPFv+G2pydzLCBFYU58+f/z/+x/9g0gWXgHHC7h/96Edvpo05fDvhlHfYy91p 8q9hRsgGBGO6ZrzwKVi9ejUrSN2Uq7/8y78kC4mxr33rW9/KYXtnAkliZqEmRgYeeOCBbmb8lXfr r5yAt5Ekv+14VYwlNUs0ptHdO/cAs/btreSUFmIhoyb1OdEjIvQxD0HVGI+JugUixDuFdV4sWETh GDxkMM6y6EoD/JEy2fmXXlqP1E9oMtGV6FCYq0kvFLlqT0Dmd0QsK84Q2qoUPbcCEMmfqDfUmFXE 18fC+QV3YvNwXVsg4mXTrJGS1fQ2WQAkFIhKSSbclJ64CZ0tYiC9rc5SYnU21urCKA678LBnEiG1 vBXZgPzwEF3z6qvbtm4nxhn7t2gFF17WqdsGxuz2Ez1oGoVgz5s/fx7/WOnGEQVaSICVThMjV+o6 khi8qfroftfEKcgpimT7SzL8xT/5G58k1BpOFxwJOXr0GOKuoNQ1e3vJPVfk2UMG8gaaW2BWN9t2 vU14JRAMXK5dXHkTx0Oq4WXmzlnQt/+QHYcOrK2q3F5Vf7i5uM+IsXPOPOOs0+cPqiitPbzv0L69 bU2th2ob99fWtTXX9ayp7NlQuL7ywNMrl0EqVIGjcEbA7skhJpyGQ7/161vRp3d5VdWB+vomZLim mjIODB8+rLi0bfdutso1DR85vOYIpyQSX7x0yoQxK5+597s/uOkwvuI9Sws4pp7zLcG9zW2wrKCt 4HBt/fadO4/UVgO+J02ewsSJICmuq4jhtFvb6hx9kyMe/Bk8IaWy5O4IbHXuwZDn9p3y6QDx8q2X RSnhyq032Uojpc+jT7N0HvM+p13ZweWEQWEw+hAcQyAJibNp45ZX16ytOVJjdkeuQyOwr+ZqZYOL uSUjgrczZ8y44MIL8MVivse3CPvx1i1bTcwcM3XIBtQmmNhRjFxxIQYYHUgG4MYOWtaj9MD+A9uI TLLmVUe962PaHew475VeO1EieUI5jl8SMPr8piG3L69ahWsMh0zh0c7zRx55BI8PJoBPPfn03Xff g2OYru1SZevcshl87k4vRHpvvv71rwNQ8O2+8847u+6vnIwmtsasYGQFqcMCuyjnuAl4KzLytfzZ z36GzZu+4DP4wx/+EDD35JNPHgeT/8vzKvtxeJMCmcMrAfRXv/pVXH2ABHRHZ32dlSss5UB2TN0g dRyH+J7nQPZsIdmMTLQA+syvmG6R8Qc/+EF2IppT9a+VJP+XHINvnVxlxeyt+HqcWMqTqIJZKj/5 qU988PoPjB035sUXlgB3gNEiWtIkmvKoK6RZ0EBoLxQSpk0UD37e6Bi0CC5cfMC3bSfsQxIZ11Vj 1CTpk2DPQ4Yw8MS1gHU2QqW28GT7I7iC7ELwLHoQ1wYayAEWfjdjyybaHcDnPkvVJL+CEjUof2rT CsRsW7K1kCYsbapGntgQElua8CVy2TEBrVTJDh7TeyO1Fmje+DMqIi+tMEvMQxKfn9RXm4mMOEA/ 7EB10gOf6ak0sMOsMePGDB7CjKg/29H27N2LdVvnVGG3K/vk0gvfX9kix/RbJQ0pMbVeeNGFw4YP JXYKRBypPfLUE0+xbqATS4iQ9/w6TxPE2GSnTzFFCUbxMDtBChBjSvsFSnCbYc/lrFkzRo8d21DX 2lhfPG7StDMvPHvmzLGljQeObF1fu2NDy+7NBfR7QVtZcWH5nr3Fh+rKxozd11C7fsMGbOc0kJkh 5GFuOfPMMxHdJPALIWSY/tUydUQOOf1nR5/efQcMGlRVXblvz5F+/QYN6N+bw1VampvYAFfeo+nf vvH151bt6FHWq6SIZqYnK1FfW3NBazP2b4TjSEPjXoLh1NZMGDdu9uy5hJ1h4yqSo0TpuGV7A1PK MUWlQ2YqNiQQC2r2JjG/yEB2C2wMTG9iyOR0ULw1QTZx5MqqWxN0SKTps1BesQ/xjsIVZp7bxUgg czM8m1e/vJolYJzsKUQhcZBKW7ifKVROzCwKVvCLW9ykSRNHjR7FQyZXK5avYEYJT+hfvjPpFoVk KFE4fzJjIRflOOHEKI5sM9HC9Z8FoKeeegZnJDcwkCY6KJpjOY4UF5GCsXaHkJ1W+M3kcC3+IWyT J09hhRB7m85XzDH0UVEYHCCKeiBvH2bL7+LezuJXgIKTyf/9v/+3O3kjo/2bIwzHQUBOOcekoTMC 3rqMYG4WRl544QWkzp0tx6wrK8MxTv878OqE9w7YF/kEbX/ta1/jwDj01E9/+tNjQmHI0FKO0xSA m/BZDL277rqrOyNCoI/DFbsdsEbR6aD27mT8lUty/te7a0E94Z11zHHx61Pj245Xucj7D/7wDwjO PWHcxOEjhr/88svE0zAgtDgJjSI4Uyg18/AwtbzWkBIYLUroP2AA+GbD+vVYW0kM4AM8ga1B3mga UgoZcVMhzB9lYju/4PwLAHbbtm0XeYeap/z42LncLJDNfvj4k4dQSMlkZ84AbSpOtWaAbG/UoIEY VJnWyGVRAdO5gQaPBIragySzxCVyFbXLnCjT7CHNWdxvsfFWzJoD4lPMneBjKdce7O4uD97TvcRy EjPb0CFENYEPYDPe4nVNN+lq4glHJJPUrHVfxkZLveGXZRDOBFmwcD47a6n90Ucevf32n1Nj9Ej0 FwRQabY58SQUmFzKAaDaKbX/iULsIEEJ3QquAvGPGTVmwbz5/fsP7Du4f7/BfcoKmtoOVLZs39K8 /qWCDSsLdu8oPFxVcvhASV1R71FTi0cNK+3Ts7WZA5KqZSkAC6ZhIh05IonSSAwZquTAe84RrKqq 6dOr7/CRw4iZfrjqcGszE8t+PctZ8CHKTdnAipKf/uAff3oroSeSRSB6rKCtMPE2AXoX4H2Tep20 AbmKGhqbK/ccJDji0IEVc+bO7t2nAgMtDKdpdnpIiCNLBKlE5VwOhOgRJVlrNwwhrzM0nts6+eZw UPDsl0DGclWWZhNE7b4NMqJbs+AjS6SFSEPcd9gKRcLVDOPHx7GpLoglfkrtOyDbj9SJ1Ripknu0 VD7QXriKVDCxRLlS2jNPPbNsWeIEJSwGf/NBcH4yoP8AEDYeJv37D+BjpZ8VvvtY3In4Tmie5559 /t5774cGBlkSRfLoMkW6fTlB/JQDcOcL5pK3Qs6NfWe/8GszxdMudp19zlkTJk689ZZbsdjpoGWn 2y/xOXW8e7x8tguOqf+y6a+//nq2VOLb3TW8yPYv93DpqquuwkflQx/60Cc+8Qn8oflWA3GykCi2 qXnKWM6FtcV4hUG5GIvLAqEKjUCcqHzZcOccv3y3+aUJEYaFxGSJ8JHZvFaEIROy2Uhq2BbT5yM5 iAF1WXtQGDcdBls0C0IVpZmehk+dOpUb/ei44NWcOXPwcswGSAlSSU9R2fT5BJiYZITF7JC9PoQ5 VmGNyE/QkOVMh5TLZEwPdFNnVWQba4GQCsz99Kc/fcMNN+CfA4cpHMHosN783smXZOSBJSYANJMf iuLqGgoHr3ANEkBTO5Cdrunaem1GJ6KMBWpEipBDHnYN2fN7R9Yds3/hXjAtR8jjT4qi+R2OHR7a O+65ymddhwMw5Mq3dm6HvRz0S0N3BLKzVsTzziT55Gc87g/mrypjIW6IWTbdcdcvOC8Qr0T8pe+5 5+5lS5edNmsW9iTtarqZCrbUskgzX1u+aHgXoOouufgSMB8+xjgngKNuuvHGn914I6BNDYoVinKo ThcFNFC//v3Qmiz4fugj148dM76ltfmB+x/4t298a8/ePRg4UUziMPWuyk99JiCjKFGdmk/wofIO m7EIwzZKM2mcM3gvCuEKlWniWMTnlbupRLdcUaApA8SETjUvyUSTXNrLeSLB5ApwL6wUNEdbYCaf V9JrKOWVel1qBdwBqkSxPNcIB4UTxo/nSMuevcAfxPUuW71q9TPPPn/w4AGDdkNJoL2AaxJPdt5q lRQHy1v+pNcuu+zSxYtP37Vr580338Kiucd/csVSOySlO9CS5giS7IhYTPchl9jILpNFFJK4x6aX /AkLsVmQPb4pfF8uuOCCWafNqjx0aP/hmtKCIoIsNq1b2fjyc61b1zfWNbUVJj4lRXPP7XvGJT1H DOrdq6ygtY19bK+uXYPlG3nDwElUZmYR/NLoXTt38LHj0B9iBhI6prxX2b69ew4frIZ7vSt6lffs SxuaGyrvvvH//Z+//tbmqnLOjW9tO1LQCj5DtJIf/oP9CZAqJlxdD7YRlhT16N+3bMa0keefd860 WYt37D74zDOEZl+nFCnVXvZ7SIicVxKyHwVFjo6Ab7DdfbcwUxQuhpOBwkS7j1eW73dc+c+Cch6S zE6MWWK2XnM5dkwW5TgqvWJwxZ8mNo33XFISNMR8gHbRuciD52HZLgSA9LaXh44gBz5ttEAeMhB4 iGCgmNudWFLnHD41LgohTqTp32/A+AljOTByf+WBl19+ZcOGZHe1M2oq6t27Dx03c+YMFijYOEEW Awc5oCiWe8rn48aSneG6DRkE5bLOj4DzCj9uEG/VhO7mAKClS5cRdJVast8uh7PNt13pUbXtLA2+ ZW+y/IznCgCvcDUBKi1cuFBsBKbk4gZYgKExH/iScebMmazFYxHMqY4sH/vYxwLBs2rP1SFJ8ZB4 NZL353/+56Dh/MTs8vzSl76UfQ4BrAngaY2dHiz1d3/3d05s4oIA8Fb+RIKM3/zmNwnhYkra69ET fJfwtDF98IoN6/BBZRe88m20SzztxSuzfPSjH8U73IdmZFMmGPS3fuu3wk2CZERNgX4S5zQZ0b3j jjvgLXMhrLzZcvJ7mULsrM4uqgABk5Gd7iSmTK6cxGAvaoSHOZTL5C4K51U2C3/CTzjMlCk/F514 2223Ba/yE+QwORLgcAU0VD7B8XQ3bISZ2c7KlmY5yBXRaSMlucgbNHQxItjqgByy2wHPIopdsmQJ jYrR0fVQirf5/RuvKO3RRx+F2/aFY7DDYm2URR2zF3KiDyGiiFz+CKWckKsvfOELXQ9P5RPa6FCF 55gCmaWzm7zKb9rJz5hDw8knoDs15sYJxkUS326MNjhNnn3OOUgSu44q91cSMlcbmwjJooWqaKOz zz6bgc2Tp595moiEKBIcLtEx7HnCzxUtRRaUUBIRubAQjUg54ldQCkHoxo0fN3rk2PqGJBr0u975 7us/fD0e5JiXyBWWUVGy41N17q8IQ5JUdfyKJrVFxaVq5K0wV53n2yynAmFERgpHkTPGDPQhDWbJ ZpeAQDliaLOIabL0mD1I8vuixEibbQlwYLFgKvb/oZ6T0ME9y9IQKoni5/8HDRrIyIRpcgnfkh07 dzZhaq2tX79uw8urXyEWOFiB750zGQ1s4BJtb1YdWC0HdkMPycAZP/vZjX/yJ1/6x3/8J+4XLVo0 a9Ys9gnw1ikZYAUuTZgw/ozTzyCGAwsgVBGdFdy2ruynOWYOTi1kgojQGQX0aOBn8sBSDA6snDHU u7RseL8BcKoOjw+iWA4b22vklJ79BmOjLq6sbNi+sXLrq4f3Hqypqi1sK54547Szzzpn4YKF+EQR WAMZINYEfg67ktiFHD95mM11y1cuXf3KS+zzbagl9kXfPv3Ki+BQjx5lpa0rljz5gx/fsWlfY8+y gpY2+qW0pa2AiSJk8l9CbbI/lgdtTDqwcDe3NRCm8dVXd//ylw88+dgDw4dUXHrJRaefvhitQx/p LqLhE9YZohElzSUPY6IrA6OD6Dt6ELsXhl4WzbERAuXdPuFvyKQzHCqiTEozyLQyFsKmpFk4N8pn lOBNeCI5maQER5ZTpuzYcVBkr+xI8V4ZUPKVN4cMlNO5AFwb5a9t9EJ0JdV9z2o4x5RInW0PCIZh /hAV0vPZAYQx13LnIttmk89FUxLYhKoVfgMiwXyWuD73+c9+7Wv/8s1vfuNTv/FJ3lJIfLVkhZ3l p8CITM6u46MkT0zmRck41HEK5p133kUMIt7LHwcgXQNOwuw3fvwEvqIYpWKMZDvd8dLZZW/Gt0X1 jJAAOIgdjopFJXP9xV/8BRDhG9/4hvA0xABpBJCRi7B6733ve0GfXsAaSiYoBBJrepAWmjsuoS2Y hicAdKrjkmyM3NyD8ikElGOBF110EcjpuuuuA5RnCQipY0YNeeKDbBb4A9LKNt8m0yJgNzFJqB1k RkVWQVuYfnTIrhxe8SeJO5wh5GTPZhQcZ2OhxPDMr/STn/xkFjDlE5DNKzPjsrT4k2YC+uVwFzXC luzUJVujZFNOthbvO5zY/Od//icoDbcc4D4c5qJfQMkkpkeY4HWTyUEtWRAn+shpoZsdeRgymd/L igdiw6uY6njTHQJMY8jIqPGyyy57o5R3mJ6HjCy57bcoeqeLDiIxDMx2q2MHJucE2LE0xguQmo8D k4dsx8XMx9ppY5RDF+cIDxmRrvxWdC2QnbXaGvMhVhfp49VblLHrQdGZXB1zNL11GXO9TfB7xRbI mWqoQ3QVJ6Hs3LULpUmsQI8+1kgcQhbGS2AWioo5JRpr7JixKBVK4BwXdB76T5wt00nGaq/H1iSh SPr3xR156pQpnNedbMgr7Tlo8EDCEZCWXAxRcok77W9+BWcqMExEYCnUp5hSQCPy9jKXVVtUzseI BAEIuBfqcUNKDVpi6DAiatMK5C2eMIv34kjL4YkTA+kPqGFFkUYMFE0TNkm2rBblkB13E3YHvuOd 77jwggumTZ82ctSISZMnsY3ynHPPOeOMxShyQ8SwzpCe5VnFwTqrVq0iYgOPtLBKocT4a4daaTSE lM5nTBDNBMaxRgGQRaPAfCCIlj/uWQE866yzOETwoksunD17FoiPqN7QEp8hW2QHRfNlhVWEvdbq FDlunC/p8AO+FZlxx6mGffv1bWhuxNOjlR7uQQj5HlikW2sb8bkGjrcOGFRQ0hMjMP4Dw4YOGzF8 OKLCOYg4zI+fMGHmaTMHp+F36uvqX3wx2djAlIYzRHtX9O/brzdllhT3xt66fcOSf/jrv3zk2bVF xT16F7c0txZzijxO3UzZEK5ULvU34U+OuyxK71raCjlfs+Bw9ZHdu3fWH6mZPeu0qVOnEykcUyJ9 5HqikiPb415LvxjOh4FOlHkNq/LKJQI445zT/oo+1R1Zc7KFBPLzhsvBZXXRQXHjkA8CnEMqJIqr chtX9kmIdKTJfumUingi/qYVcMa+1uvMsRzVZQeXY1OSQnSdsvI14COjIxYSyBMD2AO74f+OHdu1 AsAZVBrMAbT95m/8ZgKsS3rMnjvr+eeeZ4GC0DcsaVBjTNShh4wULsOz7RJqkzjr/620ezACzeUk oGR3QTohR+pYlTr77LNmz57DHmjcqDyOSm8TORO/WQ5n70Ns4iFerdyDb1iR5zQAFtkxJKOkoZng 5aBYFpr5MzImU9CVKw0+yLCKGgEBZEeXwx+Bjr4iXHzP+X3Xu95FLUSFA98nAYjSSzLwH6C9v/d7 v0f4o3DVIDsTZuzrWCshwDBW9izlYNIjy9+mVxyxSRYcAwBP5KJw0aG54B5b9Ej5gQ98APcDeWV6 dMr5558f6SUJ6EYtIPKQJZ9/5Stf4TvmykaO/dgskErrsqTi3ELhgnvrpQQaxcNAeBZOduYSPDe8 IxA2yon+yvYyX2zZKJNBdSTD3g8BXuHNQsnUSIE5xlF4BUqzxnzKYTK8gnISuFIdl71JFjtROtl7 CksxG/tQUulc+vHDH/4wMxANydkrXyAjI9lx/EACkRmkiz8ZQbri5Duc5JTzj//4j/QRlLhhhlYw u+twu2Q2I3M5/GSQ3p///OdBBg4nVMpG2+5THv2bBbtkhwDkBxZBW05fdDZ47Tjai705ujV6gTCL JECKHAIUQtW0nXvk3N4J8WBQMC8KueL7lu1Q7d/2nVcIj83pjkDmsCj+7LqXO8sVcpUzBo/vQ5eV K+9PSDknrcmveWJY5dNPP/Ptf/sOoTNwC37owYfww0bPrl61Zt++SqxrbksKxwnSo3tU//zyjUav 8Ml45tlnMDi9suaVJUuXLFi0EFAI6EUD6UGBApg8eRI2WpQjXwDU7dpX123ZtkUn5kPVVQcOHiAZ h8+RMt18mYAwK8oq/gSGlpUxEcfyqtGdXCaQMG60S3lAvZAluj/SBPgQj9qL6lRBAH/aRvWoaSCJ P2NKYHXSGUS6ls0TbWNZPW3KgEESE4X4p5jDVgg9ucDZ13/oA+//4Pvf9/7381nhzNEbPv6x6z90 PfvEJ0+ZvHDxwjPOPB37GXMeADEfOOZCSQTrhsTbXjxnEySGdukHElZ5bZz6gQSR1k4aNorxdXjf +983f+E8MBuWRcwVjGScXydPngyMuOKqyy+46AJ6ZM7cOfQ7kyK8zKNHgm8y2dZFLcF8bqhRLBi2 VfhPePmPfvQjf/E///yGj98ASGHl+vbbbztQuZeJYtmgka0jJraMm9Zj6pweMxcXzTqreMq8goqh DY14wydQiZ2liHBhcQ+OkZ992sxzzz0b2vD9hQKQ7Zhxo8p6JlHSEXIC0q1b98qWrVvxhy8qbNm/ Z8eP/u3/3fXA0qa28rKePZrB1JBX0IRfd2GbQBakj9Gbn4SvkI6/N1JT39DU0FLLwNi9p+6JJ1+8 7dYb9+zYePqi+eeec/bkSZMwhRqiBKTltCessLp1McOJmPqeERP9Ynq/NckMua6OBoo1GaH8idTF wpSdriOHlm8vGKtcQTSU0IM6sWSlLkCnXeOs1RvBvc+9HEfKcPZhvA2Bj4zRCm4cqhKmzCuoNESY 64yXtzwUUot9A3Pz3FmuHwr/hBtcBtN89dW1Tz/9NHAQ07jfE5vPPStIrPI1NTe2tDVX9OnLthMm eH1690FI3vmud5519lmwDsjOZw23Oj5xlGZ2m+DEmHLoVvQxY4H0To3CqD9qFArv6uuuu5YyGTIg 4Hlz57I3lHN/mKo5g5Ls4JjDJMvPeCuLrD3bC95j1cOEhtMF2hoVy4XF6yMf+QhCgrZmepzNyNs4 RyZbI0iXDwh25Q6rsKIOCYBRAGikMT8jY5Zcl19+eX5GyBDJ5TTZh+DgbJMBkTzESUbrqRJlRtfQ swbRICOHHtLQunyHjSw/BRmRUYM3pGZrzHZKtgph2V//9V9LW4e86rCcLAFd9HIOrxjFnFRKrwkQ cyg/DrkCrmWPOw1S6VmqQIZjPURKOiM1Mmps1tRtZzmpsze98suhj2gaKXWkNqOF6NnfWUZXM8gY BLDRgh5hhL5RyrM9EvcsL+RPt3x7oro1DVaRyFt+vPlodWcfgRzxyGnC8Qlkd3r5jX6vuuZV92s8 UeXkM+qYgn0cTX7NJGx96DOmg3/4+3/0wH0PTBg3gW0373nPuzH8bNqwMbGhVh0EgQnX7Fdz0ffo NhaL0Tf8uWzp8scff4L1X3xO0A6EyCOGF9ZtcHlqr73yk7/xic9+7jMLFy7oU9GbeFso21UvrcLi AvShFmztaEEjb+DM4AxJQVGmrZc/PQwvja+3b9LkiYipZl3Ta7TW5sfQ1bAR8sqNKTW4hi2cjPxp Xa5cCzrlvvWGboib6PXsJEF0YoFekT5bTraQKMf0Ql6NmkKNsePGMnOBY0RyRN+j6XFQFr3xHhAI k/sP6A8DoMTJTBiYBbJBv3VxibwTc3Jml2cgMLnNK2Di7NmzcahlijVu/Fh30wqRMbFwyg8YgjT9 +/XXX2LIUOzghL5JvHUtOecKEZJF0XHR1/GElLTxU7/5G0zir7zqKvaBXX/9BxE5vqT33nffxo0b +gwY0Hv4yLahIxrHTy5YcEbZJZf3uvDSnpNmFpX1buBIzabmhsZWcOnBg/vZwrt547bWlsQVGKs5 fclJLfAEwoF/zDBX44PyysucBHRw//4exY3PPXrXTbc+UNda0rusBFzdmJi0WwvYWplsqWxnYEo8 Li9Fhclvir2b2bXJgYstOJ40tbRV1TQuWf7SnT+/rXL7psXzZl988UVwEtl210QgbzgpmAtfBU98 1GPEm0DhsbBjB9F9OnRxaf/muXM/B4X9K6LlNySB3qRPIcYxQu2B/0SxgWXtRMvh8nn0aQwu5Sqk K55nb6gFApzgeTnlC29vpxlcDgF6BxvPjOnTUfcclyuo9aPssptstF6nMd5bi5Zy0qcOSwfd7QBn UMNgaGzNy5Yte2nVSjbN4qC/Zy/wehtxhMAWV73jyosuueiMM05HVUMh8xMYRTnaGhTaaC+cIQ1D Usd0njsHSH9bJ06axHIitgxgPW+BL0RuXbVq9bPPPkeATgxgPMlnWnwQ4mNrq21ODm8x8vkkHHaz HxyUN4CYt137V2RpAOvEYnoOAR0qmyw9HVIO20mDyHUoFT7MySjGAvJmmywCzvGRMCNspKWyogte Ie18TEgZhtssr7KNzZJqoPTOXJyzlAMKIZIJj03uml0d8sp6u58RMzASq5vQG8oYDXQC3J0azSJ+ 7YLJWdYFgM5OloTCzAYpqrNynESFq4m88iQdkXdnGd0DkJMx66nSTcpjRGSlAj8i+hf/H5vT4ZXf rdGn3WdylJwjn8fXy6Fbu0NATo2dfXaybX9D36sTmDGK+lUR8EZ59VpYX3MCYVnpYIsGm+TOPOss jHrnnHPue695D9gPBIgW0UtYRZ79NKgLUXgAL/D03n17AH0zpk3fvWv33r37WBwkQDUKCXxWVMLY LmKt/13v4USxuQMHDwJN8rnEFgXcSZw6K/eDNI/U1mBhgo+USV05M3jlRsWWWPLKyhLn2jRGXkik HxFKEHlozwuaeR4ps5jeh/afzRTHiFQC2Wc7WGmOS0uhiEfdLIIUGWQJEB7lDNqAMtau5ta7IKG5 KAluSGMDztopNM1NWocPHT544CBZRDNhurZ/vYR62Q+KiCoq8t6PmhfloC851RRa9u3dRzg2NrCB OjAB4o+bwiMQbGI31GEAUMuD2jqmT68dJmpjA4XLFqu2scF2UQvlhEmeadVll11Kutq6I8UlRTNn zGR/JOb8ZUuX3n/fvWvXrGI3XcXQwc0D+tcPGVQ8ZnjvUUP6DukHJGsm7HZSaVttXfXW7UR73lFd 21ydoNOmwnQZAGbs2b0X/xz6CocTTmZND1OsGTiwz66Nz3z/W9/etPtIac9SYDWGbcgtxNqdOJck IDulP3UzaeNPhA0vExxfWgtImpxvmbClrvFIXX1t1f7ql19ef+tNt7y8chkn/Fx+yUUER4elQkOE U+bYL6Jqb+hWNwvqCE4WsF0yw+mfzHDE7op9wGu5py0c8MTgAnG6PziGrZJJ+RRC9hBFzbSW4KDm 1/WWEH5lL1tUyFJIb45UhyC5lBG+GULnQN4+lyH8akumvQApptbTZ04bNGhwRUVfF5G4nFpo/BbN y08xvQ70TkEt0Om3LhBUDVtSb/JKjt/57r9/b9mypdu2bf3hD3+Eq0my7NarnLkjXc16Btn1yWZB CY5ZtTMZ1yj4E4yF/CCTyaFXRw/hsl+QMeIP7d69Z8tmRsxWfL6J7fDY448/+OBDOHUQalBnOT9E HV7BwPjE5ScLB98cL2TzktFl9wDo+SXwit172MuBmADTbMruEJBfILwCoOgFwSVy7eZljUiv4CZr p/SewqE2/0IYwKA22WGVfzH9IE2O82vXbQRmIQOuIXTdBDoC8zPJYHhnBByzl7vJJZMhmbCXWQQ6 9DhqtJAuMsJw+Hz11VfTg1xaqUOuulNjDoCO1gmFMYd31lk5ANqMOovTajqxw4wCfZF9lpNWB2Tv Wjy67h0+wjABD5OcozQ767KsXL2hblXSGIa6wh/fGOwwI5IcA6eLD8IJrLGbDT/uGnPKP+5yTk7G 1xwoY+yxCgomWLtu3e69OxNU19KImWfggEG4xhLDIXCksMmLLx2SgS0HNNCnok9F3woycjTGA/c/ uOTFJRMmTvjIxz7ynqvfjaE0AY4NjSg8AAHKEA2/ft16lDsZOXwnOVZj1y52eVbu28+ACeO6Zmmx soPcwUYh6LkE0bYVrFn9CrvlULc8N7GQVDxnUbwSjgeODwtflBxwkFzCAl6p4I1oHpg18LoPA+hb Ow8117lVK0enCqlFPw4MSQqWes+vfqKwF+3Ok00bN7HnFSxEXzDv8BzKQ4cPASDg3p7dezgVjNgj IGf7JWCuFkr/lIfZeYj1BqISbEmV8EJ/bqrjGSiOXZvPPvv8ypUrcFljrsRyB2gDSPEy9mJO6N28 KTnQftnKDes3gsODtyFjPsmSF2yXSImPmQCoDzjPQZ48Ly4sbm5MDhKnUnoHuIOyufeee55/7tnC gpb+ffvQtnr2oTbWlhQ3Y8btW9GrpLD5yJEDeDbu3LkH/NhW2FJ1uHr/gUNHahJ/a4rduyeBSkm8 xdpkNx74bOqUiWVFh/7py3/18PNrynr1LunRBllJAMGE6MTdJPn/xOqd9DQv0ntSJA7nbYnrSbIB k+kLDgyNGNwbk3WcPdXNq7ft+8Uv73jwnluHDyi/8PxzcdBn6cDw9sENJUG/IO/hP70PwkMMRN7k AhQy4ri40WLtxk0YCwMBo1p2jaAHu/Qvdw3HKavdoWCL1N2MKNuzA8f0Ia72Toz97E3OZ8uGaCwR c/vrYOHyT59Hw03sGOfySAF88VPwn4xih6QNUW4VGy+JF3nLN03pVhf7WZVtGwITHn74kS996U// xxe+8OMf/oTxQaVYDXD43rZl+85tO5B8t72SWPp1Y2O5AN8SeoG1pssvv+xTn+S0qTnUTnoYSdfF V2Ljho2cFX/PPfcwQOgRuJ16826za7qG3VmGxyci/ybimmVfRU/5EFCehbA+5AmwEiRBBAk2Zbqp Cxtqdq9eTjldkOErwBm4Ey9wtmni7izyNr5eN6+oUdt2lmxX4dkbSuEQnHMdsxagBsgJnJqDofPb CNbEaYcLxMY93OP+mPRTOKzrcE9b13nfKJOjNIA+GrNrz5kOq+66Rr4qGNHBlxy2CpPxn7Efc+LP HJMhJOgaeWcdTrKldQagSdP1Pssuqst3OOkO/dkxCLfhAFPTN5qxm+mzyfAEoy7kHKE9bvHIzwjD GT5eVEEAHxbE8re6nsAau9n2464xp/zjLufkZMw1sVx51ZVEm/n2v3973vy5S5YsRbetW7fuyaee KiopZL8R6g3tFW7TYSeDVhQMmAAEoHEOWQF4VB+pGTl65Ny5c4YNG3o6AS/OPEPYR0r0VuW+fdWH q7HmoZ84nwXGoX5ADFUHqsDTHv/upjpushpdFqP/+MXVhK8ne0FWvfwyejlWmdWpAlxVLEVlCVa1 U0Kg8MAigaGzUFgTVyQWvMYV0DmbJZBKaN8sBg2wblFh8bWxEgar0TFuKh8/fjxcXbd23X333r90 ybL169e9uOQF4AJjhqPjn3jiyUcfeeyZp5/lhEsASsA4KRTmKlIiM/80WTQ8sA7JRDO8smn8otcx 1G3ctBGrMCHSXnjhRdC2fkdCPRY3OGUTvMIkqnLvPs7Z0RwekwprtLRsXTbWVscriz06ByjYs3s3 oQzXrVvLOSkbNm68445foAWBU/oMMAF47LFHn3j8sfoj1TjfFBUUAyaPNDRhne6B/bkBP5M9GH9b movYyLtr7w52LdThCwUextBYWIgXgdEq4DC4durUKSMG9771+9+77a5V9UU9SstKipoL23F24mbS vpDRzuQUkaf4O+Fl+k+jdzrtQWxwO2luqWU9oLCALX5bdu996LEnbrv9lsLWunPOPuOsM88EtzEc KA2GyyJv5InIlRtNtuA/qOUCfGN/BfmBSLgohCc8D6cRu14e6vyt6ToM2I44JjAwkF/Aouef53zC OvzTznI4ZztOqB0IO8eYHSg8gLjLLzG6rSsrDCRwewmLZkJeTfjyx1Udi/XXKYQrTrrfxNRCazoM pJcd/uH4nn67BuC1SUjBdPUj+XQwlb3nnntvu/k2HELAyjjCYRfQIdt5Ed86uwAnlPPOO5dDqv/w j//oi1/8wsWXXERg5nPPPQcjhhNmLhA2J44xiEjPRgjcjSDD0efAlJ/dYX6M5ZzEnTmDRjIy5tu3 0MFAKzdd4ddLYAQuIhfx2emMmM4IiPQgeOMDgm6BbhRI4BSq7g5s7aLSnFdsFoTgzq5gaT5Xu4NT zQVztPKK+2lOF94F1oiNH4M6VNkd3ezT7vR7Z2kgUs+WrCPHcRSY0630F+iWtlAszaHvQjDyZyxd NxMK+S4x0aQ0+RmXAqnvdb5cCaBBFDm5+FOYKGTPz6il3ClWzgUZvNLn6piSnM9GWE2lMMRyjuN6 QyJBt8Jt+MOYwsbEUBUrH/dQsnZmxcZCgTkUyEeVLwD4vovmHAevuhiD3eHbcdeYU/hxl/PWZcxF 3rhfT502Da2QhH5sbXvu2ecI6X3oYBW2m2T99Gg0LvVWFrShP9BDHIuT+Iz2x4VkMCfy9MU9oaIP dm40Fi4QYBoKASuveeUVwOKSF5bgglvRr++2rds4xgK0DaRbu2bthg0bATHwzu2J3ASu5V7A6pjR Fo57DGWiaF2D1mIKhfxJAs3VrkfzVvObBXpDSmvRXuilZjWZ3HcVm2SWH5/UQB4WEsWaRmCRIwdR izcSFsmszieucYuo8NhJYqU3NDz66OPf+rdvf+1r//qjH/z44QcffvrJZ5a+uGzr5q3btmzDPwcO Z9W5qFc8JHPCfhkYy5vgjy3lN4yIYS+n/GeefubJJ54EQwC9dOABtUDk+AnjiVs8a85sJgkEP+Ea M3YM5lh6IQutsu2Vt+I2r+BDfJt0s9HAedutt/z+7/3+l7/8t3/9f/7PLTffou8EWkFUBEkYZh64 //7du9naz+64CvKxHHC45gjAFxdifKXBwiyn1NU2FLYV1TfWbt+1lYnEkZqGwYOHcQIBcxvIJirL aVNG3H/bf/7o+7fVNpf0KuvR2gS0LkkFUT4l12t3upukBu8Uc7ebwFPrN4+ZVLXhdtJU39RWW9NK OPH6lh37a59+cfmdv7jtUOWOc85mLf4SmIbRlMEC253jOWNUfsLmrdcEAw1Mg1Sgq5AKDzFh6OF+ 4y+tAIjTLyRWyKU2pqPhQOKMFIjJJAqAG8Mt2ylZ6c0+z4pWOJBAYXhsO0XXgcT9BqJkL6XCIRxX Tr3KrQE9+YzQ44SWTHaR1iZGevJqz9b87HgPqmAg6sTDejy3lXun345TZzIaxVPmV7iYwPFh0gkx sGXFyhUs5pARGUPz8ZnSIdvRZBV0Ed/MKVMmw+IBgwYS3udPvvTHX/3H//vFL34R3a93OHUxfgl+ d+655+LYSpdRtfNS+yg+LDmfi87+7EIrdBimLVtOjC+NmrwCVKHLMZrqTXFMfJn9BuZQiE2UVlMI aBtDGighZ4tYF5R33facjGJuQynnXx22l4fAJtbZIaw7bdTlhiyAdRQNKwP6yndxsWLAFI6QMjkE BM+72b/B4a4zurEytslG4W+eyUxs+M7wi7Ef9oLCuxaMLmoUQPNd0mSec0lzmL2jHJp28cUX84rx kp/LMoGkMZmMjFrKeQuyzM/okkhEgo8veTf7hSll7D1980w+ZqVIKWPTQWpQGr4VPDTgzHETwLQB mx0dCpRHql3PgTPHDLJ53DWe/Iw5vD35BHRRYy4oRPFUoaeqDqAM2INPdBGE/uxzz2Z/JFAQtaYu V/Hkq2e0S2Jy61lWWJQ4YWNUxA66d88enEnISBwjtCAofPUrnBe9EeMljhIswm7ftoPEyc6w2rr0 2OdBLhOLktGCAdFyQDNk8EQFr7WbS8LU6xrJsuZqy8xiPgpRW0f2eELGcBQRfUbDA8cECBPWSIDa NOBFlrCgMIZNtuqQFUEJlzZLfmUFbMETBBPvy6te3rVrt07VxiMD+YmidGMNY7P0BPy1ilDzvA3W RRuDS5FY4zf9CzEGChRD8wR4Dezm87dw0QKO6yNU35gxYydPmYLbEoCSDiVZvmHPEhSh4IA8yXaE UwWnE7T1scce/+53v3f33ffQYMjWnMkFAKo6dIivCSvmDz74wLq1r/QuLxnYvwLXlJa2otLyXn37 V5T3xvrY1qO416D+w4uLCnbv2rVp87adu/fXNbAxruf0adOnTpk6Z85p08YMWPLgzf/0tW9tPlBA QJDSgubEju0nDih9VMa8SVy7E5dvIHYS3CQNe5K4fydG70Qe+B+bMfEMbyXQdwtbPWlDHa4nrWzz W7Js5S03/XTt6uWzZ0696srLwWQMN9hlZ9kFglSRZaBM6uWJ58aH5zcjF8XG5IHYjhhcReR0jfg7 ulhM74hQBuiC6Pf2RmUiRWTl2dGnOElV+E9LnlhWOJsF3DF/iGlAyHkMGSsigRhdabfJuLXDSjbI Hj5UTb/zbOiwofiwEVPSxOEUTha/BtAgdKalSCxygtACkXV898Adh5XfGWWbLH5JuIe99oLfHz8F ycHvNUl0ThcQ+GVVBy9t1GEC69kQ0tZGyWwoZ4mPLZVTpk5hdyb+J8yR6Cz6yHhNDFImsZAUvezw zFEV3fkz5+OuMbIzdwsNt1mdDdwBXQmOu1Ndfpp87aLyBit0DW27rwhz9lOS0Sa80YuMjBcI4yuR EwGws6KsyIAhohNMg525RpCStvMl7AzWd7/JOfR0kRGgTw/mnE+UHV/xRX1D7GLFgw8I7c2GN+lO CfmkAglEyS6n5F9OZnK4SjmAY5pmQPEOM4bTdpYwM/IEU25nGZFMvpY56z/d6R1wPIMo38/k+Jjc nRptmntJXT7iol1ZAe5+OZ3JVbgqdRYlvfsC2bWQvHlSuyOEXaQ5+QR0WGMu8hZocqFUsNOgwrmw ELiPITCQDcuqCu91u+TCKRNQiOaqO1KLGXvd2vV4TC55cWlDXUMCUVraOOSSC3XFfkpu2LyHJmO0 f/CDH/zoDR89/YzFxnNQi4epLPRTFhoGChQWm8aRIERQ8fOnLDCBECTwhwBXCJJ9nsCto74ZgVSy wywSWFQgiQC7AetlUQ7TAoBG90g8RXnDkBBD0yN64ATqIpXnyzCZwa8awz83pCdXwA7uA/eE3VHP 2uBqMFMmpDs4kyvQuUwTS4WvkS0lLxilH04aA/vrc1zBx7JvX24Mtk0CkgVnggPZwm2s7Y1OVJDk Hg+1caZl92UiByUiSLMkN62c8V7OK9jMRmHg+sjhw8aOHsnGXrYogJkBipzGyiSBM4j27Nq6e8fe hvqStqJeBLk4fLBq4MDBp82aMWpQ+TP3/uwr//DvGysLW3r2ailqacJgDXJO6nhdeJakH9P+THZX tg90OJKg7eSp+DsJg4K8J08Rtaa2VqLksM+hub4OEF51pHHtlt333nvv8089OnHcsMsuvWj69BmA M4NjIPki7+gmWmfgP4VZBvorDkbDYbulF7CteumCwkPwtwc62h32XchqjJrsB0scHHISkwGXRHKu INK5bmD0bEXRoVGvwmCvpVF6Ehd24xs6/CGYxCxZpa7iyV7YcePGXHb5Je//wHXYladNn04aR4dN EKwbBl78HbKtnCDe7QHvUw94XeEZRJrDdSKPBR/vZbjyz59UJ47XpyU5gn7vXsYd9iOcUvbt3btz +04iNYHYqAArBut+LEXQNdROYubMxNfHOw7HLSiJr5OfhXx2ZXuki/vIqEt0Z8g7/xQYTYPHB2Sz 9GQpf0NlmrGLy9kCn7UsjpdgmnPM7Dkl66EL1HujGSkHIRFydWYXpOGs3TOHiXgaHbbrzfdyFBue D1334HE0VhFy58BxZM+2MVyuXU7Jv/ThoaNzoHCcg6N1Nv8SfWat1/xJLwjiQd6dZewQssvVLnoH CoG82v7ze/YEdmtO4XoTdVZvJH6TBHS4S6Trsfkma3yTctXNb+NbPQa7SUYOr3KRt+qEROLsBIY2 J3uVwBGemUwcAE2qXAFJhQLCNbKny7tV+/bs271zN2Ha1qxZe/ttt//yjjuJp8v5yURWrkqcAKrR spwFQxQ6tA5uj3gWzpk7b+iwYdOmTb/hYx8l0i1qVcSgRS0QZHh2BgQJ6BCw23YG4OPPsJ6KrTVi CbJJGYBY466JtTia0lVpaFCFR5aAjGFNjDLlkrrfXAG+ozrritKkn8tCgAJoa+xqHumXrmsnCIAE +rDCahbBMaFxcaNysgRS6kYicrV2IZoYQlQRywuk1EDoTjt9OWy7ZcpD4UjYUEkAGWCYNOphYoEG tmuKhjasi1mEHZ+2HCmMSUuWSzEsbU7MlJxNBdiyl/nFzenCC89/93vedfkVl59z7tn4XTCdGzVy 2JjRw/v26Vta1KdXeT8OD+dQ8Ooj7K48VFQMVO3fq7xXbV1NQ0sjzuBb1r743a//4999/Wer9raU l5YXFlS3ttQWgOtai1Jw/ZozbrsAALvbL94xBJJoJ2DsNs625DfdiZm8T12/E4DO1s7E8bupoZkj FZsbmtpqjjRu2brnvnvvu+sXN5UWNl5y0fmsrhI+j2iM7ucTO9IpYYg1Yh1NTlwvjtr73TcpdtRs nMZ55JigIf7CHN2WmE4L62MSq4SE8VXxEHB7r4SEZMr/SJPFjo7HhFPpFSMiqvCVHapEQQlU4SGD td7ZgkfbcJFYs3QfgiX17t2jlBia/aeyNjFzOk5N/frzZUimIlGpkwrElZKlWSAuG/1oOBZI5tZn Rd047mAXD99xBu7IDQ44b3G+p++4c1SjE/KQwPk6HX//+9//z//4zzt+8Us2U9595z3Ll61gGyVj k1x4rRBQnD3QuKxQo6PJb1R8qWIyKSe7f5nRgHfggw4zirzzcWF80yIXT7qIeNBh4d2hvENrsZ+p zq4Ot8rZBFRGPuU878zZJnAqx512mPGY3CajTrdZ5sSXCj8EOrQz83O28O7wqjtM7tCzpbOMx2xd NkHgsHxSabs7XLu+ImO2B4NXOXnzoTCdKKS+7777OussI5zkQHarw4mC4dZZRodJDmQPkjrrHfu3 C3ejN9mtOTyRV07nuDmmmxNpTiwBx+rh5P2brLEzeeii6g5rPFHlnLQm5yJv7KZaFzDkoCGwpBJC bsXyFQlo3rVn+7btHLID/k58G9ILXeXSLQMVw4/Hm6GKCL2AsmerH6cnshpLEGWAO2Vi8kHr8AQE cMUVl+NNfs211yxavPDc88+99PJLBwwcQPw1jjxn2xjICdUPaACgo/aEAtnFWU1cWRuecFbC1Ivh Jay13rmE1lyRROBCMlo4dWEpxPBmyWEzEyv4J89zejpGeBZEinRNH5dEegXQDOgjYpY2cbBnU7Fb 0d1dkUBY7AxBBONCuWU6qaAcIZrCGs0JHwZNqrE0L9+8LMdaxN9e0UCbQF/TrfT7ls1bCFND5wIy 9ldWcrN69StIizRn2xus80YolnPjq2yHSo9XwBST8SeQaPr0qYsWLRw7bsyo0SNxMWeyhvtNSY/i wUMGjBo1fNCgAUAvpPRwTXWPsl6jx04cOmJ4cUkBZ+X0KOtxpPbQQ/fc9nd//X++/eM7t1a1lPUo KymsL2ypL+Hsy+YionPDifwx+ZqxLgkpCDpPLN2ph8nRfZap00ka6iSJ/Z3c4rqSMpNw0I2At/rm QzV1W3cdePyJF2+/5Wd1RyovuvDcq666cs6cuQghiFOIzCUEhwYhuICYypLgiEe3EkYwE4anoWlI yYcbYRZ5x15M7cr2O8XqUGHJWosDsIpfFRiHgLLqr0/kTCDgrKiXlZYxB2CwY9WmcLOTwHlCiqr7 QKG7HqmUVzpQ6ddBmnSJo18SpbwGo0AiS+yAZAsvUWO49PoQutkQarFMZw6eQCS74hRemxNzCasz Djo85EvFdJdvGsVSncyxtBBjWy3n+XUgsCX9P37yn7/4xR3sP/7lHb/8xte/eeutt3E2KnCNAeKa FaMDGZRvMZl0IGcHQoh6vtR1IIdHQySRi4820LDDQ9H1V+bbno1w7C4xjcdelk9KdnR1p3ZHrh9S SwiDdDY7PYJpM9+jIL7A0ICjeRBg3oAdOc4hNgHbM32dTzm7xzqcNnikH1OjIDXb5K4bG22M+OI5 pFIjmI82HtP8nOXVcRAQ9TK/6sKzJZoTlIf05lDeYcPdHiobg8Pc8IR9eAhYF+zKygMdlIO8O2yy HZqFwpHLVdzORkQ+ZDej3dRZRsYI3cT3MAd850hyllQajoji795Z/56obo3esXbDXzKlf0Ny1c2R mx28xDKSb90Rj/xRf3yS3Fm3dkh/F71zosrp5kegC4HsJuW5yPull1YuXbr0CWIv3Hrbz35643f+ /bv/9q1v/eTHPyGYBhsfX161+nGC0D7+OACaBX11CRgLXCikFnih188977xrr7v26qvfS1iOJAJu 3wpUlCEU8IkEq7GPk3+c5n0Bx6BfeEFixktX86E70aOJFXwWAAAFic5G+worBb456j9r01WBiVnD eyRkQsUsa8LmZ2mqUqoAo3DpKStKQONSOwk0pyUrABnQbGkBQUTnYZWXZgjwuQVGYtubA1kcwKYP /A2rtcHbWG5kSAAmPQ2YpYi2lVF+ARy0BZdrzIoiG9V89qskPVr4AlQFVy0q+JmYto+GhfYVfwIm WNzYsX0HAkAXA2XSOIPJ8fXJxtyjHj5ZVmeHdxZ2BGHB2CzHsgM+nlNsiqt605GpuT1BYyzWJPsb 25gc4ttb1bMcT5XeRcUlza0lANFxYycMGTq434DeZaVtNQf3PXTvnf/0T/9035OrqgmDThifVs7e ASHjZM+hlW3NBQ2tSZzu13krpbsqE0O2wNNA36lhO/0r/Zc6hqfOJgY+SUTcG0Q0Cd2XRvturK5v 3l1Zv/Ll9XfecfuW9WumT574zndcxVeeaae2W8WPbIofODWJ85megskVMy5XnIx/rE+FMoPyMxaK gVCA4EbBw7qsZV1gqm04cKp24oD+gdGVOjsifh0+/CqcUEUVeJzPnTf3HE4EOPcc/Jt5qG+6EJbW wxAo1AObVR0uvT64SEDiZIbQuw8Np1eQTCSPfZaUQwJ2bBMem/ROSPS9hgB9352Ikp02hg+6A0rT dfZYUFvExdDQEO6CkuhfZO8ApHUUEkb04IMz+eQjlvYutbBCxZZfPoZG+KaNAfRDwmMCmf0cKfbZ 4RlP8m9imGdf/fEf/zECgFtFxH/gLXCExXdudEGOjB4sz2aeQLH4FrLjivhxnFveRdVBZLYVPvQU SQgQtyFyeEiDhumLCMiQTzlkcF46qM5NddLMnzlu6GZkwgDG5RVHT4Dm/cIj2DQZw2RnuBBbdQQA yTK562bmkCqkg2M5UANiwEZdxPXrsLO6gxg6zAgN1Aju7MKz5c3UiNACT6kCfurwY5wQ5mOYkzvb FZBfo+dWQmQY0TtsclivXZYhTX4Y7w4zar1GwOxExr4Z7aZsL2c1jiQpY11IcrZGWJE9dylHZnIK fzPdavMtH5HGs5yhkbNhN1t7Z+KRLSdfwimZJSM2FzHc6FaCE8AKfNU4ZTZHsPPzvhm5yv9cHDev cjKeqHI6/Bqc8Ca/FtHW+u69+/7vfef73/3Od3/y4/+8m+Czd98DBOdIeWLYYahGlzz/3AuPPfLY yy+tYnsfliHUEr8bNm7AWG6IZfRTYqbq13/ggIFnnn0mx5v/0R//0ec++9np06eBZdRnqWNCcuBi ct5KQ2Ni0i5pD+mg8gaV8JlGXenlrJrMOpyg/zTCQbNa04zxZ7AvYC7KGLTBojbfEW3DqmH1rohT B1MahRIFN6TnGibmRtIIgMIQnq1RQOmlOU3zIYm1E2cT53dhUJj9UjhsRFpADW3/8ATe6uyrMc8m C4/AB9zwnCdiZf58xzuuQoOyKPnJT32CLuAV9OhSEosAWrKpC7LDBC5DbBq5KFz3BoGRUq6xWWcG fIo5tJK4EIn9Mo12wpmDo8eMlmPRRzY2irWNNjY74IMn2VlEJDBLvKJwaEvnfduJU8nUbuWKlS+t XEnsc2JiPvzQQzfffPNzzz4LzmWmBwfJyvSEoz/Ly1vXvbzkZz/53ne+8/3nl68FRSdykRw9SVxG dlYWIKONeIikeDoN4d1+tU/UID719T7q1J30RgrAE8+TtGt8IvRO75MtmKlreALDiTZIdJ/G+saG I82NVTXNq17afNsttz7+6P29ehZedMF5HPIKfhU4hqjDT2ElN7Daeak7IozvYa/BHJY97GLBImJj 7A46iy6LCS0ZRavZvYkhxtFx1iscD3mOHlEYdNKAHkYZOwtZ1LryqssvvexiJn4MOuOHKGPpAMRO 3JDGvW7qWd4TCSKqzOLFi9iPiL/NxZdc/K53v+uss85k+YJzH9n+OnDwgJEjh/Oh4NtRdbBq65Zt nAFpzCInk+LjMELHzMGWwgGHp3MMx7X3zgeCezQBBoZHuL4lRl3kIRmdqMhwh2H0TqzCBUAnvRNd r6ycx2cnvh6OtezV4RffBPk6zOfgPw6KR4miswmnTTwWLiJUQCTAF+NxTsbPf/7zfGY5ChubC+OF sM0g1/e85z1xUmNnFdmcHIL5k4xcEQcNpU7hwDXgke5w2ZEe2SEYSuj6b37zm0EzhYCwY0NblhIw NDAXUv/+7/8esrkeeeQRYQpb0DoMsNi1B3aHbclvO+zlErHZO9EEvrSd8arDJmelorOMXTCflnI0 /XFkDMq7bjLdQUvZ2/foo4/CXiY51113HQ+Z2uV3emcCSRZeaUnNGQg5lAuFmUfxPCzlWQAdIyib Ues1AxzAzfOspbzroZR1OOmCydlC8gO0d53xOAZvto3cM3D4ZSrL96fDzjpuuaJbGen/8R//wXBj xsvHgdHEdyNG6FsnVx0Kz5vnVYfika3rLe2sbn49gp5CjoHgjzBZYY1GYfNJcQFXxKmJiMGA4qFj 0GSXXXbpOeedA8qqTrxNqnDaTtK3JSvFIAxOpjzrrLMSW28BOynLCaQGUuLL+6//8nUsQFqdScAR 4IRP4XTA8IXgOboH7cVBjH//9/9w/733c7yluk0bHqidNKR3MZ37cIGg5WoybvS1CPRgFmArsINW 0BzGKuYoUoYBTybwFsjIDSOZX2YaLD1bi0rRc0n07CR7gMjQnZoMhSm8dUmdjEbnkBKRri0VhWik 169DECzghh4oMfx5NE1AL8IACnMvDhN5wyUgQlJgI6eQnvn7v//702fMoC5O3PnBD3540003WS8j mcTUkJ6pfpDSLF/plFouHW0DHAcWF+HRHIQBqITf45ixo8eNJ6TdOMyxTmzYbXbjjTf97D9/tjcN ++3avVMmsYsdJDSxIn49zCVSSk9kD+cHSbXHtWVCyYyZM8aPGwfxTAJhCz4H8BpvP6YL48eNX7CA Gf5CtvBV7q2srj1U11i1auWSh+59eMVLrx6pqQMQlxQXURnbKROATHQeIDJHxTP1QDT4/6NeQjww UF+SmCWI9Hn6wFQ84y9kgz+S41p9m7w+urSSkE0a/uRN+kdxKQ4uPXqX9SgvKxo1auiZp8+76NJ3 YZ5funzlypUv4ROs/w9dRjPD80HJ0T0DbtCbIOhEzDjlvqkReEoYj/q6JPg051vx6/hyFCdOQfvb z6tyEktGOy7EgMTi2vheZN/G/Mc+MiWiiJ8YyJsQe7j9UC/UclDR6pfXEIsdS7DG43RLCNtF2ubN n3fVVVdMnjw1cW3vxfekmhk+9m3cuOEMh0ZxLiqvKJy2JNb9HqX0Kbb9V1YT4A8ftgOOGi4F2KHn RBQKtei7FODHUTHje+KghjyzOzYNrchDXVlITGkSTGJKM7tTa5kW8xDZa2mifG6c4ioDcim+G3I1 vr0mwE4vnTlXTrIO0+Q8BIUAZC2HLx5WZ2vPL5zvDKdh+xysE6eyY9nlCdvU8un0XD1SZjc+Zgsn r9mpmjLhvx9YMgpegwzMnIAAIBSKnzKxkmq0xkoKGjOMWmeUp0fbXsZH0tJwtiFLPq9A8DnU5pBq M7MZ2e6f30CSkZHSqJG6bDvJ5LOMyuFVh022nK57mcUH0uRbl3lojfAneipLuWFGc7qGLJCdzZIl lVdoGVqUs82OXEA02StvzSUHqMJu7ax3eK4MBK+6aDIFIhtSKLWw1wZ2zSs7V09XHepCwLrO6MJF h7RlMwa3nc6p9KPJb6jGbBtzWJEvVyTIDsAcubKXc4ZS8KqLjApktnZl7JgC2UUvdy3JJydjDg3H 8cHMH7xvHeXtyDvkiY5UMfBEvct9orlTkxjb0fiPh5OnTL7oogsxcG7eRCBttH4bbpdkwYYHpJs8 adJ177uOyF/8CahAwZP9pZUvfflv/47hIfJGQWJUxjD2vve/D2UDUFAHJcqyrOeB/Qd+4zd+4/HH n5g8eQoRGpBXV6W1tqaYsA0ozj20adjzPjQfVWhdC/SgMwbPwd8QiQt7tJpKxZFQhW+MdmXc2QEK aFwteSpUVTiUCKPDRqWFmCdwySP3uFD5UEV2TcX2a4KJ0y1cAtAc6BnmZ7hkeAfNk5TDDIQy+RiJ MPhCRRASgazWZZ5DHrVg2f7ghz74+c99ntUHhlVJUQkHkbH3C6DH+YfsV2PhnpZycPqyZbgSbbCZ XDRNMiQ1iy0UDJtmdbB0/vz5p502k7AhkyZPYiJnGEEuUNQvbv/Fv3/7O9iiw7dek6HmRjsoeCKm MdybtQSqtkXBMXJBiWjJNPayFk2e00eUg2rjDU8gkvkAAkDQ5fe8+914dz/ywJ0PPvbA0pWrtmyp RFIScJ0apml6URoXkGlcwgsAdFHSzARIH7Vv66ik8KRp4kU71E5wuo8LyZt8phOMHfKdgvGkDNC3 b/lfMiEp7lnKcVVtfXr1GjGs/6LFp5937oXlFQNWrkL7rGFg0vU0kMHC5C6NnvI6jykOmB8+cjht ZLkJVcHQQ4C3bGKbxVZ2uhIXRKbBJR0zGJVceqQEA+1Te8QZF1cIhrIh2+3iRMyOHozqwITbuGkR n5HlDsLdsEhDG5nPv/zyK4w4xMABiwwgJ8Q//MhHP3LOOWczryc7PNlXmWwF6du3gtkgY5ypL+mR /Ag/grKhCkIDrl+7geNckXZHJQlkiKjXMaKY+QWjaqWFXxK7XqfxGxRuGp5w78RG5K1QWb5ccvBq j5BFromF3grkTXrlWY4pLZHMvsgZXDzsDHlbgrnso/yrs1fHnTGniuMup+uMWeR9cmrMdsSJqvFE lfMWMfmtaPJxk3qKV90fvKd49V+SV8UgEjWWlhsUj3pLMKq20PyJpnnXu96JO+CM02ZgUybeAOdD YDjbtXN3oo2aEkWlSjuwf/+A/gNGjhqJZmGzEgvEPMRxhaPF1a/oNhQhWwZXrFjJUvq8ufN6lCbh GqyOslj9JhrX8uUrCI7BonxALk1Qyc7yGdO4EX3aMTZBykVj5FLRWix/GmiMZERoIa+KKkCk7RVz 8DY9Kf11oY7dskkCtbjpveLetXsuIXWQJJoUIGojzPJZJlOOr6RKwrwRdwoOeMuf4SsSQJmM4Qoi 5cJidDk8wK+ByT0bXtH+w4YPm79gHkd+gDwwKLJkATiOZQQRVbbYaKzzjQDEMjaZJOC8W5bMIvy+ kwzsywFJS5csZZ+luDkKoeF2jZdtJ4GzFIGLfWpcSxdbaBqJXc2XM9YuHuJKJCfdkIoQSie08NzE lMxUDfBKVMFx48fWVB1cvWrN5k07j9ThWYT9HnyIEzZzD0B3Cpw1UlJDsntSA3a70bvdjyQFv0f7 X3rp34QqOlDwbSGKiVA1MaaLwDIgTK/wtLTkjsAo9S1F+/bsPVy5GyA9euxYXLeY7qX7JpPNspSA JIp6A/hyWgtdSZ/i0D9i5AgdwRPbbQsTv/aTpGCLYuNWwliQcQqkgMnP+ALIWMXSX+VTWXU4hNBm H0Lt3r0c+rh72/btBBXduHEj1enUQYdiF2cCzBFC77jqnaBj5jwyk75jukvsI8z8OA4RtB6XEmz5 ZeVl1YdruDd6zP4DB3nrrFjeKlTZSSOvIE8XKXnllgPTa7fWhq20OGRsjsCdJ65KyQ3XeSKBY5Df nOFgUQq2c1eLiq+EPAyZDzkxAfxpF6bX/198oi2/wzQnNmNOaW8dAVgNMawytwz/lqOjqV0rnbQm H3cbTxqvOuv346b85Gc8xavuD95TvPqvyqtig3gIHGmky2dZTJmghBQSjRo1+g/+8PfZDQl2wVZK aMB0k1kBylUHDKCqG6TY/LT/QCWqhcNN8P8mOgoBbtmjSeGBkKj3mmvey1oza0SABuBCsiUutTAl mrCtFT+TcWPH8z9U166du9w1hSYjagqxCCEA4zTpWYuU4KMo57WbeGgDxXOUn+4/q0sP+SPadHIE Y2IjTJGxJli1tUyw7YE8AvKqTUNDeK+TtKBfg7cYXcRsOUdB4WvzgYDjAXHIGI4oAYOoGjSjEdol +wBeogonBgKjFDokgSBxRx04cBDdhBPnL35+B30EysKIiE82MddJyYkk/AJxDlYdEjoLX4TCgbcC O2ZhGQ8FIvgA8DydeiXmQy7sqUteXPLUk08zvxKfBWF2RwAaq5AtNkRQAirCjwXkbdXudRMg2rM8 FBLJ/AA38TBItVHpEkESpX70WI764bjKsb3Le1UfPFBdtT+Bu4XJMTgEB6RU2JX6l7TvlEwELKnj Ndu2dm5qTRxR2sUg8UvRfp0Sk8Lo5Kad1JCWtKQUmKcIPQHbqb94akgvTILdJx7lRZx5yRy2ct8e LNwTxk8YPmIk7hlpGOmk12AOQssv9ymGrsNXmUjqaSSTgaxOiR1B3MlsOPV+hgPUpiS7dBMPXXtx SiP+VhKyrJbh/spqbuzW4LzpFdQkltGePRy5hgDs33+AjEBtI5wwlrmHEPYGTJw0ITmgiximTS2s MRHr+vHHnnjh+Rd37tjJRJ0t3YktIN1GsXf3Xj4LOJwxFUdAkF7lRGkXtkqMYCLIi/kGcugwCfQc WSwh9YFJHMfNwqUI8UQvMhkoZxRXEtjq6F/5bAIrUjj9VsSYsiOkNn5J4D6N7MXb7Cc6W1pOyhOY 8WQSkI+8fyVNPm4mn0xe5ff4KV6dnBFx3OJx3BlPyVV8No/5oXvb8aoYFZhtHvo4tEhAT1UISv2d 73onmAX1gbcGBtTEltnc4sZKFCSI1vACwA8QHpAa7QsUI8bc/soDgF3NmaKoyy679JOf/BRHHo4e NZpoXIQuAwofqU08ubF/o/9Ke5QS5HvhgoX4jG7YsB7LWUWfCoR48JDB+O8SVgwtjh7DiBvQLZCW ECEUsMhAbWr4XoA+wRb44oNKSeyStPYzcome1bguLscVhsbQo1YkD7nRwqpOVcsKE0Xe8Y3IgaFy 2PRBvCOWV5ru5LBOvTzxCpYGGDI7f4JR2b0H8MHrgIV+AgnjtEAWW4qdG58PnEOMcQE2WrP6FTou wUCp605OE+JJjjVUduFejGMBTr30DhIFPxGJNa+seeXl1cy+suY9O4VCdATKwhGNlBomaRcQGeRN SrfkenZJ2CBtY4iuRUkzNzG9sa7AYcnO3vr61N2lZ7+BA6dOJbrO0N3btzFRpJvxjErQcwK+E0N3 DOZ2a3S+obH9LB1dP8TgehTop5F4imczSXAiGGmi1zUg/SORZDdpJsdhFta1FFRi3a3cU9BYN3PW adiJmRh4Rin2bDouiXKdLh9VVydB8ZJ5V2LmT9oLB3jCMCTCDPZyeEurjc7JK7dMuH5CvQqtlm9v sr1MeoeDD0PAzCuHnWrGpkYeQpU2dS7Gh9sVIICUR+eNTfv27aWjD1cfXv3y6meeefruu+++8867 nn3mWcLwIbFrX12LwxIwPXH/6FGG8xcTDCQUF/Dy3uWHUru4KwBhs7fhUhWX8sBDElu1VNkWBzgl 8Kfi5+SflM7GrQJTNAXyhF+Y7zIUb0OSZcvR9sYm12QGq2TG0A4R5YmjID4gVvSa4B1l7+vEKH3t k/zn5o1+Oe6MMWGIj2pQFVWcKAKyyPvNU37cTT7ujCeTV9leOMWrHG6cKIH8NWHyKbnq/ofubcer YvR3Vs7Q1vwpUlEzxfcosQAVF48ZPQaT9lNPPbVu7TrANEvDaH31h4gQnWQ0BspRyaE+Up3X0NSY 6C0uIvKee965py8+nbgOEyZMIg7FfffeC7Coa6jbtXMniI2ldpxV2J0Jkhk1clTvit7PPvssmq1v RV9UGSdoDOjfHwvm2lfXQYA6VYwb4ECI45/RK95DG2heb078LqoPVQPpADECBTPKBLIbLUHbVVxZ U5bpI5eaWIM3ydSp2s9Mk6Cro+YugY7896E3WaBjljCZR0s1S6vUpdaUcc9NWn4Jc429exOHdRKw wxW8ghny1TWvMtUhxNy+ykqbTzwQep+qA5RE4Tk8oS7BGdUBtlh8GEcAiokTOSubrRvoUdEDO2s5 OIkrfOUDDJnd3rFTZEvWOg7xUMhb5m+spfBLk+VYNDbbs7Ix0Dz3ASJlsozlJjmcaO/eLVu3UO3k qVOHDh926OCBqv0HmRwVp/b0hI0p8A5Dtzg5fZ4GFzwKqHGSSJIm9vHEYUUvkrRNif3bQIOKU1xJ 7tTI3V54u3U8+TOJOaitPK2ptQAcWcAhpRi/21qbCMwyfvwE/M45A529EExEAaRkgy1GoT7EkYmc YMW1F39pOrYSK/KO7Ttrqo9QqAGC4DxMFnk7FYzJibZbuwZexQ1V+MrPgg1xuAm4XYjQLcp7soRd OYo1L5IM/xOftAMHWBADXnNcwKOPPsY/TN1sr3RK4LgjSzJJnjyRgc8JXLwtLeuJ8RnPEzZhu5MY Uh1oSpQGeyVESqg02pJOA5JJmsPHy3HtaCK9AuafonC/aWSBKqSd+arIOzmxtaLC7AGsY2ZCgqw8 yzeliAv4zkiBXdrgHQVUHci7M8iblSVblyNgJySjjHKEZmvMuT8hBATyZg/oyakxWnFC2ngyeXVi Ke+sZ09It3ZI6ileBVuOyeRTvPqvzKsc5G3wkHbVf1RV8P9qIzx38ddEYsBYI0eM2rtnL2cgozaw S6HU1V7oKu6xbx01VvVAzZT3LGe7Ok8oBnVFLC6WjNGpHJ2Tek8WPvP0s8SgACxs37rt5VWv4F6S 4ONx49OIyARqHUVkAzyGDfMHJEEFcm4LIcZdMddcLa5KUE9mAdd733pRI74u2vlYQwagUBpkA++0 KLvKrP7WtEz5QmraomlWeBo4T1ziWDKl8EWeBEpW74qeQ8ebS30sAOVJ1vqoNrIL4iJL6Htz+adk yAouGphuI0s4ABmi2CS0xf5KIqcMHjo4DdoAuq3iyA+XLKTN0rJfz2ijbJSrsJEodQSymDRl0tSp U5k+aYilUri0GWy1eYvb+IJj0RG2yCpkVLRCMuRzarjd59ZSsZS5gmPc+0Q9Gj0uwYEFSa9dlgkG CzW7WQzYs5sEp82eNX3yZJYVwHLE6qHmxPSfWKxTr+zU8/to8MDX4/FE2pJ/ic9JiphTQJ14mGjw tmkyKqvk0r8TL/Lkv3a/8BSTJZ4JaYlJ45IQQ9w3txXWNjYfYGfCocp+fXoRYm/k6DEwoq422Yqa GrzZcJhseGDiy/jdu3cf45ShwblXLHjsr9yfbjZt91+ivSQ0UrWLG7JaXnETHHY6rRiEMGRFQowb DM8OOiXcjPaU5mQoCQmkW6GcBZkdO3bSvyySpKLYPu7sUNY9ECrC5lDSrh18FXY5ft3PYLuUmZAH hcRfd1i6jVLpsplZ4YlZtG101CtLXNTliKYoPzXElAB88wq3N2jDlg/lSHh8dmSRrJPDIZCymrd8 xwjuNGvWLMqk7U6BFBVjt2eHRlZyOrwP6TqBGWOUHbN2yQ76j4Nyw2ADu+NrcMxK32SN0nwcpHaY 8WTy6sRS3jWf3womn+JVDs+7YPIpXv0X5lWuzdvYW6oHfwM3uK4NZGFf1JVXXknkMNxKX137KsEx 2AIl0OQXPWdQjoGDBs6fP3fBggUsM48fP44N7ByeQwQGAvQS8gaTVk1tDVEFqWUYYVCGDnn44Uc4 +w2DN9oS19SHH3qEZXNsqBQrvNuRhA3ayQ1/YknFcIsuRwtiuKVe99UFYM3iAFukKkWzqhdRpTwk kALlcOOxf5qpKCdsuiTW3qxKVpv6xDETila1Iey2CrII02VjeHEIFHwYUCALo3lOXj0r9C4V6ZJY SJ3FqUIHoS2v+FOgYEutlHtoBvTEmgalE6aRMglMfOjw4UcfeYyzRp1a2KIs8paAMCVmecs9fcr8 jTUKDyePKQfQdvmy5dgpI7yDbImO8MYaw/rojTXGgYIgSzslLJoxzZCTciZ6jQJFOfzquyzNpPRe 7x0wUxKBvqV50pSpi04/A6Fdt2YtDsTsk6Rz0jlBCrUTk3bq1Z0C5uTenZIJvm4HHbwQp/s+6w4Q 39aj35E0p1G9UyHIfl9kfuJinljS22c/8KOhvrFy7649O7dx+s3sObMnTpzMHAL0yZoPAmyMPOc2 XNzwiqbR4yJd55ZcBgkB8urnLYsU42CpzJSBzhuVdnvKZCGTAXyzhZjRxMoqowAaoNOBFuKaijpD pn0NJETLWohSOWr0aPZjQCphkZh+Q7n25vRsmteM00qdhuqsbGCT9gwpvw82lmTRRim0vdLMvQ10 7uE9l0MJwwEJaM7EiZMmT5mEQ9f27TshTNmzfAsPeuK5Qx5sze6FM888E/wN6KRdVupbzBYhq1nB OOZ9Io0Zd/Njpo8EHWbME9pjl3diCTh2fRkjS3cSZ9OcWFJP8apD/p+Sq+6L5Sle/XfjVS7yjogf IgBVjjo11ZGJPfuss89etHAR8c/Y6YQTyPr1G5KTulPwx6ff0yVQJETz5SSdsePGAY45t5qV9F69 ew0dOgyoNyHRWpM4yIQlV41YBChk0Xnjxk1axbCErVu3Hiy46PSFw4ePIOYgWgpgh5Ub2NCvf3/V JGvbTADAfP0H9EfLAyckUoKlX3gXH0e1ILofFe7xclrO9AZB15pS5CoSBTGEPhY0xNY0xSXQJIXT fJQ9LVLNC0FEAyLjLMJWQ0uebwUrsl1dHhiIJ95zJTgmDVgBaiQ7KAWew9JJkyZStY4lPBeUe1YI 98ZDbF9GT+cqgOMdO3a/svqVjRs2OmcIe3yYLWWjlAS1ORMGMmqr47nOD3gNYUQntglMlmmKkBmj NBueA7ul0JbqwiTyI6M8ETwFJLLLcmCHbFQayWUTgsMCSrfSsg2huuYI/umzZ88FZ9Udqd25dw9r LQT9S6MNJiC4nR7Bd7t/iXZro5SkCVJj91GjdUJ8dgS9TvGL3ROiU9j9OvCtJ0viqZIg8+TXfwVN DU3sgzhSe7ikkFWgERMmTiJQIj4TuG3geoE8wyv3LzKsPPYVYYB7gF1jNXKRLLC4Tv92gcyUaY5l eaUI2V8Bu7P4O8tSu9LsgenlQ6BwB6acibETXcNDE/jLJNwzL+tq6/kmMO3HUk5zksDeibwmnw6S KRW2gj+dKjjWuByMBup23hVCmMwkMvb+LB9stQmyUsrXwKlLcvxQ797EqmduSeHKmARYvjJmS6WE i+d0EEuC9BSrbSwh0n3KtnkRVzkTLMpKTtf3JzBjfD+7X3uW4KCkm9lPIOUnv8ZTvOqM5/ndeopX p3gVHDiBo/5tJ1e5yNvYJjkcUR+Le7gHB7P+29TYfP/99/3yzl+iObTyCvLAnUbuI8bCxMmTeIKa xHILTkQFYiJCPxKEIQ083E8NndSYrizX1ePnvQvFhrkO7XMu13nnot9Q6GCa4cNGAPfZjolCI2Za YmcdPYK6CFxIXYBvsukoIpKzZNRnKEW1rH+CRcIMxhNP3EhdX5LJg2Z7XSb081a7a8PmCthH+lCT ZEdxeqY36cMpRSyiYg4dzL2OECpdryyglE4VeXSByCY5NWbGjGEjhiVbD2sS52x8TznAaML48Xiu J660B5Pz9pLJSWkpap6GOIsAteh1LeeNSMNFFWHhk2+BvG2piwkyM5oMJWAknrGqX1aahGmnQele tEJiUzz37HNEotYcq40z8DrlaMuXdfLEpkXHmVimZQGN7IpkwSLRGyVoXnU75ujRY5j4hSsUCeyC kAoIQ+YT8Hr4cEW/vhy2M2nCxD3bd+zbu6cFNxIam+Am/ksxeHqlULvdWn3UyfsoVErAt94myeVQ CuiZ/JlG9s6kzkQrTAs/mqv9Pvkz4TE+V8nL1rZCNggT7Z7mIfKjx4wZOmw4gorvFstEBHbkKB1n UB5IKU+0dtNq2KKrCUhRg3fwP6qWgbJXOVdKHeNOiuRhCK3dYffFlf2MKL3Bihgv2cmSZcYrh6pd SXuF3cgSz1k6O/+C8xM3j8OH2ToSn6akozJTCFuHGNhed3HIHH+RQNPIJdemQopsqUPPJiMqPISB nupFybie79ienMnFq5g8RMP9VgS7LMdBxHNyYe1m7Y77LB+yyDu40S55x/q/HLzbffjbdcYTVU4X 5L9FlJ/8Gk/xKsvzU3J1ouThRJVz8kfEya/xbcGrJKpgllD9vEOnBmhQa4pX8Bwl+BfLpMSymDBh PM8xnaKTeKt51RAKKFLO7xg8aDBaasXy5QYV4dAWdN2okSM156IO0akChbFjxnFsGMcd41KCzhoz ZvT//F9/AXlVh6qw4YFlcIrllJDt27atfvkVTOljx40BU/bu0wu3b8yTwG5s3oF3RQDSHFhNcKDq 5VW4pkCwSAUcz+VJOkkcw9L2E+Bhi6Xxa+gx9b1siRvdiCnc07xFMGHBVfWSXpAR/BTIBpo0mVhH wBRVCF4J1Hz22WdddPGFc+fNZacp+ruhvoGT4QcNHoSFlKV5kuGYoy3fcBP2DpduBmIICk/Nou27 PG1LIGBBiZLAc2EE0T+Y/JjSBLSY9Xd2rLINjhCQXGyLZLIEnUyf6KwDBw8ksDs5gv21aJXOf+wF uZHFbYGH4u1RpJvUG8jGe4qyi/Uk5peS8V5KTlKcMGHs2DGIEBMVaIAeGSjuT6eESY9TNZKJKBJ4 nnjYRNRZtHAhUyVmdIeP1HKsZbLnErhv3JKj/1IypCUh5ChhPn6NzhyCTdqOvV+LPJh8nVKsmYHl CXxvf97alp5gD/BNDqdsg6y9lXuqqyqZLY4ZN27goGSfH8xnMjZ69Kgk2mAZxwnR3sQ0S3udDSaD JT3jSU8bQSGXaJUbJ4paapVb5dxFA5eDwlFEKQ3AHZ/XQM/RZb4KlP8ayzKLRTmwO4tEPSKAeZHk MY9679XvGTVmNL1xuOowKypOEsgiyHaAO3aoyxlmWMGVcImJYet28HiozCucMSi4oSJXCSyQupy1 uiZmaTafezF6DPmQVfPaKHqH+2xj5baJs1f+k5wE/nkCM/7KCTj5TT7uGk/xqkNp7FAgT/HqFK+C A/+dv1ev2bzlAsogdGRopvis8wqVhjpBEc6ZO/dDH/rw6YsXA6O3s5krPZySt25pwqKEewknYhBm gSgor65ZsyfZSrWDjX1odXy1QbeqeYoCECQOKiXFgwYO4iBT/Ewg5V3vedc111yDN4XaHciPuuSk ekKasLcSYjmXEOUHIgC4bd68FaxJMghwl6QaTg2qEg3rNfc8cfcV6ZNV43SHKBf3aUxkNh+yxp20 RSiv4hcfhCkrH1RRGnlpmmDXxCpXlXGgkNDQwWQRtmiGG+p1GsC9YFGyIYlw5otOXwR5vKW6rVu3 bdq4qW+/vlj9NUgTIlAneKr2VzgFu7C06eptuAbnSBQbOFumBaISheglDHQDMZBA87kTBkogNt+C BfNmz541bfp0kLeR1yEHZjKt2rxxs2bvgFwBu20Uz+WG7KLkYKxV8NzLroyplBDHQiCY5uBtM2fu nLPOPPOKKy6/8sorzjr7THYQMFWgP8HZhsuAIdDPggkglZUTDZ/MH2bMmDZt+lRe1dbXEXBw4cLF +Btt37xl/6Eq4msnlRqZO/UBCUwWjTqKetLXqZdTfFYyids9oPQfeb38hHNX6s8S7tfp3EeQr90b szfIsbGh7tDhQ/urDhB8c9iQIcOGJQ5dw4YN5SRRzhOdMm1qesh8Aj2dVMAoJZOGwEn6UVxov3tj v8eNYkNGzcPObSLOj2PBxNkvafxp6/wz5pYh/1n1Yxq5FDCUm7RfSp0GQ4P08Of8BQvYmc2qDrH8 OU/HxRO91GJW6ViTeMXVtliszVTIHVZBZPajJ5JW1JXAKIT7mKhYmvQ7imWywpzDnGB4lBzyL7sY NZ1BwGNCwxOe8Y3ipBNOwMlv8nHXeIpX+ZjymMwMaJGfN/vklFxlPyOnePVfQK5e523Cdx/LdM5g UKOoGtVPQBDUA34gl1x8CdgNvcgR1StXvsRDvD74l0a3wEqGPms7QNSMqsTzQVWNTgIEUhSWSK2e nmKNoRQFuWLliicef4IEWNPf8Y6rcJxIXBcKi9n2jhc49ku2WFYdPLDypZcIEM5BfVQNsODEDQJo qPPAE4IDt0tCsAZOcQNPrJQ/E1fRNBRaGhp5CKZi8D96nXAfQ4iU3Kd3z17l+FDgVKONkAK1QAfy Dp54Q5mUpj860BNOCm54ZdsDX8Y9TRYNqLMpJ+AORWm3ExbYEJP1HzBgxMjhwD/cn0mVLH3X1ODs DvbF1suWuw3rN7DAQEr3tAm+mVMZeV22iOx1aEk7pf3ID2kL/C3CoEU3fPyGa6+9BmBHbHV3uUkY MwGsy1OnTcHhnuhgoHPpZF4A7bjAvvTSqmQX41HkbWNJY9OidcIOyZBjwRleBUISSInkhN2UQ2Jc lS67/LLrP/TBK6688uyzz549Z87ESZNwNUGE6Eqjk1CzJ1xyAvnixYvYp8gOuaFDhmLqZoPvrNmz CF5JRQRDXLPmVc4GWrRoYUlB274D+xHhHqlfNpIvkkrGQkplCqDbvUccKe32b492OprYFwEx25F3 +K+8Fju8fay99m09ivIVoaT0tE5oaWxuOYi/Bb5eBW1Dhg7mCEsQchKrbuQoViHoiylTp02fMZ2h RFzC1Auc1YDEz0G3b/cqWFEWIMpqIbVS7XQaViNIirTdJHY0b6SPr0d8NBTaqCJSZhOYS9mI4UCl yVQqPU2Jh+2OUi3N9BdONcBuYispA+R1kCpm+ho5/RZeO+TD68Y2hrDZovhchFxFu0TeDooYkjxR RGWjMhl4mpTJUs/RZS4bm5Vqm5lTBa1gBPm8wyuHzzlp3oqMOVWcfALeRjWe4lX3BfIUr07x6r/z 96odeYcG1SCqUgnVqF6JNEQUUGGMGz8OQ9rjjz9++20/xyqcOF6PHAUoxPhKpOEE2/XEZFuA2brd HbO4sLG5EdwgEBei4enIqRmgcyziHOqO9Q5EhmfmzJnTcRPHME0JmzZtfOKJJ+fOmzNp4mQU/TNP P7Nh/cbE+t7SQtw6jL54QlAgutaVX2FK6PLAPYEkdOnm0quEHaL9+2Ol5bSPvqCWwYTpxQrem/96 4cEAijXkmavSOsvmDBv1ul4r7nKDBqPpZW20YpqAuTLZZfEsDLI0E4fdmjYCxhP/+L79CO2c+HkT S2TQQFx0zjvvPM4kmj1nLscSUSnrD3gaUEs4YABE0pM7a0UYggwnJNITnutxLxt5TrKPf/yGGz7+ sanTpi5YMJ9zkVasWCk6kbG0ehDIN3W1J8h0ij0TkEqf4ly0cvlKF1JMHJ0iDBK4iITCNi98CVxi AjOKvCHJ7KJwfs855+yP3fCxM844c+TwEf369U8CyQG2igt790oM8Cy8JAFAjnCYYz2ziMWns0N4 4dTpU2Ed2JR24TTVt18FmBtS4RWrLnhOEzpz1pw5hLasqaneuW1HCrQTT20IQfr9K/X5fs24m5rF 2z1GEmFLeZE2O3l49I/2eaxg9OjXpz0KuCMreJUdekfhmAdt4gWTjKwjhw/v30tsk6r+A/sPHoJH e59EnAqZEZWzj2LIkKETJkwk+B3jklkHfYcDCv2in3eAbIXZP7ODhYdwj/518UfkbTdFYsdaluAY GoE748ZXgbAVv/jOKPCxiEEcUjA38zpqT8/kSi44zqdmz+49fCIczg4Wcimx3kiS04z4JkC8w02x 4a3DUznPfvQUb2lTSh2h/EneuI+RG89lizZv7x3IwdWcgRAyQHqkmp7Swyfn86JUmPj1YvO6hCc2 Yw4NJ5+At1GNp3jVoex1+PAUr07xShn47/y9SpB3YD54oc07VEU+d1R1XGxKw8kBxbZnTxKHBHXO kv1gTG+DBlb0rQBSYhZLEBg6rASIVjBgYH/8btFDoFJiBWLzpi5gNyWgSgnmjbV48cLTZ8yYTmTo rVu2gZZSP+YBKMWxY8YOHDQAazp5qQBUxFE+5KrigMSqBBOrz8K1A+2o94ieD74VAetlwcPU0zfx Sk8QXHExDgmQDVVgSKND4OQNxMDdhXgSWIvdoYU2pRY3KaoYwspFMXrawDRNwqp20sgxzYTCC7Wy EESooUIVR2qE5gmlcYbIvPlzL7zwghkzZzD3wI/i3HPPATOCSAYPGoRvDBOFUaNG84vLuy4zBw8c IGaLvrxiVum0o8X9gZaE2nr9mkza/JOWwqurr34vCBXgwnyEfn/qyWdggxDEiQFFwlw4UN4riadR wvE9tUdefOHFRx9+ZOu2bcL6QF2BlmJ2EYyVtsAWMioItvt0ahIP6UhAh1522aUXXXQRfkPpqTaJ hTsNOlJYXJi4m69btxasRgAQcs2efdqsWafhlT5i5CjiXbKRdvDAwcS1ZLpFOYTG3rxpC8mmz5wK QCsrx+w6+bQZM2nkxo0bMBtTJKAs9TjJaJCUX64M+UlpN437Zwq8j6KppKtF57Ikvj7poHsthp2l p6IL0D86JJOK0zN23NqZ8qem9sj+A/uwazMNHjJ0GNb6xDEmPZeHShAhRJqjZwHfiATdxwUKVzAc 6TFNVQKtWglhLLhnmnsXlASpXnalhQTB5o0ej4+JsNiNEDYtmq/8W0gQkLp+9WWmxMIO8Wf4Vrhr 1kkXnaV4WIj42wHoYk5gayl3ucNKQ/5F2EGwVcfUVCL9bnAvZDd9oGppsHY/CCZzKHWmWuKjYXu5 8ISaN28ey0rsIM/Plf1EZ/mck/IEZrSWuE4+AW+jGk/xKmc4B0M6lP9TcpX99J3i1QmRh7fdGCxG K2eJNvZWAMFAYDGE1BMajVDDs+ecdtU7rjxt1mm4f4CewX0oy/SYuQR+aTBDV7HiP3/+/MWLFoMX MWVxkYwrWTJOd/dTFIpn/LgJza3NI4aNbGhseOzRx9lvNvO0GegxShs3djy2doAwlmjinzz22OOE WEkAVmoVpgoqIpkK0uAkIAahKMrYRpGAP9X9/KpxEyLLy5NIJuU98fgGzorXSZMsWtfXYQplXdtT ZtTK3FOpXArEoBLVeTpVpYlpXPIcaYJpC9FqrrNEwBf1d9qExP+BbZRXXHn5hRddcM1111x80cUc +blgwUIMsaNGjWFiwGwBoAJwSKFciic4tLwoOY2FeAvMhfRND+gvqcIUe1zMLXQWu/AwUHJABxLQ fYB+MD2m9Dt/eefKFS8Bb4RcJAPP4T7OcZWg20oOT9yzh4UIwk3ef9/9q19ZYzy77EzDPvKSnuCS IDuwhQhJyiU+cJV8S1BjS2uv8l6YsWfPnpP0KefgJKH/aEziFsX23Oeee/bFF5ZwpgxEjhgxHMeY UWPGTBg3sU+vPu2eIUx+ShJ5GDCgP6scLLzQ3gEDBxJiJw3C2MoEDuGsqz5yoPLA4VoC3rckITXb A3hTXQqwDP/djoxTO7iOKK/5eydv0xpf8/1NcwhN2+F4toM0cWpC5+hKYxDCnrbmlrZmDorH5bsQ Mlpa2VzYVLV/f82h/X0Q5Z4exVJSXJQEZpEkwCtrOVir2RjtUfPixaxqlKW2IrC4E1ReKfbRmyH5 Up/UkhEw+1Sh8q0w1O7jodIVjbfSHO8j/C6I988aGl1M9zGZhAa/MA52J2wWrhM/JbseYl1+fBxx JLAWXbCQSV1o/HqEyVzCHJJZbzHFL1gUI1f5DPhuk8PuHr3Z3sdHpwqU4/fHBKnJoAUPqHPOO+uh Bx/Odkpw1cQdXpH+BGaMon5VBHTR3uBq9iYrgad4leXAWyEex907p+Qqh3Vd9M4pXv0X5lUS2yTb vEDeoRW8ycGX6iriDJxz9lmYObE1lhQl8f7AqSBjtCuIEvyNHVk0jApk4ZgnaDvcOTROg4zRpipU VvnBuxMnJOGogezLVy4nggo4D+07fuwEDplHgwP3IW/lypV33XkXhkz2lqFENUXrgaA9W+0oFhcB aH7m4k/fureSVzqogD9R4j1K22ML2mRX5DF4E713545duByoxc0iblBPq5UDqqp3w1jr+LF2LuFC 1mdUkuQw9ySA8ssvv+zjn7jhnHPPmTnjtCFDh9AeJga0DniNyT9t1+vOmExcmdOKwJdE0cZT2d2Q OptmwWvQGSCDXAEpBMEBeYUFbKClO/bu2XffPfc//PDDpIeBNseGG6sB8E1EdnxRXnjhheXLVhBY ULaH6V3GakR0WSBrcaTSmKXIEK/gMInpNTeemiAkE9/3QYMHlpbRp614JuCBBMRc8+qau+688647 74YbeJsgY4TBZp/hcHb4Dh9RWPw6/2ZpQ0DB3EgT8ka9+NBv3LBp27btdMGZZ52FNBJt8MD+/fQh pm/mPak1+6jfiRbvBEIHb44awRMuZcdZ4qWSTJxe59OlF4qHX8YSQQLpmU0wAWBS0pJMrlJrdzLR Qsb4E7N+AttxA2GuhedJa3MDs07AeVMa6x0I3m4CL2hlD8D6tcnylMM8ag+kGCIa4x1WR1xwnacV j5TU9qNnvM/CPp9kkT0FapMOzG3f8etozRbCEz4OuF7QUb3Ke27atAXK6T4ECWLifFzzKglxTqqr N9ROXYYYcoHLweX4JY0CH9NOLdYWaEruRd7QFsPBkvlTw7ZtdA7JjYJqLU6zlfDYzkEaiOezyUZk xrhfGAtn3S3Z/1pUsnr16hhWktSdyywnMGP6hUmu7tQeVZ9AAo5Z7wlv8nHXeIpX+azrrHdO8eoU r96Kz8XbTq5ykbdnWCocNiYrKDGcVCcs/LKRa+ZpM9njd/PNNxMQEA2X7scCJCbQVr8ObtDZ3IO5 0YUEAqMWcDbuyPgBa5pFA7EI3rtPkn7VyytXvbQKuyOL29u3bmcb3ID+A5uamyjnldWrv/GNf+P4 CUz10CYO4FKpi7/VxNrqhNduKRMx8BalKPhz9TyFgEUEGuc5laomyctblP2hqipWuokWgl+L0FBX k6xtWC0bikpsIbJMbFlHI4tr0BWRy1gVc6AHcScXnjlXXHnFotMXO53AwkqRUUtqPnwd1jGX/cV5 7QBfwvklWK0Fgtt9A0yjmg/kJGAKMkiQNcwn8C7FWMw0OC9pyZIlr6x5hQaJOaQ8xENDPpZH8IQw iFc+FOsEgBa16DYQcI2qY5KQxW2CG+qyQ5PY8EdPOwoeUjJSxDZTnJgJpPPQQw/fd++9Dz700H33 3kdMcUBb6g+TnggDTi0sIAYI/ktIas5H0LrS6HuJDxKySrjGNa+8soEDnurr2TucbNycOLnqwIHd O3ekp0zShcyU2nGy9CQtSu28TndSBrc/TnvttWGll3K73b3dO9wOac9Af+rKQRD8ZP2koBUfrqJC QHVbUyOvQHsFjQ1spQVrJp4liDCSunfn1ua66sGDh1YfqVu6dPmuXTsJ2cN60c4dO1a/vJpT5Xfv 2eMCjj1ojRIvfHSYSLRhf8LmLRhVKuIr4c3Rxgbxr7nj2CLl3OEZJTibjW+xyZAWKuLbgp2eWT1f DC4GI7kghg4ClztOXZtSeMzr+FL2vNHA7PxB4SG9NzaHBNRoBBgZoqwG2ZbPr8RbUZCtfPrEexKQ nj/1TvE5xGDmwIrPNWbMmOS0qV27tNM7AEnmcaQyM0c4u/4z0p+ojCeqnGO24oRTfvJrPMWrfJ53 1q2neHWKV9nv24mShxNVzkn7enRl8w4QkNWy6i20hagaezAbEFETLNPjKp0A94KC1N90CC7IQCU9 N3iOVwlqBossscCxc3Pz6quvYp6kQHQSv+gqnhMKY+OmDUBlTHy49BIcY9/evcQRY8tmog5bC5cv W0YAQZzCVYdqXN1IuELniXrRrEb5FfnZEHW2oBAEj0PL2HGjAYOcCtmrd2JRw5dDh1GITGJ31zdu 2rjR42YoRFgQpjVVZlAi09DlseodOFvlbXslm2Qq3cAu7nvDSIm/+9SpUxJ7W1trz9KeLW3tsYQF B1mkkgK8RE+L8mkv4Hvrlq26xATyFvQ7eRCRBHSADNcKbIgECz4ipWSLmM0bdj7bbieKI8XWwS7n KsF/EsgcWSfxMSWwOTZTNuqzlG6ETWC3KEfaxDRkB8fs3r1nw7oNTP+WLV2G4xMOQgbwtl1mqW+o x7GbrYcjR49kcSZ/mAmDqEtfBTArtRAQk8KTED0tLUROnDl9Rk11NRuC2bsH6exjOGrqbrf9ph4i uRsl5fbrr3an8KMO4in7jl7cwhhoZk5YW1fPXomepSVN9U1lJT2HDBo1dvQkfNMr+lXUNdSCtlP3 mmJYXN/UUnW4uurg3uLCFiLil/XsRdChF154/vnnnn/g/geXLl0G7DZmPy0NEZXVibAdRZz2HQkY aK4wOD22H2MSaPeFBObzM74h8p+8CpI3Cj8Xi05uoEzDzdcwBglpwpBn1YtPxM6du/x6UAjToSRg ecZ2bufaFi5KNshJ0CwEp3Ya4rgO8SOZBIQtP6bWtCVmBdxbQrSXGyVW6bXjgo3WGG132YfEeNmx xQUykEy+dUwnYhyRF7JprB+xN3rFQDhpGXNF+ehIPGkEnPwmH3eNp3j1RqUi8xls/8K/0RKOu7Pe RhlPydUblYpfH7kqnDJlSpZ6NFxWZ+TMJNQlPETDgU7YT4ktCYz46U//5syZp+Ege8utt+CfjW0b ODt8xDB0ZOKIUlICCkTNmBHFI7JR4XmKe2KWrq89Ul2Lqwk7HQ8eqCJ2AS6rifW0qem69193wfkX 4nOCDfKmm2/8zre/N3TYMKACeTF2Qn+KkZKg4JKnUuQePZq4aqcunhqh+aV2SeJtcvjImFF4AxOV BEdRTsvDIsUyNwgPPpCYGG04l997373/9s1vqfv1EzVggmo7gUepCwq10DpaDXZ3XxpvE+h+NJK0 6FPgzpWuDyR8kLHQY0ruzzrrzE988uPz5s9joyeWsI2bNhELb+aMmYn3zushnLiHLJrwWUm4+667 H3/scbafptGrky1xImMrJXFMG4QssE6LIK888C8AuiCJ53JPcCP29QvFW5sjNPFAIi7aJfRJkFRN jdwWzbhAQWe5ImH5TpPcwEcyHrqC4W45DeQUqClRgKXcitHt9xQXYs5sT2maLDRkfeaSSy6ePGWy kR8hA3+GHsU9mNgUFxYDdFlakR6bhry9tOqlZ555dskL7HsrwE8gsVjOnNlwpO6n//Gju+6843BN HfZhOBFgtH00JdxJ+jT5U06lf/j/6W0C2tsTHT00J8ZXmil1X05kp45MbAUtailsayk777zLP/zR 64ePGrh23YZt23bs3bf7qaefOLC/EvxPHMzSsp5MVpihjBrcZ/GsGeedf2HvgSOefXH5U089vWED E9paqhB3JoKUXsnkLOU5zHcPovCaX/oRM63LVuQ1wo8TrcjlzMcrRNFG23x/A9Obkoc+SZej6hAC 4j8yambOnDl37mxm2vPmznv2uWf+v7/6a86JxDncHuEClDNb5heSFGwnrt5ryY5tGEo7udxWQXOc SdKiQNhidESUNBq/aaMTPMtUAu1fJRDKnaX4keGtDeReYgzaGEidVxTFW4YwfiYibCZydofSwUUW aEAgYyaT8/kNJgfDg8/2QmR0F3s2mfd8MDlWNrrAqs14SXqxzuDbBx988Pbbb/frmnNRMh+3HBqy BLB7h69Qfkaouvbaay+77DJfMXellkceeSRLebbJ1NJhK+isNWvWZGskGYWz1pdTqaWdccYZ3HBS RHCbh8Q1IgvldNjG008/3SwWSAn85jA5SKXYnCbDxo9//OMoF7M/99xzt912G+3NEhCdhVRw5bOL 9FzRWTgjMTrsQavuQjwgmHaRMr9GuErb4WFIglXkNLlDUqnRTslmh3jaG6KVk9HWZd92RjndAcc6 K0eRzvIkOEb5cBvmdFOuTHbppZci8EyGYdQDDzyAKNKo7IiQvVTKuSLRlRBAV9Kh2f7KNhk6YW9+ G+VYTpeZkREBJSEDlA8x8MEvZzYLZCjnOeXQdvpl7dq1hhE7pngE8Z31cr40dkh5ZyMim/3kZMzn VdBwcgh4o03uAHlLKC0JilUhUbToAc0tsCbUxu///u9xkDVhQB575LFvfevbaClU5/ARw4mNTeRd U5pFiw4lCOBQNjgDgCwR6IP7D+K6jLM1Og4bI+qTBGCjAf37TZwy6Zprrk0VcMFLK1/6n3/xv8hF GBKxGuQZBiGNI56ozNT8XQ7YxIRWhZY7eBB96VZLEqBK0+2PqNh6Phljx47r07vXhRdfgHcsFtOD VQcnTpyYGJ6LihYtWkTgCwBZ5b79X/3qV2+88UYaEkiaegWFtChBaWlEYR5CSRKacPDgxC07NRDy iiEhqWIagYsYVKOs6lnFTzLycko2MA9f+b379mF9J8D51ddeTTBjPAe4crrJ8QY/li9ffscvfolf AZgGFI2nsrCYS+zrjUCBP50qiLwpFtjNN0LTu2CdlDwXB8ckIUAGJSRLHEOGUDudCDhzFmSjyK6r D5egR+StJFijmMa6hCwiZnvfHbG66qYNbBSmRGlOA+yCAM2klJkmE9Ywo7v6mveee+65UEtpznAA OhyMCkkEY4Et1Gi/JLQRaaS1YMu2zT+//edPP/UM6QF85J02dRobLtnNcNcv77jpZzeu27CxBRjN Rssk6Eiy7zH5XAbsToeNHzgANv85fFI/79RNPHHtTjaE0uLkceqnkgYF4oTXOnojCSNTUjyUiJe9 ew8bOe7Kd1/74Y99cMjQQQf2V23csI3IQlu2br7n3nuWLn2hf9/ebO9tLe5RUtqzvEfhkL6ls6dN vPjSy0aOn7FkxapHH32MFSS6wzUEetxJI+11HOkX5L1TNbiBzdsoIk6STab85IDp7Nfce9WYYuYU jhunWEl8wIICzqtiyzWuF+iqSy+/bMjgQaNGjmGYM+GC/wzbz3zm0/fcc9/w4cMsByFkWHF5JBCF yFcIw1eNhiT7pFNzuPIjkVx+TKydt3BAkkjPr5uhhemObmrnT0Py+1UROpsx6d+ji1dkd1BosBCF K/NZ/ScT/P5QvokVe+lxsPAKBexYji9wjubI/ilb4uMcGRcvXvzjH/84eiRugJIf+chHHBGRkfH7 wx/+MLBFJAaR/PZv/zZZcgj4yU9+AkrLLzye/Ou//uu//Mu/yKV4CND5u7/7OzouJyPl/87v/A51 5TeZWqirw1aAtKIjyEhjSYwUdcirdevWkZi3WV7RZLLccMMNoqhsRgr/8z//cx5qloJXLM920V5e ZZsc2XmOZDpLoYF/+7d/y8EU+Z1F87nyy4eHX/va16KzANPQDOr62Mc+dkzxoMkwlpT54kE5P/rR j3j70Y9+NFspuC3b5A7linphGtzOZkdif/nLX/LqPe95D6o8JyNNBrxCiYLk2+zQCBrsbkU0X7AV afmc7az/kV4dCklncoWoI4o5As9ckfTR0Q4lxAAJyS/81ltv/dKXvuTzHFKhE/Z2SA8Mzxm80PDl L3+5w6EHx5gW5vDKoYdlMKecX/ziFzCZIYYKfvNfjw57pzufnV9hxi7k6teT8tdHXkjlJVRCSE98 LLhRzdAYzZn79u19/vkXnnjiCR7WVNcsX75s29YtGL85Ad6Qf6AHtZ2ADN2jDYnCBUYJ/k51eXoy eWltbQP2IO2FGCUxg42bOJ7sO3fuQMSBq2DlBQvnUQUgzxgFAkoKRyXjwss/AoOMGjVy/Pixo0eN AjoY4kAQyYWSBvZfcOG5V1/7btxL1qx5hejOs06bM3nSlPdd934kWPjoJsKm1ma2jfL1JHg5tUTz lW/xK3qay4Vs/hS1CFh5jq717G5aHUIgIgzGUqzKmMuRzJ+cEHTjjTf/509/yg0txbu9snJfGqLx dUbv+NKlUBUjJUwYBv1pOe1mMEGS4EMmxPeC7IHCpUEsG5gpqyr80HBFUThvnHnmmR/56Ic/8YmP M/JpZjN247RTcrCvTctid/4U44YpPSYh0in6T3llK1+jTfJolNjFvvBXdGgXyPCkCW0FzGGIgpJE g04dnbnoaIQBbcHRqskJRDhBb9zIx6u9C1qT2deAfgMr9yTCRiHGwWTj5uNPPL5t167L3vHOGz7x qamTpkAKWLWNLZcEFEmHFPA5cb1OgHgaWyTZD5uGAkwc9mlY8hct5C/ROn+nT2lLGgmntZi/UoiW 2Pj7lPcaOWLkxCkTxk8eUlO/7fEn7jq4fzfLKmPGDJk8dew73n3Fe695z6ABA8DpYPWmuiPNtTWN tY17DtS9uGr9bbf//JWVL56+YN47rrpqwYIFqEn9tmG7DmPOalxe4NduipUN50gKCc9l9WtcfT28 DlHMyo9zKljH0pZ+zAzJ8y84/yv/8JUf/viHN918049//JO/+qv/7+ILL54ze96AQf1KSkuIV57E Q+xVhs/JGWeczni2arqSIYaMUYJO/66EUIWdTufSQXQlqF2HaSVKevgz3U6dXMJf8bETYE37NJbC nTqS3skhhcfSTbIGkU4jlUa9qqRNiXVeHSzSQUuGUy9QTBpIHMmcjYQPmx/eKCFnvPs2xkL+2/jI YDlD2Xv9zd/8TYcZA3Zj4b744ouTCPfTp2NxAOKAkr/+9a8DCzokgDIBJaDM7AW4zGqNyAhc+MY3 vsGfkLFw4UKqoFhMieBIXgEou2gylsJohTCoQ3p83tmrQEg5kCifyTAkkFwwOb+NsAtsBD38cmGn lADsl8A1ehlkBkJixHEBFmEmaA8La4cE8BCGRzMtrTu9fNxN7oyNx5SrfA7zwWSGQAO/8pWvhNaQ frAsfU3/xoLDMQWbBLGmmsOr4EnQgMahs+D2n/zJn4Rc8fChhx5CrkIas72M4IHg6Yjf+q3fYmbF RTf96Z/+KV8VEHN2jYWS6V9ax1tGBMm4LrroIobVddddRy93wauseMTQyw4N2kiNwm4mJ9BM1Yw+ xqBDDyKBOt35CFAOeVl1iRWSYzK5O718fJ+dzgTyJNTYHV7lyGcXn52czjrhGds9hoPLgWCyT2wS shKwSTWmtWzr1i3f/Ld/+8pX/u573/3uY48+lsQ/Ky7GL3bTxs1bN2OP2wq4Qenyq5VRszQqiic4 O6Ip0UuAxZKy4iO1NQB7YDEne4+fMD49zqbciG9YwamLjJz4fc4556Ag8QzRQqyHBj9QxYE4qaW5 BX/WffuIQZHgmbrE+otrbmIYQyVDDDY1YBGULl606PChQ9U11eStqa2GNhZuCIDIuEXroyxRpGU9 SqtrDi158UWASRY4woFQn+pgqOLD7Tq+OliECuVCHIdESKfQUJ5rgPSVDKchxLmjTBV6GgZmexIt 7uhh79mxAf2pIm8lfAd2RCz7KTf6MxuhXtE2xYpHo4oA0GJlQZIJzCLB3mdw8GveApx8tHDRgoUL F5xx5umXXHoRywWJ5TeT8Sh0brcNxPBQlAPHB1bjoaCHG4gBq9Fst7faXm6CWlGOkMV7zbHSLNBv h5U9y0BM7BDASLxj53a26q5YvtzNvvsP7OezpaXfTQgJnsOInV7VNYcPVB30nsKT9Pv3YzwmbOLL q1cvPuvM3/2D3zvv3PN6lfVMgv21tQK+223ZKdBu/5dmT/sA1oC2Uwze/ps8SwPVpPOEBJLT+IIG Tp9KnUB69igZPLDv4BED+w7sh9weqNy3atmyxx665+Xlz61a8dzypc83NdafdfqiWTNmMN2ob8Rh hv2XycBsbmw5Utu0dtPO+x58dOlzzyyad9oHP/A+VAhA1rkohcMiAXfIpyPd9sZDRFGRsNcClwt8 s3KoAJMSAhhuWJIYuQw6pj2oq//5P//iX/71azfe/LOf/udPP/eZz11x2RUTxk8EYRNnBl+ygsLW 4sIePUvLS0vKcPFaumQJp8SjUNFAnqkOGeJsxZjaJZ7nLMJqnHZOS08xWeLb4mdHcdK5K6b9OqVA J7MCfT+yiJmSjXwq+JZXJCCZ6NkJP7ySCVbheJF7ou1YLHJwOb5MpnwGD0m5cMEC88aVr07UYX6I chLn/InNDGjLBe4J14KcjDpFgFRAimpuaqSBgEURALDDpuVUx35rS85e1Ngh5ZqQgUfgCX1s+JPE IBt+ReGdNRliqILVSGvsosmd8aprLkWX2UZIpdWyIniV30YS8BB7ua+CdX/2Z39GRjB0YHHay6xD q3aHtm3Jo6joLEuzo7vu5S6afEzx6LBbu1mjeaWcG7oV4rGmZ/uRYUt7aUv+AkgOz7MdlC9pOd2X bTJMo3C4jdE35IoaqReRFs7myBXTA/qXLADoGEpgX+TcDTBx/eAHP2AIvPe976Ur9f3gonAgOz3+ iU98As+xzpicFY/soMgOXocecJ+qAzTLLodezACjyUFbthwXoHJ8h0x53F+Pt13Gzr4eMY66KdhZ 8evml/b4eNUOL6xPMcoWpG6wVQGShM5iTf0BgLYvPL8E02y/Af3Z14U2wSbNySPr12NDBKVsUbFh K0IXsv8PKUEloy/RXqAfwO4VV1xx3vnno0XZr4nDNqFR+g/oV967nGFNdBGidHjIPFE+IHJqMk2d smv3LoxblEYFICcmAATkwvN12vSpH/nYR6+59loMnGy2W/nSynXr11EdQR5SarZgHZvFeSozZx0+ VI09G+1OBAwoqejdt6mlEZ9vJpEobMij1WwhBRctW7aEYHkVffvCBC1YImbZJdoT5IEAyC74Rqn7 OSCXq9U8VO9GCVGIb7XgBrd18Ej3p1bCZ464Z4qhvc2q7TXSlPUowxEFJwXMptWHOYixFjImT548 Z85cAl0DtkgvnYGh7VwvXuljnWNCzo75aLIw16qJFAkDMT+CIMaMHTtx0gRjhgSqcJ5g1dnvlGyx Cf4GFjdZsuuutvayyy7Fl2nevLmKUDjZU6DUUmwAblGXLkCyTmQjigLJEutw04bNu7bvuvee++++ 657nnnkOUUSKNMdSODNArMIJsmtL9rmCYO+5+x5CJSZzsHRLrtgLKMknksg8K15aOX7SpD/50p98 5EPXjxg6lKYArJPjM1m1ydEYR+cw4GzJbr8SyJ0ktUsRtsReXtDc2IA5VleZQsZbK7OqwuKmtuKi HuVFJT22bt782CMPrlj24qaNG4ifyIRz1KgRIOL6xiTmJMxuYE7amASjr61rXLd+0y+Jrnj7rT3a Gq664tJFixbiMyNIlRK4BPPtoMCCPNEX34+X8sYVsM+bkEMF3iUFVxVSF8mrf+d3fvurX/2/P/nP H2MY+9M//bMPf+gjC+cvYv7cWtCSzD8KW0uKcDHjzKJehQXFm7ZsvOuuO7///e+xnnvffQ8kawcp u6jIgSMxkKFXjN0N5sb5m0Yh53S08DqLqkHhnoIpFKaEMJMbikcjQno4V+KeZtRFbeF8ByjfgCpO nqPrgoFKr0s33it+kmr6WOLzA+KXxGkhf8Ku+fPmffbzn8mTmvYH8Ynu0PqSkyvr1BEZox+ziYVK WVt1vAUBADiAUzp/Z8vpjMgOnwMvuAArBCTNfgFMDMjgN4vYopBI3J0mZ6t+Q7zKZqSxeKJDUtZ8 2P3GgoHgFfZOnBakISgHCILAsGh2XVrXndVF3uNu8nF3a06NztCYv8UeAAy6PkGKukl591mtQKIZ 6Sy5nZNXlw/Ad46081Gig3TkyMoVHXT11VdnUbLzzyzx0WRXaXDOzie4w50JJsupUZlX/nMuQD/1 kiBnQ0WH5dhG6O8mk/N59V8jY04r3vyIeEs/O0eP/zhqp1E4REuBh0Ixq1G81En+ovOIkMxWS/wy v/IPX/7cb312/PjxWqcSmMIJe3v3cUQ8yHjVyy9jugArg1ATv5EFC5AbTLOg6jMXn3H6GYsxluPr SzwHaidCM6q5phpn5VogexLpti0xtIONfvM3f/MD738/ptarrroSt7D58+dddvml7//A+7C8Lpi/ EEPagvkLrrzyimuvu/r3/+D3/vhLf/z3//CVb3/r2x/60PVHjlRzhOFZZ56BYftTn/okDtTYOB98 8OGvfOXLuMr8v3/851tuutX9WwxlkAfuLmzRfOyxJ1He/z97bwFo53Hc7YuZmZmZLbSMkmWO7TCn bTjp97Whpum/bb40nIahbZrEThwHHCdmZplBzJLFzIxX+j/7PveO35xz7tWVrDixoxPl+j3vWZid nd39zezsrOiEDhZw+CzyK8B8bl7TBNZyiDeN4NtC+Ml+dWF2MIh7eAhIKsjmK4Cb37nPkq/ZIcK6 nLwkojmAu37dBjjq7Ni1Y+XKlcuXL7vn3vsIq0e9cJgTgUOGDpo27ULOkhDB2v0BcYDFSoMfIY4v o+shRvCdJy+o5SdgysYNG3bu5GJy4Os2OEEzxGeiHO2jBS21LmuRM+EAELAGLMSF8JzZ/X//7wsY jfAIooIwaQsZZXsQLGoMEaUL9F+3FfyKGxLe3lDEbgo6Hna0++99AL2LWIRbt20Fb9Hd7vElzteo tWnzhhUvrYBIMbdc0k0ZeQCsY/l++NFHcBB+3/v+9i3Xvalz67ZcbANpKeBJ+pfukswwdXJ3kYta ulMzy43c6VtyMyEBWDRzP2Evh2MIADPucK1XtyHOI1u27X5p7XqANUxt3qxZw0bsaRwvO3qIf1s3 b9i7e2fnTh0aNah79PAhikpKAqd1OTF5iLMHBw8cObpy3bp777/nxut/vHvbuosumMqlLbQUzmjF D+9tvjrY/SgwlKaDhHOCH3meKWxA4CPo3iirfO3aret1b7ruP7/1n7/+za9uu/3Wm2+++Zvf/NaH PvThKZPPJVZm7brsJZw4dpyiajSs3wiHdLa49u3fO3fe7LvuvvMT//iP7333+/7lX/6/r371a0Ri gWNbafau3ejVRhaC/7rKxM4MNeajWAKRk6tZ9mEUG8bEWcheQ1wNY4qKhfpOGrpEzY0HUnrUko+7 ZEJweKL7map1uiysYv8qgHXIhkVBrSUrqPxKds9e82HGoxwHCIVnR0QO9urdq3OX8gOOxWthDMMq lsn4Ke85WkVGRJ25FLRRGdDUB9rSTomAPJEiA0yMJSkXMZR0HLfG0wDBp00qYDFstNXhc0EaD2IW H6QzGboHkhNnWEuWf9qU/9kzwjd8k2igWhy7GXo8xynVyvj5J6W8gNtVi2LVGkJ+CJiy+NBCvCx5 wjjPAQA6Q4+NgpKV8jI/9KoQRRqIwlDF+DLvn5TJfyGSXEDGX3iTX45LUNBDLBX5bVAWEk2JGmtZ LfKWb34B4nC9OYOtf9+Bb7zuuje/9U34OXhUi0UF5M2CxzFBVjPWIRZyCmRt41fEFxCDvfZo2dHd O3cDIgFigBLM25wXO3Tw8O6de7k7kCBxT858csnSpRzZZDncvGXTmHGjwdO//vWvfvDDH/zkZz9h m+/v/vbv2EXq3LXz7j279u7fM3TY0Pe8531vfcvbPvzBD7/9be+YfsklX/nqV97y1rew8G3ctOnO O+/Cz2Tzxs3r123gPOSsWXO//vVv/O7m3wHFbvrlLzlzSSyzRx59ZMH8ebfe9vuVK1ayXkKtmANe iVZ5CEUl9pFlHSzSc5RmAko8rRXGzjDTBhYXjoe4iGzyX7HuL5i/ANZRNo7EOBNwyeKixQvvu/8e VOR//9d//5d//pf/9+9f+PH//BgbgAZsPpTTrHmzocOGXHX1lRgguYWem0RReAYPHsJmGQggXDvy NQb+zkuF0Mcmm5hnrJsPP/Qo98lzw9HMxx+HQtqo82ukF52YPprpy+CDFkHhOMmgH9re8a531Ktb f9/BvXj2siuSOd6kUHeWL+sUS1gdrrpRL+VQPngL4IX4Zafy+7do1aJRk8YDBw/CwU8vpmeefu6R hx9dvGAxwgl7OZYKCQlI1TiOcI4fPw6BwZ8lbK4CKf6qEDJ7/uY3v1m8dOnlV171t+/72z49e9E9 J44DYTMOlLt9Z2ZjIXgGxbPtjzQjVnieAL7L28477P1oJRwbbtOyfetmbWvWaUYswX79xrZq2bZ+ rZr16tRiqwGdgk2Og8QD4ip47hmt37BZo8a1QI/HD5fVAO2dwG0cqg8fYesAyauxfc+B+YuX337r 77dv3nDe1CkTJ05k1oZpAms9duyd6CxolNX+FO/5qkc1Ixq3533796EGvvWtb73pVzfde9+9//vj H3/sIx+bPu0SfNOTNnH82KEjOEYfq8OcgTrGDkTdBuvWr/3dLb/7/Of/HYv4O9/xrre8+W3veue7 v/e974NaksQ2a7Zq9SocDLgF6cmnngR5e6IDHjLPeJZazVaZ0d+MJjCT8BLJISQLBzdpILZwD5Zo 4yclI5GvmAaGDBmCYyXjOs5eK1qiamosv0trP3dpESl+L9nJqGdLHIxWUSE95KULPivUSOcKtwXc G4QqNGEQPxOjx0Dhp9tHGZ/rzJo1+5ab/1DFKhs/5WeGkukFHAURGFyA8wuSyfJ2voLS/Kn4BNgp reXW4m54ScqtpTJjYThynN5SWv1cbO5DapycO6U2yjdbSo2sg/HBv4sPX7VfVo288/wvyStkL0qu jGPVb3Kx8Eiqn+qIomkkFfMtXQm6xVjL2VyGrX4mp/Q5PeIlAP2NXQWq9lPMbSU5D4tPOpQknr6D IRi5PQ6rgb8kqVZRhbpojflBUZI/Dgp1uZIfCkEY5DAazknVhiikmk0urvQ1lLGA+L9AypNDbf7D KiLCEDkJYlxC3Ev1TR5c4l/ZqiVLXSvQxK496XAkSbitEi/tLGMKw5dZQDHIHQES129UHyiEsZDD CixFnM5kiE6eNPn+++5/cdaLbdu3wdblXjBLE3iK+CSEFqEojmx+6Ytf7tWzJ1ZFwu1xrUnXLgRU wZH7WPNmzQG4G7dsRBZBNY0bNt6xM91m37lTlwTX2LU/UYMVkvW3S5euf/j978eMG0P0lQULFjz5 5JMEMwE+ooBiM2Z7Hp/vn99wI1fn0BAXyJUvrWSc4CK+bv063mijhUUBvn3mrzZjssBD6HfRLV+S s+3sQG+RxdErk+0Is4tyLJZnPGeIcHfffQ9g/ycc9Y6duzhQwf2aAEcumCTsMccaqR3agKBME+QV LqD2HCvbQmx1vLEnTp5AqRs3bOQnSkO1AKOz/wBhBcMyT09Qxcu89VrxoFJmmaVLlrVu1Ypw0ZQG htBIzF+BhfLDXzEKfy1HbkRdJFAzMQ0lcH/kuLHjYNyhsoNr16yhp9X31BbMK/hWbmVauM0kMHnk CGGh2ZchQXKcwAckHQ4uw1MBUy3ZAVvIJ01AupA0imMjB6iNo8HRY0e4Eapnz14oZpi37SCr1gDM Xx1gAKCw+uKLLrrkyqt69OmNF/OjM58gSgtYk6am/kz/yF6urgm3Myt46uF0B6XfyrmRsaXGCQLM H21Wo1v3fiNGjrnsyku6dG67eNHshXOeJLom4Pt4GeKELKajopxYQACQ3tqJumPorYg7Tiw8YZjG BI8PCy/xAF+wZM3RX9805dwp4yZMIZbI4zOfYBRgCYbbyptmWj7wWc9pWeeQp8kMNB7ArP379Zs4 aWKnzp327N2Du//IESPZk0kCXOP4kWPJDyTNFZi4ueOnRq39B9N9jQzJxYsWs8NAoJU5s+eAl2EO JQtk27VvR0V0Itg3BTvauZOXUMIGEsZiMDT2bPrLBOBvQLDeR3aKGhEzAB9P0PIy89FqLtmBnrVb 8xPYGhzMcSsyUiMJwMeG4oES5Vb/IoXfIea4Vv4dsJlWUGPGpTPe+MbrZj4+86c/+Snj1Og9ijoU QrOlOTT4Vd2YMt2ZQbWGBmiLwVj1Q0wdxcmqXtcjo8lOw6gcc0K5BFdJaDHWLKC8CgtiQcElsU6k qcKL2m5yOi35gUjMtBjmC2y0VTC5Mrbr1F79T3Ws4EG5BwSjcGZyaMbMXAy8WNHwSM432bZUXV1B SBwKx5Jd0oe4uIGUj96Cz7Rmb88+Vp8PpoQ8yC6Qq4CqJUsD6NN3BfphyaorUzWr6GW8sfNRBUsK ZJ7JVnFSS79a02nwh1zKOTMYhPEX5xkde07pc0qCnS/5NZTxpJ1VTY79KZpciLwlJUCS603Q5+QV 6JzlJ4UCSBd3p018VpRtW7cBVgAirK9AwNbZVi/J0t2QQO96yWeURYjtct4T/47S3Ed+9PFHAevn X3gBCw/ZAcEcsTqQLH9lnKHCMYAlj+WQQ1d33nnnG9/0xhkzZlD+ocMHj5bVoFxgEwsrIQ7r1kpL HbXc+ofbXnzxhb97//tHjxrN1wR9yo4vXbrk4Yce5LKe6396w5gxo0CKK1euYtVn7QFaQWeFMbXW 2tXr2nVs16tXDxATQBsImAx7WXP4FMwLfLXSQJksqDrIggY0fsM63RXyi0cer4tEXewF7m4vuE7D OjQB/NS5V4j45GBEekngSIfA/HBEJosf62KtoV4gDl72IFawS5OmTXahbWzfDpEY47FcGp0t8KvZ RcA+2xBbLYaWVD7goVGjAF3D0WpAYGvWroE2gSnpg115jS5kzAIpKs9VyaYW4M6PfvAjSGALfsG8 BXfddTdMMGaLGCuUnHAV4L1H33CIb9IY9eM4F8UPHzGsVctWODvR15s2bMrulqzheYMM1SXliup2 7Nj+xBNPcAfR+AnnXHnV5f36DAD4oiKi21CsaqemX/taynWS0ReFBED9CRMmfKZ37w7/+78I6s6d u9n7wJE5oc+yFNuk5vFk7k6KoNftZOEHUxRBeirjCyTpf8hPeGvjHX/u+Re+531vatokeYaMGzd2 +9b1Ly3DfHisds1j+/dxUOFwgt1Hj2zdybbSvtq16uMtjbWbUr3nNNWRuiPzTj5Wa0fZ8dnzFiPt m9atmn7ZGy6+6AKaI/g2ZIdjn49eOmJQtyaycwsHiaj4gQ+8n3jzYGHcRV6eHGocP3Yc+F6DkPx1 auFmzYHCY7v37F6ymP2AZbhywXBOuKJms95QKXCzRcMEuGNWUa4AE7gVcc8R0AEyCFU0eMhgDg3T ks2bOTG5U48pm2ZsRAphvACjtQvw7Fd6B/kkcCQpGePqddSissQD+xspSGHb1uitUEs5KBuQB5EU S3Y7Xe0ODrhNpxBq7VYa4RJGhOnTpp1/3vkb1m+AKpB37Ao6ij1fTi60lD59epML21umGydPGEVL KH9KHwdaAabE+EfJVa/rZCwZRrq49pLOpvlFoZiA6jShJOX5jCV382NSKobRJaPL5QusokYCj1Bg 3uBdzYzFLQUJVaHMFPshVEf/iXkYUyi4lq8wx5OpOKZjZsbWW9DdFHtShhQTH0H0ECE+lMxfoF7x /knJLoY83IewDQPWT4o+S5ZwqmTTcTCBtsN2j7oygUCGQRgLqiBZFcJcIB6kRA+ByZRJUbSIBz8w Nq/m5TMadLw68l+FJFedPd+t1EXDTzqUKivwryFjQdv/QppcONELaJxJXV2kO94LkuJXMGUrrJ2t CcHB7Y/NWJ8Ac3zatm/brUcXnJ2xgGfXW4KKG3OxJZaynj17sBHMbi8rE6sOSyNuDwQDJGLJtIun T5405aqrrsS1gEtP2rRtwygCgrPIAs8GDR5wzXVvGDhgACZCIiEcY0Of0NYnai5fupTIKh/58Ef+ 3+c///VvfP3WW/+Ac/Bvf3vz44/PBGcvWrJw7oK59z9w33/993994h8/xX3azFnz5s377ne//8IL LxqKhI8+wXwFiuHdCujCh50znLNfnL1s6QoAmbauPDdEftGRLsN8FaaQUpAqPuYjetNjh0+s3OXw qEKrMQvZNa6LFSq2pMtvXEeLYZccY15m4EtXCGn2s0zS8zUhirZtAOW0FzdchiiTPugHv52d4BcC PqbDmolOPnardfmGcsICnYfRoR5k3KhJmGl6asDA/n379Z4wcXyPHt2hmoy2VFREdiFdjAFxfJ6Z Uq6k8Ze8dMecuXM++0+f+8wn/+n73/sBdn2aTBotheAYg39TsidZmVWBj/TjFVde8YX/+MLXv/HV r3zty1/9+lc+8YlPfPCDH/z4xz92/gXnEfhy9ao17BIQ7xbRogQd8SlBvnEo+MZf/PLrX/3G3Xff tWzpUo7VPv30M4TIpBVJ/6k4GxfGTvmmWzDsnTlz5t13373/wME3veVtV15+Ved27enCY0eP1MS9 OYs3SNRvjM/J1zt9Mo9vOFOhxsii9JeEGbKvW69G7+5tO7RrwaLy2GOP7d6zb+yYSXTpvv27D+w/ sHvnvlp16nfs1B63qWVLl9COshO1YTS7QFnIwvRJbudJkjhyeYCr5lEU9h08Qhzwx2c+ffvvf9Wk YZ1LZ0wfP/4c4KnCby4+4QgBl+AtbcxOoLb71Kc+edVVV7dr14EexmPbf+wPoF3UqlGH9qUrPJYs +vmNN3zuX/4Zzn/wQx/63Oc+9/MbfvHggw+jUcM6hjwfA5WERldObVkZHiPDhw/75Gc+8dGPfZhT HFdedSV6XcfOHWEgMVvIIoqF4VTkJU0C8YYNGxFBRYiscxfPyAws9XguVRiRnfdQgr7BkEh7U8nD Dd3pKCOFX7Wm4xbCIkp2JErOqJo6KFQXrVcTOOxCSZs3by7baFxGxZB0WOkGI7YmMUUNHjxw1OiR /fr3YxqEDx5jpShGsrAgP1IKlo3Kvr4sORU+09WBSmHLrLrG6ljm8gRUk2aTVVF1sW9AvuTiGtM+ zB9/6MFil4ziGsWXBcfpiltRzTYSCoOi/OCAUfBhHi5ZTjXhmh7AzAZYoykfwM1DPg5GkE0am+8H ZsobYiBW0UERxQWyQeGg/IhvU51uhY2eO6Q6sp+GJBeQHZSXJFuDtEdX8QARfOunUbLq6hjvo3cA uLQC9hLeBD4Esq9iDNr2U1U5qilXUS+NhS3RO7iaeFjzVMuJAv8aMhb02p+9yaVNLILIAJoByPK4 3PWGxYL9WZYrwo1wjWUyqTZpgoGKsKZvfNObpkyd0rFThxatuaukBYtKh/Yd+KlXr97eMsOQZu3x GhdWOEojgtuu3djeDqXLNfr1HzJ4CKiedRYoklD7gH5jzxl75dVXrlq9+re/uXn/nv1Y1gkr8ba3 veNnP73+ySefuv5nN3z9q1//+Mf+/hP/+IlVq1ZS7F133fPv//r5L3z+P774hS9977vfI2AzDqDe /EL8O0w+nnniJR/AB/TzwCrLtvicWXNmPvbEs888zyLN8inqotWyJY8d6UXtVTqMCsvctfdZo6n+ pmEtC6wp/ggIYhUe5xKA6qKqWZpl3NKoVPOep990ZQnkDe5K++wtgOYpLANtJHAp0yLXjgIuAZTL li7HkE+kF7BLVO3oFWUqA9JvExSD0BOyH5NzArCGA7LAIMAFhwJx2Rd281HfCMN2MC0KT1bZiijd /poKzT48IEu0bNPmTaAueK8bQLjLq+GI6du2acuB2o985MP/9NnP/N//+39wMh49mhO7E7p1JcBi PfBs+44dCKEzZOjgwUMH9+jdA6EVFekF7jlCN2fozJmPP/HlL3/le9/9wS9/edPzz72A3qLbgB8H rQ4YMYApAT5k2GvezCeeOHq87O3veicxdvr26U1Hwj5aVbtOrbg8hxKSWTsL750iemdQ3AL5fx1O aNaug1Tt37llznOPrV29mp0ffgVEN2/RpGWrZtt27Fi5ZuPufUc7de5Rp+aJxx65b86c+bXr1j9R hyAouEJRLBprcsVKsD4LEAKnjhw9dggIfoRTFrU37tj/8FOzb7zx+mOHdl952cWXXDKtZ8+eBtFT DPyQU63PIji4PGnyZN7jsMNLzkdS347tOxcuWvjkU088+tjD//VfP/zYRz/GQcnPfuaff/D9H91/ 7/2bN20hJYcNkD3PJrodlLJXHL1VgaFYpJHJ4rrrrm3brk2HTh0bN2lC97CLsn3bdnR3ouhgpZZR 7jPQfcgebAdqN23apEfP7p06d3SLSRkDxxv4XxdwHcRjt2fL1i2MbnylCH/KSWvaLvaFTmzYnoME gjN2mBwYicY5CfoTH7KhR0Oo4sYbf/kP//AJrsOzLWJu0bnuMUwvLJndu3dDxnenWyy58iDRRkMU e3KZtyRuqBr6RMaqj5HlCxFSewFNQY2nTUAxkSfFlDrYFN8leVJj8CvhVdBJjwPagGvFJtLithRY EEwQvDppS6PAPOVMy9XPGAMzitK1o6Qvfp7+0+OVDsQUXh15gJO4PZCeM3/8xdOanj1TclWSAOz9 tLFqlSmfUT5XEX5EjskrCy/pyVPZSNQ5nhsxqx6q/KoOELs6p9Q7tgJ8T++gkMBq2O5gOaVyXrl4 /OXUWB35LOiUPy+vCpF3oB/xZcCs+Cpw5AOwA7kOGNCvX98+xN4GyKbjehkc16MRMzaHNXr37aX5 B1Mmq1SyYWcGUbdxWXJAuiTA7O35OTio2zHve/Tsed7553fp1oUoEcgocUiWLF7Sqk2rWnVqff1r X//7j3/805/+zC9+fiO+xdSYrpVu3ap1m9YAvwrAmjAfcgkKYfnkPkjWGIxMTBCU5seV2JBhmtPE tSzkwNLde/aAJHkjMoM2YaLccHWPxVJeibADnQdaDXxp94ssRTYFAiHEZ42HIYYrNoAMvMKm6y0h 6SxXxj2ya//T8geRvMwAQTpthp0YNYa6evfuzalK+mjo0KE9e/UE55VbNDOXepGuzZFyobMgyXbx EcoEzTxAG3oRgdtXvbQKb/gF8xfixQGipBBKCNgd7Q2oao3yMIyIQUZUJx8M72gy0lN4WNNVnJDD GZdO//BHP/yRj3+EoNG48uPZjyE2i1uX3SqZQhTvw9tjwKD+gwYPJNAif8VnVKpuoOlaJ5+GjRrC ZLyhkDckFmgMV+0yYWi+Ia6FvOEn+wKnIAyfu/btvfpNb/qHT36aO2JaNWlSK3kH1ahVtzbcQZ1J sDtrZ/I7ScFNUpBvjd94oxBYh6OlCDKROO6+755f3XD9gH79p0ye0Lljy2WLXly+dPGy5WtWrNlY r2ETeumee+779W9u37JjX+2G9U7UTK5Q+LBYptpS+pcOcNbANevwMbynjrGps+dA2cbtB2e9MPem H39/4YtPTjhn9LnnTiEMJYgTztAc5dCW2ungeMIswpkkZkfK2DlZs271Qw8/+PWvf/1Tn/zUxz76 8Q998COf//wXbrnl9/ANXxfOfjAkU5DQTB1Vn3R0UKy6nPJfXj5KCK4ghw/hUkV/ZeF1T6xauZrg SAxVdsBatgEKJ08PWC1tdlmmNdVp36Ftt57duvfo1qFje+Yizn6gvRAJHtca0DlZ1AaF3QY5IS+e LQsWLgB/g4B5BsQDiEkMnW5zaZ5XDWZSwnbAG56lWc1EyaQi9C794GOucBwlu0OHDqyOTDW7du1Z MG/hvAULqEu9N0TLqU+G+ymYHEp+lZLIaJyQymKJ5EvQ88FgPgU1+lWMclJLYRBg4QWUCxRKnhUz o6iR0FUFGW1ISQtiQZOrw6WgLT/lUg52Uxz9i687KSizijYG66poaZRWQHk1OSxX8+wNXp0UTRbU WE2hilFp74uhq87rEVWgKlk49M+YxRWkpFxVk4Y85dH2fL/IveKAevnOyhNgW4rvMyrundiAOmmU krxcqfRyhu2kvLLXQOrFvSNzFH6LqkK89T4iAd4v+UngpARUJpCv0YwFYlb1hFAZz086jZzBjIXI W9OL8Iv1jL++catUkyrrCqvIiOHD8C4497wp511wPq6frKnJT7QiNgJCwC57Fnw6AVmWH6ChqJHF hr98BTN5jzeFGy4ghNiqWaW5zmbqeVNZU3HpBkF06dxl4/qNmzdt5vabu+6+h3XOEF0B48hlmIvM 4FofYM2vmtUBspqs+GjK1QINN0V10K8ZlaVXexUPujT4NXw/hA6U4IprCX54mQcrejyLiR1C0Xku 21adp58Egh4Xex7ElwLQQNsABQnjAZaiKvgTH1sHk3ds3564vWunZVJXk8bNiLpI9MaRo0YAQFnz KFnIG2iSxDxTO4zSii+SFi0pEvzlZWY+PIb37fbt3E+0jVkAB1kTBK6yNBsuB+JrQaujIyKND5Sm O5AKm647NIeZnYkenY3wcJy4bdGyBUdOYUgyISOrtWoTPOTIoaOHDhzG2/i5555ZvGhR8ncnTtzx 43hGAa9D1KlaQK/w0GpsnDpgWK99rfCretGzMkGhlU7KQbABdnizAH2eee7ZQcOGvvu97508cXKD uvUxNyMLmeyUf8qlJQUAOY5NGht1dvQy+VYxaDjleYzr6zdvvOue25974vHNa5bd+tuf/PTHP3r0 sWeWLVuDhze39rww6/k77nlg9fo9J+rUP1ELJ5OyGseSW3l2YWbGcwB4cmhJt/ykOOFlJw4fOX74 IPHCDxw9fHDH7n3zlq6++ZZbH7r31pHDBp5/3lTUM29fUu+SJ/Y7D2gjrKnPPvfMzb/7LU6xH/i7 D/7TZ/75Fz//BTsDgFf0LqEqfeGhDjtdObe7Y09DlsZgyRLzNZ06OnD4ECoi9KMkbN22HQd9cm3e snnv7r1MJbob2Xf8lc4s1CZBGPmkKQHLd+++vdu1b5sFikkuWx7NNLYJQiJJhmYHl4uAQd5sdqWB s2MHksxD+GGTCwP8sGFDJ4wfz+aAUhEHKO1HviI5DhNFRWnRk031AxZxW9PiJUu51yliqlhUzAwx DZ50FTSLw8oPANct8mITcqSJWQhUAQIgfQTlyNfInOzyX4XjSjEBeeJ91gRYEPw4MmpZVE+wdptj bOzK9Id8k6NdJV/mfy3gFT/RdvCilyzm+VPMq+LC87zyGZxExsqigsDPYgL0E6haTSrJ5OBVFQFq KuudylpakleWz0DI905xCfQX/g+wkUj8pMQOjWix9Q0YLchYdTkhP8W8ip8Kas+7bhfIVV4a+Uk+ FwT5jjSsd9HL4WFVPAazGFl/dEGPpCqxXrtz0jYayhPxKzhrYcYYesXqaDHnrbF4fBVTXpC3armq Qkj+MjOelOcx7xWM5T9LxvLY0sHlPPLmpbv5PORhIutc8tbojdtIz86du/DMEpLvZhY2RAEL0NKl S7WQsfhxNov1DDMPyxuIljKRYGxILJUepdKamB/8aYE9djQZxYkkuO8Alr7nuOfr2edZj7nkkk1b qjaUAQR424Xez5TMhwfeU7teCoYJc7EXJ2kh5g0Es1Dxq1dp6PurVZgH8tK6MPa7subho88OP1f0 sOP6JirNt46fyKh5jPcFaJ430smSTNXSo6VNNQCqbA4MBOuQ3rOYwkRBADCFYpNz8+rVAJfUEZmN sFXr1jji4wLEjUXAAiVSPG1n2RdCXk3XwsroZR5sJkZMHIratk0eRbh8gIapUTcAvTgCoSpaGs6t MRQVgZ0Myc+VvKdqIItetgJugS8P9HimrSWj7M6du/Bf51pT7ldavXYVMsYbXCB+f+stOBz/4Pvf /+EP/uvhBx9Zt3rd3v0ofrvWr9uIn7R7I6pnwE0kjb/MntomYSAf+0WdM+AjNdpxUm67TGnb2W7A tYkjm7PnzO7Vp8/7P/ThN15zTVfkPDmWgPJBZEmTURDLZYloJumgZTqNyUFFXgMpG9ZvQA3Llr/0 rW986f/7p8988z9/8PycJYuWrd6xaz+xvRcsXvzUM0/v2rWPRpA+wWswd7q0Pj5JHjObd7JYZy7f BB4h2ncZdu/jhw+gC2w7WGP52q3333vfw/feOmxQvyuuuHzy5Mn4V8ATtwVsrA1kOP/ohz/64Ac+ 9OlPfeamm35FbH5unmGsIYFwzEvXzRKDwlHmiLDT3ZbJ97U/8UGFnDp1Kvo2txcxzDdt3IQcYf/m THDtmrV27NhFZB5GJIWodkIVkwA7WtC2exdxS7cTXZ736SbXHoQ+6kyH4uNBAm/BVLsWDfNXaefD UKLLEBvAKNnpU+A4lgKPe3Ick5fEVoctmN5D7xJYx8yQlwellBoVclI6XiADgiEPjRHaYB3JaL4b Jtq8C6bByiBIyfcCWbQjiXFuKfjk33vVYj4cR7Ti4x//OMMZsKKjTtXlFP8aBAAyAGT5iyqDAJqP yZm8+Q16MsIlL4MsgKQOt8o+VTTZ6aU4o/E3vv3tb1eHV5W1Md6jogCnUH6Kw5Oz3UrQD3snPvCE qxAh4L777jttAjzqV9JfpWSTo/bq1AjBTIYn3fTQz4SSuaY0yveZOyPj9EK++6opn1XIVYhHIGlb RHXEYylgtQKARxmiiLZT0EFkRF9iNlMa/chSPW3yEsuxy4IaTc944a8Dyk/VbTSlcl7wcTwKqU9a DrUwfBiqBY1CDtEQqtPLVTO54NfKCqxOk6sQyFcoD9Xk+Z+OgFOdIcsxkMue1AuMRAXiSHntxi4f HRtYaA1M61Ja0D2scCxXRuNKAa23bycXAgwc471RCMhIsSyBQGeBnSDV2qWH6jDZNqzfENMda+Hi JWn3n4ODXNjBB6ikTU78JHISiLPUSbDH76CBvy5+othMGUhmYz10TQBhUC4Z5hU08BH5OQzkkizy azy7lgfTytFV9h+S5RtYjrf+ONZVwF/5SXpKgxL+esSNv9ToOs2DcYsx+rKQiySiluwwWeogPmvX rH30kUcxyTz3wnOLlywGXrBvAKzZsnVrikmXfewOqQpEos3erokpICZQfoXznKrs3qN7tx7diJYN /00crVOEbI4VBfeCmf4qiAkCghjeC3HcPFEs+ZWeUk3CcvfIw4889OBDNPDWP9z6k5/89Ibrr//x j//na1/7+ne+9b3//tH/cCoAp3aiKC5btnzrpq3JPWb1atgCtUBGNnDQ/XyGaUaDZiLT4hsIO4jP 97gCIKl8pJC2SBtvevfp3bNPr3GTJn7k//yfv33/+4cMGtygbj08MTh5XK5rpfOUnL8s1zloGRxP pyTLMOseR7Fp1LAxF/PMXbLi6TlLDtdohLvIiXT+svb2HXuWv7R61+79dXABrwXcPlqjLDu9SegU 3GzKfU0EX7xO4X0ysSR/QujIKMH2kadDh49y5nLtxp0PPPDI7397Y4c2TS+7dPrUqeciUTCE0QTv 7TJK4i+Chz2YrkfL1RNDkYthy3Meatuh/OWlwuyD+NsREZMPD2xvZPsG2xlp2P0tefmy5fPnLeRw QrYUpY0Fhip/HfuwklHKsrpk4ZK1a9Zt37Yj7VAdoYnHCWtD/2pudLBTBZ2rnkBerfuQ50FSJzc+ YnTek8uQJpjCOWuLo4ozm4KtbKtPirZDsZQPfijHNO07tB88ZBBSwRxlKzwc7A0+xROpQ0MZy3Mp xqAJ+LDugiMFHD4bgcHYxtpWjTTHywgth20SXIVt8he/+EU4hIA2uLtKUPiFL3yhmIDo8ai9sgfJ xpdDb1QoMdQMH+ALlWqhD7wiFvc9ICnexxRUzRrzvKoiC5JAAwPf5Jlc/Tbmy5ddID9aKuJE9jii B1zDySGss7Sd3qGZJOBu1+oTQAlGHbGLKYEet5uq2eQ8tQVyxU+jOR+TfTBg0wrcRXhZ0hUnzyv9 jLVzR/l2HxwGfFctHkH5STs3Eli74oE8QzAjAhqQc26Sr8J9yO6maeSCmRSCQPKMwFNUnn4LhwN6 QzF28F9/KLuH1Qsyg2zDv/CXxSiGngOQTww9B2NIMuqxQw9iwk3foWefIhgFnVXwNSYBd2zyDl0M XmTjtttuU3M46exRkvOvoYwF9P/lU17ubRIyFAiYlriuuEwGZBSLkKxOinOXDNWeeCN9gC1+Zbph VWZtZnnjwg8uxNm3Z9+BfVhAU0Q1UiJYiKkLoUuvizovDTohFE7+HvuJ11ubBYrELGyso7iPE9Rs LKGezxmnv4rmSZ7ZCMbEFSgBwjL8nSC48eYkVeRKMuYFHTl47+k9F1QoFIcZ/sK8Ib4urjbZBTXY ZVtErmJ3h4dY3Cwyik9gjii5YOonTQBuT4m5iptXL3B90JlEgJIu9tFZHNODDMAsOwazX5xz3z2E eHlgVRa2HINiOhG4McX2lv6Ay1E+bwIh2SiboLTwl7oyq/axFAa7Qf1mzZumff/Mv0jfHr7aFwG+ pY2PSCV4KFuCsQHBRWw2Kq/7iZPSIbVdOwlt/tRTT//m17+94fqfA7LvuO2OX930aw4ALFywkAOm nprFcYYDjtz5yRtQPEHoESTQNnTCOtC2/gDIrQ4ngaGhRDANJape9rgfpTcYroU+wCibQlhJCZfJ q979+73zPe9569vegS81p1CRMuAzlIjdk7m7nLHpPKSFpgtB01HO5Op/+FiNg4eJ+7EXJ5eGjZJ7 NwGyjxxGISSMIN0HtLaQVJae3Zl0VYC2rNPC9zu5feOKc/QE8BTj96EDh3btPbJu0/aHH3n8xp/+ z4ZVC6dfPHXKlMl4nrAsYTBmsyGmNqjxgISbG6GdOnBkRUx8AbvVl5AW1chII9ZUGPhL4Rzb4IEd rcxhOtXL15dWvDRv/nzs3/QOXxUJfiJXihuSDW+21HB8YkMDTQzliksAiE1EpEuq02fMWpwEnDRo iN5oaZqq8GKCeHdsnDR4lgbkjeuiZs2aBfK215wh87gh5sDggHISbKHHUbpwi6KZKMCIr35itj08 7ooXwqhF1hUnYN3V6saHh4KPiBxE4vt8UGduHwP7kp2lGi8pPizYAAJgAdcDBxYpWWkxGSUppyhq MRzbww8/zF4oHxAGsAB8kzeUvve97yUSDoehIYm4OAXzZHWqiwkqP8FWljEP7vMZq1lRcTLI/tCH PoQYwGSugsLez1+gJ5IGfo1DnBg1SUAyXoLAopw8k0syHI7dWPGhBBgFA9kmCueiysSjshYV1BKF 0wvIgJE9SrobRUZCbaBI0MXF9+YIc/U5OSkBLi7V/0AA5BFyBGFGsUGiEC1Yjds3wlaZnZ73n/rU p+A8osglaNxoQS77Ave5/B4LwJevcJjhwKB45JFH4Ak9CENYiPN0xtCjl4uHHkePHHoC8eAbnIFO JBD+oC1UMfSKeVLQy3ZQSSZ7iPOks0d1eueUZoBXv8aCJrz6BJxSjTXBAVAcQIfVyzUDQczjaVYs FwaPJBITcPKUScNGDGvTuo3vXRFj9SU7KwqlJa/Zhg2xNT4x80kWRZBN8xZNsSs2bNSA3Vugj7Zz 3ossEUd9CaCBRZFn9nwXLlww68U5S5csZRXkhFOK79ujKzZQ9r4XLVg0e9YcMAiJEW5s4YgZtjEM 5Fxo37xFs91cZ5ldAS1EcPn3jcunu72sptBACVxsyfErXV3hAOWwQOrT4hsXY8OWCctc0SlN9ODX eDaBOoxLtVwS1OpBEQnE97wxtom+oSo/Zpc5TlIgBujUOsvMa4hiP+TiEm2iwbRs3ZLLvXfu2MVy TRNatGiWsFTHDlw+z9r/6COPPTHzCQ5iJjyQfaIi5VhbuyhHG3AeffISecA3gDsy6VAuBH3ssZms r/QpH2jQ6ZludQdfSXObAmIsirZYad6oLwongVZJnUzkG1mE4yQw0IQ4LEAeTUt3oNapgyYWFmh8 nxCbK668vGOHDvBqzuy5K1a8JF+VXhtLFdTIX/tX06b8VCbVynymHCTQwwCUoIuxsNtNlUmTJ73r ne/krhn8PDjqinkZteSh+x+4+667nuAI5p7dKZB3FjETv+x0yDIFPMm0suw/SDj/pWf4kq6jwVNF kFqrTgbTidodu0NCMf3p5fTLOzNyjIw++JyGfLbDgN8LFdWvw5np+nVq1WjWtFHvnm1nXHJZ70Gj NmzavmDBwhUrlvMXpwt9h+AAeRWzWADyq6ZVZJSUbwfJN7MEDVLpVx90l3rb2986ctRIwvLMmzt/ 9crVdAFxjTp16oDTx/JlK0jmMKRGEiMhfFXM6Ee0LI9n2B3ZGc0kt0ggaUgA/XQZfx10Djdt3mrX UmK8ER7UE5BVulXirT0ptNnHEa2YUYImcwepFgoewskbnQ4JYcQzVBFI84aTmFx1lymYEw8xRftr cRrXdZBcAeYo6A4jQLvkR+GUBqQDAcQb9q8LygkCcJxgzimJxmAUSEX38ZKUAw7CR9ZbYEwZzYGM KLxkk7EpskYUxEPM56K0gow6Xhd4ckMGFVVG6qm2saC/mP1gZqg31AI/w3WYxNpHi9GhlJMRC6tx YKNkZvuCACY4AUeZxU3Oc8lCZDLl0EdRe2SUS9ERWdzq8k7MC1tkB7M6cuVVASejRtqSVtVSjTVN EIDw0MCSKSHAevO15CkH+5IGgnX4sZmVlUZGCEYU43gDWQo6KJpMMuqlQKoG0zul0DvkDWIqG3rR d45BHEuQOkMJ5QUGOvOguXjoRWIoQbSQ5OJJII4jR+GawB2nJ509Sk4pr62MBWPwL7zJNbHJ5Ulk SaABsaDG2pbW+wx8G2sCwDdmzOjxE88hZDRTBfAFbMFKwzU6ugWQkaJYVygfWeHs2G9/+9s7b7+L Hxs15la5ZgQG5sRSwoItE2LG/oT0Uwu4kGddhDNjG9Ezjjz++GPPPv0cgb+2b9uGqZJQuEQwIFL1 TnZ+t25jhSYvVKVYKwP744i5P/m37CCQGes3WIdk3EkJRmLYsLBhKAbl4JjCITwmL1diahkzejSx EZlM0BOghCmAYpFjjo6x3NIKQZUuN4YT4avnqHSH4Gvgb1/yJt5TlBhRFC7OE87GEi5A4aumU083 6lgSneKSbzLSwEPS2DQexDceEyTWS+s2rTh9Ccgi4Bpuryhabdu2Ixe0AUcIwXHTjTfNnTsf8ilN aCuFFEJbeKPlnmdPlYknbKmSA8Cl2OTTsm7dypeAs8e0I2qPNL67mxsyR+Rt5BbKcc/EenUEolLb aEo/Im8K4SXlCH0EXnLYLKHVkMbjByaGgEtmTL/o4ovIQisJJPfiC7OE16E3ylJKE2IKpOw19Sj7 y4ogmHahmMFGkDcsxbIOrnLngVwkQICvfsNVY8eMZYMIpMWyhgsHMVfmz56D0+ed99y9YdNmrM8p yndyD0kf4HVaz4TfKf534nL2pF9T+qG235NfeHmIFGdy3uZhNy903olfZVTMp+kQavKQoWk0rzYb AqBFoni0btKoT59OE6ZOGjV2yqbNO16cNRs3Ho4KgGhVw0IaneWzel/22w4kHbO5/WvKICAyOuHw V++R93/g/XhJMUUw3nds3U7cpBGjRrZo2XzRwkX33H0v4QXhcKwu4m86C8mhu+G/ylLmwJbM23BA tE35FE6P6wVED6qB84ysesBRedaGTiE80Llk9/SCe248m9iGqMzrkuTZTeVWjdqKQnShyvCpFOWZ TtVOBziJVVALFuYYaP5kSh/yi43LP5A6MHHJjF5/XYy880VZfrypJgGnTflrPeNZXpUUyJLd+rrk VQy9wMQlxw72cvAx4Lt48P718Co/z5zeRPf64FVtrET5lRK4KTtcC1k2xD0es3MLXpsrqbCWkWDv nr3Lli0Fx3Ad9JrVa7iz/MCh5LnIYUoWPG5MBI6zqc2RKaKtHTgItEqeHlkH4LCa1jmAC4lB6pSM yzLrE4urCzyLFs9r1qwlaB0XnmsQ4i70hEcPEpk4XapH8DUOjFEcwQI5Jgd8YN0jckW9BvWbNE4+ 3wlslZVhM9u0aTMG33E4qqTgHqMGDhoAjidyAvY82sixJwrpNzC5B1AXwYOhE+dRFlSBtYhTe5vG P1gXnwDEQgqt4I4xoaRfA4XIZF7GCh2J+YkaIdtCXPn8BPblmfSQ4bXYGn2tl+waiTlbiSc3F8ew 0qMsAV88gUrHkZ6+xv97yeKleGvI6uh6e1/BkODAEAXI22R86AjAJWVKuRkFr5q0FSf5YBqbIBPk jFjEem2L2Fqzt+LHX4mxU3zJ19gZoEY1BwpBvNHl5GT7du0I+YwDAU61G9dvAIHJQJLpaVBhmyxH S0ogHxUABYAHfVGgQfykQzB5U1yNzGvFlLQBWzohPvan4wMJk/E+OQU1atile7chQ4ehamzfum3v rt1Hjx9NQDphaTyyvSZWo3E2SsqBOD2STNz+qXhZkcLMFYEKMwaWY1webIXdJGMz5pTD9vLAi1kk lCysHx5KZVz2/tLKxXt27ejff0C3bl0Bj/g366Jtr4VuZmMdGjGTWpFvlCUlWRkImYkskiedRPGf PHnSvgPp9DBDsi+X1PfrhyKNmHMywcEY0iIZiq6CSqeQAHwMD0P7dQDSd+rYyg9t8fA0X3Vvsygn GRLzFyUUKdNYTtWKSjRZgm2aKp9fY67gpZs5vGfcYYZgzuG8J3chUY7eLHz0c1MtD+1ILgncg59y NcZm/j0mLj74HmAvqCKj5/8qu2cxMsYMUH0CgrZTpfy1nvEsr0oKZMlufV3yigEVQy8/QgvGDttN esPHPJxnUXHG1yWvqm5ydSa614dc1QaQ5VuS3xGLKV6cJNBxeWOpwNqHJyXYOrmyPfc8+9GrV63m BBIYGrvURv5LGN1t24kgATdXreFmm5UiqwyTpAWM9QwcBZBhWWIRolgkFe9qfiILTiaYr3An2Lhp E2Eism3fco8CYANQHjN25sZQ7plNrgSy69fDlI6xmCWL5Q1BT3E/atbcvWsXB+wA2T17du/arUv3 Hj3BYdyjgZl82dJltCVbcY+lSL316mIkxpzpxSh8XLMFWw4GCNaBOzCNU0+skTyrolSgnHJ4Gsuz iERAIJa1cNFeHmG7FsbfwE9WLT2x1DnU+ZqcXzPTHVBYu2wyatZNARzTia49e2gXXH32mWfnzpsP pBAukFEKY8z7VUghwOLDS7EFDxBvcInMVz7dHRiEhdlYu2C+BHLJ0gBtgV3Cqips0naotAjWhW5+ rAvyUhAcZCIzhPfq2XPylMl4LOADc/4F508hUke/vhRFQDf8amg+d8gjDFJlW/hkGzD4riQh197n r9Yu+lcSfKBS2EtpntyFPNAewNpOTzNIdlQAQzjbQbzMpL0u2zBJM6xTh+sKu3Tu3LRJk927Uox2 iE93rme5aF7KngJ7l/csxyazCODleDvzMSlnQEWSxIzk7Y33SgbBKxK8bLyEUcrJyw8ZPM8cxDMH hnKgjHU67Xrs23uIiCKHD+1p36Z1z559AOXIEi2Fk3nRDSG3L0IaCyQ/NMYQrXwCJRzljWCCM2ZM b9C4IUcRdu3cif5Mn6IukosY4Xhvx6Cjm2K8SI/yEMZ1vUcgzzHlqQOhLX2hvFGvOqrw1251+wiC CZjUq1fP1IPZR2EIV2z7wHolxjnBdmUyWa6cUxSwmyMow0cM692nF95Cu9MVOrsNX0h1CBK5QqWU h5VB3hB+ezP+BvJGAS4J1s0o8mbLRYCeLy1fo8ypopzo6CAgivpry3iWV9H1JTHl616uHFMqvVUM XpE3l4NWc+yclavXsVzVLIhMmfbEc0foRJOsN7p3M4QC67DMMPPza7qZ+jC3uCUHCQ2QABUyAjt6 9uiBj2bTZk3wYgU67Nu7nzNPnLECwxsBsFGThjiHgE/AcRp+gHGQBNZZvnw5yxIF4ki7ZfPmY0eO YXXDOC22y2yQ4La0UwzBwOX27driZkulmXt3C1cyl0nKeeH5F55+km3YZ7p17zr2nDF4lXTu1Hnz pk1btmy98467XDtBoj179sJKjt2RFRpsCiRiXaTVOm/YfP7m/SJca+WSxlfSyLE4uClecV3XyBoG WjKq1QSadyXTtupPru72i8jDr8JivkpAeE1QuH4UvFdNolJ+ZdjDHO4CJC9xXECiAFB1rbyVjoya /UQnfhX6C5dJrxrGr7SRc3h8krfJ2rVz5swBieqSRDIAjWEZNfuZiw/l6G0Co6BQEEwt1qshnwcP zlKy8WokRiVN1GXXgGURuY6dOqJGdu3ahaB4ADikEPYkG3lt8NbROXNm33zzLYsWLjYxF63QQUEV pBIEOkNmZKm9d28yUWuqV+DtXPnAA2/gG9LIeOEvyYDdaHGY2HVF4A0lQDb04C+BcxTiSnQ7Dg6q 4eD/QxP27tr74AP33fzrXz/z9DP7Dx86moXcrgnQJux25sadfLvRNBLuzuA8ADU5d78MvTNp0WAu 8K3w8s7cvDNo/bJbsJ2oYpA9KGuxo5LkiGuqsvuwajcB9jao2b5di0F9B4yfNKVZ6w4PPfzo88+/ 4IkCupXqaAtdyvAPF5QQVAGo48Wllw8dJ88jmWIWkJezYu969zuO4fh+osbihYvRCbhOi3MECNLD Dz68ePESMtr7yolbPdqVHfLl7M1uxSIxvcyvSBqzje4l5nWA8F7Ds5sSjjXD8dKhF1980cXTLmZf 6Pbb78DlTIzumHLEhRDqFCdkl72J+xXuUukaoDZtuM2KqCaNGjfE02n+vAWGeNK9ygEFMUq4eS2k 4CNLC14Gq89gRvvlz0hAVP2qNfm0azzLq+oL5FleneXV2fkqLR8FNm8PEOQnd55d6vjo8utCpZPD nj3JydUEvDdiSeb+miLgcnsNSDoDl3VBw6xPmHn4ZGttQpwEwHBV1gOSqjEFUZTxBFicMEjv37cX tMUipRcBuVo0b96+QwfuYhw4YADXwYwZM2b8OePHjB0zdNjQ7J7nDsY7YyUDcgH8oAQDNi4rkI1W eujgISzxmHuXLl322GOPQTBMgCTSAL7Z18Yv3Es0XAhjURfmyhC3hp1HfBmwhhaFhc/lWTtcJOPB 5d9cgnKRdAxLl+0AuFrdqDGqjmd9AMgroqVMzcYUpcHYqmk7igQ+PxzrmT17DpcQAZRFG9ZiQ0hM IeBmvmbAJv3f0jKYVZ5SyCao0mscDKF9ncTAHTrUqgVbIqTIYqU2MP8Sf/Hpl0yfNGkiJmFcCygz yKMQ4RFQGzOk79m7xzMBbwTupLz44gsvvOjCqeee269f/0xDSBogwpXZkWvCblyhCJGBaCF1ejS5 uyJ8pDVwFw7ICvdSqALK+Ssn/UnKVW9oso7FaICIevLkyZQomVYeqO7wYbI3b9asW/ducEbcBvLm f4Db3n1QAwfAuwP79m/fueNojWNA31rZNTjao9Mn57zha/mvtFQgvfJvfwzMylFgRbKXDd6mtsfz GCtFFE//wPxJ3I8eKtu+Y++69au7du/SvkNHdFX0WNFhdKixWAqAi4PFKsLolZ9YQt7igV85HXvx 9IvHjhnH7IIf1EvLV/bp1wcubVi/3hjtYR52yCg8MY54E24bdoHqnNKrEsizapU3ANBfZFFzVh6U dn56y1vfMmnKRKaF2bPnkmDCxAl4LnloQXzvKFaGRfDOhCEkyKH7HkYTZ+bZsH4jcxptUQPRF86R FQVWBruDwyUfYv6pOlnxryUz5kWimgWeWQKqU+lfSI1neVV9gTzLq7O8imXrDE50rzm5Ku1tEuux KNMlIRwYfOBNQMyEbLJPDgokWEBUE1YdbN59+/QZPXoMxmxSYj3CNRyskxBb7ToHuRfjWBnHJY0e wDoHemONZCEExRMmDMiDuzY7+R06dRwyeDABR88ZP+6c8eNHjR5JtIreffp07dKFECs4lOMTAEki XShEK2CZxF5OLOe5s+diROcnCucA5eLFSwnpbLgGFj8qFWeD9ZP97GjSLmydHsCuqbQoIHJYagXQ BcIUUENUITLwIxZxzZaH2pv5KYx5rijh4WOLICxb3fmT1viEfrL4jBkSJThMgnQiY2E6D94RQxr7 S/u3gZBF6oFr8zgMzAHCAEdCA6ZxIVRAk8DotsV+B8egMrl1LhZ3AyS0NbkXTNDCF44KInh87i+9 9NJrr7tmwoQJgwcPAjRhlYdoMpJSMD1wYP/Lr7j84osv6tcfl9mBPE+bNm348OFoXIS1geamTZpW QLG0sYAPAb1JaDl8FWYTD277dq9YMlJNAOvsNF5qZha7uvwmeZtGGs+58iCdNlzDPK1GVnmD8obL TdrGyS5vEr3xN10vum8/MtwixdhMd9MIyxI3PC5Zp06bdm35EafwdWtW7di189jRdOFi1iM6dqeA 3y/j6ZwhMpOuctGrkMDynix3JMlYnjmfvOyWUF5yhXXcTqmQ4cyinoKCp9iGmd93zSPHTmzZvrVO 3RNdu3Un1CdKKd2rcGZCW65YhjJpUc4GlsxfxUYG5oeAX32DlF562Yw3vvGNdBC1LFuybOPGTQg2 5zf4itaEsxAsjSxRYDw48POUSEYa1JnJwKAlyr+BOHmvt3e2jZaIFArzt2/fPpz/fuGFF+fOmXve eVMvmTENOSRuEn0KB0ycejBD4Z5niMZaCMLgrUy6idMKzl0QvNuZxIHvuI4xHrOE3JM51fxE+lee sVglqw4NZ5CA6lSXZ9Erb/Jp13iWV5WxrlgezvLqLK+CA2dwunjNyVUJ5O265VoYS7IQXCzCx6Uu gFR+iY3FNa15NWvop4FZevDgIR07dOzcqQPAd/nyFQAdDFJga3xJWQ7rNyyPmwECZiEk2klyua5b lyNW/Qb0HzRo8CBA95BBAwYOwLEBiIa3gHgorbVp1zlZtlhaWRSB0UBAQjEsWbIUx27qwry9YOFC ljcvricLGVjRDegLnRiD+WvV4jZaJLBIkQq7djXioVZP13LRVcBueRUYwvVYNSAWYzkWWeSnC7CL twUKLFz74ydPYhEfEGSEPgOkxm+hX7++PXv2mDR54oxLLyHeENAao6Dla1iFYA/8lSP1irXcWvwI f4UC9iO7E+yMDx06mNiRbdtxp2O6ppRwE0AT2lzu9ZA7J0f59AXZZaAoWUYJd/ib11tIqee0NfIX Vjdt2mzQwIETJk/AgA3NHdp3IBiLN7lQN+bG8RPGjxw5/MqrrpxxyYzBgwb1799vyJAhvXv3AWqn eMyZ4pH51SR3FEL4cQxg0aKFmPZXrV5FWIzHHn1s/vwFmsyNNR4QUGphPh1ip4eiAnnhYOOIiC6m XV7ARKVkQcPE1QRqRfN8ykdKjZoAL+5PIaQPjTaMBtUlqcjCBfKXr/UbNCRcJqdft27eCr5MgU6S tGSoNF1qWWK6rphr7LRyrxIPUYQ13A7X6p+f72hHSGy6/DIzcptPnK52yOsksTVrHC070qhBo149 +2EahtpePXuhZngMOlyJonxLdooIeBpfHRRhGw7C0puy4zMuvXTsuDHbtm9jx4P9GXDq1m1b9+zm KPA6lHALUcJjLlKMlXm1RJNFFfm5K+vlclclPYgMo0QWFUUSaPwmIXZ3tr9eeP5FBHvqeVPZTFu+ dClSxMSl9JJLjTQQv2+UIhiCPCAVya28Vi2MC3wyM3waDsxXRg0Xssd0mkeTsrT6mLIg5ZnKeKbK qQLa/okof/VrPMurPM+r7tazvDrLqyo4cNqD9zUhV7VBDHlCIyB/LJ+BwstX+HAO/ePj/K61fgJ3 ZvgjwVxAbofsAmdcp5999jkMz5kryDGWe659J34e0QnBdhCDsyywD8zn5YI9e6U1HsNtupg6ReQA Z+N3fJj1UzuWO/4YtolOvXDhotmEQJs1CzMVQfKJ6cGSWXbsOGjbECXC7rQANm2qYwarpoicX0nM ywiHR/ksnJyLYinFBkxdgG/XVKGDy3yBfAgLxBwBsoUC4oNADHmUED9ZGmlc0YXvfDD59+7dq1fv XiNGjrgIt4oLzr/8iiumT582ceJEUCn7AMSgwCOa/QQQJ9V5ukv4m3SSzD2a9+Js9QG9JqIW3tvp IAT0jWHDh6QzW+PHjxgxbPDQISg83D6DG44SImE8gFEw99JrKXZkWZnxHyhELAKq0BlGTUA+qFSE RZ+XsD0ZjLm6qFmzdm3bJWx04jix2PsPGECkC6Ji09JxY8di2wbzYT+mAlAsIWi8OIb0YDUi56xd s2bF8hUvps8LjzzyMB78RCufO2fOrBdn41mkkwDtRZYMOKhKkFmg4UkypmLzzhiS0CFkq/kE1BO0 2UfAJsPPUyxfNaWTF25HGkpOFzy1a9OufVu4BFeRZN1RQnIUAxAYPB06bHifvv0hhVPFew5wz2sN Q9tkgUjgdoVniNnLh1ogszhV+fLhTI9NlrunlMM4vZ7SWUwbEpSI0TPg7btyxJ8UqMNHWjRtM3ny eZyCaN26FSLBpaWMaJRe1A+6WBUuDzplndLrnBCqjhIec4UPDg2oQSXmglWGMK5fOLUhb6Bwx6a9 Rr9YoAqSeRUwK60wxr8cx9Bk0VhrtIvTFlI2NPg1/FIy5M2exv6tW7Yxt/Arqhoo/PnnX2QmyYLf v6yfUyMZ3RYraBSYO3NqqkuA5pGjhuPxT0MIA4zwGE3Fka5/lypZtO401iRbcUYynqlyikkqKNmv Z5DyV7/Gs7wq2aclu/Usr87yKjhwBkf9a06uXrZ5ywUWhvziUYwsBU+upqxwuoiw5Lis+pPrHys+ sEuTZ3a33A7OLHLSkcCCHJkaO3ZM/wH9hw4dMhKnkcGDuvXozrYsuASAAv5O2QVwrI66amZQUhjB ckWx4B68EVjG1qxZg3l79qy5L77wIhYpEBgxENauXUe9RPMAEmFW9DyTMMsVmr8uuiyNAGsaQttB DynCRePGVKfHCx8owbGhQcMGemcKxQRh5QilwrDt0h6W7JJ2rADf4g++lrMrd7CV94GJSYBh/oor Lr/uumunnDsVqM3NnSNGjFQ5gV24VMMUHGRxTcaH28sXRI00iqIMPe6KrjuKYmoVAqYYA4JCisWF GrZwrzqYmGOCRCQEjaHM4CgveZZDgShIhKmm73iPTiWLdKhQOxIh2aFKSLjx2B10AbAVR2cC4uCc wQEClDHUgnRusmMHjO4pTnz21btiLJmzBBs2bqR1kPQUl1g+/fTCBYtefHEWQVWB2ti5t2zecugw Pv3cgppO5UKzXi4RSpxelgM4knCfDOd0GzSsj1cxNnEUu8zzOyEzNYe8nPOV9wiMyJsWwWpt59G/ AKl0RWLLFkgOBKNZoh3RTJkvn2U7koYkc0QCZYIDhTi779+zd9O6dTAk8SzzQVfhTfJWEYckAGux S4JJ4r3qYUnPhYoBLkCnbBCqBAqHky2c6+g5G925c7errr66TdvWuHU1bdJ495bNHQkP1L79/uwc BTzUfSgEzL62fJvpm0DA+bnFgcCvaMBcw4L6RBRRxIYCBc2eJeAhwLEbCxbrSweUtfhVYZPVMWZj +uJB8B3lOGpoSNpFy07NZjsYR/HPRmnfkD4pJE5w3sErAZ6V5I0Kbch5NgwbdenSqXOXzjBj6xb2 NNJNtCZASJhtPBvt4Qq3UKS/4HNSTHnGM/7ZCXj1m3zaNZ7l1WlIbMw1JQU+Xp5xwT7tXn71M56V q9elXP2RtwnLhjElYrHMLcJ/tBiwYrFUEEuHi0LAfxmuPeAiFMg7W4xTnAcWZtatefPmP/nEk02a NcVdcvKUKYMHDwZ5c0oScynW7mzJTrZA18K06Gef8G9NBvLydS6hLvxDWAa9Z4tn1rPt21KQwcy4 m7Zxs0vo90ADIAlYg9FOsBhwmZXSeF4gftA2KJMlkBKoBWSm9yd/qQsbPGCc9KgExDvB5A58lR6X 8wqcUu73LNPEIgE+xAEBO0QJ5g2wEhDB9VvDMAif0Gbveve7hg0dAXoD4BKVLMV1qVELwzAMy/as 02lXTP7PPfc8njaWicoBdKBpQENYIcH8ZU8f5xwoyZskgzBIUvvq3LWLaDIBkYwbnJulE4nmIWgQ 31AIVRhhBn4mVh854huIp0bN7WHjNKPMIYEPboDs3LUTrenFF16YP38hVmlAKg0jDXcKyVKEY9fu FO3xyOGjGETvvfdeJEpvoscfm8kVpxhHt2fn/xQVAY21KJxiuCxSSmoaXCIJQAksCURu1aoldONs Q+2ZP0ByCDZWuu4B9ovmfD3m+VVNI+ri2f0Q6tWTGOgKC9AZuMOIe1vjxnhHCn8RLYQZxYlRAA87 denUrXPXxnXr7du9b9OOrSBo5IZ0WW9n+Dg3FeWBcuVz9B8N3oDB+oJnpu5k504lZ5b0cMjPvtY4 fgyjd9mAQYNmzJjRuk1rXJyJ9/f4I/cfPXSAG9natG1PziRX5ag3ZXcgx0wSKNwuUPJjzyert3zO gb3wE1aTTPzKV551Z3K4xTDJl2aN6nimDAU4Cs/PbFFOfik1AfXS7zzTfVDqafIUYDFTMBzFTlA+ kIX0Rk3hV0UujNk8Z2GRalMC0sIkwzTC6VrHjjpqlEb51FXF6m7bK0vwp8hYIFSvPgGvoRrP8upU YWKkfw318qtP6lm5ev3JVTnyVpgETyFYrgfunrt2Rvt5AzB64xuve+/73gsuxM5KVO9YCMnVqWPH 0WNGjxg5vFXLVqxJmEIB3wD0gQMHELmC+2SxX2pvYrFM5yC3bCGkiDvXWrAoTVsUq5GUUI4ojQeA F4A7RSDZswcjNdURyZvDmsA86ARa4TSKiZ1i+eAnSiEG9IVyPSz5uDrqrgryZqE1mIa3EsoH12Bq bN68BcTzFeM9NFOLBlGpzaNq0ltsFvAuQX8tvjYqAAcvfS/8EpHwNV5qjgX1YQTl8kWOmaaAEyeO 7z+QDvZhGcaxBNPgs889g6GXzYSHH34YtgjFtKXxSeHMs4gxhoHD4QEPaSqkR9wct1sFxNJgj+zd sw+8COswLa9eQzz2VdwVymVJbFnYI+alTPgAE+i7LGD2bkpDNtAQ9OeBk3BJHSNqySBvgsVqHSQj IyUgIexgcA6AzkVZygI7bsG5CGhGvZwQePChh555+ul58+bee8+9Dz7wIIJHSqLW6ANjsQYtoS4R nn+FYtKGrTbFsmzDlZOJUBxwues0XQiMNwinIJs3x/4NzWgaeBnDN7Gg+JuP7dVbwEBydrdeTFYk V0X8MpbzvuwAgbOQAmQVw2jmtJBCnEB2lj5FKiS0DrZ9AqQPHTasV5/eDApAOVXgapX6NWHhdLA2 NxNl8bj/eGYKRFghdX8Uoq7gV+3vmbd3Oez22QkBcTpw4HDzZi0vOO9CYrDAggb16m/csO7u+7mA c12jenV7de/RtWt39iiIGwJzgJgqz/K8XEWrmDocyHaECDIGjgPB8JEKmF5SFKUK6ssYNaTPqis/ O2GBMVNJQIicZARmdVpznJrLDZwgzGcbon6FPAipxcrRLjvasO6QF1s91K40ZkP4GCUwWhGidu3a og+jZbHF4VlnN/RUjClfvfeP+9OeL5+iK/qlRJozm7GAhlefgNdQjWd5VVL2qlAFg2OvoV5+9Uk9 K1evV7lKyDtwId0cNm/nepYZzheCJ0BF2TJcjrc012GrHjZ8GM4G69avmz1rNosTadxIJYAaHskE M2HrnjJxjtQSyadtO+6NbwxiZusW7wLg1Ly58xYtWrxh/Qbs1qCa4LUWLAEoCxJOzMlx4fBhkBmh KsBkwEfqwnzOBwwFCOMzePDAadOncfwOj/Dly5YDBwFJrIIu6hROGXpf2CKeWfDA5ZTGoshiqRYR mAD6aSyBDuBDt27dSYxp1vWPxZj0ruIBaFzIY5F2/XZVFnk7nAIRJmt/LqaYXCKlwBRgwEMK3MGd RzW5yn4VUclnvTgL54qZjz9OVMRHsijLc+fOBYaSkSyCBuj3HKEaAtAWY9tll83gRGbnTp1WrHiJ 9mpZF3bYp4JLPvBt44aNYG48pGHInNlz6WLcqQVApg+wwjNMRkhgJgwx+jvJqBdEos3bLLykFk3d 6eRZBrBIoGUxxA/Iy8VMK156acG8BWgXoM/58+c/9OBDMx+fSVDnxYsWowlAPNEjKUQfkoRy6iXN SmQcLuZyw/ek5MQbh1M5vokXDcHm6XGUEw3h/IVyyEPYMOtyG5Q3I9hT+S7jqw4GEGyxhm8HmrnR oVYTvuz0C29A3umeqe3byILagQuNZygB+mmXoEkzCEdjBOfv3rOr74D+hBts26btlk2bUiS7bPho bv0jx+2KuTlgpXKYm7A8Nlk+eLP/5oF6PL/sZZIZrc1S7i903tTzrrrqDagIhOPE4v/CCy/MfOqJ vfv2H9y3F1cMtNbu3XtyhBTfnizuaBpfSqA9nqrM7aT5HCQF5UiFHAshjIFgLJpAzO6PhRBaRSg5 cjuxq8LVJLTK/CDlORRjt0TUoqFBghVa/rqtoTeIQ8z0FAtVJEB66VMJSOaECtxPGp49SWk5Bt/c tnVr5l+0N+J5a/+mOhF8wYqbn6L9qST+PoMZ/+wEvPpNPu0az/Kq+gJ5lldneRUy8Nc8X9XWJhqf sLi4yOGJ8da3vmXCxPF4OuJm4GLmIsGvmJx79+pJzBE8WYFH+FfLSpKxpIFTua0PPxCwNQuNSyNx G7jYErPx0sVLcI2YNWs2d4gsXrQIREIVbHqDQrAIkt0NfdYh8BxrFbUDuEHwa1avBoJz2okAZyz0 HNDUZYX1cvmyZcQrvOKqK4k0l2Hx5vg9A61wiQbNYKwUEQqkhGKQyl9QqbCbwBrQD4T1J1dWYSXQ rk+f3gRXQd/AgRh6KB/VAhZRlGHIA6zzoJXdtd+l2meSxboungsTmoT5K4lFIfzdTXTFTZvgNujz 1ltvvffue4HaOrUTwoX34D/BgUUF0CGv++B0FmlASLjXg5CA4Cm49cqVqhyCdSmRQgohC/Xi2r5q 5Wp6EKRLRwTmiObwBhGC/xi5qUslRxCjPwZ/5bZIi5IFyrqy8FV3FGMt8xxwijve7XqMhfj+rlq5 av269RSLM7SyBFjFLURNwM0TMR+lqbMp1cEQmoZ5mxsuuU2pe48edDfY144mGbnUx/iL/obWQdxJ A9oUIEhbQXrlkyykUd/A+4IgGP369qXBBGS0sSTPWFqTuysPHti/e8/upDTuRN6aN23cFLlIQ6ZG imrHDZdEfyaQtp3VuFFjgqJ069oVs3YmANtrUViCfLVF0xrAq5jIMp6X/17hHx5vXs6ZCUxKlj2k f+RKmlV29JN9kk9+4hMEy9+1e0+derUZqrfdevv6NRtqnahDyEbie+Oa37xJwz69ezVPG1ypH93l CHQYymRoa75xrhBey1VlXkr8ywfeaggXkYtQ+fgQ5djX0d0WqILNg5sVPju+FNTQCdWmHLm8dBIT YfPgjU7BahOYWLu4qN33kYxnxVLtl9mVeQPRYrZxzGq2V8ZIHMc08yXkC3y5s3NPsYDlV7LgcMks vqwiY/z0CsupovaqCXgNZTzLq4LOOitXMuQVjp2zcvU6lqsU2yTfPI/bu3rxgGPxuVOnTph4Dnvi uBGzwPgTf/mVxYaQeyNGDMcR4sVZL86fNz+WPZcZIDLh/ASyYdRJMUZ27ExIesUKgCPb614Lz2lI QBX41I111m+RnL4oWjHTcoX3C4t6hh+oDqQO7mcvmhAExP8CLA4fPoyIKADlbVu3UcAVV1zBra0d OrTDhkrVGjUDc8cDhdNYhoqgAfJYmF2DbSmN5uZnrPUpKtiRo0uXLgV5gzg1doJQySgUkD+89JqM sO9SuHDE5dmSBRAiBhGqC62GcJEuNbIhAOx+OtNS4B6oDhoY2okDWXYhglW7lksYb3TkcI3P3tTA iQNesfzrmxFQRuKdLywHejJDZtrNcPOBxOJ1HiiTZxQbNBBMyHDJgOgWIorV4B34RjHQ+VWfEOGy J3EDrgmMtCW7WZEwGddPZloZ5esBIlqiW924F7iIrkhjReEiTOMIqQ21zVs2p28gL3kRZMEB0V7o cRgF0DdoyfatO1AR6Q9KsjQ/0UfCbvUKaoQMgs9cc801kyZPRvw4GNqwcTqmiSnfAZV69ngZLvqI FUomApNplTvpBTqNYCv8leB0grFJY5tPe2Es2BcWcKUUeD3hVBJyQ9DLHiEncfwVxBrnJPPq9m5L IbmOKP7LnsuTpAmAa5Rq16l7xeVXvOnNbyIOEQOyUcN6s+fMvuOOO44ePsp4xQ5/qCzpGAf27mza pEGv3n3atmuPn4feXALZAicNuzggr9Iuh9UzefaN2pQyEDsJpI/xYkqHkqKbX/JNFiPOjos05BJ5 S4zVqUTx1WdHHwncUQmhcgJRzvm4Y6OyJwHKnp1uvc4hDge9aEysO4pN0O0k8Gh1lu2YuqNe3owd Oxa1LXlPVflxPyefMV+jnDkp6C9JwF9bxrO8KlaTzsrVKx87Z+XqdSxXhcg7osIJ5gQNwAKuscDk rDOAwA6TIUEnevTo1rpNK6w4Mx9/wqjYsWqCZkB4YAvNVC5vrDSCNmAHCVie9fdNALROiioA/gYD WDsrbhi6rDStlwl11D5+LDOjZrvhBP8C8K1YvhKbKOY3ljc2/YFF4FT0imnTpnOXOMGS5y+Yj5eI ONglJ3MASDjb9ZUChZi6PbjQYtDF34ZfwWQcy+PKHqx6OGBQFCgB8M1fY1OoXSgrYlxhNw2MZT4c OkUMVioYldvCuMSNiqiCru4s1V73IwI2QcAOy7FrnPIADaJV4ydqBoYzKdj5th1z585btnwZWcQ6 YSm3+wLHhFFQJKFfii3y2RJwN8KFg4eKk4KHvR2QZJr6wgKtDPAREJOFEuIkK4mj+dZIAj1AvDre ohBRoyALvrU9q0GRyyyKCiWEdMln5AtPbhiSolVkcd+xt4OzkZzVK9eg5+HsIeRN6TOXZQQl+GAt YinxlmZyCsS76ZJLpk2cNInAiLXr1kHwgD0tW7cEbutGk/rn+AncSVI3ETXlyDE0Q6Rozdo1bAFh kM0CDgL7aqDwGTKIWtIwQWs6frx33z4d23fcsmkjehce8KmjsZKWBw182XhZfvFlhWtHDomWT2IV 0LPgGGX563IYmuB5guloFt2793jbW97WsXPnHTt3If9Y7O++647nX3iOw6Cc8qXttAvNmXG3d88u Nlx69kzh9hmhjEp+peNol9oddYhBldsYKS4wjhqTRQJRL7LkHZB0t3JuMh/IpeQ7oHgfglTR2HJT dIhfQMPIK0Z34PDstMCzKdUfLE3dwN5xuOnxr2Ybn2iFuRzaZnfEMTABx4Yr1WRuAtkS/Clee0q+ ifQ8cN7j2mp8vvvd7+YrKqjxlRBQTZoLWvrarfG1S/lJeyovVydNnE9QWcazvCpm41leVV+0Xje8 KmHzlgsuGLST2Lo4G6xfv4EVQksqawYmPUIBclay34B+rEHr1q5fvmyFdt9Y7VwFMRtpmuKZBRgg C2TnGYDSv39/rHuemxSOY91knWYxbdCIvfsmpGGJkh6DSLCm6hmZIN2hw0CZQwdSeEEM59TuOo1/ C64R+KVg1OFrl25dcAHnlNSjjz66evUasaO2W3EbRbmC6pzqXjmU8JLaMSABqqAZ91xMe/rYcD8L AAiqWCx1TqAVrtkuZlnDy4OL8dVF3dXXX13R/appzeVZwXKxF3qKAkV70hlfNbyJM/J5fSYlzcSQ zwJPc8KRessWfExTT8lYsYu9JmF5s3H+TYAGO0XwYWL+whb4gApEFmpE1THCt3H3bKm4RMLUH7Tz 8VM8yAGZr+rCs/ZszcxaDc0lUhEYab/ngY/8DOJzLapBFHA+x7mnMYtzglzCmS2bYMo24uuwp9Gu fTsjcyOE0GCJJJbV9iMfTZjQw5sp50756Ec/SvBzMlJy6tp0BqABzO/apSsivWs3/9uFtgip+MgQ AhKtAWxKW0iL89LSpcsPHNxP1Bru1QHg4nZFSkLQoBsgz/wPB/L+Awd0bN8JlLdx3TqqTk0EAqYb LjOLdVaphy0LlrfAcxXjk4PH9gAA//RJREFU2u7OxjgxOlMkweyxYuADuxUzjNxEsTz33Klcwwn3 sbs///yzd9xxO3eC4s+eYs0cL+OeH7QJumQvJvlt28qOHe7Urg3R3xs1aQYZKmzwXwFQUKMihYH3 ehzZjw4HJZ9fEV12KmAsz3k5t0A/1kLJ2qEpXx1JEY3RZLF2pbn81QQyzb52o8YtrxCeGC9S4tjh r2KpHMZQsliqc9NGPdOmkYbTNTi2DRw4EAnhDANjJ5/dik7pA0lOPnw+9rGP8RdgTXjNkh+2UJjQ RN75jKdUY0Hi0y7nryHjWV6dtmj9NYjHabfxrFy9duWqBPIOQKO1CZzdvl17Apjgcoppk8hoXbp0 5u5A4j1zqSR3KGZnE3fMmT175apVGn5cw1zOPUPmuqLLNWXgoXvdG6/jM2XKZLb7t23bTgQ8VszM Ksn2a/IDrlc33ZsDwqA0FrYsmkfauNehmaNYmf9kOpEWrq44q0At9IhGgThcYtIxWeBqcTLviSee 3Lt3v5hMI5yWLZEr5Gli5KWrr8YtVin+kh4MJN7i8B9+CCJXPRP46zJs2ykQyijBXXLRlfDCMeZX shQgb98ITSSAMqNA9Y2A2gG4w4gojBAXihF1C3FJpmmA4KzilCqQayghli8SshAlwa9CYXGwL30P wWbUh5VaaLVW8GRaPnQonQ7MVBplQEZBGL/aNN7YrWHRtDprLJehTA9RkARn8sf4LfoBG6VbXOWG fuzs21goJXG6ziYFEGwFhV72TjO40BvKcZ8gfGSz5s2EaCTg1pimTZukvjtcfmpQaq2FdnGuAKl+ 85vffMkll+CWnQWf0Zqb+IzggbtAVx07pcg5wO+Dh/bja05AEyB++/btqB33ciRqzx6ujNm9eRO7 RxuQZzUTHTYolsTgY3aLevTo2btnT+Dbti1bMP1z0U4Wny4DzUY8yR69l96PSLTiwW/pbxxyrHA7 MVHC7vQwfQXUbtO61fRLZhCIetee3XT8zu1b/3DrLfPmzyckOhUjIGSg2oT4oQ/HpCOHd+/ZeeTg /vZt2nTv1ZuNDbeP9BwLNCyL7GJykYBf0YjS/zLvC4cJ6fkVvhliPwaOGS1BOcxDXgXGJudHkxZl 97ti3JlMMlQPkjKW3dEjUOZZEbXHY2azZLVHdfUQWuU2doTSVUpt2xLwnqa5aUOWdLo3821Lrnc7 dzrQeG9bCjquoidL/1dexV4BiUTe73znOwtgNyez/Vx88cVsyHzve98ryBh8s735r1XQUEzAX1vG s7zKi0fV8nCWV2d5VcW0c9rzzGtOrkogb9qguRHDDJuhXOI4aswoQHa6tIUr7Bo1THHZ+HRg8WjD 3j3LKC7IDz74EPZOl5CSMy/sZgXFGtqmTTusgNde94bhw7jUrSfvicoM1CGva3Ba1bJVMAWp5hLK Ct9oVj6pgiQ0Aa5axOYINGmYuWCCciCblTVzC24MPOzStfOECRPYLgcS43lCdA4t3KyRbvi6fAr7 XJgF4ixjfHgAVTuPcKoMbxPqBY15I6ZQkvSR1+WfVrANT5Q6EINQ1TVbuOZHuBAIwOrMa2P5Sds8 D8J9KReemiAKdJmM1Tqya2yjHDG3BzGpRXooipRCcyrFO4LDo6AEmimkFgTIH+uSTvFB0EAaSkjX FWXGY8jT/OxXnJiNFCm+sXbZYlEWLj3RHdEWa4SqTPaS6xEEp5ORmTpBRQbyE3bIPe3Q2sgpWcZa EQmA3X379WnZqiUSyI05qYF4KhOVZeeufXuTXsfFmXXr1z165CiSj5cRbCFeCt4g+/cdwEVXl4DA YVRBGxkRkyZNGjZ0GBBU+3FMH4mTJ47jnt66Vbrmk3iFWMQFo1iFiVeDH00mvbWTlnAoxXCEEk5H LFmyhCiK6A40Od3F06ABBKfwJ02bcNsrIg3l8JZuRcVAQD01marOHbh0MAaSyxLk/FISlYpj6tLy AnD1roGbDZsMaX/pwosuxOZ9PBPYWmUnnnpi5t133UmTG6JjlFv26VDCoKBxoHMgLRyTOIIIcX1R 69Ytu3TtztENiCSL+qfEwEOSgcZR2aAfPl9zzRuuvPJKtDFHVl4k9FdJcUKzjyKhZgLtJlZBja5R 2BRU+50PfacMK7qCY0tQeHhQRJ0EkC4HoIOR90JwE1Aaz0gjf1UqSKxCyIM7eNSjzRuQzZwJExgL KrekQUrZmmOnzo0aBzglR38pSCXn0hAwCc53MT+JvAHWkazgAVcUkPf3v//9goz5Gp2pTo+Av7aM Z3lVtUCelauSI7Hk4D3Lq78SXtVk09OlyA/oWVSkZwiLInM0hu32Hdrt2rUbrxIOoTEhYyxsj9tp xw5szbMXPvOxJ9g6x079xBMzuU4yltg8EykTzNS3b1/sdhgluYXnyquvatSw4c9+8rNf/fo3hFEm gRe+GA063WfZunXjpo24DwYY5O02LHjQQyGsbXxdsXw5wfWIA55h0/IQhCyHiC9Fcdc6J966ZLFH brrppu9//wfbtm1lLWM5pArWct4bfwNUGsFJIEA0yVrIBz54GQ3LJ3yg4SCJRx55NNCeC7yAkowA QeKHcJ07iyjBWwg1DdoEVcHjWMgF0/zVAVoYQYE6UVAgNAQ8FQf4k8u2QEEUK4d9yZvYo4dsDM/Q zMIPRCNINg0UuIgVZDXN1EnjvPPOGzJ0SNmJsttvvZ2TsrwXkVipcD88AWLK8CUV8SEx7j0gJ8rX FE0JVMpHECyFEACR1suDTIiP0FYMJFvgJz2uq72u6sIFPWvVtfhJV295lfB0hre0hZOYjCRAMJB2 kDf6Y7269RF6nFmobE92AnXNqnWNGjccMLA/B3bxBgEZIyTQu2nThtmzZq1auRbLtMclZTsFwkMk h+re/JY3/8M//F9ilZQdL3c3VyriL4hXxIbZe/lLK9atW2soGLjUv19/WrxixdL58xfxK05NXAwF LAO5grmHDx+OKwsSyAEDHFHAhzrrr1uz9pGHHvr9LTcvXLSIE8fcc0nnU3kNVDwwcAX4z8MyhaRC fspdTTLxqRj+CcJjRacRx3bv2z9k8LCPfvzDqCLYq1s2b7lq6Ypf/+qmOfNn40ZCDEbyeIk6oVnS yYtaqLL169Zjz6ouykTL5o169+o8Zuz43n0Hrlu/6elnniEWJGchUHKIRYhGwVRAi/BaIdLOBz/4 wUkTJzVv3uz+++/7l3/5V3qDfkO6YTX9i7rLRhm9zFd3wAJn2++MX6VamzQN9IGXGcRP+1piZSVK OdGRyfcWaOHU6DzDr8iP0iikjm0ixy+8JQGJkXAeUNLoNe+xgtpmzZqipXPK2vMAior7dc6uTj7U wpRCvW7oqST4iaGd//qyRP1xKHQTmxK1jWcOPVeW8Re/+MW4cePwdYn5mZTIGFmY3MjOM6fSL7ro IhLw5v7773/ggQc8ZFKSgAuzD+OUckz/4IMPeigoGhIZBw0apMNh1O5PxKGyCue3yAipEIPObPo/ /OEPFJ4nJs+r5MHYpEm+ZJ85EA898R5SWVO8iK24xnwbXQG9tS3PZJ+hinLi1zzlsBeyg8lkJywV uxB5nhf0Mso5nwLiMfpQfgGvqhAPmm+l+QXCfoTDBRlJTC/zoUeYae076MzzSm5ERgonV75bpY3I s8h5dCtMoy202juVg8nRkOCVKWmjKV0mTlqOBJAXwWMPx2Kp7uc//zmUVMHkfJOpkfY+9NBDUSND wFvhKhuD9jW/enq5QK6qyBjCU9xG3iAqF1xwQXQBJHlDRbAOspHtAtnga9XiQbdSrP0rf+677z6G T57JVOrALxYPmml3P/fcczK8IKMDX45ROLMElBeP+nPOOceJpXjUk5gBTmP5tWDU85XxUiAPVER1 sIIsdrSClOcVHsLMpQW8ogkFI+K0O+uMZEzIOy8TDLnY4tfWmCzcHZKNmzu48bPgAhca4OWI7Jtz 1/uunenmSEKIIIi33X7bD77/A+5zsZAoWfaxIDFPcSUkmJ6vVI018eGHHgbcUQvsM1IEqxFfWZDY om3LbdXNmjL9QQmlwW5AG3zXqooPwMwnHuceGc6r4YqaRaIod4pAQwCGXXDB+YgdxX7729++4447 XQzISHZNpzy7NAJPSWYvutyaUqMazxAwbNiwCRPOYYW+9977gdRsUIfBTKHB2j123Nh3veedI0eN LDtWdvdd99xy8y1EfuDwKAwIESGX9jOBptYykZmwgKJEqK73mswF63KSvNrhFCY+ruhkoWn8ygOw mw9kA9Rmz54N7jEBv4oaqYjEQBCSMX7olA6d2j3y8GN33H5H5m2f4EhgYqGwtVipZJAd2E0H8SsT 2bJly6CWseFl8lTNx9B7ZFGdkEjtgoG89Q+xjTJct3KocmqWbL3GQ1RsuIyVJMo3arvgCSnlmX4n I/W6y9+oSUNE8+iRYymGdvMEAjhwuW7tOmzhPXsB8pJKQCGZ48EJ/D+YklavWotEoYMI8oRN8BCk RQkf/OAH3v2e92SuxuUHZAumfnUJA3LiXsXJRbxX4BVCOGTQ0Ew3O0xROHU8cN/9M2c+kaE0bLQs 7Z3HjRs7YODAc6ee2xi8i3/O8XRolcHIgvzic8/fdtutTz/7zM49e7L+qJ38rk8Q+Sfv7pX3Nkli k7GrPJRJNmMloJ68xROArg1xx8qOcS38e9/9N+Mnjdu0ZQNC06BO3d/88tcPPfwIrl0NGjZie0kZ eFkUSJSEC2t0vQYpUjke87V7du80eeKkwYNHbN6667HHn1iydCmd0qFDe6QFrbhr124rV61csWI5 fme9evZh2+Omm371ta99ncOa6Zh1ZhqnC5j6SU/R0Axkp/dFz+pXig2J3TaR7e7nOKDsLN08lBaN 37pymYW+JjsdKsj2yK+nBew4EjstWL543UKybbm9TGtIKfLAKDMAFOr3+PHnEFST/UAWFRZs4b71 SjCFeyzBKtjRgPOUULB05WXJ5+IlJGZa8oq88+t0rExmvOGGG1icCpA3b0AtLHXXX3/9l770JZfq +DAEcF8JNBAEMNIxrrN25hPzzFTwrne9K49Wg3Jqoa6C9HzVPabgPYZ5FQA+8DnWeI5VuO4W8IrC i4kh2bvf/e584WT/yEc+AuU6u+c/BbwyJWTEHkK+RrYXSFBczmc/+1lqLG4jvP3yl7+c7yyfKefq q68O7SKfMV91ccZiymk+mlVx1SAPOJzHKOAtCi+ulF6G+Mrw6yvncAFt8pCO4FMs2FX0lBmLW/r7 3/8e/pfkFbJUUrZpr7qcQ6O4zHgjnXz9+Mc/Tu0FclUskJGxQK7iPb2A/DB75CtluH3mM5/JdwHd CudLEsYoo1Hg6YImUzLC5jCPscMz/mawLnRXSkYsi8XD0uxuUWK+d0qSbeGMFwuPJqOfUD4TQgH9 DiXmK8YmwpnnFVn4Si0FYJ2XNJbBUpDFxLQrpouCuvLTXb6i/Ig4aWedwYwv+xQK4FyutImyE8rG N0Iwd87c5559bvacOStXvpTC0W7YAF+ef/55QPP99z3AtRok27N3V5u2rfDHzO/5SqglC+PAYcAg UHX3Ht0wbnEbObcUgjkyb+l0hQSroIZMbEitMPtxB2bLVnpn8iuLLp3K4uTiB1Lo338A9lq2xTGl 8FJklrlrH+LSmeuvv+GrX/3qf/7nfz755FMQ4A41yXTA0FAqEDSABuufYFSaZYiwGIZAOZgJJDxi xAjWAC3W0cD0XLOGgBIbZxbbpO7Bw4eAk8ARA26EOAZihqrQzxQyRUEAauGm4UHkqn9zxE5x3zxY rT8GraCNIk7yAkA1MCvreWkjLxzL4jYeWbaEADYr2P0WyGpBF9+LucVtggZf8kDfsW9OmA4303kP umVfgg9mP1FLgchGq20XH2mLVliRVdMQzm4ijcgeezIpPAsxpDPHpMilTwJyhdjw8UweYhPKDCXz 7FnYPr37ML127YYHf8KOKc5fOoraOnlg10zYHdGirhXLls+ft2DxYi6lJxc35iTDv5xRijIhTEHi AZEN6zf4IyNeRYNDirIsaf+AQIHIdId2HYYOHYY1l32GQ0cO8ZIlcOCAgXgC/N37/3bqeeei4NBG zgTfffe9N9zw89tvvW3d+rV795Vf1YmrTJ9+/S67+qoPf+xjV1x+VbtWbWsiLDWP16rLlZjJ+ztk CRapy/mpkCtYjZt2JmAVd8jjw0+ckgOHDvbq0//jH//ExClT9u4/iO97w/p1586d9fQzT+8/AJ2N 6KWsIaiIqc8ouixz8sZUjvPI4SOHD+Jrcujgrn0HVqxcx/mKWc8+0axRnSsuv/TDH/rg//k/f8/k +J73vGfGjEvHjhnLEW18XVKaWS/edvvtv//9HxhT3L2V4ew0XUAekqA2hbO38SV5qeKqkGi9Jou4 NpYHOyikncT5TRu6WNCsl7ZIWrRt14WKpeSoEvPsHCJVYnrkEE1JzC1t2cyAD/cBJkzmRsTVvSyI oZCkOGXg3kLcNWJzg6vHsEoULBjxNT8j2bnV/JxSRtEYqxqmMrA7Hx5AAKxbrMF5YbZ2VkEWZhIA QUhDdtJj+kKYKSeGc3FG0scnjzDyjfrnf/5n1lF+Zc2mcCriKwhDJ/Uqmk96FnI+PFRWeMnsp8Sr yggQdoOHgCAwBMq1fwM+eF8MFknPS+YrAFCecnhbzS5Oo7jio0EELgV7S5bD+kWH0k3g1KuuuoqO llSIoSQoKcCCBZTIW5l8ShyuQrwr0ydLZpGTBUzmDeAEVv/TP/1TcS7eI5MkALcp26wCvKHVtFel 7otf/KJ8s3W8oXU20ybDLhemMzIG4TlVUxSU8wxJY8aMgQaHW3EXUHtQIgdiOBQonDRH2M1gZEjS Ugq3s7BAl9RYqhC2giarb0MetTMkpTwK19utQCBPVZJj6ijISDPpvuLSIAaOQQxzF0rLK5HP054E TiljOfIO0MMK4cLAg/va6S6VVasWLFiAiY7w2yJvvBd4CUybM2fOsqXLgObf+Po3P/axv//hD39k JOwC1rj+seqwOAHUAHmt27Tu0LFDmzbJhQNLJIgKq7OWUYCjq5qADCMfWUjgji30QIColALBduDg UaNG4WvbqWMnkDFki4lZnnB+uO222/FB19UYlxi3iQXfySE1817Q3ZklUEun4Jv3wRbWSGjL+LAQ L2IMyYR2YZkkmS7FFJgVe5xrFwmwiH/Co488ivHSmCd2CY1yWrTYAEMBDmwydYmQTObyrJEYzuiH E9ESEn+ylZ4G6t/Mg4Xom8GqD7t4ae38FI2KTqE0ugBdCMMg8fWsWsSWR8YZukrNxI0ewkAilCaC kZmGXYdOOoX9CvAECFg1pri9gQLF8dHkvMpBXVBO71OyV9OTWKTFT/CBCCp8IJ4eEXCLzNS+IiO0 QZjAaNr0iy+dcemFF1x03XVvZLVBe4A4XLGbpB3wWrBr88bNhMrhL/FG5syex5VDQCg4IbxTsCVS GcM5G62d+3GA8diMiycFpy0/Fa1OZmmczdO2e3LSTgFG8BKhYC5JPf+8C97//g988MMfOO+8qcgk wQe5ReiGn//iy1/+yv/++H+XLF6s6V1/sImTp/zdB97/lje/pUe3bnQtukA6qYxNOkPf2dHHl4Ut yE7VQQEVZgdu+Q+ko1Ps3bOvT9++H/rwR9/xzrcTW4j2tWnVZv3qVffcc+/mrdvr12vA8UvM6uXH I44nPJqVmTCuXknJCM0UkiLtHdm969Cy5Rvvf/iJ+++7a9/O9f37dB8zaiRuPK1at2aQcQEmAwpl lh2kf/u3f//qV77GZJLXvnh2JIqqHRc6R8FJd0hiENFYx6/4W18m5xz+xpzopKGDGTOJ0w6ipfNV jA59r1U77VBVfZvpG+jhVxtPac6NXuOKysQC8Ktf/frRRx/nEqjYTEv6Sg7BO8nwNxsv3O7Ubey4 MZUtUcGZ6q9hpjyljAgk6xaQMczVPLzjHe/gr/AxXzurIHtlTC8gkrAoC4aACJG+gAAhTv70Z5jf 8oWzlGo1p/Z84YAGDJP8WkBMPi+Gtyi/ZOFnnMn5ArGJAqeAs4CeeK/+APiGOXIgPrhE8kwzgVx5 yk8J0RYwmbzBgZLlwBYooa8LbKt0HHQiBlWDMwoPUvN+EacqnKeXHgZCHk0AYOWZDBAElvGeJhTA Vr6iVChOGBOtl5QgSMB3eNfk+abU0brgJE2OcXFKlJccg+JX5hyoDYs1JCE8SALDqkBOqJHa8wOH XA4HfipA3giVsNuxLAHaiRXFqjWrqlsH6Bd2q/yYmMLhrUq4jmenxKJIXHVGdKoC5ysz6lFDe2kg MvxK5PNPRHkBN8rXlXiroYivoiWxghvrfHTbNcyIDpTZbSC78NfEn+Hm394MQCd9HrPm6+MncmF3 5HZAwoMQ6rtf/77/8v997rvf+/ZHPvoR8BwVUKAwjkVx86atmzZu2rEtLY1sX7JSIpeslPzKsufK 6mIGzCC8Wr36ddu04Sbw5IiSXGMzVxntsqzTwLLRo0axyJFeSqyLn1xihRGkF39rUQtW8Mz6SgMZ t7rT9OnTh9Lob5BfRZNP4AX24AMP/NeP/pt/XDOZwZpyr5JYs/M8sQohUeBd3mhyy2BuIwAWg7Dc w6cpFzc2jj1rFSSVDT6yDhbxYIhG8lKUXqQibz9hwAZNd+/WbdKUiSNHj7rsikvPO38qHSHICPRP RnEPbgAY56ZPnzZ4yGDKQjB437tP7yuvuuKqq64Mix3vhTUFcY7FSRJgq30TTJYzgcL9FVbbZJhA n2KnYWDDeR6wGfMXE7uWdWhGOBmZYCAIEHDbFn5FK+nTt8+okaO4NB73Ys4IgwIlhl3+rL1lKc73 jp3bt6VrdPjHtgwip8FSAC3ecp+BMoHj+C7fe8+9//3f//Ps888iVAgm0pgLLvJybwu+/Z6u1dGt KNncs1sbs1CKx2uUcVElAXkum3HZxz/+93/zt+/DAYZkBPdEnO666+5f3njTPXffg5/G8XQsElfj +gMHDXr7O9/x7ne+a8iAgTWSk3ZZik6YnLBTcEIpD5bCcTIm3J2gt/qfDv1cf3OYKCz/+A+fvPaa K/HVbtq4Ub/evWqdOH7/3fcvXrisQcP6tesBu49lZyvL+yipYolz4FHs3ZmffZmBZY6y2cMRyj37 D6/ZsuvZOYtQRJ9/8pGt61cdTwj2yI4s2D8cnzh5QpeuXVAtGOOOU7nKB4E3CClX4aboh7izVzhb q4iaTEGK3RgFJrORp1h+dpPDRNUd5YoBgngk955du5BSpAV3SSVW7U4Ded6U7mxjXWFxV+R84zZa ti3Ghls6LoyTFLoTWyuwhnbZ3Q7tQO1mpHZC7KOyTJ4yuWCCLvk1Rk11EhfMwNJQ2YcVi3Wr4Ffa 5Q577ORKALCbl6CHYnRreqxrBUWRCwtZdcgWj1JO7FwH5Rq8rf2kn6rbW0X202YyBIOcgif5cuRt HiQxlTGtgVeK8fHpUR5uyiflTHFfS6rEYCg9aQkFonVK6V+JYCMbTAu33HJLsfM9bBeJFvg2YIg1 kmaBrNLen/3sZyQ+JQ2N8k+vd8xoXkYTvY9IFKN5NbeqVa8op2Qyhw9yWDyWKbxACPka2kh1RoRD r3gvBR7CzOLCT5tdBWPQnYGSGxoqEsVzVzTn9PrrtCeBk2YsRN4SSjbBWaANHlhg+CkPyFw/WHxd L11RSKDHpEUFePVX3rDa4ZnAiavly14Cs44ZM27M6HEfeP8HsCJvz7wIWINZAsFPWNlfWrFyzep1 O7lvnv3crcnJhBKS0X31GvxKKRCsw5K5cOHC555/DtQxYuRw7rrHjs5P3ufCCkqZrMEf+OAHvvPd 73z9G1/DRp6s1McS2aoQlMnKSuF8ZS3kWV+OwIg8CLagbfbsWTjbGB6b1X3KlCmXXXYZZeqlwMsV K17COYfTn5as7dn7X+CS8Eu2hDRoPCt4ya/aw1IcjK5d0RxokTzkQ126dvjGongD871zh9JotVDV s2K2IrxTzIvzCvsPKQhg3fp4O7zlLW8ef8450Lxz5y6KUhKEIDx369rtiisvf+Obrn3Lm9+EM0nG gaZTp0699LIZl1x6yYxLL8HOTUvZEsF+yWDW3G57A7AGtb6MrzZBJiS5yuyLcMBoNgaWSTF1MlO6 IbdhAnzTLp5UtSygeMB90niUyiNBqGQtmhMnhJAmwFL0sTKwlzsGgB7qzcycydmZMwN78EM4lIJF atTMAFwye6uVGcrQduGqAmS77dbbvved7930y5vWr11Xp2ZdPaEDf+ebZvdRLJeD6uRA4bB31aqV C+bPB3+TlwSNmjTu0aM7JpwvfvmLH/rQBxEA2ohW8MzTz1z/sxt+/N8/vueee15a9RK3aELPgEED 3/Ged3/6M5+94tLL27ZoXqMM8y1XU0FDwuAhxrI6KXn8NwsgiKGdJABxvKtbt2r7yU9++uKLLzqw fx+XeXbv3rld25ZPznx05pPP4L7OTlAWM/wI1wHJk/SX/3KpVRlvdDlJ748chaUJf6f4JYdTIHBc yeYtXfXQ4088/tgDm9evLDt6+NiRozCye7euxBjl7k9iAdEKuhVZpYu9oIpeS3cxdu7UtHlTKsLW nsS1wmWLB3vBTSqFXwgeaZJOlV3tLsIG4KqSMZkwQAwnQu+bgF/ZIiOBW2HhigYlumI7duShmnam Y5RDapVn3rAjc8EF52FQ+LfP/9tb3/bmdm3bIV3qvaF3JT5merIGcswKixYtxjuupDlHgSn+nHRy ryJjZT9V9l77X4FdTQxd7JzNS8FEZXY1spx0IbSuAkBgk+k70EbxYcQqGvVq8qqKztI8nHc5lVFV mI1PlfIo/FQzBtlkhJ4CR//qCMxp11hQ+EnLUTby1m5LMKMCWeDXq9JYnIWXiNNJa/xTjEG9JsLa XR0Ol5wEHIYFIsTLOEBckEv+MHzyY7D6ige5KDx/5jhfvvJc8sTCK2Qykwn2bNhVcsKpDv2vkIDT 6KAqaiyBvIUC2pME38JoV46ASlGou8yxqws8GjUy7SmjfBc4TJud0sAQHFzDQ2LBvAWgDUpYvnwp vitUZ+hfoSqOLXTk2jVr2f0XxUAM6zGA6bHHHlu8ZLGnpiiQNyxjXJc8ctRorrufNn0au7eQZIQ7 wTQ4pkfP7udOOXfkiBHJCpiNU71reNCFlK9awXlj24Pd4lTKpI9ZnlksIZi8VEEyfB7wdgAeTZ48 mTHPWg2o1N6mSUwWleOVimiGMlZOBhyX1Y4KGIjZj4/wUZCtAU+PGt4EMhDI5sGEsAAKgTJwQBuz FdlfCUo2boQTzqYNG9m4AGsSxGbKuZOvvPKKS6ZP69ChI1Y82phdR7oJiIDhvUd3TOTYyCddfsVl gG9cP5o2IWx5A6rgF8Yz9HDyNVlA+V/FhSYhLTyEUmfb46+iJUyUTj5QSMnwNsUBzAIguuWihgZU wmOBWQABoF+QGRpLLwDTIZK/mOEhCVGkKCSBVjz55BMoBojWo489xg6GPr6JGzWS/TIpYBnZMpOP nkicGWzSuGmrlnhoJ1dyz+ZKJzQDb6ETqfjNb35744034t1bCwBNwJGaqb8QIlhO4WE7j9GUcCpx Vw4dJO/tt9/+H//xxQceuH/vXpbnE+bllvu+vfteffUbPvvZz7z1rW/u3KUTF9bAAbye/vd/fvy1 r3z11lv/sHX7VtB/+w4dL5w+7cMf/ejlM2a0a9WKyoDEeHzHgJW34eSk8ZtWY6HniEXHTl3e/e73 TZt2IebgPZhu9+4mxMszzzx1y+/+sP9wWaNGTbGMZ4sbmcpqpLPFyWifkDaIOJnBMxye8DFW8GQI P5Z84FPjjh3cz3nQbTv2LVu96bGnnr3rjltfWrqwfp1ajTDX16uPfwu+0LCRbkJ9PW/q1CFDhqJr Cakzx6pGLVoR7YibQRl95e5Y+l+Jg/XCYvAaUcdYNwgDCBtNTHs2sBsJEXDrSqdA2n32oyYDEpBM QzimcXf2xPRRqQ4tZKR5BRtZJG7dpg3zz/iJ56BZzZ7N2ZiVypUSRUXutvE35tVsYB4HZV7/02SO OqXPq7OcuKAWoDEBEFMTzqk4khZ8+KnYvJ3H7lVTLmrPQkUVfqiO9yWPTFXNuoIaEbkouurN99Nm svRjP2bT308xhYgcbCl2LcinrD4BNiTQSTUz0lPQiekXCrEp2nGOjlP95GusPoeLa6mCcru+MjMt PiH8mj8o6cYCfK4an1WTV3lS5RsCyedU/TccC1J72h/9nmkXOwBRSGDx4rHjG1JaO002FlD1iTcj a1DJUW/VVexrnQaTbRdiyRRa2eEHFY+Sp6sLeHvaBJzZjIUO2VAZi4S406UlPwhj0XK5Es8J5lgp r3vjtWyUcO3lr276FS4oWqnzRLP8aF0Go3MnDYcg8SJ9+umnOEymHdEFVUMj6xNQA0jVtkZbjI38 xPqHrKxZvbZu3ecmTpoAFgr/bJZDgiO1SocyW5ORs5usnSzGrVq1Bpz97ne3EMiM81CLlyxhnRZY a7UisVersPQaw5tapDwAFk1gjQdr8h7oBuaDVBAwKzTJWN0hftToUURLZI2/7dbbF8xfoJHMdV2j l+ySYz64+vqrIhKqjghV5Oc6LWLgPcXi+FFWuzx0g1mC1RYr+PC9CNLCRcNWylcOlkL8HbffOW7C OCZKDOnnTDhnxqWXwpYXX3jhxhtvYmoAyw4cNBA2kQsvjG49usHzocOG4pqCUzvmus5du3Dhya7d uyEVYApWBvVSOJsb+EADiK0xgI6iFe1VGfAjVfykqsMHSkBCmRl+p0WRBuxCMo2dpAwHISQQAnip E5F4V4bTcMbn3LlzOQXI88ZNG5NNvX69LCB1TcJpg0Hr4iuCzTmZ+NMx36CZqN5oHW3btOJSGxAU 7iiQZN85ZJJeVKsWpuLHH5+JCBFWctiwod0Jh1evfgo3kvmW0InpOEHd7Lqf4ylitIOLvwS3+v3v fs+ez3e/8z2UxkEDB02/ZFqPXj1q1aiDytmkWeMRI0cRjnPixEnf/vZ3gEE02YOnXC47Z/Yc+mL8 +Am9e/UeOXp0vTr1GjZq8odbb924ZUuNmkTOqYNs5YdwuvwGRaMWfK6NQKBcde7a47Of/ZdLZ0wD ZHIfI6xr26b1nOee+NJ/fHHVmo3cWsupTQA2XCJgoeg98xAngPlxei5x1/t38GCpWVYrYXPgOO9r cQCTY591yg4nwF7GWDu0b//zu/bsHzNixOARY9as3fjUk09zhpWApGxlMF+3at384AFEvYxhxRhE qJLGWJbuJOKKrVQ15vl9yV8fwRAN2wsyE54w5OkahF+LsmcZlfkQrbz4hRw6OkTGOpxQOIW4b0Ze KAk/E/VYdem8zuyUsnrVmjtuveOJJ55kGjSmkIItGWQpH8IVLum+pMl0aMFkmyevimenhdOAStXP CEsN8VlgmK8s5ALUFttNC3BhFY01ZckwHXk+FDS5OgAisrAj76a8H4wp7FaXPLsJWBE0FzC5ijgY eLvmowoW0xxkgJlIDBsLXK6Lu7s6nSUHSqLSYvEgMTv4EXWuOjVWh8PRrafB4QIagHfFVElDNc2c pKyCJ9VpchXjLoKomIaZmd6s+vjvK6kReQv/ewaXsUE9WSE3lE/HHT+ddPgEGzkieUqzh2dAK+NM yYFfoHae0nzlkRKcZxikJWdv2O7JZkfxSWWjOkOpZOvOVMZC5C32pUrXGI2OWlJdZqJ3AzsGqHIp YpUCdQGI2dnReCyLzWuZPGtaxl5Cwfg4btq0BezCGxOE0d28e/ew+Y/BlQhxB/H5SPcOnjixbOly FmYOhGmsYkt3985d27ZuZf+aaM39+vcbP34c93KDdYmSQgSCu+68e+niJUAGApNjos57SBuskGLZ 6daLAzIkOJZVauRXIqjwEjQPgNPbgahheMVAOdidO/hoDmbjSZMnQAlIVIdsZcWFP4+58+Y038so l3myAALAmnCGv7znVyrFv7x9u7Y7k9POSs1ypITtPMhAISyUJ70lC/bCX7mqYsN7oYBZKHzW7Nmr 1qzu27tPvwH9R4wY3rVLN7BU506dBw4etGTxEmrs0rkrhwjvveceOovLQTt07EgJIHJcFsCa8B87 JcfVAJ34DPTr13fA4P54dIBlOXkWQzpEhbbQEOlUKkK6FJhguwcDwFLqSDQh28RIjtfgAOoiMUXB fDC3ossb/Qd0GNAFiL80nC4GQO8/QEjp8rg0xBZkOyXx/MTx+g3q4aGBglK/Yb1jxxKmt9cgiaA9 HCHo1KUzfhGHCP9BlI96CUBLrbtDblDAUMJczpkzFxkbM2b09Eumd+nchXDeNeomZYAQkwdO7CdI ByIKeFUxq1enPgErZ1w244UXZnFYGSv+7NlziSUydOjQSy+7DBSeQmbXrc31saNGjb7q6ivvueue zVtSzO8MzR9BcaILnn32ucsvv3wEbvhjRnXo0qljl86//s2v0XzEefR90sZ4zoKZZKc6a2PGPnjk AD/NmHH55VdcjlJwoiwhTlxucHj/3Kc/NXveghYt29WmlccZEaBq0DUnKipCJ2bYu/z2oLSFBEBO N/EcO3H0+FGAOHpP3RM4rqPyJCZiDD+aKSDH58xbsHfXTgJx9xs2kjsBOBzLzgmRjIiz3rAxkbxr c20nVNFZLVu1wPRtLxDUh6CF3gx66OBhjOs4CfETPKR/DclPp/PAcIY5sRFnHxVMo75RIAvWgBBX SshiLqVI8BDDcuI0SBalN5TYGOBIIDT87ne/o68Zm6R0389dFNM7uWlE4DmmVodkqHMlF5iCVuS/ xgRbRZqSP4XGnv+1mGks8KhGxcg7H27PEqqgvKS1MqaFYvKqBjHR5KgR8qpzMFEms1rrGEouCAMm 4g3MGl8c/gyH9WKf9aC2ALIYNkRIhM8xINh9fz7AJpFTnnKcjyEA+EsgbX4COpASYStp1C9ucgHT oL+kcRciQ9rNgmJgiENWak8W8uzfPA8Laqwmh60CDvOhd145h0uO4qpFPSg/1WOR1R9KYEF5ZQNh KSLEc0lf5OoM3vzYKW5ySTlkumNgSkZ+LNPqKvyegycqaQYm4jlPAM2pzKcrCg/hz2eMIO7RZHhi zJPT+DCgMHXTQD34S/YOTMAX5Qc/+AEBkfiQzM0E2lWZ39RJh1JlpJ6RjIXI2/VAMyEVBAqPyZGH vI0H4mI8856FCodXdpqBPjikCpVME8koWbQHs1iW2rfnFGCKgIHfiaH43UdOZt2KK+KgJHl6HCsD 9xDqAACAk+iGDZsIPs1pujZt22CrS4cyt26bP38hl/xxWTfrPB6iHG/KjkwlfQCIwMlOSsC2TeGs 0KIxt5gpH9gExsViSlGKEYtibNZDP2TzEzYwRCFccQR5AHcKefHFF8EQAwf279Wz10UXX0RsE34S X7q6i6rDAic4UJhcgwMuyHzeUKy2W99AHjbR1m1acYcRWARohVFNAzCfDIodFrWLFRQ7QIAIkg+/ BkKlfOhX08CrZ8+uFKC6d++eHdp3aFCvIbc5Dug/oG/vfskGXLsO/Ln00kt//OMfP3Dfg5yqBIRh +AcPA5XwlN68ecvSpcsAPxgvwTMH9+EPc5S4HyI/yi+5HssT2RKyxEshCFngOaw2CgRx5fD0toP4 QA/zgq3WLx/uGXZQ22cyaWcnL8N9iFaw6cEFJqBPmnTieK1DB47gks0VMBwKIDFSYQC7tUfW0zl0 CkXBMfQyxDJZWIm5eThpMuhyUAhVfCgfQyz3eCYPLZjPhTbHjhKfMYt3sQn39959+lBm5kx14LFH HiMuPlc2gsgxr5edSPffDB08DD5v2LT++9/9waxZszjMjLn0pZdWsZ9A3J7JkyfhicEwqlu/DlGi OX+JUoeqCUZ/+OFHsEEit88+8+zCBQuHDh1ywYXEkBr3jne/q3vP7jf98saZTzy5Zx9NKL80NJn3 M//u7IYkFOOa50yY3H/gIO73qVunZo+u3dq1bb1h/dqvffnLjz43p2njJujd2KoB1GnUZ7d0njh+ lPssk9E7nSMNO2s6spk8dlLIwaPYvomVAkhO/7Dv1+Ahi6eS7rlMvipoUSlCSs0aUyaegytJusSB OzBr0Sn1jtY6igdU61atOEmLLOFEgoiqK/JhtMJiRAVDOPsVfOUQ9uo1q/XvJyVvQpyUOgUvBnLM p77PwyYTu9PCg0JomREsBbY5vngI5J3oqYjeiBBivXaetNKYAEmjhuaQ1/tIydfGQaU6vxUQWfVy FbNrAQQ86SJXRcbiBTW8ugsGMuC4oJwqxrvbwQHsImNwqWCi8KRm8dRRknKTVR1qI18j6MHlmYxg FOoC+wJujF2Y554Ru2MRDJIM6hxSJAEs/IaVwIYdQTPypeXLkWDMgVRKkA0mFoYz5ejLnt+1r6LJ UbjsLXCEja7MiwfrgvbaCKNeTSaflMMh7TzI4ZCH4DD2y2IOF2tZEAx7RWzFAnlS8Y5cxUCwsryn OpRCYzEj14Y88sgjqHCcYixAscU12r9VdGtxkyNyvCwFztLjsAgNCtfq73znO3lGwfzicPXFvYz4 kQwmoy5iMtBazCioArPasyVHRMlVXpkMhbagyRguq+5Kg6WQvYrpgp+QtPPOO++HP/yhcU6lhAca UuDKVZ2hVJKkM5ixhJ83ywlIglUhrMKagYXjBVYZLamuUtDKV84XElsQHxIQoUedwopjY1xy3CvH bYOqcBFp374dhuTMt5tN8i3uEUsDogCKAsTQQytfWsVOLm7fdeoBH2uC/GbPmr16FevudtZybh/c tHnTvLnzNqzfcPBAsnc2BZI0acqamLAXJsa66ZRkBmf3GTDReyt0ZTYAiDGh6SqvKw/pp2mQwbRI FhAPrXDpReJBRZjDyUtzuN5y5synwExGAKSZpAm+2Xaq09gszpbhfHimOiGyuWAXJXCHC6BCsxnJ +Lp7917yo060bdMWAlJwuszySmvdGacE13IQg07SUmt1JCYBzzhDTxg/YfDgwYROob3de3Qn+513 3H3L727ZuHkDaUBseAKAqo6WpWiMGGvJi4cAlwQ99ODDzz37PDiFqMwERblo2oX9B/SDPLoVcX/6 6WeeeuopZh+6UlWNT6CfvD7jCFGKxExqI7yBAOhhYwSTMHb3Hj16EQewT19ctzsSz8Qg5XxIRvch DMScQRVhUjDiO2nIhe2ZPjUZV7ITdhHkx0yedjkIi964AfVhVCYBkkbi66697h1veydwGSVK7M5f MuKOspNog5u2bNm0dfv25FZutxrghSsYUUJwjIJyMmZ7HUlxQvv6yle++p/f+MbMmTO5/mzRgkVP P/XMnXfc+c1vfutn1/9s46YNyZ5dsy7bA1zXikv35z//+W99+1sXnH8+EyJneEHev/rVTUS+euDB BznYwNECurBX795XXXk1URE//JGPfOzvPzpo0EAEiVOhUPXkk0//5Cc/+9EPf8R4mTR5ynvf9zdT Jk9u3rgJt+8QrBuaUpCQEzUOZz5WuM9fNOPS8y++ZO/+Q08+9dSG9etw737kgQc+9Y+f/Pmvf1u3 SeN6DevVKOMoRTIzc56ZsZ4s5hkMT97r6VPuRJRpdcb9AGGn5PzON/zYk9Sl2YMxeAwe4gOyZ9+h 7bsPLlq28qGHHn3uicfGjhpx1RWXDxg4gOuzSEd6opVzd8PAwQPZWmFkoWLFXaTKSdIj6tZmvMPn rdu2GvCUTqdT8mg4vwwUzNrOS+LsVGCFBTrgsgphjJeIb+gk5qRhRHmLUmhD1K3aUabySRok1g1i vpLXkRjjlAdEPWZ8CY75p7KVwMFe/GvVGaW56ozVIaBkOZVlZPnUOMcIjYkuT3k+Y2V2yioy6vtR mfvvSWtEeAz7UGxsLu6Igjbmv3qYD9hdsOVdsjcjo0ESDUVsNOIITHFSyoOHBecIq8hIdawaxl8r KVpKb0HvlDz2WpCmWK6ijTDE2Bdw+DQEO8pRcyvpGW+TC1rES8SpaifgkryKwV4Zi+RSNJkGAl55 SUecdPCqIhYzOZ+x6jGo4RnnXsrJR4EM5bOaTAZD/8d//AfEv/e970WZ5APyRjUKrayyyaeywVuF RJ102inIq0MUzeS28pPySlUE8YAnEYU9PyFUfygVi1AVgl1N8cjP7eX3bMcrDcCxTR/WI4GgLQ8c GehQXMVPPmjL0SocGCufhl9ZtwCyBAnhQ3wxauQNAbmnT5uOc8jmzZuIzG0cwxS1cM8e/gKtuIyW mBvbt+44dIAIaG3bt2sPJN23d199Ivg2atCqdSt2rnfu2mlcJMzhDRo1bNe+LaumiyuUC9HY4/7M Zz79zW99c/yE8UBb3gP6MfdSEcko2egZIlpXaFEvwI6YrJDKrj6eJ7hYkJL+xsHGiQA0jyMK+gNH Oydyg9+kiZzOc2EWanukT+TtuOJXdQzVm/hLAiql8KHDBnP3IhhUh280BHhbn4jDDeoBPjDhgxfB 1ibwkh0SUA7MgYFkcXcb+BK4PKklmdfm4GGDr37DFTNmTAd/pxtG+/QhzQ3X//xHP/oRk/LWbVvo VYzCdWolJ9eNG9fjlwKHATrzF8wnGgNxJYYNHzJkyOCRI0eOHTOaKsB/2BhSEIktW609BAb+uAcS kyPNDxOjKMSvPAhlUBv69u3Tvz9IrB/9AmKkUcQHBLjgZUF3gLaJbDNv3jy8YriHEuI5Vckd8dA0 7pyxHHTDB5puEmOlSHPEqeD0YtrxTzZyIC8+3Hh+o7+BdC+97NJOHTtzD/w54wjxMs5I7ZCBfCJO uPcvXbKMAPZbtmxWU6IESPv0pz/1jW98nWkLpIg7CT917dLlbW9/KzEB+/fvi6L4yMOPXv/TG35x wy9/9avfLM9CUs6bOxcmf+2rX7/jjtu3btucIqrUqI05GnEi7uHn/+Pzn/7UJ4YOH4r4c+SY1n3p i1/+589+7jc3/Rov5uTU3oibItONPFdcduW3vvXtD3zg/UgriYm4s3bNmjvvvPO//uu/ufpqzNhx n/r0Z/7mve/p36s3bdyfKR5IWMvWbcZNmnzd2952/rRpzVo2h59lR45v27z1+p/977vf847f335X jVp1qCO7bOc4fvBauxHi5N2dWbuTubscfKcbMY1rAs5Mriy162b/QOfMGCnsyTGM3Jy4PMK/pGQm 96f9B3ftP7x05ZoHHnzgzlt+Uats/8TxYxn+ZUfSCdoDhw4wCYDFUZzwaEI/9JisvluICDiZYYVO mG1upIBI+lmpiSk/edhdcoWLSc/0ZkEgA3PHjKe3CcNK+eQvyeh6Kw3YHXMjvyrMplT+eUCLYJh4 DsE9PZIxOyGWPJOGUVydGd80la1h/loFkqhinYiM+UWCijS+FjhyCNoqc/wtJkDog/tBdSgXeRcc 1ao6o4i5pIGzOjVCsIt0gaW5anblf6UEplAXggLYXTUBcMZLQCqL11EZDQVM1iXGQqqu0b3QynhV WXXB4ZKQrjpMDt+GKuTzpOVIdrGCZMaShn/rpXdOm/JqZsxrjFW30f2WkvqAGfNjsDIMTTJAS3DV LCHG1WcyOicGYz7E5GaXlfNsn/rUp0qe/gQBFw/MgumimrwqGDsl+x0/E4bSF77whaqHgL9+7nOf 4y+JzyABJx1K1WdyvgnlR6+EgPwQB//t+LAABYY2s+kjF7/qwyBCdb3RyFpSgKSVBRgzFbM54Bs0 jHPnt77zzd/85je33X4rZ+V5AxrOOy5TrygZ0JmsjC2a9e7Ti1UZj1tutG7StCkrsS4WlIzlNfMT SIRx+R0w2tN4LNJsTOMRe9lll1/zhmv+4z++AJ6jTFY+fjKgmMFAErrN7uZwPbbVWtS8aJM3hsvQ wqrckJiqcRhYvmw5YGXI0KHEwROlCdRsu19dkuMn1/L8GxZ7sPtF0y6aev65OM8AOoiLh8V30OCB GHhA9jwAtYFrQH+PgjHvx/WNVAUPdUfRN4MPNCfEmRmYQTlQA8cGDR04fsI5wHOIx0efqCZLFy8n 0sL//M+PMV7v2bubfy/OeuFXN/0aPA38qBgkBMmmE1PgCKIk67iCxZc4cZOnYHKdzN1WOoGE2ChU oYZpcfQvPylI/JUzPGRaUy1jOLJFsXDhIsJac2oTwM3OA4EjmIVpBZ1FbMSevXqOGzd24qTxY8aN xgCPTw7EuDmhboO1G5WHoN3odbt27gK/c+MirssYdDkzkHjYpIW0JQWsXUJIaA4wyuhvqIgID/Zv 5YHOAjNddvlll156GTfgXDJjxhuuuZqLMGnglHPPverKq2ZcOmPKuVNwmSAZKhmRLmAv7SIBfcSt qWwL/Ou//tvn//0Lzz3/7IGD+wiHAkA9XuNY08bN3vLWt335K1+64qoruJ0eQcKBmR0VdhJu+d3v 8QUH+YLUM5hbC2z6nve+9zsExf/Ih4g7gyIKtfDn5zf8/Gc/u/7gocPv+Zu/ece73onjUJOmzdt0 aD/xvPPe9f73f+jjfz96zNgatQDThzq0a9W4UUPcx3/4o//ZuGVnukeGc5mHj6S76DN/EmWS1Tyd y+RYJh2YrN5ZaHb8SXAmyQZHYkv6IeUon/s82KDx+ARtywJ/p1vgD+Ntv+fggU07dz83a97tt9+y cvmc4cMGg7aHoXAMHUoUcxzciWJp4HbQqkEGeXAnLf2tWZNOIRQMVahbBuZ2FqoCfCt1ImlKi/Ho nJZfA/gaqiDPhkviDUyOPSulS7U5jBSWo8Ar/wxDDp17MbI3BlgygqSHOrE4Sy4w+cnWiSg/r5bM UjBRx9dqZiwoU2NqrMQS4AJf2XXNEVg6lgkvVOcwcRUEx0/WlY8gnqe8pL2Tu1EtP2qsTkWRhlxq ESoY1WdyvpZic2OUA82VmV2/8pWvUIiIoXzgnEpoEXOxIqAzYKqEhur3ckGNZKwiaEwBh4NUiK9m jQWHHQt6qpo8V4Qw2+d5FQRcfPHF/Fqw9WEWNJOSQ6nqwDIlh1JlolXsVVzZ4FVByp/xzZdZUqEt 7qx8lrweRfPjqEABAUyklXWW3kGhNOb7Nz8i8oUX8KF41J/qGMy3kbAtDBnt8SctB06S2Dt0Cppc ffl81Wbal90QbZi7qzyEdccFrGAZC+7E2hYYPcTU1auyecSlzitXsI+yDLN2Yq0kdgQmznPPPZe9 XNG8aAx8yaLrnSnEi8DCzX/adWzXvWc31lzCbmCi4xcqZXnjAzjGYMbFlueeOxm4CQIXSUMeE9Oc ObO1BCfMXTddt+71hzqgk92Q5NRudDNnBP6KnqEZtAe13rHMM6spf+UeuYxpjd85js6wyHr91YU5 +GbJFstfvsp/0yPH/Qf257bzwYOH9OzRg1wtW7bAjAq0ZX4cMXwE0VR69e6Z+Zk0pZkqGAwtrLbg SA56XnLp9EFDBgGVoIpm8pLbZ3RapZnpZshNW9esWQcYxRG5cZOm9AUBy2E+d6lwFPX2W2//+4/9 /bXXXPeud777P7/xTc7+0F4gI4yiX2gXSPShBx8iNArO308++QwNT4a9UaPQCiZMHs+FOwYtEs6G DuMwDqMgLfWnUGD4SYAFV8HZs2ZxK+gsggCyGcJWCR9wT7rDslv3jh06Euhw3NixYH2uAOzavSsd JjBat3r9ooVLsFLjIwR7kRCqyI72Jmen3Tt3Hzl8NClXjRuPHz/+uje+sVuPHvjYyPxly5c9+sjj DgQam1wmMk1JmqMrueQFVicP3VoJSxHc/UMf+SCeKi1bNd+4OYWOjq2GLPh0CnhHXt2NKDxh3Pr1 mSz+6VP/9I//8Im582ejXKEOHDuejPEd2nf8l3/+l69+9SuEqMeUTv37Dxx87LGZP/nfn9xx+207 d+1AoOhYeIkuOnzYyI9+9OP/+m//Su0UC4vQXZ988smbb7758SeemHLB+Z/7t39/13vfN/WCi0aO Gz1w+OC27ds0a9a4U/s2Hdo0O3p41913/+HBhx/avmNns6ZNGXZHjxxOgbqTv0gW8S4hyKRs4OtN jenkbOrU7P+Z40nWt2LxLOxJNu4r/vk1HbJMob/xPTnCvxRQCHP+rn37123ePm/RkjvvuuPRh+7s 0b3rBReef9UVV3K9PGcu1VSNG2hUTViNkGtZZNy4V0YaB1TMNgLrPBC3WxVCZxWzqOPl85rSjz2u Kd30/KVGxJ6PWpnD1oFsUSHM/qrw8BL1FGytVPBVSaAclkxUMpA3ymS+9vxzNC2vFVSW+LQzsnSJ j/MfQIAvdRUIAvzKT8XABYhGXAUxnJRTMrgwf/tJ1cS7a2/hBU1micUhuwAgskUOnQwlXVmi+6rD ItNQka6oAItTZXLUAkTQ6ilyinIoHIaUPKYJr0gMZ9Jphxzl8VydJpBYDPfTn/60OhlFaXRKQY3y tmSNeQ5Ht1aHtkgDExQkdimLM1af58Bo+Ow1jXkm8+wxx5DVqMUsuOBDQ0GTcXF++OGHK1Mg83Se tHco3NoL1MuSGeluxJV6i1Udmnbbbbep55T85HklH5C6PDx1bHrWMN9ZZMQpHJfu6igb+arzNeqU VfKW069+9avIeQGTT0lI8tLLUQRYlA+YWFlR1Oh5AEz1BU0+pdoLeFWdoRTln1Q88pSUI2/xRCwt LiGuXi5UxaX7xl/5uPjlAaVLUbQksFcUxa/6XSAxxEXYtXvXF7/wxUWLFz351EzEDoyYzldl1mXQ ieDbHed0S0l27yAgIFmyayZLtsew0jlLbuFZv4FzVxDfu1ffyy694u3veBuOKKxz0GnYuxtv/OU3 v/mfv/nNr3G3xWUczBrX7oDYjEom8SLvcPiWIZn9dasWWbwgIImFU+8RWafR8YUXXsDERRuxNwuv aQU/gSahtmBIB7vkdgbR0wm/ZLMHVnumk+AO9eoSLQK+20EgEmzhWMHZfMc0OHHixJEjR3A6DQsu xkLcjRs1bti7V6+WLVpSr81hlicDtcBVSALTgk23bN66cQMePunGdWYEvDiIcCdcWLtuHXaUxx9/ HGRAWGsaq70/4DIt/d3Nt9z4i1+ibWJUzu4OrMd6yzOIgzUwb4wUo4TwOJ4FKIqKADcECT57vwlQ ko4YPmw4bcTtG1cf1KoLLjp/0pQJo8aM6tWnJ45GGD03rt+weOGSRQsWz541Z/6ChYsWLoY8QjnT Tde96dqp509p0zZdXd6iZfNmLZpyLyOoiq7HbAy7sZri4P7Zf/6nb37zG8wgq1at4SdELRwMYJoe AjaBHsHX6amnnlyxYjkIlJd004XnX4SHWc9evVBqHrj/gXvvuQ++kZhGaXonGX9hNQ9G1KFTcGUh iHbjRk3o2bgLiYsgYeaokaM/+alP/J9/+Hu8evAYYWNn9Zo1n//8F97znveyE7d8xbIEIxmANY/j /Txu3Dlf+vKXfvKTH7/h6qupEb7hA03fEf+eeDgf+cAHLrnoIpxOFs2et2ThgiYN6nGmeOmiRT/5 yf+gPu3ZtwuXCtiflMCEk43YzYnI6K804rObL7OBn8KUJ2ZkXt9YjtmpcMinWPYCcz+8TuKdQn1r 80bPPHHkcI3DB48f2H9oz4F923Yemjt/zX33PnTHH27csGYJHcGxS+B9OoSZeXnxgfPpAGumP/NJ F0s1aswYQVEJgVG6YiLKmw9iinN82YMhjSFvxb/yE91KjYwgpJGhgbc9my1p1qoQZh+QEzqUxHqP WGbMCU4LbuL5Hj4bA9GtNgdUflrIPwf9+Wm2ssSnnZFGsWPL2hk3RAoCmGdYbhGn/DTOYs9Lpp18 ekAASztLPmNKAzAPLIqe56Mc43vkP8ZPMC5EYFMLJz1AkJ/kjE6flI/2FW0EoFC466670nleVcEi 6gV6GrCM7DSTWYWVnunuVJmcr0WgQJgFHfrhD4AebBd+5PnEIgZ+8njc6fUyTAMWi7x5psA8e31P Y3lv5A2+QiSVkhjuwUzo5BnG8sHXvIBpxRzOk3oaHM471YTMV5/n4X4AgtRh3UHKM2+U1YJzAmbh J3oZhoh2lFV4wnN1LnEs7h3jefNBhBBCepnuVomqzhik0yHJVgiFjQHCHgjvi0niV7pJoSULvUxe A9R8+MMfLhBCspNYBVjKQfmIZRVBJCvrygLwZgPZW+BMcKgNFEtdFg63qzkGi2s0o+8pCoN3dWY5 XD3hPPpG9Hse01anhEhzemPwVAdvTRx6AnOzGIBypABeB+AQHvk3YJNpyMtayN8Cw4/JqlhIogou nUlxDICDnTtjJGaRFi5gmgV5s1ABcykHgOJlGQgo/QF6BmcAofC+BCMCHIGoxC1heibmAybA9h3a 9+ndm4u127RpC2S9/fY7f/fb32H71IOFdQ7oQwP5lcOd2bHF3fz1hJbHrVhrqZdWg4T4sIqI3WN1 RzfAN5r0eH5Tsjecix1pnX4p2GUhGz9j3iAT7CnzhvGzevUqLqvOKzYyM1ZrayGaKZAL4eb+znvu vGfevAU0vHuPrsOGD6PjWOYhjIbAIqAATevZsxfg5vnnnl+2bAW/du/RrXXrlnt27503bz5WeRQA w2zTy5iQyQsl0AMTgFwSg9UNeEHVoAeYYERCsCPPSDZoHvWGBKoZNIpc6AVQxfvsvOxhGotJnsOa OPVipaZerZK2LgBK7AOIq2CXnjax5UIv0AQAFlZ2bNs4FdD1AwYPwDRP4GPOyHbo0K55y2bsKvAP HxIgHS6/3FKIKzNFscuB8wlbBAS0oQn4gUw971zcAfCZ1uioqqZe175dO5xVMPz/4ue/5Ewkwghc oDpo9lpTG+uYdGMEzERv8ozUMRkS9WXC+PHt2nXIRs8J1EJi1af73u+8e/68+YlLTZPJNhpLgapz TrjIxr9//l8vuvBiXEjAu/rHe5Ujw4gQ4KDW1WtWfftb35n52MzkQp35TVEg5w0unnYRF9Bw/NSq Hb7btm/FU/83v/4tultb4pC3asWAQmnp0K79ww89xingZs0bN2/RmNiXzz793AbU1JrHCbpBhMN0 oWW6Byg5lGR+JCk4ZPZY7iaUnwFA1MJwYGc2P+DFxDcMumR3+JfPAekyzewrHjVMLZmrfdIk69TH 0atO/bpNG9Vr3KwRbrJNGbPTZ1zbu9+g5DaebufBY2of/EEIYb7glYLoU9SqRx9N1yEZfyY/vcYg dcA62+QNASXn4kiT+FihH8JkJiJGNz2O0VrdyekxSlaKNBAw/KGQ7ovNqzzHoIc0zGD0u1A+NSf7 yGFGWT59TLP5mcFxVJAsaDZWAPND8ZRiRlZrVm500WACL12kwZ0YmwHfBSYx4nl5h0UwNggAZBeb yemvD33oQ7ht0CJK1khWnQ+HvYAjQTnR2Ypj/NH1FB5X8RFNwhH06U9/mpcFs6iNxXs1f5RQDFpA DyX84Q9/iFAt8srYGlAVYSLybAfv+qu4OTqLSvOhvj1ZaASJKM1y4B641vILKIdvsD1ftVUUi0eE WKkOh2GFnjyUTyCIfEfDIoAOoEqHKCWENQJAGRw2VkmeVIiEw5gb8m7BlXEY0FbAK1IS2sWoHcWC HRyLXMFkADTiUSCoweqSvLr22mvFqfkP/Q5sLb4tlTQMJXjy9re/vXgoqd4UFEUhdHTeRlvZGIxO BKqCs4tbgTDnDecOz+L+1T8E1gXijJIpkyWg2MGJFtHe4hBAJacdJdkYLPneoXCjiBSQROGMTYPU xXTBrjXvEbyCxNZYksl2B6KFQBZPdMin/WKBzJno59TIddoIQEn5LBmw/BXOtNGck/ZypIwaaxac JgE8+VuAQr66YuW3GyzIBcNjT9p6TeaSE8uSHVbA9FhpwB/Jz3jQ4BEjR7Ro3ozrb1YsW87A5sY5 rIauTwHaWNsyt+YWmMTSKbOGDVjCWOaAYqAl/BxWLF/RrHlzYBZh74wbKPblOp5bfnMLgUe279iu PTu5HzRqxK88s/jx1Z1rwyRDlacV9Q/hpde4QLY7xQJ0cCEZQWC0LvOOIJJ0CpCSLkzJgDsfUClT GNAHUIvE4KCCbwP3WN9ww88ZLeotFBXLuazTAMYxwY989MM4v2IYe/jBR4h00aJFMy7jHDeerduB uopyUpAs6WhdOoG6nlwg0fnzFuCA7kUk2eV96RJKfoJFvKE0LME0CpTMG3oYsArUFlZ6xFYYYdsN sxh7DnYoP9E19P7w4cMmTJjAcc9ZL87GEZnqMPqBXOHMmrVrVGbgCYWrywlTdLt304PGho97SBqJ qZEZ5+KLLwLdctIWwIbTM2AM3Wzblu2Q0ax50107d7PFge2ZjJho27RuRUxJaiEl5zL5O2vWHOyK 02dM5xwqziFsdHI8lCg3Kg/AQdq+dfMWil27dt3SZcugB6nDnwEibSM4ka0GmaOce82h19RDJAIM 0MHhG3Afh+TSocmatVe+tOI3v/3tY489TlHum+vuwgMuPd5vTyEgsL/927+5/PIrkIcUZzAbdGRB tPjVOJjHjhybNfuF//3xz1atXMWFo44gg2ZOmjThfX/zXmSegDpNGycof6zsCFsud9x+1/PPPwed OGLRv8k/6vwL2Lb4/S1/uO/+uzdv33boyKFjh46zMYIFO+1R4MXtvfIpwl9C39lRStB3+qh44EUi vE9wPPBfChfIIE+UpwJygfB9zu6x128tKys7iJmktw5bIjXrcE1OvfqN6tVt0aRhsyZNe/fqetkV lw0eMa523QaMbk70sqfETZ94q/C8Ha1i81ZG+jICN65YAYscO/k5x9nG94ESYo4qmAfzE1TMWvn5 ihJiWrOi/PSlMZ43ziTKc8F0F1+dJBEY0DwpkeQ88qYQBs7Ls3MF2/MEB4U+5KdWnzUbYw6A7JIZ WYQgII+TyBjIGwiFWJ5//vleAc34feihh/LrejEBhqMOD1eGmGZjCWB5BnkTnUBEEtwuWBSwLwBD wRCAsDzlGGsxKEbhLMl5RIJUY6jGd8JgfMVNZoGjOZDkHoUMgeC8Hy0Zn3/++ZK8onZSGmM7hMoH csEi+ov5xIk3T0DEQtapQKBjaSQOlxg7CxUlvwuaDaKkk9u0vP9MvsejRiAg4BXVKPxVSjLZe21U QiQ13D+oDq4ai41nvVDUVUhD10hGQRslRnEibz5YRwGHQyDFBvlyTEn5OsAUUB6/yv8CAtIe44UX RldSAtb0PKYsHkqaxiHYn+AYslrFUEJsVCALxINKQ0k2u+w6jcELSdiPoxVGLKHGPK+Q4bAuKx40 E0RbGeXBK0Qof1gi38slZ48CJjN8nCtKTjuQlPfSMTB8Ma8Qp2QoycB0yfmqmMnAfVKShcWruI0U 6LlS5YExyHTKGwW4gADlk/nwpLyqbML8k2QsibxjdXHJCWYVzJV2kh4RPMeer3YpfQxikiqYtsxr TwBxMN1xrhanbU7SDRs2nPmIg2Lf+e53fvq/P8NYCEojmQf1gJt6X4BlEccUyLl+3cGDEa+LmzZp +uRTT6xavXr8OeP79xuAIyxOviTo0KE9pd1zz33EPAaAYrgytAhLJtCZVdPL5w3YrJU3M+ViXU2B BbWR69DiMinx4nXdUfTmbNGiOc7leK+CsPmVdonCAbiAJ94AvkeNGtmnT19KxgGXr9Qi+pSTQNPM yTxF4qOWfv36v/8DfzN23Fhcrp+c+SQBswF2RHSeesFU4gmKhGIygkgKxKbLIrRzO3rCgeQTX78+ wS5QK6GelPqK0BagDAQLpvWotij4bEhH3hhQj2JVflRFBNDGJDZa7Tnjxk49f2rL1q327dn7wvOz mP4ITDF02BCY9PRTTz/66GNeKUK91i7yNk6cMCXwipBFRQ5iaOyll86YNHkiQBm7LHgrizpXlpaB devBcs2aNuO8I7lY0ujKtm1bDxk6hEjn9BTp6D9oIOYJp1179OyOBwgSuXLVqqRBpVpSrBtK46gl 5aHmcUjUSCwUZXB3XX26dO2CEHKd04b1G7nTiYDgAGXvq4fauNw+czPgjqEO6Tab0WO4OTX5QGdu OU899fQN199A78BeWkdoHWZtrjUHRJILASDsN/rkRz76IRxpWrVqg4ZAFD44AKwEW8MHxIwzeMw1 99x9P7EwDYefBPIo5yDTjUjZXa0tL7zowmuuubZTx44Joe5IVvnHHn3s4Ycephi6j0YxV067mJHS 5Pr//fHNv79l6/adDes1qFW/LuyucewomB8TMW4mCUXXTdfmcI4zs35XiFmS/iRxybk7eyf4ToCS 1Sddask8kBnC0xgpN3tn2TOjN5nSkYPki5Iw+AkuDU3hCus2qFOjbp36tes14Ix08uo+0atH+3PP vWj06Ckt2rTbvmvnunVrtm7ZxuBdtmQpTkRwEqGi+VQdS3U8xBrpgxLLg45MBRORwzne5+elSOlS F3O6D8qzlm93bNwbiSWqgIxYdaiLEYdqx4PD0CEsqbGcO7oLConyY17Nrwo+n15GkTfrkzZmqDq9 cooJEHlHKOLKKJcA9q8L4jr/6Zp82rwqyHgGeZUXuej6EOx8X+d7R+TNzkMgpJJM1n6MZpVXM06v xqDtVHvnz86r06b81c94llfVHwKvOV7hbpEcIeKT1xddDAoWqvzXSODU4IcZASzihZS6Z0SyAuBu Lo1JpARegEhwGhg5amTb1gTRA20fJ5hGwtbZR8OwriCG/PPUGqAEt4oe3XvghUxBya935w5CTGzY tAEEnHlSbl28CPi1jGcaqEEXJYm2gJ+AlbgIDx0ylK8s7a52nneEQlJStb40EuAKKjSkakMWqp6i X06bNh1lxhOWrMrgKvJSI1l02wC6QT/KGd6iMkfbKgVaEcARK+8FF5wPhUC9rl270DowPiHtcF7H NXn4yOH9B/SnsfkO0k7fqmUr4ratW7sWTJyCDtarB2TEJ2drdr+MCwaUiHT5qp+xdnfxBJS4UR6F G7GBtsBwPjABUt0SEXMkViT7bgI4mOT7Deh3zvhzRo0ezTVGVDR//gKYHEoClaqqWb5/FQC56sus l5O3CQQSYQNw/NKKlwiGnSDy1q3AbmKagyNhUYuWLYjwPXrMqH79+sCo9h06cP72yOF0g+AWzmNu 2oSFeOGCRZhHKWTFshUUQngWopSsXrmaKIT8w1EHJIc/D92ULNyZrV0dg/2KCZPG487BlahQtyOh vRRdx8MJJIZUUsJDEqO8UR3aETfagFnxd0p9lFpem05ENYMSNgQQ8nOnThkwkNArrQGoKXpm5ltC pELuByUaPQcPiNjDJTuoYdl52aaoUsRyIjTKvDnzESHGLEeNYU1S/Y6kOOt8svMJ24l4uHBh8vAh aAv2ZOIM0lg8+KFWrYaKwPLogedfdEG9WjUP7E13J5VfagkSziza6Uhl6gbtE4Wex8kGbsfl5a/C y6ViyU+wOyaPLD2lAUyTF3hC6Dr0A/KJpIiPOBWl05zHeEBCuZJ+34GD27duP7QnXcxEfJXVq9fO enEW93RyPyj2S13nA1IXTCwxR0mgk1J+jio5pwW5BQg+BDXwcbbRlEK2U7J6qZshFW0vh9Evz6pF T84e5Z4zFbBbruq06u5QFSXkf8rPw6edEbsRtkAkzXvvnA3OCAEY8ygZi2De3yN4FQ8SAPQvTlZM xhlp8mnzqiDjGeRVFQyvosk6/uIqU+DcXMBkb0BkX75ksleHyX92XlUt0mfl6kyN+tOT5NPundec XJVG3qwotsS/eb02v9rGwqZdXEQCVsCddNq0aYAnzx3m+9KSYw3zgYzePJdWnRo1CZpGFox23/n2 dzjPlN0pmK6WZLUT5XgaElCrRwTzYAryjcVyxw6CLbMqY5LkUne8L9JxLrxBdu9KrsCHuLv7gJHv QB5YSSkKYzDuFl/7+tc++MEPnX/BeaBh0A9kaHaFJMoXV0mqGFFtQba4hZ25Lhyn7SI2Go5d1izi A09VkoC/7E4abQM5Az9pgNcBA/eS7//g+x/76MdB8Fdf/QbsoMRgxkmAcC5kWb16TbOmzbk5BXdt uJE31EkhfrME2AYdcuUQ7hCJfkyJDRroUQqTxSu61tAECqFSMQQ/qVrohuFPJNatmZ/oAjAfDRSL 2/DslNgOoPCWTVsA98BF0rCIkpTDdMBlHMppu+hQ0yMPqk/yU9TipgF/w+xNEgBAdlslnxTRD5zZ p0+vXr16Nm5KgLkOkyZPwhxO5GzcS6iRXgNwg7VRPLCMcsvPS8tXYktGBYIwmLx9+84NgFCigIO1 E9xOgHv9hvV0ljA6dEVjoiNYnAEYOYprkjocOUT2HevWrieZShQfdypUCwPh0UZ+Qq6Av9jjMZ8T PGfn7uSd0rdPn0svm4FmAsRkBwUFJEW6hofZTaXIJBVBDH7hxEVBdDkWXL9uA2LwYer+4fd/9NST T2G6hj/QBq/gYXbLY3sYtzNzSqG/+Mvll5zrxZoOKF8DYJ0121CGUKgSCDcZKZjkz7vwIrREAC+7 IgQawUmEs8tg4+S9nVnr81uDFQNfNJ4+Ov2K0jLH7sDaxWc8khW8Ascz3svNz+XKF44uCXiXZW4u 6WrLY2UnOONJjCH0q2NHDnZo3x4ZXrlqDUo1bEQ9gsk6dAFQK46fvExMAeDwq+JaNeauDtC0mUp+ 2Lnzs2K+EKe7AsVAHZ4mmF0GBs3MbI7l6hBTgL9fSUZs7QXI+0wRUAXyjlZDuQRUE3nnM776vCqo 8c9OQNXIO3jl4bzKAHpl3e0SdqbaeKbKqY5wnlnKX/0az/KqJM9LdutrjleV2rzDKul2aiwPosmK 5dZvLx/3cXlj8eA4F2bX7Mjdy8g7zx2fo2SxFwimVcvWWCsfeODBm39384L5C3XvM/6Dqx1pjLFt CYBA3U6x9s18fCYb8cB0AA3HCkEeJCl3wQQhY2LLXFb4ZGt2CjzHWo6H7lve+lbiZHN0E+v4/fc/ gEFRXCu8hhUJh2UhDn0ZFvGAjBmsIab9XrA9rcYBS6OytnyAMkBfvAvZFkXT8A248soruCv7pZdW 8hITJqbu97z73fyKsy9Wz46dO5Ae75QU/mL9egy3JB4waADsFSUXsJQ3oHiQLlfBg9STta9mrcwv guAJB71JR+cW2h7IO7xUZQtl6uZOdhurcdfLRMIFJZgAw8GXxIVct37Dzh07UW7odGhYtmQZ9zXq eCPs9q8OJ1Yq1A6uBkLiJ1NmZwAGcWQTT56+/fqeM37coMGDWrVs2aZtG7zn2bIHsQPRwNY0kyAt OLjDTC46Bc7g9wwwRTqA7N4JD/+BoXx0HNLXJYSQB7cO7G5dYoiuiPvPanz0lyxfv36DuVDhRN4Q qfqneinrYBHJ0K+WLl66FxecfXuWr1hOySgKQwYPxUIPqbgp7965Cys1HOasAvwg6jwhaCgKeP3w gw8TEJDzhZ06dyQvMVLmzp3PKKRk9TQ4BpHeEsUFNJOmTMbNia0efGaknEGU3T//EnWRWPICL6qJ oaENGjzknPHjd+/auYrbMY8eSYcpU8TA1FWZ+0jF8YzMuySLEugtOtmnAhyGEMagjuFZNHU6bBPL lbQsVEqaCSyN4rN6a5Qd5TLMGownFOq9u7Z079z2nPET6EPOLOCQBjMBA2xHISPKYbF1ID9r5X+t zgoaaQpAc7yHk5ZZWUuL0bZ5FRj6zr4oZ2RuRjXQRP599Ql+JRnFx2HzznPvFRKAhRUfkqot2VBO MvxMQN7Vr84R9+rzqqDGM8ir6rS9uMnwFg6f1JINb+Gw7trVqSjSnEEm/9l5Vc2Gn8Emn3aNZ3lV GeuKe+c1x6sSyFvzZFh5BUZ5FsRik2+/zwkylpVhdQZ9Yj/GulagLpcUaF4K8oARbC4TyCIBxAw3 AxE0gmpXFnmHbyVfk9G5rAY+GGnz/XBagzl2mcy62TO/ZlEakj8DBWJUpRCy81XjHzgGKxqxjbt3 67F7z66bb/4dpjc8NLKS0wXRpocwDeGUzHuNo/LBBsoxUCBHppjaKB86baw3upOdJlCp9lF+4p7F Cy66oBPxqDt2XLJkGUgog/snxp4zlnBpJOaixmXLl4JRsIYC6MFqS5YspZkENsE+JHBR1SEgTPAQ TJkO66ByYO6uUwdvHLoDyMiZ1AkTxuOCDArfsqU8OAkJIA/dQO8F71ESoPOelmbHAcujWVMjH1EO jdVcDWTETn/Ntddw++PQIYNJsHjxEu67wQS+YMFCrlFMl/VkOwMBu2OzHpq1nYu/TSZXM2hVCxqI kH35FZcR1JyzkrhQd+7SGRcOgpBgcCw7hll0PzsboO2F8xeuemnV5k2biQdP0ERSjho9cuKkCf0G 9MdrJbN5py5DG4QboQmImP3YKdCGwduocLzB/QSrOU4+S5cux0COwsJLTwJQFLwio3sycMwGOlJE V9i8lyxaAm2U0Kt3r0yDqs+xS/qLoIe4u+zZuxd9AJt9ixYt9+7Zi8cLRMYJYHD5ogULn3n6GTx2 KBn9jW0Hxxf9ghcUAoP5PAUjv+46wuDgNAVygjTZGIcZVHKimeo5RnPHDYntghHDh/MKHWHr1u3p 3vc6tIIAJ5lunBv5Ff7baTRmunj5b8p58Wzgy/wyX/FcPlcwdLIaMrdylMQUmTGlT4i2DBnAGaXW oSMHd27bumvrZja5Ro4eR8h5nYKyAZiGXuzAhCJqCXnsG2RUhqSjlZHAQqqD6vINTByryBX0+EAv eEDcOAbIj/NqAd/yyLs6tRfMzFV8rQIBQIPI29NdBS0q+Fp1OadNwOsj41leVV8gz/LqLK/+FKP+ NSFXtVnL84SCk+BFAAhR0Un1iVjYBB/CWS2ClS1L+SVH7msEgh6ur+varTNOC5iQ8dnQ4CpcoHzR Eil1SddNmaUfLwug5r69+7EU4nQBZM6cARLeAOiQHkgN5BJJkxHkQclkp2TC8C1dtvSJmU+CdXCx JXE6opf5VOgGo2e5plC+agsXzcTqqB2XNN48r4bAr0kZaNCA5Za6wN+itJSYsIi1axKgBUv2ooWL dDjBY+bFF188dPDgqtWr5i+cj3UWfENglqVLlj715NN4CeNr0b17N06YUjuLN61Ii/3xdCzSD2RT C3AKN2ggSt16dShh04ZNvfr0Ove8KcNHDKPdVOfhSGoEdou8YTgcA9XBEL1xIFInGSGmW+Q0h7+0 xY4m8dChQ7i9ZezYMRinueWekrmknFOJBB4R6eqhIbvUXuSVfapqV65BZJhe2SBN27btpk+fxnU8 MJBYgUQgSa7bGzcuXrQYtI1HDe4f7HXgyM+JSPzj+/brc9755w0fMRyA3rZ9uxQTumZN+nTVytUE rMR1wQA16nKBRO1BhVx4ZAep7JFl8+Yt/NXZXZXD47awJdNtGsANu1vx0JYZsgqXYAj7BVyDTu+z 3cBOC5fVUwiWaXA+ugTPGKdR24Td5EUfo1iQEF2ggoRQUXXgfh6wjuOUgtM/dy1BM8Fbppw7mcs7 0TTY9ICtgHOPIsSIVmuiCqiiCenswa5dBFy49PLLO7bvuHP7dgK7J7eTzLSNkiDCLkeTFbc+HUuX W77s5WF/5XFkIOzs4Y92ZirQeObqnYX7zzzGE+z2VnpqpHa8v9NeVoZ+2dXas/9o8kcvOzJ0yJDu PXtyqhniPQocDhtKTh4u50FtARYvho9VgPKY36oAnfFTAG7fQFX55km2ZaQHF8x3T0zWRV5+0s+7 oKJqriWvJKMmZ528iz+vAgGvfpPPVI1nqpy/Biaf5VVlc8hJe/+kCYrnk8reVHOMv4ZqfM3J1cs2 b7kcyNvlOZar/NpTvA75hiymD8xRdcfn10VXbtbRtHveuRMGTpZQ1losmoalE7QF7AZ2gG/cusVy Rt6ElurWIT7x/r376tRNN5ZjJ06mOxqC22haoJNLZYWFNYEbFkJxJy85acciiHMCZVKjBzHFheQS cqlI5JG3ZmBQl2uq/hhGOyGlBl0aRQmkAXzzE4TxU0IMZdgdD3KGcs6cuUAlyjHW2JbNW+bMnQME 37t7LyoEUVkAmngtQ2G2J9AO5wSKRbfxYgsQNoUD3dxhMFQiH1yuScChQCB+MpGmvO1xhdi+dZsR oCgEOg0tzIMIWCcKmKnyQBckJJ05yejQHH0tM/kJ3hDLD0Mx2g4IlQS4eeAejQc29YIyKUGYq5Dw V4cTmanMqMxQpsBFuzg04MrMS7qVo4dELVz50kpOmhKenAiAMJrzoWkTYNjQiy6+aPCQQRxk7Nip U4LpBw5iZgZM4Mu9YP4CQnrjzY/LiocgxdAhfgG5AsMpaeoGUqgAiInpQVpknG91rTAq26LQIsJx hSYkM/kB8Pq++QvmpYsMt2xV93Mnh19B4XrY23y6QDVAVytKUBW0g1QAdIEHXtNq9Djkv3WrNrhu 40CVhc06rod9dhA5fXiWPKqQ7SqZ7LfQMSPHjG7frsOeHdv37Np56MAhzNqc0UzMSWDYECbJGwdA zEzh1CBD5GQB4swM0i9D4dwknjOQp7kCxnIffebLQkVehInbNwTWzIzhx48dLatRdrzmwUMHtm3Z cOTgvgH9BwwZMpgCs7gvBFVMvWmHynmnnQIIXhmwrgJwV7ZGxvvilSlfqZ3oIWb9uNQNVJ/C1YQ3 luPIKom8q7mCFtPzCjOe6np2xgmorMAquuAVNvm0azzLq+LxclJm/rk666SE/eVI8lm5el3K1R95 m7BsCJI0+2mSdEEtEMT811g2KluoihNHmbFam0ZwQ7QSDqXhhMqyiuM162uAbLAIyTQrBpJ26xlQ yBlFctEEzmEKJUlMlixXWtoBUxleBEgBXDg9WdsYKYASKNFBVggLHPGWQQ8gQhioSOu72Ctcn42D 4XkvSnDJF3DH+ioy0E5PaZBH+fzKX3b8eXB/wOBxAYIzw2TCsmBNnfPICHQGnHB5DNgQP5WWLVpE vVrNaQ7txUec6gjn8tKKlSA7MDElHDxwcNeOXThec2MirdMlhuq0XhvIXGucniQeSIUhGq0pXB8M VTJRKcm4EggKQbcrli/fum0roa9xn0B3ggB8nbGvGwdd1cVephyIDMAtpBMUil1Cy8LMD0jlpCBH ZgGd2Z0myRcIwz8RQohd2K17V1xo8HLmHnYSoGxwXpBDis8/+zynKFFXcH1hF+Kd73rHjEtnUDIn Dvft2ysMkioxpZBIvciW+pPESLz6gzZvpY4eF9fa76ZXqQh5dlzAVdQA4louXZxChhshnhJQXbzI UNitePtXhVMJRBLc4tDQHtXheEO8FzxhYLIaF20CQHPBJ8oP9yyhojCajJPooA4+24kUiOIHDbSI 0OyDBwwqO3SEGI4c7SVCYN3keSKwtt+JO1KuRMUoFlDyiZGeTRgvn8rKrNoBuMt/kpkIajY0wfnJ +J0cvfla88Sx7OLLVKgRb9IxjWN473A/0a4dW9q0bNGvf/+69RskdeZAijYTHyerPJ4ufpOfqQoU hipm+eI5sCRqp1HuhHgc3PEVKRWSZAaouPQgOCOdVSDv6PTTgAXWexoZCxhy2uX8NWQ8y6sCDlQm b8Wj7K9BPE67jWfl6vUnV+XIO0ADyxgrhzhSXBXrq40vWGyKh1b+TUFes7tGlhyTghuwSGYOTOiE cMVjRo8mrLpu2SQQOoBdKEoQzIc3mW0vRdDDWNmuXRsOnxGdLd2BguEwQZe6hksjGWf1MH+2a9d2 /779HJ4DrLBGAjtAQtp3hd2kJK9eB0KlCrSdbk7hjCORuUePHg3gj7s81FVIFo4fgjOq5ydcR6CN Y3Zjxo7hDCi40LaEQ4uYj0q1p4Ij0T0sSvzn2nxg/0HWdaJ6QwMPmtNUljTQpupOHMcxAwsxnsQU Ar4HrINoaAgRPfQAkTYDZcBbFQCYqRVWrwY1BN5Qrw1RO5JyzY2gOhAGfkHz5nA9JAgylYHNHsz9 wguzcDEncSBXjdlhoXRbQNgd5lgxnHglu/+lF84wNBSH8vMumNqtW7pdsk/fXhi523VoD/8hDJHh Pp25c+bNemEWQf1w4KFd3IZIiGs6A6P4eedf0LFDBxj76KOP0Xw9ZwIyUqONokbIQx5gJi/VPKVZ eVAHUyehnSSDQprvbkw0QVhPXnskOCYn+cBVmxk6j+OLchyM6pYwHAdcTLxUQZX2WnRBGlA1TnCL EM5I8+bOpedwE0rjInVWXYKd8zusoFKEHDplqfTYNCnko+cJ0tK3f/+JkycTpJMQ2nv37GLTJwWZ SaEEE0CuTfzITH2KGcPmBPKueE5+I7lfXnYXD1Unu3M+Jc9CDRq+UCUfHF/uiVJeLkgct3PSldXA ux9x3Llje4umzYaPGNmiZSuJd4dKNC9tMVOVnGr81T6qDB9EmmKgUIDd+WrVmV6dzglEsE5FK6pQ nEjAyLV2pU5m8akMeUeLqqCqspaa5VQzllzvT6OcV5/yV7/Gs7wqKXuVjayC4XN68vnq9/KrX+NZ uXq9ylXhCUvNk6wfCJmgNtbUosU1vZAvBXN6rCL5JTlkSFBiXpfJ+Mk3wgI+ICQwxxe//KVrr7mG y1m4CBB6oE2joHnJAh5inQONtW7Tql2HtnhPYHBt264NWC2zm6UasluoT4Co2bofd85Yzu2NwB2i W9eNG5JnLdiRn9PW9e7dmfvsLlyWr7rqKv568w7LJOCvd6/egL/BQwfNmHHJ297+tounXzxwILeq Hl+x4iVMhlASSoVQjKJoBRAQ2kA/YCxsioTmgPKdO3cQgkNMz096p+CXPG36RSNHjCBkNT4nYSqz vSQWEKMzXH7F5X369rHtcWTTXtPzm4Zj/eW8Xf0G9WE0Xr9sekM7YB2Mgv1bDKdpmfRqLwHIhH2U ZkdoCaZ84YKIwV9h8thxY65747UjR47YvXsP8TSoFK5ibOaEJSFBaLeJ7VxrFKf6MoqymYGHSInr OTfpEIkP32U2J4iQzcVhpAciAmhpI15BaBe4euPTAsTcvGkLmxh0PU7SBBycMHFC+w5cdw/GrYnv /f6D+59/7oXHHnsMDtCQsEwLfaCH6jhmQKPUMXjQGZdnoJJ9xEebtxGydddJ3V23Dtg0hDm716YV 5chAPiLmaDiQnRMF1IijNqZcmSAZwWEeuNb+6jdcddmllxFMEVeVTRs3Iy+0SECf1xzod6IlLl++ bM2a1YePpot1cIrnZnX2PXBqctdFbjuubXXBX+SfS2TpZgKQNW/aBA2Yr4ePHENNSfdaJnWoTu16 yaKfMia3k6QgWWwMaj1HtJRXTA+5MCmZ9m1jGeg+Z8buSPPynJC9SiCe4X6csCd8MlnF+r9/395G DesNGTyoY2f8kdKVQyozjpQsYelP9FHBzFZZegUyJrr8c/ykkdsbvhz7wY0oNqSdMauLV6jNMYXy UHzCspiwoKHgp5hvK2vLaWcsrqhkXX86Ak6b8lc/41le5Rf0KobVX4Jgv/ricdo1npWr15NcJXCT X6W09bJIiAhdLVxZ883WwBOrkStQXjJKTsFUBOAAQ2CZ83RUcTLeaGlmRQdetG3XbtKkiQA24O+d d96pCTBAG8k8eQZ0zmJ+t8JHPN2CXod7cdOdL+mCQ6yq6SRX2vEGtADXgMsD+g8kV/fuPbiGftGi hS7V7PjrAwBE/MIXv/DmN78Z/MEJSKi9+g1veOtb3nL1G64ePXZ0z149uQ2RUG4QQ/nEoyCGHXnl FcTj+XDRxRdysYvgzC1+YAEOuAQN7NmzO7cqcq0g5nZK4FQcLaJeGD5q1KiJE8d37d4Ft5DZs2Z7 nTtcDZMwmAPUNXTo0PMuOI+KuDMR4B1dQ+3CfXBhiquY7lxcT7E4G2CKpgPx0GjfoS1Br/EM8aAh TNZ1m1rsUGGiqI4PaUIB01dYedBgDFYHinGBKGwhwDYon7jpwDXQJG4E5E2HC7OO1uwXPh56UQfy 86EALYlNp02fNmTYENQLWMQpSaIWAuvx+UZvIZIJsBs7Nycg6TL8dADoHDHkRCZ3OnPZDLD40KED aB3z5y/kL/8IVIJ/guqlMiZIglSA8uDBg9GveIaHkCf9cklvXbdc1M1QM2AawwcpIuw6osX/tAfD UrxiAPG0i+ZH0wKN8YaMnGGlUDwSUlieLGi6LuL2BS8RACInEjdGV36QNNsIWUDI5PwjXKNM9Rl8 sqmLOOJcuLN82QocWAht+cLzL0bkeNI7qFWrwjzv6PbGVt6jQ6YA5/v2Ifx9+vbdRyT1LcD9Q+kO efaQOHSZGasTAYDidCNleWDAmA2y4INpMqgY3QHBdefW2JwSpBsvM+N45syS/2PezGlet5PsRnqe 8DlB6ThytGwP51O3bTpedqB3L8ZQz8NHksO6kkYupTQ/vRQA7uoAgighPwHmy+RZIzcw2sMS4QhU UHt+hiSZl+MqVx659qgAxFNO8axYrEhUsPEks+5pZyzgz2mX89eQ8SyvnIuqCQPy7PprEI/TbuNZ uXody1VtFvV8BwPXGELCL9FSwIU88hY5ucz4iaWuYNkQwImVWRFZcrgfG+wIduFcV/FYJaUILzv+ 2HL3rt0cByQs8Q0/v4G/oBlWJu2RpORBfwnvs2zYqGGL5PmQouPhY4AxDahBK8opqF0TnMWGOvAD SJf5dh/nAb9kbs+RGIzlYJ3LLp1x5VWX46nCLjcw7typ5w4fPgJ8zL2YqSHHT2DwxOgJAAKjcFkM h/kIw4JpmLaziJKyW9eu7O8T3+P8888jyB2euJAK8jZ43MyZTyxZuhTKwfT4q/Tu3QdyOUzZp09v yqc0XJNBmYYtNx4LtAmCyUUboZO8bGsH/IpegDNGyeCD+/XWLduNwkZc5OTFs28/V9IQIwStgNJE 3qJP+8huEtIlrJM5rGv6tVPy2IIsKgOah8lIq4no16Vzp+49etApHhwkjVBe+2g4b0Rd1BJY0Bmc xAgYwgn3wHZ4kqCKYLFetnQ5QbsBoPCH9zKEq4XGjx83cNBAdB5u8AGtoT5x6xAWd5ScLApKOpeJ E8AIrv/s32/3zt3gUdGtioeU8xWlhfbCMfpRJOS8KZfsBR30SUlDRowYMWrUCDLSrXjrSDl5kVIy ek5Xa7dHFPzQRrdu4HXHzh1pJhpU0yTDjTxPLBTmPQKPkwxFYdN/8omndEPiIyU+23cOQP1hdu7Y gcsNbff2UD1YSCnsVqLkMyXzQAL1isycnD4wEHiOxKbb7Fu22LxpA8KTbUrUzEzlEW6v/AxlHmhm 80Z5QzNYnXn1aLlOjU9hTFIkk2zOgGHpBk0N5OX/hYeJRVkDjwK2eQzOZeD7BLG+geR0xLZtW44e 3tu5Y6feffqjxtA+GJ7YW78eB4uVZz/B/NN+iEKUYUEzHe1+SIwLBcbhE3DEAWU3OY6ULgXD3SQP bIS9PETlpMTHlJufe6vT6ioyxk+vsJyquf2noPzVr/Esrwp4flauzsjgPStXr2O5SlEF880DK2gM y7+MNUNgoaVQ5O2K64oSy4zJ4uNy4jpEya40eB57n3l+lPrMCmSADjb/wSJenb129drkOJEBjmRZ ZO8baJwhOZYs3Hm5txzknZ2Nqwss4lZF1mCDead1nYAJhErgfppjKeQ2abCOi0iaNm/KJjsn0Kae O+WSS2dce+21F154PjmOZsc4dYEAXHIbpnjLRRRogmczKBnIzm6+VGlGTTbJg4doKXHuBg0e2Khx Ey4UpDks0rT6+edfINi5ztkauvBUbpu1lJs4gcVG8MDGClNFS+I/sSlVgGghvkeP7ln8ij/ai5DJ mMw5cgf22r4tAa9dBCrfuVNIB/Jav2GDTjXCVjGlPSgU02Sof4J233C6AB/kvQtIBjoC3sFt/nF8 k2DqbdthOG7LXgH+6CBmkLfoUP4oFRr8bJdNs3VyOwA6bSFMJCAbIy4O3Lv37AHnEBMG8zJxA0eM GN6jR7fOXTrhwNOjZ88U2WbbNjqFQPJzZs2ZM3suF7kvWrAYtYcC2QPp1asH1yVRT+q4TZsxN8fh 1KyLk3neSH8BYb0TilaLnmVvBeQ9SocmM3k7bus8hiOTPjlyUoAOzwWCjpr4SwKypBOW2bVTaIno DNOnT+eeIJKtWb2G7AbEIBmO8osWL3r8scehDXWLvJ6ODe6F9douc6wpNnSuJ/xMI4djC0LVWoIV RUoW3JMMIaFnkVu2YoiFuXsHF//s4CgAZ5az8SSc1Yhd8hB2mkKyG3iyeCXJIz05oJdfPp/9lE0y tbN4gtlMwM8pMn1KnhGM2JS7YusCLv/TbTupznTVJVHaGZSoSt26dO0/YECz5i0ctOixapIy6qTg tWq4lsfcMErHErV9OOxGh2mcHGLddXqMiTGaEHOjI875VjXY0VfR0uoqDGY5gxklu/p8O+MEVN0j 0dgz2OTTrvEsr4pZV5k8nOXVWV79KQbva06uCpG3yDIPiH0ODxBWHZYc8Dph2kAeLvaB25Qq0ofx xqUo+MIaw4qOnzGwW0Bm+liuLEEjHDiDoHLY/DAHArOxKbIspQNnQ4cASkA2/PUm+bbt27Zs1dIY I9i8MdeB1Qj2nOGJWiBRUCCowlvE2Vdnjx/6yUhKqB/Yv/+48eNGjRzVrWs3IBqQQAiYGXQTIKsw G+8gWIf376APvPD8C1xUzpU9omF9Nz2vmZbnhmgEnPGszVlDLPe8gWACdGDCh2NeMg+3KYcbGXGT 6Nmzx+rVa59//nngThaoLgUn0WYvZvIvL/E+nzFjOn44OnYHz4N10EOlOFdQBb7s/CV6NL/iZKOf N84nlqwGFUhXHBDwl1/pI73V1RPEGVQq2sje18E0i96CskFgk2xLIR3TpArQ/9p1a2ljHuEJvlVR rEt9LNoY8EWkC6OA8iQHWA8dNpSo4dxeWa9OXQSDKy2bt2gOqvLIIwh77uw5xBCkj+hxNBmyUzv0 YE9EKgC427ZuJ0Qjniog3XPPPZfsuMeIdfSh96CeIg2RAwcOZA8knW6sCCpCSvUEOz1Zu/fuo7E4 nyDL8IcPeQW4SrjIO5RVURcJKDO54hwGNx7ikqOJEyZ1696NzqV2dlSyjYr04aQB1mtqcXuK4aNP szg+IJoDzZEY1YVqEbBbbjviFABLsGdjf8PORRS5aoefRo4a3bFdh7279+zcswuKU6DvuGOnAhwG UKuQSVXe9MFQHcM8s35nin16wmGFQ5u+KQdRgG0PZ+hHoxhkJVWg/exEpkJz7HiNg4ePcYh4/+4d uMsgEsQmh9kO2AK5coCc6sfmwBzDlYRjiTyU6Dy4z09lAcRNqR6LTOrrJeCWMypFMfqqD3ktIdKf qYxnqpyTcvuMU15QI+sFo5i/8cHLiw9fOQ1CYtTjkxJZNZNfN7wq5sMZ752zvKo+k8/y6nXMq9LI 23VCQJZHZjwDNXr37s2d59OmXcw92KwaOG+kHeXs4xpAroB0gkUXFX9iRdf5NZaoWMBchDS58ZBc sTmF1q4NkBbYjZ8rZVx11ZVvfdtb2K8FWVJgKxB3q1aYQrMbG+vgPsv9jqBn7JqLFy7G/kWMQigk u3voANyLLrpo7NhxLVq2ALmwbJILJJ5cF9I1l6RM2CvhkrIUrJp5GehDaVlw6JVLFi/FJEkQOG6U XLxoCVbqWOMTlshcZdLFNO3atmrdslHDRhRFCRwENMAIH9Jo8LbVrMGAC1oKhF24cCGoEa2GX/Wu DtbFAk+LmjdvCsLgWhbKydulHKgZWqmNVRiAhoUbBSDbYdgK6/r27UMMPkKbJ2yadYEEi4MlSebb O7y3+3ipoVrLqN0khmP3gGOjl14+Ax8iiiIIIIXj2oFd31jsAa+FL37Cyh6CIfJQfiSMNCyNl8yY TqxuLldq2aoFX9ORRHyRt+0AWJESoE89K1e8RPBETN0H9h8Al6NscLkMzic8AyWhARAGwel+mbXr 2PEAPL3hDVefO3UyCzC7FgiGcNl26RYCMTzYFyJyqpNs4andxwOaWBYrJsWfkUtia34N06aaZDqN 0DQ5LJFSWywPwG9K4IgCXjoAfpRMDhJwrZFcgmYAupwnPdICGpYY784MXMgDZdJZlBnsVQGWGEUl PgEmKJbCwZQqWvY1H1KKFKmUgJ1Dhw3r0asnduYtGzdyvDHtJlXc/p7s2YpEeciT1IXl5ScH7vKB n7C2UBxwnXnHaBLP8mZvMx08oxBOymD/oz1cCF7hEJ4EJfmc8J1WI+24tteudQLuMQMw03jKQu8a FbxqAqw8zHIUaG7QFZ5BV6EMlM91stRxoQBbV4yU3ODlkoGkbvnR7Qfa7CBHSpRzStQqbKeUxcSn nbGgrtMu50+d8b3vfe9XvvIVdjILPtdccw1vEJKqr7XPN/O0SX2t8KpYfk67yaed8SyvTmMUv8Kx fNqd9RrK+JcmV6WRt+a0QN7gEsGQq07fPn0++rGPTZ06tVOXjngCgLHcZ4+1jefAWAKCgN2032Wm mBHxMuxzvNGETBbinWEeBvNMmTx58pQpIMtFiwDWXHXeEFjAwy5A8IEDuGH079+/dZvW6cDb4UNE vOZrz949CEWHV3SnTh3Z0+eOw3TRDLbbCnyAA4P4Uj9XQ+nt2LmdjX4ubMfFlnUdD2nwa3ad4S68 Gnbu4O4b4FRDGoLHRZY7NdO/7sazkmJ8xRgMWlq5chV/WVn1Yteqyl80mQOHDmYIcg0BOngDDAq8 G04FwhDqokw8JeDDuHHnNG/WIgM95dvcLvnkPXj4EFfPEGaEACPUnjm/4vmAcRfyyvCmAH0aFI8y I/yZVQTz7anALuJOPibzxGE6/3biBN7AkyZPwqCOyRYgjnZBdJMMFZWjdioSygfsFp5mrCt34TVN iBC/4oTDWdh0dfyA/hwShe3wHw9mNJ9Fixbhx4JdnxOT4HvgKdgXNhBf5YKLLhg5ciSmfby6cU3G 2E+XUbg1Qn/LFi2HDR86fsI57dq3B8ezt8C1O2gbAm6FM/QB40uiNVFCBGbWjcTgMLYCsgOqCp7s 3BBpRhA6z4CBA1q3akUPVgDNFGyevJSGRFELezPAO/iAWkWIm8GDh6BP0o/U5dnWAGruCBkRkvTU lclbOd4VaKoGUHXwOdKE3ivDdXYXCIq81Zwhhp8A3/QpZzO5r6db9+5NGjTcumnzIQ4rZ4Zq2pm/ Yj47XpmFTMk8QrKP9mwYlfGqHGqnMOGJP+n2nMxrJQlfFk8wC+xdgSOz05opYQXy1m8lA40p7re3 +hwnYEvanNm3n2OvZRgzOcaNDzaS7yWsNCpEK1By8SwUuJk0jkT4rJ3bjSxnOYsKpFsxMEPBKJcH ZcmPPHHEUbLPniiQ56EbFBR70mW4WNhKtqsyUJWX0nxGyT5p7YHdKyunihL+RJQX1AjCxub9s5/9 7PHHHwdkP1fx4dkPJpWTNrNqUl83vCpWM854t57lVfWZfJZXr2NeFSJvr48J3CwwEh+4vZ6M3EcO czCRQ0FEc3vgwQcIp8Cap4+BhjoSa6yNJSdWuzwrXcBifjdxrFXJ3nbkMPfXEaaD0rQsskr16deH mRTghR8zNk4AAcAlC12XPBMIc9Cpc0eOMIFLQGA4znJEsl9/XAa4eaM/7gpc8sJ6TYEZIEgfKgWm UwjOEsThwyxKpG3iQhA0g11+EDOm0wkTJg4YOIjwHayWGeDbCNiDwoTkCGzRooWhxPTJQT9JR/fq 1tMdHoyNKwLAGnswyyrmbdLr0Ck2ggDQMB+Xc+2OgYCDJ1qmM6+Vw6gEIBmrywIAs2GfQZIaNQ4d PrR9+w4CPD/7zHNcQAMwSmHLD3A9UHLbBYhwKtSTfzBTbUpI4eoiSguYotVT1xRwWK/evWAC6WkC HCYvN9vDvbRv0CS5/TRt1gS4AaK9ePq0MWNHY+wHGQfgcB7nr87l5RDtj6/RUfxIxr1I1IVZ+vCh w3j1cIvnnNlzEDkDF4qlDKEIMRin6fqhw4fSy/gRARnoxBdfmDV39lwOw9I7cIlk/DR46GAizAwY MJDL0vHfIE4Nod/xPynf6MggkRCW8rX48gDwFbtDGKwTz5GM9zpky0P7TtrE4n6FvImTJgwdOoRb cVLkmbLj5MLXRTMzKXm5bOlSAiMawoW2tG/XEXd5tilQotg+yHokhRKBdW49iYlj78Khp2qk/Gis 9ausDoF3rPlVOvnVUSyO10FcNQCtgE5ELUSG2SkaM2YMFnrkaeu2LVzEygYL6DvpmpnVOiqy/NCm FNFstGejvnwiSODOrJlrM6cxyl72DTdteQSVCnu5r1LpmeUc9F/uv37iWNnxQ4fT8Ny9Y2vrlo05 d9umTbuD2WaXGksQo14UuwHBFmmGvZ6RjdOT6skxNGKOitnM0RpfY05z8MZEx4MnWJQZCEDYHF/O n5SgphQTY9XwF6r8FCxR+Xk1/1M8nzRjrPp/LgJKkq24nlKTsXnjWPLGN76xGHM/88wzzCRneVXM 6lNl8l+hXFW/yactya+bMXiWV8VTdGE8b1Zf2ST4jjVAwOQRfs4UYm/m8+CDDzCdsbCFX4ToULjG apQ3oBasDU7o+SUqv9iUr1VZWDE8QCyHbVriCFx77TVDBg9h7d24aRMACC9w7Ny4FowbN5ajYOw1 Y42lYBxIWjRP0SpSmzOMgdtJumuGU5ZEBq5AmdAJoF+/Id0CuHTJkkULFi1dtvylZSs4nMe97tzc Dpq84MILRo8cDU5q3qw58ZJnPv7Eps0pyDdYWU8AWg0AwvIKotVrEFTarQeB7drgC4PnSfsOHWDR SytW8KvRx2igrJYSPoGZxEl6X4TGYgLBfXbw7ij+ylwyjxdLm9ZtcIzJzKINOV5KvLtVq1biDANI xRCIhwbpQdvsctMWMLFN5i8VBf6QBlGCBEgYzxEKAy+jiy68EE2mfr36oHnyourw6/4D+9leSHEz sqT8SkC66dMvGTFyJDxBQgCpts4q+Ii8BUP8DWVDmYEtmQKTIAh+xrgVzZvHRTHz0HYwDoo1wdA4 FWiUzVzsm2U7M2mTAaS4cOGCJx5/gusqieNC4STzKhnuVEJOzhk3gX6xyY0aNu7SuTPybHAb2CI9 PAvUJNtedlDQRn2IeY6QzAF8SSycIq8f8rLZ0rtPLyhEZojJffDg4SzqfAonB9scaLwkZs7Klas5 X9u8RTO0DipEZ6pVpyYsBfJCAJoMTNY8TxU6goeVXWKkHLIVmGhF0OOgC+StEFqm6ocZKRl5xtqd HUjdBFd55pArrCMgDzFnkD2CPCZnM4ZYii6YuWIb57vCSSQ/gWRwO7uiMjN8C7orAppkcDyziWfG 7cwMnmKgpBjiqQeMlZ7wdkLe6ZNtqiRXluyt/+HMJZrnrt1omMTgr5uif3buSnbFWA5QB31EX2Sn sdNJCeWQl3SENwNo5HYrIGYqHmRswTSqsqGoOE+qUInFA3mTgIyMQdQw5gcGZgor2bChIhdeMVRd MFWWXLmtyAFVWYIzkrGK8l8dAqIVp9fk97znPWiwP/jBD87y6qxcnZER8QoF0jnhlMbOa30MnkaT T5vJrxVeJZt3rC7Z8n8wsKAWVkGSmMM1hnUCU8GCBfOBRPhGsxCycrlgu37HnrVrVc7uVR5RjmSW Vo6w/9jaHau1K1y41ZKFaCHTp09jyxuKuK6yR88eOL1MmDBh1OhRGDtZzHCtFlWwA40PCf+sPa2v KRxZ+foqyKCxmzdtQoXAfJ4O3q14CTcJHH8xUQM7KIOluEPH9t17pBtPkul61+7bbruNQ5CupuJF lkzwNNCWD9CEvxCMZR1v4xSpjaCHDZLttl+/vnzV3uzab3aeBV4yVuOcTcgzJ/n5Zh8RA6xG4cGj Gp9qDPDYgVeuWok7DVDkxRdfeO7Z5/Az2bZtO4nxkO7evSt4FC0F2w+2fxwYiISttwlkaBaVjNCU eAM4ICg1sMD4g6SEvYBvjlPS3TuyYClwiSp4SUegpRDyjwvSedmlS1fqAonPmjWL/Vz4rElYcBOm WbULP3aTDxAj0oU/QHzjjUBDmzZtKVYveVZTyCON9kIauH3Hdrzxly9bPmfO3Nmz5iCiYh0hMrnS p0E9judCHm7KmT/ECUy2FAL3tm3ZClby6JtdICV8+BrakbpcSLvWdF7ap9rFY5gI1PgVpYieRbSW w6JVq3Fogu0VPhjJkp31ePK3Tm7fu3dvWLf+6LEjnP7csXMHxA8aMnjc2HF9evcmND0u9DRW+7K2 bZlGXkAbf91uyqtS0mNzHOwKsALG+4h/ku0FpRjkqEwIM4AbhcQjxQ5qfuIrIth/4EA2voB+e3ak CO6JJbXLL6XEAzw7QfEyIswqTJ4k4RmV2e8TbwXWIvIEyjPXkoTgs0+5W442bhJVTCb/f3v/Ae/X cZ4H/ui990b0Xgj2XsUiFolqFtWtFknujr2xYztOWXsdJ7vZzee/2RTbcSzHsuzYqlajJJJi772A BQQIgADRe+//75znYvTzvQAIQhQkivcQ+uncc6a+M3Pmed955p1Skl27lak0YuO2sIkiQAHkFFbD yFE7Pbp1mcLrzdRpdgC3fZGboui0OdeduKr00pRkWFcw6jBsB7XzPMLMTe7T3BS8qOJB820lbz4X UtaBfXLjiNCSC4VQlBTDJaJXddapN62faPfHn7YTS0a/8iu/8tnPfhbdIowLgyheJttNTkL6eIrS bq8hUSxcuNAvpatdART7Qx/60P/2v/1v72mu8847TzWtMh2r5ElKRqc1V93sSOAS7xhL+BtuuOHX fu3XPvjBDyq8nTnGy4svvtiu5B0j1h5eG+UP/uAPfOH/1//6X0cN3Prw+EJOFY5aYNWnRMV8ngKQ 9pQpU5rF2OLjv6PMpcZfZ2T7o7RyzbFK5gS7x08qYrtWOImO/ZMq+akvaqesTuRDdyIfgRNP55S1 chvbJOPWb07SyRW0HV5y5p5qOqoBEjGYI4jQlBNU5z7kyAqnKgDySqyAhppCboJoAxQKgOjabeCA gayb9hSee+7Z55537qTJk3gmMckCXoVaMIaLlUHQU4ja8aKQq1YkNxLM6ryvYXEqsmoVI/dTUNoT TzEPc4TSHNW+B4MFZAwIlqaFdefywBY8Az72+OMPPvCgwnPLbeKOiVHIrBRXHOM5AgMjZfGRcqBg IAba009feP5550HOljh5S7zyyitGjhwFxMgl83dFvUoeLB6sk1aoWlDIBkEPJm9h8GGcU2ij4apX VjIN33b77RQJVm3ffd/8KdNMAZORm5Gk1ZrHDw0LV5mDtTUZXnLJxRCACSAchljgoBBcHeJVLzxI DzN5NEB8BymZMygdwJnAFhzOOvtM8JKn7aeeeqa4NFkB929Q01u+cwtvg+lcwdzRH2ICT48KIkyL 5z55uRTDlGaqzmKL+Z7JkKxivwwpPyePuqrDx/hPpDnQl6SWBRk36h5/8MXpTHE+yWM3q2p3feb5 55/btHGzdheXWFISBUi3aS1bqpAm81Z5NC7GUVESGl5KNFUBSCarB6km3FMO93x1Nfzj7PkMpUbB K/pGeq+QUa5QJpjh7biFL/W0BfMX8LpjbYdLFuWXEUBc93RGkhmAEgytOYXPgFL+lDZSTdVShQRz KUDYJrFz6z/kabCkY7fGTe4Ezj/EGQvPtMF52+Yt+Pfgv3IUV59FmWk72DJflVqStu9MmwLQ9rL5 P/+KqEqAQNk2knjD+z5SCypFs5jWBft6zJixkydOEcFKyK6dOwXRv2D/wjDn8Jvxe/fejevXH9i7 a8zoUbNnzeYLKPs1SSnHjuoFomQoZfdkPnRVXPmMpPq5qd+W1j/TPSLnDN4o1YlVX2ll3c+mCMNN 0xsgJFmzcKNldafWLFrv6ye6I4zrGOVXf/VX//N//s+czfty5nIPK4O8t912W7vwH//4x//4j/+4 415Dzn/+/M//nExuvfXWNFV+r7nmmv/5P/8nNFwBNKB54403AqBCaqB26Ysi9y984Qt2NILRAeu5 KO1f/epX24Unor/6q78SGFk/hS+rbVdbb7vqySefPCpS75hj7XjUDypBx1yOKufjCFkV1LpjgZX2 7/7u7xSyNYv/+B//I7XB2LHilzTbXZSW//1//987pva6Wvmku8dPNuJxGuuosnpDRsRPtson3ayd sjpW67/m85OW+amJ2J7nneP96hzjBowwMwULxsRbA8QWHthdw5jD4DnPzS4x7QTC1jneVJSlWFc1 CAWdB30K2TBcZ9hgd8WVV779umvf8Y53sG1fcMEFuJt2zrFkK0xW0ouFr/FTnLgpIfCUUyEDubxS hi1bt7AEw4Uu5u1nnn6Gbfjpp59Z/vIytiAVhzOK3+7mKmSMYjjsytcEiLZ23RoHcS9fvoxvCgd6 NxoFbxht9IloFKH8wrkXXXThtOnTTcQIyoRDAgSCEzJkMIZD13vvuQdbmnsWgHX9Oo4iVmeGDiRy 409V8xvsGP/Kmf7lIlgD0fwWckdwgznbbyFmvLIyXvxCEXE1zdfToZIwH7Stahgx0FVcZJx77rmc h5x22gRvFR69WIJxSJKzzYkF2UB4uQdSuNfmQLAiwWcAJUY7F95kIq6mFoWWsnLVSssI4qLgaxyB qwqRpPw2Zs22K21X58tAQ/UCu3PMakzsOWQ0PHX34VoEOYFTypwzkiQevmzdgUAOgwYNxpSgLukw 5QyUAQOVg6L1wovPP/XUU5s2bbEJlfTiCMWlVytSMVztLYR4qcWcHPEmWNCS6vhT4Pgb8TwVTB3T nULvqdZoKcTNhWQ9lEsgS5aD6Gz+jEahhPYH4ybAjeoIfI8bO5ZU4WOxpJ9FgGSUzcGB1ClD+n9G X5V2/bgkWFUPCDYnuSpS2qKmE8XJJXAb+OaSZcQIiGTUyFF4J+vXrCFYweQU4/Y/3sdRPpVH8j2S dhvzO9STJrswUPJZbf5qbOel4AY2zUA3GTJo0FlnnXPzBz8AAk6ePIXtG+63FbYsUhVYaltwPPcf xIFCO9mxbQv7to4xZNiwgOfoTrnyfcuIS+OmkK6IK6I7UqI2daV+9wO48ylr7SRp1tYPqSfGF21W XlF9YxONqUIu4X9Xvt+xppYU+zgTD9gNblKYf/d3f/c3f/M3/7/mYvfVUsCxLnTPPfe0RvfQle2G rc/Zm0X5y7/8S3HrcyH/+3//74r9//w//w/46BfEh+aBSK8uvfTSv/3bv+1YNhgd5paOKF87ckHe 7MTtMLGQgKzvvzL/0i/90v/9f//fbsQAbZO+8HI/TvVbX1EJ1EK+3/72t08wSm3odkJWsKMWmMqR UrVKT2WFV2DPO3ot9Eq9ZKSNjqUSvGYrn3T3+OmJ2K4kb4Uqn3QdO2X1usZva+CTlvmPNeIxkXeQ cSbgwG7lyDwRaBjjX8B3VvJjHrvu+us+9alPOb7RJkgfnYaUXK5UIwCrXpnbMuH52uJCnL7w9Le9 7W3vete73vue915//XU33HgDNxRcVZiWevRqc/dWAURB3gf2A7gAk5nM4jgg63PG/YVfvv/srgMm nDe++KWX0Gezes4Ku2LZis1btmAyqBFqdrw+x8ac+hbo1tiA1dHZmD16etKddRONhAfD4pzEVN3M f5FDs0JdEPC1117rs8tCD+jLOjsRcz6iVIGnxsfgNsdhEh5uhnsWU+nEvB2DltnXDP1rv/arzE7r 16+z8c7EI9Nm/6uzJPvyiyCdHIgj6+qBoexxZNMtx3O2ebnGxLWzEw1DYIlgvqI6+DNQb+SIkYgh ha69dz/8wRonBbAgUEC7kGrcbvhTstkY6oq9OdR2lzS1RXGsPmpkcZA3ZrTWJDEFJt3oP0EwqWC6 TXBJOkCuCnQCnRueBqeQe2WUtostVgrawtKBukexMZkFuHhVoD8Pc/EWsmtX5uks3TB7g4lCkrm0 4bOly5bcc/c9OP2bNxfivlaQYEjhCunewaLkw3NOXU6pyFshg/JDuRaMDsN4GrifNYTguUhMxAwW v1ELoyjmJn0v6C3jK+orGzkZFieY3cqhUWX38OhRkyZNHD1qtG5gry2h6ThRBmJqTZ+s6k2EX0dN WiENkd6u5I2nmoPk7EpLZcDWVqvhBVP4eMcnYRGnTZ/Gvfouw8iI2rP7UNfsTy1et0MgSUO3QpkG XofM3ZxxVd7FaUmzE/MIDq/fPvJD4FY7BOx582ZfdumlN1x//fz582bPmcPyjZutk9uZSkdScakC w8X2bTt40UZ2bN+6ZeCAfjr/yFFjlISgmrWv8r2KZGKZzpUmqJ++WvHWD3FCpvfm8jbfyaSWK+JN FtqdNcEajvFix6qenAD57MQS776jzbjjpFvRYcfZyEBgwJbOzTffzEJcAzgAGD72aQIHAdlWOHgs 5M0oq0j/9t/+29bArNEeAvStCNhY8yezNKTrw9uK1FOAIG9lAKMFALj9Ug86Iu9/8S/+Bbgv0z/9 0z+tCFsBQGeJ43t4eOJ+AOkD4LK4bM/hhCiJ5uiIhl9TyMdC3vg8bPP0E7WriQR5y4XVoHXFIAHo Kt66OT7yPk4rd2z3+qSOstbhdpzwP8GIrynzEyl264flp7/KJ906nbI6wc7QMdhJy/zHGvEoyDsm nPqbeSXmOrMIYGcq8hYwCt0CvAjCiNn4nLPPefd73g0YWSuH8EQsc0kztwZnJPEAzVGjCtrm8wHn 4UMf+sAHP/ihd970znfceOP5F54/deoUiEouzpI0pVugz5xkXou9EILFrMbrdZa4E2pceMbLX+ZM egWovX7dejv/hORX7oEHHrz7zrvxSeyRRFbGNFBaALHA6OJ6bB/zYezK0g88Cg0Up7rZlTjcXklU ZnFhlLbF8LZjaMoerJj8Q9ycN3cOvxlO01y7bq0CkwOrbXM8eFEbWFqnTpuClv21r37dwZxcagB5 KOA+0CRTFwfMzVdcccVv/dZvgX2QNx8dpg1h+BO89LJLONpj9addKBX5h1GqzBXqxcgaC3FOJTTN g5J8/1108QVwAfs9zKTKIdiA3YG/WSgIBJQIaGVOjbFZNdPWXsVKF8Nz+oZ00MoJnNws7kPz+gla PEUoFvSK4UQPNPRbu1ZwZyuaiSVSjQK74WiCsnHTEgT2M2Vm/vwFTvFssA6/74U8oDCyY2VHps9Z M7H6F0NsG3Oq++Dm+E//4l5GfyQZ1P6iDm3fBjeqtR26uOwaXbLvevdNH/nwRwl/y9bN/IVnYUd1 YsNWhexoDORV5YZ2cpDQAuLrepHqB2HX2TTwTpVJUlLVbi1WVipCGQ+YsyLxwosvWKhJLpgydu1C FaNHj4LhrOFQPosjoJYDj2LWDaAMjk/fbsWIKUAGtcARlz6QDpDvTv0NoKw6s7oQeFF3167B0qEb z1+wgHxWrV6JmF88CLa5ATyadTber9vIG8WDYMH3Dd5u9j+WzhJBFRTOcUrx2LN33/49vXr3nDVn +sUXXzB54mSa7p7dha1B7cI8wT8p7o82bSo2464H7M0G7J2zc/BQ2VCxx1Fa22kUh8eOG2MTtlWs 9GrRSSZ9L92yfgTSUdNMrb03MLr21foqzyPS3NTma/Qu/m2GLViwgMNTXiz1j2izhB+VzHfGCFWF 2kmONdO0gxft/gQ0IWCG545WXlWmDwOvUuZir0Y8KvIGDdnOQUNYuZYEswLQBHyZuuvDmo5uj5wN l3e04wZ5twOaHZG3foinIRhk31r9ZEGRQIyRFNbHsYTT7nloMKL88i//MuN3KC4///M/r8pyOY4/ wY5CPiryVuDf+73fM3j/9b/+162W+CDvP/uzP1PgVseFkpW1wtAEBDgR5F2/GCdY5eN3j+Mkcuoj tivMqS/AmyjHTlm1a6wTHA51Cuv4vXrNFH6s3eMo/rwrDKoZ58ZEBWoz27hnffS5MVtAosEiQXhg RDlVZDcOQNmMlX1aPkksUIzTph9sSujktAkTbBq7+OKL3/ued7//5puvufaaiy+56IILL8RIhniY k8GIkK0ZuhrrIBJtYZ36xVcGNZ555lkUba5IVr+6BsuzhC82633lfPft6BZ2zlnyxvXcveSlpQ4S 5xNN2ZgJ+fbGtizIr3sxVTKEh00RdAhZFnzZp28xqY4cwXY7Edth5HCOAGMEDeCAav0rXhziJ6Fn L45TADXmcBvG1LQYmjdtyqY39fUb6EOO/GCr0+23/eDxJ54gHzlCkJgnwDuFQayYLV0OwRHeL6YB ZNkcf7PrU5/+lJlVJRG7qStsn81Zld3Bd1mELOE3hIHoS6FWNxlNHjlyxIYN6599ZpGJP7bYBkMW 7zGq5qGWJcYoVxIhmeo9I4yaYIuk7AbYkixP1WJhnKtRk+Y+1ixQFQiWeoBI2CaEXIFgNXXX1AIN EzjYUZjiv+/goc9+7rMf/vCHwc21a9c0GGKUQiqe7bAaXa9T8mwHbMzPAyw7AKaNXlGq4yJDJ9Rw GzJIxx08ONzxmJ+bLAiKy7/CGHaiJPfkmEUf+ODNM2fMojspyZ133Bl9JgMkCKmyFIJoSaXRc9qI K4JHSmkCebXKLV0ittXAtQarYR4ba/o8U33bnlRiKb4FV6ywSIIrrvPxlkO7w5ix56GYxvcWt5ua oEDYI4f4uI+GrAdyZekmhthqxI3ykz/VS40CBOvuwNZvU4WbgeDRzOWYpQ+jdOr0aVTo3j16btm0 2YegUMJKYdq2WqZZ2642S3jDRzmCzDFsEqTxbBKiSdyadHccPK/4kO3o0SPPv+BcvkFVe9vWLett AV27dj2Vb+dOOvyEiaf15mt8wzoO9yXh2FM290L7pukfPLRrz671G1bv3rNNH5gymZ+Z3un2QdvR QPTw9MAqlhS7wutWzN0KyiOT1sBB1WnfSMtCC8YLFze+JJYHKBk+ngJE3Y3q1Xic/KF3wqPODUed gepDdI6QGTrCSmFkBHr6reA4WLAj24TtGWyFcVsNzJjiQrLvtlrTKzREpwam5d4K1vM2yJvRHeKv lQolhgG+PrHEBygLFjtxS38pvcSoV3hJeZtNn0eVT+vDsM+FlKYrjBq6AfVDUkc1z9fqtEv8qMib QHyNlaedshHkjS0jAP5hax0ZvLW1BqKlnDjyPlapOkrg+N3jOBI79RHbFebUF+BNlGOnrE58CLwp ZHUU5F0NY7HZuGKBM69kFsnBJYFQHpr2su7sg+6tV2ZuzkauvvoaSJTl29SC1XDOOWeD1zfddNN1 1113+RWXX3b5ZTwc28aH+8gV9P6DxdQHqZjPzbKFrFxw2SFIlPsR4JJr7WefeeaxRx979JHHHrj/ Qf4r1q9d59Tyc84757zzz5s7Z+7wkcNwPa1kllM/9tqBV0qy7OUV5oPG9/aBAsl37Gyg8BAzMQMt BP/s04sKjkEjGTMGVQB6mDljBvP21OlT7E1kFG92cNpNWBQJcAvIs1JdGMYAJQ9ojdUTACpOEQYN 7Odc+nJ2fcEuyAzwX/UMQ1BmDmXjDDE243AnJMWUPnbMWAHYwllt5SWWqeXee+9V/Y985KNnn3UW n+Z/8Refh654NnQejiX5aVOnQoTcZXBvSB3CToExpN+w1ctGUg3HxMU8nIZrqrDTKgE9hExiEtaC wHTeBkvFMWLMn5UOEfgYTlFgt84d3ObJ2Wefde3brxk3dhza+rLly5sjP8uScmUMp0elI6VTBYbG hho0k9zdVJQji5hjVQEU/vQ/+TQvFZ48+ugjfD6KWJSbTZvCWXdFMzStAlUUjHnz5up1JKxnyhfK YeeWGp/RFlCoZGU74BF3LkX5aLz17d2959LLL7n5Ax8AO/Te/Xv3S9B57Q88cP+zi57TpiB7SCxR TiKNrFfUxZxgtfQZ6DL7jJUtKwauIFeXAmhrgbOXMUAZdQTeQ0YKJk6wwHRA04Cyrl1OKWqOXJ02 bfpZZ541d97cyVMm0QApPJqvWltFgfPKLtWJZeEl9t0ULy0YgBh6kiudIbpWxZHH+uTVfkUa2bA7 atTohacvREO3gkBD5mu7oM8GILW6OsnuyQKIk6u/i4eS5mrs7P5rvAna/koUXZ1X6ttAhrSpCy+6 CNmmV0/HYFFztM9uPgRRotTLcJg5eyYy/9Ytuzes20rX79ndjs+ueCdqw9s3Xv3WzVt9XAYN6Dt3 wYJhw3jYLPS5LEcQhSzSiBGO33TI9M/ILVpcnidA3kaSeVuj1J4fWM+C0LtXT8W1YOWJriVAkHe1 XyTN14uQUjYRGaoli+F9VEwWjkc7cGwpqR3yhkqloyP9xm/8RqsplwUXs4Ip96jWYgUAQ8OvaLcP Msg7Z9nUggV5w6wpuecByoHIreWvCCnbOpnzU4Aa8VjiEsCpW6QhSj06x4KAYWK/ptSOdZJOR0xW kfdXvvKVZGcF4N/9u3+nWUmpXX2DvMFrb90rQxy/ECzTu+cKEOh/HJ73USt1IlV+s0RsV85jqVI/ S1U+6Tp2yqpK4DX7w5tCVsc7PT7TT5ZBfRndm59guxBtTVEmLfchSVeTj+egEtLIhRdeJOJjjz3G 8Dlv3rxP/5NP2a4+f/58zkmY67r3LCAgc7YLdufMGNgDpPi8W7b0Zf5Gnn/+BZsgH3rwoUceedQp Ks8+u8gpKr5WcgQywEqrtxdexFI+hVUPExdh147JBhgVZaDx8WcXmh2KYERhCLCPDug/QERYH+dE 8cZPGM9Qd+ZZZ55x5hl4L+iqMEpD5oa7Bvbs0UbclGZTwkIMgLyZJKGFQnJn1R40oFi7B3E1XpxG wzfAU6g4LKpwptk9ykk8D6LBgIMNkOqq4kqOBDJi+DCqBUtSs3+xzN9EXTxIbNlqKkKxuOvuu7/z 7e8QMnTuuTnj0ksvE+aJxx+/6OKLbnrnO5EliHrzxk2aJjwTBVAj04NY2VtJFMgJZv2t24qaFHJC mEJlXaIBQtm2GMztrSeNRlTatzJA4EBoM/1bAPJkih4ybHD3bj1s5SxrFPv2cxwBYiduXc0Pggzy jtoWAJqxFGtfLIXB3zAEjeKiSy665JILCerV1au//OUv33LLLdEKKt0lcMcklxNPs5UAfKNEYP6r ThQMWhEStrUOG0BtqyVGXS5NI/dBQwY15JkuH//4z9O8sBeg2//2X/8b0uqjjz7m8Dst+8EPffCm d96krR20lA0PCh9ujxwDr6OmRqp8XJ7NFfy5Z+uuchEyKocKBu1F5q489Kek3CxcePo5557DjgvU k2AwahYBmm68Ffi2gVUFjawJOvH48bSv6dNnQLHRviQYGSoPn3pWbxj7kcM0bKNDtrkPklc506dx qRE0GWjuys3xUWACCEnIZRhv3mSJBtuKcXf7lq02NOj8YHRTuzYTZRsqLTTsgO7SC0DvhvRdnJuE meayK8IjPY3GaEgY5hecf9G0GTOLGxMOxLuD5TqSTifaobLwtXevAyfHT5g4asS4Xdv3rF9Pxd0p hJTkRk3ucqj7of1djQ0rc/0H9EVZGTt2fHO8a+kGgc6RTO3baZS0UQJkeGYGrYi8VTtKl06UfEKj CGkIuSCYWa8zDH1GgPyMO690mOg8NffjTNJHhVaJyFbtt6PVOWPKL7zbLoBt1sC30mZToAB8YJPJ Rz/60eopLznGOwqweFTkrQChdlRkXMsZ5N1uE2dF3rXK0QH+03/6T+3Sr6II1RuQjdH9NWWl/EK2 Kg8pErqdX9n5whx18+WxkDcpmRkUkoiI2jfnd37nd1qpO0k/yDsbW7MF0+qBiFg6BGtdgrGlI/2m tVmP1fqvWeWf8ogZR0ftwD/lJT/1rdMpq+N86OoHrX6r31z96ug878wxmT8gHpjDxODG8xw4ErZ3 AJAJI7bGagpi9jj/gvPNvgzDyKnNWvCo6TNnwLUMzA7jsJuNx4YCesqR4MUHtq2RQnJL5/QThy8C OsjZjz36qE+kuWr9+uKBq5oVAQWgxJ8gLEdzvnGQLpL3N7/xLdbWWBaDlYUp+6wOH+4/oB9SBG4G /9bTZ0x3D69wEzF37lyeRljLGNIwu8vRHcXWdbixj+8EVbGKGfBgNWXwG3oDHxgkU5DcQLC7bCtE BUdiYVwkKymUvWaNTxJAlg24bPfcWOIy58d1HWzK1bhiX3Pt1ddee7V0Hnig+L0mtGbvV5mPy6a3 AwdffnnpU08/fcu3bxEd9mr8b+w8fcECYBfsXrd+3Uc+8pEFC06HyL/1zW+Rrdwjq9CB6ANBRQHB xQrr3L/GOwcpxebqJjlW43dAQ0XeRYwNOlQkEjv99AXwSg7dVEciseYBY8kRWYgEiqV91EgJBhy7 CfgIaqmG3gpQ3FTEk/EjGDhCpKYopBFvrXJ865vfpF1UPUHJ3WvuQn1uPFpKWRVCfNL6cX6X1LxC M5g2Y5o1Fvhb/Xjus3UVJUYfPuvMM2fPmuOwJKxlqhcEjyyhYxLpnXfexV6lyS659JJPfPwTqk/T IG2aEs/ogVmVeZKdD0f0LgfojDvvgvP0OuWxA4GVGsoMCGu6WWFwhSKiFoGkkqK+6RXnnnfOiFEj 5btxQ3HYh3peTgIqqfemPKgX8veWTVtU2vbfZmftIONu2rSpjqmXpv3NRBHdQJievXrq2tqo6cBb A/ojmYyX0Ltjv68SU6SqF3lY0WS9b4WeWcnRx2gmc2bPLbS0w4cL/6c5W6rUt9lEWXyeNJ7/CsDG 4258mXsUg3JzJHzheyOceKyM+w6UfmvH7qc+8amrr7nWGgnH7V27EWOJ3L2rRufFsJykuXfPbr52 fJPGFpLYOC24es3azVu3ybSQy8oHjc+TciTujt07161fY5Vt4mnjJ06chM1CLKFFpaun4qSRZiol O3Ljz/S0KsAA8TRfFVG6el5FOSEcrckWYCeo+/wZekk0w6hwkW2dcjpOJx2f1EzdcGYnLvB6rIit yDsRAVCX7df1Rgpf/OIX4yKwNZ0Ayo7IuxYgAViFffFaI4KqMTB3tHnTpWuVU4CO6dekwG5JAdM8 lkZKJy0rJEPomQn/OLJqnfiNZbUzzaWQInqrGOB1dUdTy1mRt+4UkowOJhYh2Dxq2aoS32NBf72t fNLd4ycesbbXW6fKrb3o+IO3Xet0yqpVdK0TUMdR/6aTVXvkbfqs0CdHS5hC/J55xhm4IpzlWSOG aWLjETKTEEwAIcGFJg8Tuc8Kox2f1oQ1bPgwgFsKxcrZIBVUFWDC9GPvI8/TDmnn4I9bN66gwe6n nnwSJ5utIlCVia6Z+0sTBBaYqHLOnEldHODb1iVvy+HADz0MXmIjB0loDK8cu5MTLrHJL7jgfPbs 7HAHUyQiKYGliZECUm/bUg5X37xxM/+DxRfKqw1xYuUqS+eUhHjMAMQLTNlXnGAMQv4YOhh93KWO 5JD1eiGlsKnZdGh+KNSIjRsxcnbv3KUOcOr6dRtMysjEdkyCegLTNJTK1xlKBgfZbuPOlnmM+d88 Tbxwl1+pYVQ/88zTt37/VrBe7rD49773PcfWkE/8NoRY7KOPvhKDdyCpyjZeVgpCDYYI2yEwIggj gfOWDGPQ9adYhPa+n3OwxVXMdfa2yquBIIcJRxXQ0LMhFUVH3LLisG691CrmzkCqyDuW9UCcwi06 4lkysDtLB3AbrhGV7KUlS5HpuZi8+tprrDuolMKQdizN0pRadpTGxB5AHOAoU/fA69wFc7GeGGWp W4rqrBg6HrPxJRdf6pgevhGtBlD2tDkkR+OkP1hswUpiy6e4OXZeJ6YnPvjgAxw0GAvFwN+4rk+O fgPR/PIXYkOtdHQDKBmRyWGo+lvseW7SlJGARETxpPFLOJAmx3y7Yd2GpUteXr9h/YwZ08459yx2 a3DWXggwWr7C02NffOFF3cOuUF2FuOgMzo6hYuIgIUEHRJr++QUvGxCpvJs2tcK7yEeACC3lCeLM dlJVq3pCxZEVaUWlSRPkdEa/pfl69qDfEqyjZNevWWdwFcn06O6Aypi2o4HlpJzmk9oF6PYsH1AW 7VDAFd/hQYbM3Fkz//nv/e6MmbPWrtmA707w9EfIu4f/GgJIz8aLuuOHdu3YfuDgntMmjpkzR+6D gO9NW5xGhL1DCQG796nnnv2Ht+8E0zcc2rtz3KjRc+YvYBQ3arLak37ow6Y968cwYyS9NMMkH8A0 t6vVGJlXR6pWpJWViqw2RIWRkT/TY3OTTRrZs9t6tZutW/+sDVHDB3n/v//v/5vh3DGdIG9ws85V gZIgICqgX+CYbsmRK0vtN7/5zWiGSacj8m5XgIq84drWAvD/GIJ4PW1HxOzgrOQN4VMSiL/doTy1 ACAss/f3v//9J554op2U8ueJy8pwiKxAf9/J14wYrMzc/va3v/1P/uRPQlhXL+yRb33rW1JrLUBF 3pJl9lZswqQ2WKqyF1PIiryjeLyukv8o3eOk+9UbFfE4mtLxO/YbVYBjpdNxKP3Ec+yUVW2C12yd N52suselXe30WadWDQgAUcFlAmYSPuf8c2bMnM4tAGOtr08F31kBN+kFo5s/LNNbM7zs8kv5+jUt gQJclAA9ZUX7cPGj9OTjTz7++JOWXJ995llJwVU2jcG74ewGgihSrInmuYqoYpSSI1Tq8hYe9US+ UPjzzz3nYMViPerdhwkZ05c7cEQO2xAvuqgQyqkN8LHEpRPwoeTx+2GeYHFfvXqNswOXLV+xbFlx Sggt8ZCtVL7LxBL+dDV0lcXyxlddoAkQrxjKQwKxXWGVONrGq1mzZrKz8puxetVqXvj27nZYyXbz uo1iZ597FvMwYd5/3/1OaCNqKTgpHXCXUQ6XZrFDiHcSO4u7t9UBnG185Qy/Q4eJztHqDz70ICK7 GsUAU4FdfDgomyk/5SfACEE503bZ3RUY4RIyiaQnBIp5q7JM2cgt1g20FISq5Jg2DmM7/4IL2C/B xMK3tmFxxw5npFOfoI0MCdHTx5JjSBcVbQfrBCZmjMUKGAOkLud65zvfwUbl3PKhw4aIG0CgYFl4 8Vt3ggb+pkbJFOCyJkEBQwmywxWwgBFpZSNGlpUTytjMmbPYkuHSpS8vZRRWC6RsPRYgWrpkCXVL GSBg/eTZRYvuuOMOR4cCwe95X8EBORpQgdNdFSmrFk2/6E5PExhB/Prrrz/3nHM4FL/jB3fAjmGk BGYlVvSTbKho3GOuefqpZ/QKSc2bP2f8BCcKTbzwoouNQfoei2p2TIJtVo2oZyLYhGAnpZGobrqH 44FCiUmDaosw+CNk+UbU8U2UewlmZSlvg79jwg/LP2x1VzgqlB+XVQ4jC5gg2BzBGDdHXO9zzuMt M/v2rduKF86mCyBwF0s1KldDpS5jCvIuuD4QpDmRstljyfBNL2GpXjB3zs994GbZ6imGz9q1q23v dIhnt66Hyh7MxsIMeRfLfteSu7GgryoSRWbb1u06Kot8MalbBOD3pDmidP+hfXuM1207hg4ZcvrC hXZAGhQxQjdaR7EpRFaeRD5VSp7Hqp3PVHpahk8+XxFmurQ/pZxVphoyk0r6jFfB3240XztoVUdQ ntdvdcX6reEx+qTw+c9/Pl/L1vAi+kxxTuIh5F1jVbzLgquHQIfQMEXOfkcNCubWdITU4atNumMB wjKXe3jPNSIkKiKCeJ4n4rGQtwLw+9Su5CltfJtwOHgstySvS1ZB3n/0R3/UWtRjCTlYmUrwN3/z N5pJAWgIxAV8q1rVH1KAVuTtT4E9CSM8JW9n8z6RArTrFfXP11Xl1kR+UhHfvCWvQ+/4Y/ANFHKn rOrn4lj9v46dN5esupsXa4n1J5NWMSD17OnLa2Hd7GUVeyp/IMOGsdQyVNvjuOi552IVy2TTWD3b tsflc+/gD1ud3CxZ/BJyNsgIlpmGXlq8hIMIxl00Waf5gSyhZFTIUr+2oUYEVLkJMvM2MDEIwCee SXLM6NF8UJRF/OIocLiVfVnPP33BWQgEZ52JCM7ZMFggTLBRclRs2BG44f4bcFnhjJyl3BG+EvO2 gpm7C9xrjLKqKWLsvhLxG32APZspFGgA/LzFJcAAz4J7uguCilyALWZgiSBtW17etHmLKcmuxEsu u3Ta1Ol8U1h8vO/e+xtz9d577rlb1T75yU8C6y+++AJEhY/+rnfdpC2sD8BhYVbkyD0AKFb2FFVh 67QRYEdlQkqJSuBXm1K0YniLJTttp2yB4xWTRdr5M7gt03bDoj5IYij4+OIS8eTMMxde8bbLeQx5 8fkXzZo8iK9buy4kddSaIpkjtuf0lmpGregkHaCimdohkWp+/uMf5w5C1d7//veD3SCqtWb7SiWV HatRIeSiCmqXI348idVfmkCzx+/7ufe9/e3XWN1/+MGHUYGEdK7nyOGjxo4fC5a9umrlM08/CxOz dutIffv34xHFMsXiF17iIbAY1Bv/g5qA80q4mcxxvm9+//v50CRnRco6g1qE0hMhR4Ckx4w9c9YM 2xtsWrjvvvswk/RJz4ut94eOs4vtOe2CbF/24a14Jba0Zk1mK1HjcrOF61Fwv5GrO0VulBwrHkuX LkFG0TX8eeedd+LSpHEj58DHCiWTrKqRhBaB/ISpfT6B0weCv/U6NVUG3cDQI+ccL5pjQeNIvkJV VSuOwbdu6d2n94LTT58+YwaMu27VKhTrQg0pTJFmByUTeMP1bnBrMYcXZyY5XLN0gvIHyUPktOhz zj3PcgCNV09bs3qd5aluXaxp7MW9EY6Vvfx/AcNGaLedO3ahm6mRPs81kJUTRzvJvXevPoXTcpjh u3j83rP3oC0mXOP079eL9nXaxInWvRQ++k9QdcQSUQRt51sfYF2f18m43Svh0wfyAQnyrjetsZLa cY6xrLGiABx1KgoRgkW2I1VaXsyu4Vt3tDR7CHnXNMFKIF5qYHR0BheI6YmUK9mjtQw6wD/7Z//M k3/1r/5Vu7KhROsz/+bf/JvWkndE3lJgaw+obZ2V0mldQfZs5yd4kmWN2FFW8vrc5z4nLxVs9zZt 1E7IHbGyWEzvzncjk3Y7NYkuPO+kYxU3cqsKz1FTO2qVj9rKx3p41JKfSAqnPuKJyPyns+SdsjqR dkmYTlkdS1Y/RN6RkY+sGR2ei+3KfGxp25xhOxdoYl0bWgUOTNUhLbhCUYXtzE++MsAD5Pry0qWP PvLonXfedf99D8ArPOIhbwAolt5ybHLm+EzwgQX1vmK1zG1hWWQCUyQ5wj0KyYnv1Ia0zTMIw1vD CR4Doc5fMA+B26ctZnhRRJRj2QC2eRP2CPTAVRz49fCDD3HTRjGwFWwzBsj69UH5TJCRRmbZdCC/ mYaFyRpx7OWFIX3wUBxjQxIKH0t82UXavZsjWphJuBEEU7gphEp9f2kmb7/u7Zyn2IGHSQ6Koala jV3xygpC+/1/+fu/+Au/dP75595zz73s3+JCgQ6nRHFWhdqVAzdVDrC4/vrr3nnTTcyQaCrVQ6Jq orMThVogpQCa1iKmz5gGEGmggOn4KolRnJzTEH5juotZOvqPhzHwM7Gj1LsCUBrkV1Q1agb+CcNw bOTlanY6JrpcKuxOXgH9md5csbN64pVcigPKAQP+8P/4Q6ZiSGLxYkrHi3I0JX/5y19B/2AiDB8p XUKsOHCMHhLLrss9H4JXXf22q6+5irfI5SuWP/TgIyuWvyIINojtgCFP6xlM+Lbnso+KDGdCccXz zO5dOcy8Z4+eFjkUIJcS3nTTOxcuPEPnx+uwBbPR1sqx7QrTjIKCoWOGb5YUulHqHn7kYYBYe93w juvtM7aTWIMGHGeGloIojepbFDyNG6YHbRA1i2PBsv1gx/ZhQ4eDvFQyIJZVkhqaAQWIm+N5q7y3 9JxnlKFxk/LDI+KjXEXOGWXp5BINuoq6W7FjRlxtu2hN6QYqHs857oP+Wy2+MeJSjVxWOGi/vF5u LWSXzTv27IKS0bvLBoxmQ2WGWhgNTfEa7lOhmhQ2StmlcajLkKGcYc8ziKi7Ze1l5JhN6zds3bR+ /8G9KOFlzyUmd5EV/F36D8u83mdTBCeN1JV5c+eDzZs2YkVtLqdcEssB3k667Ofz5NDBbTu2bFi3 5tCB/ZMnnTZv/gIOTbN4pb6xC6Tr5hNUv1e5L0i/xTl9ZKsW+TambhI5wjM5OqM30kvTHP8A+fST 48x8GoWtWoCjglfINQbaVr51bN7tkLcUwmn2ua7UDq1pk6WBxu7bsQxAc1zsYV+0vpWI1SrPcVda n3dE3r7A0HCs2vXDW6us5Az2vp//4T/8h+NIoDVizi06amAZhWPT6ugwPfCoQj4WVpa+ircTeEXe tbFk1KrtHAd5H6sAJ1jl43ePoyZy6nNsV4xTX4A3UY6dsnrNnn+sAD/NrdyGvDNrKij0Fit4THcA JcsfP9P8uJVzwnv1Hj9+HIwbw3NWyWPCDMYKlhKRsRY4g8YaA94uRjgAFGgLZ8PDfCCSQuawjt87 T7JfLSH9ZuFbCcEXlAHEg2FlrXuYSaLYzJqN56YuScMojG6yViqztbX4JZjCS18G2myalCgW8gvP v7hrR3HlAW+kJLII2g4ADTosOOCInTuM2KBe2alLs50Rw9hq9q5iae73Qwdt7IKewExM69D2rNmz 5YTAcO755zI+EfXOXTssAtjqxxB1zjnndO3e5etf+7otX5dcctG2Hdu++pWvKbassbqtEsAtkUY0 loiLFC3oO/JzwfwFdAmQSxRv1SLsZyUUkSgYLdF+uHYxvWXDpZRjMo911r1YSdyTQIoY/CKZ6DyM 6C4iJcZiDG7c3WAbs7CapNMfxI3cqkKV6LnCNkmYyLkNqB85grtB/IeGDhn8oQ9/iO1f6b/+9X+4 7bbbm80AT6N8NI7zYjiUbGNDPWKwL8i0YQdl+V7jchNJ4EJZfnl+0fOxVK5dvUaxAWtxgRUzdON+ kVvG9VGu4nEZdX/g4HLKTNnH2KgEEU7pw4V+vJ86dOttt61bs45sbTzV/Sg2zfGNhVmuAH61GmSF 9I6/JHeg2Xku4a8jqmQ4RBVhrvZW+ED2uKSUe2hCfilgVEdM/qZZN/HqPW/+vGbD6CHHDnmI2y2M cReBi5sh6c9Axtq3/ZleFHwZzBFFK+0SoBkcmehJMB3DlZM+Y83NNy64PC2bjqRI8bA+etxY9Hon GW3dshmFS5m4DASrS74NB6VhdnNSUh18N59TjPCSaXct1beP84NGTJgwkSbKoRBNct26jdo6tVBk n5B8xcp+y+KQUDGsuewhaosbM2fMRuTX6PZtFHRe/KZ3bzhjh4BvJXQk7IG9u2fNmDprzlzy0nbp nNGFlCVdumpKUbFaZZtXFYtH+BGFRKokO84TkXCuYyHv+olOS3VMJE+oXtzex+wdw3CNiDrIJq13 ccdBbjWFYyHv7EHUH4KkpWMKYCBwxiT4iyjYWoYcguM7jAPd+srzP//zP/ecKz1TQGvJOyJveVmj kL5gzOrtqix9gJXB+zXPsExEH1XOs4minXdwxVYLZnjZ/eIv/mK16LfKqqOQj4WVrfJhraimglWB BHnL/ViNdazUDH8KRmWFHauVOz4/we7x0xCxXRneRCU/9UXtlNWJD4E3l6zKDssKXBTd3FlNdz5/ QBtMcP0N119z9TUAbvghzF2mB9NJoK1gWdbPNBOsUCyeB9vm7BjAQsOomDWfOb+J5V4xWmUnHdjU RJ4wmc9MOgJijTO3sVmKY6LG0DX/yaI4/msOkVn1yioIu7G39WCzty9y0TOLlix92bE7KKewEeot NaBkh0h6BPpXWou8qhYR4FLN83WurYPQqwKMGm/BEHyBUD0KQIkjarvi4Cf7Kc3hfKFQD8aMHWNq YZ0FJthZv/3N72AvnH3O2SAmg/c3vvFN6wOPPPLwd759SzF4N+ydaB1E4aPMLSPmD5Oe5w3Q6Vv8 RGDRbN9ugjHdQgxylLtftYir9YDFeFo0H8ccK1ZxnticX9jAvjYUHtWiFZYFWskO0eBtb7vigovO 279337Jly2NabpbmuQrZWFZIGgQZDBecl98gkvQ06USbajpJAbKtqx8BKFnu1/3Q7U38Tk2yf4DW l20JUoB0LXSkpQL7VLwwHJAHGoNlowPA95TJvnAK3v7LS5fJDMsktGadGUgFy4YMHczzNznoDKyk 2CnkA7xux5svB2Tahlsccqdq2XeIAkGRsyjx8MOPMGajf/Aw86lPfdLJmvZfasH05AghwyHlDJUf vl/5SoHdBfA1ekJwNheZl11+iRtbAipWk108twjjISALXpftv2vWKvOE0yZY3OjT17kwe20Slrh8 q7W1dYjVVYWUKkqRFLI3Op0/DVHxZe3tGZtVd4oO5iNghEYXzVuFrCp0nqfjUWP8WvM56+yzMZas MOCtwbwNUcRZ8/ZKuo7YchumiXQaI3Dx6Q1K628rXlm+6pVXOLqxxxQixzQfPGS4Um/buqM5tafQ oorLFMqYnsawXSJ3OXjYSUy7rGtxgjRl8sTx405bsxadbNPuXTt8GXqwqXP0jTB24PDB/Qe3Fyb8 tmFDbF1YwMMMQrmmIdJqIKh9uGp6EWP9gilyBmwQea58IuqT3KTTJkBi5aYj8s7wTI41fE283Q2x U61ZYTmzM9Lp4WXZZ9Aga0dBxgBiR5t0O5t3MiILCNLHCmuiFgCqlrJLAPg7CJ6p+9//+39PIfcJ qgZpXYuB/Pd///c9t/sd8k4Fa4E7Im+vpC9T+xFBcMtcSR9Q/uM//mOF9BaVpRUrt6t+q6yIFPhW fhsc3RtW2cIuX8cDS8SYrZyc1xTysbCyiKG/M2lnpyZZVZ53uyrX0nZMLRFvv/12WzZJTBu1yupY zZ30T7x7tKbzE4n4Ey9Ap6w6+9WxRtOpHBHObx/V2hIxE2b6jOHTR/Cf//N/fuaZZ0yaMvGZp54J 1cTUkoNggs9i5ar3mSTyW1klmaLq9BNAlmGQ7DK718keEDQJJVnTfBAPA8ZFF13I1XZcl5jxggYg ISZYaMmmRoZt5kAfblxYNmIo3G7Ol19efsSOW6yt1cinskdIMmWLXpBHveSujr6ncg8WzHxZLwWO TauQvPfs3bRl845tO5Scc0AFiHtvB4vs2bsbmVtVOFqxH5EbDdP5omefve3W2++99z6LuQ5q4Yz8 a1/7epwxs2uC484l+exnPwORs9IxqwNYQJKtorwQwqBIwM1+1n6A9QP3PyDuffffB5ZBadnulh14 qV0R0f79TN1oJ4GAMbVmDSHTUgzqXoUfUlFjoEPCMK/KGtxnwYVl6VNIt8rjrEecexpO3aErSpSW /EokukqQdyBakFmkmv4QJcdN9LeyUrFkCYjMVI/BT+sgUvXVFoxD5KyQ8SgfAzPjPjcvcjN14fOw doPRKOe42tZAevfsPXL0SDi78Yhiw0Cv3bv2oqTDVpoRzCL84nV7XyGvg5G26YHIYqsBEJ/+Q+Au ZdPcIYfI1wkv9n7NmDHTufTK/Phjj/MFnkq5sjASvkHIKtXpZGz/Cq+Pkf9ZZ59JMSuntL68LKyP jKNc6eqQC21BUaFJqyWcltAUUOrRwNCp6DKNgtq2RiR6miBDr4LC+oQ8obHoq96m6dMQ9fOUMgTN B177LY59isOiAtnVK+pBUkiHqVgzgL7o3k13PfeC86dNmYalbRepZwUid7dNsti7izvPsoxRruaj dPig4dVAcP/sVS0LK4tf7N2ju6Ht8Cp+k8aMG6cHbd28DY+k6+H9jtcpRuxDSCAURUWlmbNva7ti JuA2dO6cOacvWEh4S5cu37F9ixN5UHs07EHw//DBXfv2W2BZv2ZV17075s6fP3bchMLuadQGEoj+ EzFWSeYjFhG5T5euQDzh82Gpn8SKxvIZaYdFWpF3q+Q7QsxjoTrw1BpjzoNEz+DM5DOf+QxwrGns cczB7635ttq8a44ZjwCl65FHHqmOvUM+iYM8FnEo1iUjC0eg57/8l/8yHUA60C1jsOdOcHSWDRmm Csna71GRN2kzH/jKmXcc867wLkDW59QJO06FFOCoE2dHWSkq/JoqkAZA77IhMhoCazdzdUpSu/dx hHxUrJyIVsxC47Ykl86QszarV/Va5Zp+a2qtBdBSupmS54SdjhHb9ZYTKXlHcZ1glX8cEdsZYtr1 /5/JKp90HTtldeL94c0nK0uQdYCZJOADHcWEAXz40/yKHHz1NddwuIY/anul7wIkxKKMTxKDRLBU purM+rFlBi4k8UCQTP9BsXkSefnN5O2+YjUFMLVXS2GS/eQnP/XpT3/y2UXP/umf/JnwLKDFccrw skUseMV3GTy94goHZF48ZPDQp55+4mtf/frSpcsaVwzF43jF3AqTHEVJOXOgemM738qXA8RCDXGw pVVylrDnnnseCk99/QqZblErnnkU1L70skuvvqaA49j4lQ0aW7ToWYZVBhgeCFm7X3zhhbvvuue2 79/+/AvPx7opmJRtIoQvH330UdPMVW+76vP/8y9WrXrll3/p10x+2VJ50UUXvec97xo9dtQ/fO2b d9xxpyqEf5KjQ/Mh9uv4TFO4WwJMUTUcWcnFIjIgmDNHSZhpShUqthPS29j5UjUSy/a7HAPJ0gzy xkUdP4yOEf3Yz3/sve97N3j7rW/wfn03o6/AihHcH9ghnXAnPNf6sC9ZRStLsJQzV1COysqrWTco xVY7fwqGeCM1rSykHpiFDqlp3/ETJthxq0Zn2mB71hnoJX/3t3/PFeTCMxbS1kBV2xNpCM5Rkg4H e3yjQ2lSFmXkqOFYNf7t27sHcxoNgeGZemMWlJGKk2c86mTFgAQMhFisTe2/83u/c85ZZ2NXW2K2 UK48QZwBYS5PYjWXiIWm+EOMRiQRVSBtgHL8+AkULR1GlMQNmBM+RI7UWhnK/tr+A1DVLQHBw8qp UuRWqrZ5sxaswE6UaDiiBzWmAwuQXbPqIhYh18WQOjCD/tNwoitzdGDSAIZkF6/5USHSdhL3JEhL SClklcOlNbkanD5t+vo1a7/411+49557eJLp0aeXku0/uL+bch1qSsifNyM2LNwlin13C0mA9L4D RlO32dOmvu+977npve+bcNqkgxZbNm9+6omnHnv4fvpIv/59Bg0Z3LtXX+bsfugpGHGFnS/eIXsu 6cf2gYwZN2nN2q1f+tKXHn/kgQ0b1qhIrz4DUM979PK56zmw3+B+vbpNnTj+jDMWLjzrvC07933z 29+hNtPASLHhlRUWU51NI+Qq1YgrLZ5G11iahjxVPyKK/Fuj5COZBiLVBGj9frZ+ovM2V/3+1DRr RC2bEx8T0qjnpaSSTFojCuMSIL0u4aNn0m+9gimrbbgWW+K6fQLrPxIXprXkZhafl8oMqRFryZ3g I2KoKR2rLLos8kowY8oeoeNXuYqlyjPJqoKk4jRGNSXVrqjHitgqZPJUJALUGdq1jpGoV5NelVLq 3m4faqvMpUZ66uVrVmWeorpk0UpPP04rn0jJq3jfkH71I+aYftVa5XaN1Srzn6qS14p37Mmto+8N FHKnrKrMX3MIvOlkxaX0P0LeBnwYCJCNajORxpQVWzik6xXTaU6yrLNIxW0Vb3kV02amqExIph9T ciyyQpqzfapiTw1GCSzzKy+xTIpy9yQNIE0GY/6k2YO/e8v3AJF4Wggsi3M33zvept/17ptYnX3U /v7vv2RjKIpuYXoUix0Noe0QmYY7UfbkxWypOsBocdvXr58zAVEpLOibuf/Tf/r/zZ0779XVK3/9 137DtzXsl4y9zKz+jM+1hnq7GcX0yrdd+aGPfJBgs9QeooIb9eLjAoKwz++OH/zgrjvv4cg8zmSy hZRY/uy//4lT5++66473v/8DWCU3f/Bm0PbP/uy/s4JnqUGBr7v+une/+ya1+5sv/i/P+U+Uctoi +wvN8RMnTYRdVC0wmtgZnxhm/ALx5jBFVSQSNm2EWpOdc2qk2MHKQcOghnTcA9ywb+zBRE0MdAkz G+MxVy2Tp0wpaHX1alMpqKFIpJrTScUNaHOlQVPfslTQ5BW7aVXYZK0klCXZObkQHlUMyebsnkgs kE5SIcnAspdfcSnLFmaI03DUjlN2vrpN/E2feQ+QcvutP3C+zLgJ4yZOmiAKv4fC6Bvqzp4Kew0b MUR0iiHNUQkReF5dtSZeL1WkUDsmlIg4RU2T9SIWA8GF8DNzxky6lqUAVJNar0BevwGyrtQ9/vi0 hVrEi3N6ICilOZppiSZWun30Vb9N7y1aVpYyAm0zarJeIZay0RCEN2xzhFA6qivdI8MwyaYDR9+T jnxFByyyWVOY9AQRMySFzE3At4HmE+FPUQSrgzRINNZ9ueS5vOqnQCe363f+vPky/urf//0t3/kO j0JdenY/hOgtKAXhQPHkHX3Mg4a7VY7hKfAdkmZQ37t7QN8+l116CfcyV159bf8BAzXfc88+99jj D61Y+bIM+dVvupltoH3gbyAW80VqfBtKo0u3nvNPX3j4QPelLy37i8//j+cXPz161AjKYM9efY3N vpyS9ukxZFC/iWNHz54z+7wLL+3bb8id99zLEOuzk9EU7T31iq4YcQVz5z4B0hPUhUdzfZaQ0xDV 7pCGqKnlI+DP+m3Jq3q1m/XzvBX6v1ERa1f5SRXg1Ff5pHPslFW7TnKcDtkpq05ZdX6vymwOAbR2 BQjApBXrml/TZ85fbI5kL84Kqlfg2MDqNBOrWJKKiSvIOzNufWIqch74xRdfZJICIqGrwNNM8JnU FcBDUQKss1Mwzo9ZLO65557nFj1vAAflN3idra5AzKQABjFLAabf//6tXIYXs+q+fYqtGLY5skmD OKHDusJjkV3jxbmYjX/913/Vscnmv0cefdRkCdcC4o6v53IuNsiq1IoOABUH3g0VhEaxYP78q6+9 ymnnWDHO2MHKYEpDRCkb/hwe2UyogBqTxstLXubhO5JJRSRLDgRCLF/58pflbjsm4/cD9z+IRBFR ByfJ0e/FF188Z87c5vTP1YEC0mGTwyz/9X/667/xT39DOlCgyga9CeBGxeM3XV7+DMMkls4AO8Vw L3xMm8JIXAdICoCdVWDO2kUZOGDgBz50M2/lVkJuvfW2la+samg2p6Hgx44eOQfWB7r5zRUTaWod aFIxYuBgQFscjygtoUGTSh7OBrlF74ohH5LjkxuQhVG1+9133/O9W76n9XkA1PjoOuPGIfzsxfLn M66wwHdaHOjC4R0SA9cxsiMGIb0J/UbuhWDQtA4zeArcsMdRMg6xmiOLk5LiEbIovEkWq+DKV/E/ pE8DKfSII0yPdJuYPNNj070zyoQ3rKTmoSFFiaPQMYILJkwaXQGin7gkm1bTImF0ZNy5wWjXvf0Z cktAXn47ArL0JSlEpMX026tXNkAH6KfDBE1KM3014z3uLBXDfXgUUYTSyhWyB5VWSJpEpFBEvWsn D+uXXHZZOTd01au8kZfOJoUu3QvtpJz3Xi4EFElibSsCAo//fCDQw51ltWL5MpQszTF2zJiBgwbr AFZHKCNo96wEyYtah3tS7Nl6FKytNQ932bF76+IXn5k4ccqC088cNWqcBbHFLy3ef3AP2rejebSd XETcuXcfPvialSuGDR3IMWKfvmWdJ0sT6b0VdqelkmN6b16ppi76yU9+wr5Gqy64DWVvd6N5Riat M1AEKzqV5ljoud2c3XEKfwMjVuXh+Jm2vk3534IR34JVPpFecdT+0Cmro4quU1Yn0qMS5mdDVu2R twkDVCropFlUdYW3F0xsRokVJzgv39nMuwJk+jG1mG9MzOCXGTrPG3BTAL30PefbuDlvfC/gEnwW PJGkJJtDMYvT5aFD40M6hqJSoF3FXwT54xzn0JDTF853NL1YcaeNVMD7Ia4tlyzBFjEriq5QapEd hymqjFQQqmscq+0HUWfPnX3eeee/snKF48GVgfOK239wOyfQpn11YZ+KqgAtNZ7p+nMZjjt4w43X 3/Sum2648Ybzzj3fIYIw9+49u1gyQTEzLhuzHXWl7BDDihVc7zGS9+3Tl62OswqAkpGYlRa+5HXO qWZ33XV3BNscIlMAWYBaHD6av4nlE5/8uP18gKNTJ+rcL4dePXtdecXlPKXYRYp3qJxRFYRRcRkp RuC1pNt0lSNHwAgWPUSYvHVPPmiXN9/8fhZf9BLuay+86HykXSgWrVlFtI6ySVz501XIVqXsYdUc BT818DF4JepH7mNSDfKutsPYRwWIDT6wm+FcsKAWEeknVCNgUYB0M2QAB6Dyf0IHsJKAnB1Duygq oiSkAc6CrKRKkdCLeBskRghPh9GnVRwit/927+59uiyT8u6de4wBLsm1WtC5dtd1f/GXfrE4but6 WERZR4H0Ci9ch8QiFUV3KpCxccCiGAoZ/m6I1FEz3Aim72kjWQTyBvRniSm25ArpKnCvUD76rfCk VCjUzUGtFEUFiz4mSisYqnqOhxmbCqDjCRm6f3amZnaMOpQvXfB0Gi5/6ocqm1pUtSqVjWrh3m96 Uba0ZtknFcxqjGZ2RJRNkxvXrXv1lVf27eHPsbhK5BtGCYqK5r5uxUZl6XqoByxe9Pi+DuSx+/aF F59bs2HNgH79xowZZRGBsxe6w8qVryavZidIs5GgqAROxiz/NG7fXn2cJzB02PBZs2fNnDFv547d HPofOLi7TzGU25dMAt0Qxt1QyPfu2k6tmTtvnvA+ivkept/GgFfbKMJJ47rRiPPmzv3kpz559tnn GKrWW5548gkDtn45A9AzQCJnV3HTdAI7KY81f9ekTnwmS9btItam/xHTOcHoPw1VPumidsrqWKLr 7Fcn2Kk6x+CJC+pnQ1btkXfxk9BwcE0wsFTWrDP356rziud14sncE3gNYbhyrB1Q4kmsa8LEgG1C AtdM6xBVOW9l69aY1jLTKwArJqpGVvZNz5BBgGnDbzk0fPiIWTNnOlkDAzuJo+CCHU5X4cewOaxu d2zzwS4qUsyu9l7tPxDfF5k7s2GREVcx7B9iMXXKPSfcTgtnVueeT4E9hEXsY4sTBt6I+buQo/Pe L730Eh6dP/1PPsWH1+WXXT571iwcVmZUAH3T5k3sn5ItjhK2b8NA2LCxAEG127FtO8s6/EoreG7R c088+aQdhKFop7R+sWay/JwPeuBjzoiJ2rB23VopDxk8RF62ClEzFC/TuejLli9DsWDyvf8BzNey NzTyD9KNyuE+lk5vyyrBEaZ17Hmy8yQMZvdUi9/4zd+4+YPv13xPPfWMevEvjo2D/mHrKkQ7b97c j3/iYxZP8Fi4I9BYIYZGw0mHSS8KCkxXiVEw463C7opChFG21sCpQuy70e6CI/UQKFMLgteUOKAd RA7/J3qFxInUDsvg+2bn7iCtoG3c23CpYzhwdPcele2luaH2YtzetVtFgkQbE/IeB2E6ovyDH/7Q ZZdexqWdC7Vdsoqk+8l39JjRn/3cZ3/7t36b4R+tXxZqLEdvcZ8gqnAV0s/VPS2uOumiHkY3C2KO /pP2isSikKSxMmQyMKOX2uZ12eWXnXf+uV7pEty2qG4EXjF0WiFNrPylSzdXFJgUQOJiJc0q/4ov owFKgfz9lpWBf7z5Mi1breb+jL9/F2XJgAqtK7UuoP/gwfkLFlx66WWH9x9a/eoq50ryz929V9nN XLjdPXsV+zf3I5ZceBjMOTuNg6PCusGrWbtOP7RrApZ3MGkh+o9x8usAGyW3bt9W8Lvz54tqd1DX 6dmrN1+DPKn07NpTNRcvWXTg0K4J40ZfesmVAwYMW7tm3erVK3sUh4OM34e7YIhb5ulmAWHPtk0b enbves45502dNr1ZG2GYKOpr9MDAi/TP9Mn8STijRo+66qqrJkw4TWl9Vbj4yIJSRFSvOuuI1Yq8 Xy+MrkDnjY3YLtnjzJE/pgK8iXLslFVrYx2/P3TKqlNWx5HASY/6N0W/Kl4FWwsaoODKzBFjahbK Y65rN8cEF9YrzBDhURFMISC431i8PA+szxK5iIWLu3GjZBvrVAFn3sq6bIXp2gWQalxSsFSWI6+9 NW1ff8N173vfey+59JLxE8YCMDCxRDjMbs5+L/ALdAg0ydyWG3mJHo5ssq4IL0ZHb8kh5BYB+M9m rQPLpCbZLDE7bNyRimyKP/+Jj370Yx99103vPuuss+yHK1bVg/vKqTHNwTGiKDmNYs/ehryLSMDb 4J69mzduVcinn3oa+fjeu++5/4EHHE60dVuBILmCYAIWA3ryMGgpnBCmzXPOOetXfvWXIZA/+W// 7R++/g8OMy/b0Y548UOJvuyySyF7sD4L/SLGrXi4CmkI1Q/CI+1Clmh4xgG1MRVnK6GHhIDAPXLE CMbghx9+FLHEzlqbTSFvhktqDPlPmzb12rdfN3nSZG3lbbSp5C7B2haBj55kbSRanGCeBKwEowfK uBGstSum76WfCNB4CClOJ8Ag2Sk2KKn6FICs1QgTVVBdpONG3NBshg0b7pXeYvVgwMABw0cME5iz bUk121KLwT7bBiIWvRiHB4zm/0QWZ591lmWax5984uWXyyGRMfEKduFFF7zzne8cNHCQFR9w0FqH dZrYrTME4kIkzRp7f1qn8lsyxGJFFivNEfNtVVoq1M7ClD9zkLuksKroRY8/9oStpfJS5Rx3JWuF lAudlkKrq4evr/nCI9Lts/8s1KAoRVXU6TPKU1XoHGYZoJnuFGiekZUU/CqSkGKplq28s2fP1BLU lah8afdUedLkyVdde83gIUMc2GXwaODuTttpcLZRkY5R+oy8GjRd3JccKjtJuFm30vXKylXLlut4 GyU3evSYESNHQ+faULc+zG1KU3/ypj4XTZM6xPMMTs7u3RvWr9Njx582ngf99Rs2L1r04qpVKwYN 7M/TNx8pvhxA+8FD+/fs2rV188Y9u3ZMnTpl5uw5lqEaDaos9cTOnfpGzq0TRlFTm50tjz326J/9 2Z/KK0NAlaNrRSfJME/H6Ii80+Fbkz3WfcdgJx2xXRYnnc5bIWKnrE68Q3bKqlNWVQJv5e/VD23e kYKZOLNCwJDZLtilrqgKFhyQ+SBwyjyaYBAAAGRp9bwLzuUfzaatsqjd4F1zk7B2DeJTih5CasCH uICUJ6xiOXfD4Y6jRo+cO28Oz3q2PDmoEuFh7tw5COIzZ80EOF588SUE58Z/dg+WTlNapvzCsm1x L5BZLVDPFQAkmIeBbtnsX4/hDEG2WQp3ROVOiASsvPJtVzBv/9z7f+7nfu59F1xw0dQp0wYPHsIg tr+4OrAH8YeHQkvcEyvUtuU5XObZZxY99ujjHC888fiTDzz44MMPPYx37jgJ6oKCDRpcjuCOVhPg EitvtVAG2eRSqnBybrjhxn/6T3+DIfsrX/kavodXaRpvkct/+7d/m68utnwKQ5i4ZKV2LikEeUtE E8ee6nkwfYV3sYuHGhSAKAUGbF47qA2qFvTGHxwp2cFGRRHAeYraeuCggci7sLEqABASqYbb4OCQ FtKpgtIqZAkET6dK4DRZcG2KHcgSdB5An6SSsv6TTQvZiiBWDLTCxP9JgDgDqqNYAiWZpSlv6RVY QHCSm5AoaBRhKImCKT5vwdzTFy7gGYMLdm4cnMzKk3dxD7/NmT6l+Rrad39NIPxTTz35g9tvX7XK kUZt/nyUKkpC9IfUMeMruLyxmhd2e2OgbXPQGSO39ANhhU/XDWaVYDTS2sOtrliFWLLkZS7cVUFJ cthNkLQUdAymcRWUYHTOKFf6eaqQsqUMbtLx3EchzGjKJfEQTtKOaYIUzG9aM81dY3kFdit1+nmM 60qlGtpBXS+59NKuBw6uX7fR5lfLC2VfZcMXYQUvB82XYy6bU3caD/blD6OmWQyQ3YaNG+1qcO3c xbkkJvfiNWtWdTl8yODHXSmAuPgtJKuujtDp1oMfwy4DBw3r3pVnyV2btqzj2YbfoQkTJq0oZxW9 wrVKzz79/BbrNJWaFrp339YtmzasXT5y+BAEcWXyfai9NzVNL619tVE59j3++OO33/6D73znOw4j 8yqNmJv08FyRWPkstLBNXi9MSafqeB3r+XGmwDc2nZMuwJso4k+8sTpldeI9v1NWnbLK9/Yn9aH7 R2wT80HIGFkSjZ2pQQX93MRSVc3bmWszDQcAmb/BsmuuufrjH//5t73tbab5Lc6t2boV85jvMzbj adOmANMTT5ukytBF479vS+YqF9gNtUPewAF/FBD2hPHj2B0lz8GFUrEj2unIVAzUOn6SZVes4IaG pV1cm8VOX8xjzRVDXfCKX5O9h61oL2Fi6i6H/61b17tPL1SWyy+77O3XXfue9777/e9/P2IzV83D hw0vlJWDB8ph7vvKltAyfTq2A0TsVqzF4JJiLHv55YcefPh73731tltve/CBB9HNX1y8eHXjRZsz u+omDzVFpoFEgSbRZwRLyh5Gl8hUnTJrApbU+++7D6E5yoZYcXwuPNPs5Zdfzr8VQd11112BPmHx BhIltUib8KWp1dKyydRv6BkB4imhJihg5JVXQia+8cYb3vWud+ghtqYlKdbi++69f9Fzz7Nr0o6c 7eK0cIZV5JzwswMyglBdUdUqvowQgjxSwnStoL3AFNHrW0/gaVVOgMIMbsyiMpIdi3sM2554RRuU YyCvfsUwb0ufksguHA/y4Qmb90DVVKnwrSOHoMOGEH9gytQpl192xYUXXoSSxKh877330U9JLaZx eQlviebxJx5fs+ZViuKFF14Ixzvz3quMCyXJlgalVf7sEG34V3SWouc0m33bPIHEGByZCBY0lu0K 0TQi0vTtqIvB36mXYDGpeuI3nP6kqYLkI3w22gqgTVPZKF1SyPcokvckQk7KURTjxtEalFauKlC7 YSWignmoUiln47uwmPOjPEhBXfz6RHiFlyXMxZdeNnb4iH07dy9fttR2x3IcTtPHCv2j+ZcDL5ur +AB3oVr5wvhbqei0K19dadFpG11rG7JTIRcZoXUHL0WR35S4+jaaeyLB9eixa/e2J598dML4CW+7 6m0LTl/YtUuvH9xxf7/+/bp039+9B+2xjEa2djLdsmPzrp1bx4wade5551ufsw3AkpwVo4hXGVq1 5Qwo3YmCp3ql8C3+BxM4X6ratz05DvKug/ckJowM1ZOI2G5mOul03goRO2X1etWPGv6t0D1Ouo6d /epnr1+1Ie/0CdXLSndMcQyZ1kl5Ro65NHZKOMDsayqNYwcI0pUjY2BT5OO58+fyxtWnd18+PTZt 3mjuRL4EnSdMnMALtYNmLIVzQME6ZcYNt0TKHMeGCmI6l6lXDzzw4EsvLjF5Y0JzUmGnI2sxHgg+ twkLzSGO3oIbTHswUKu9MHBWgsGvgRH5MxgiYA5wMikiUXOQN2funCvedvlHPvrh977vvRdccCE/ ccOGDtuzjwmcwWsvY3ZwYZ0yM2vCEUAYG/MTTzx56/dv+/KXvvytb337ySefKgvN+/chjqsRf3Mq BaYocGZZ8oxH7aDGzKmxPTf2vH+04cmfoQEEXpAeI7QNmnC8U0JE0VLkD8DcdeddX/v61/7u7//O 3kpsirKJrTG8uQJ5q0DCNgkDh0AgnxiJAw48UbDIVpeQRTqG8nNDO3HSaQDukiVLG7N3X5bgqdOm OMCoHBJ56JBegYJPJhQkwdpQ0j8+jSV2+gr1agMF9qUYUfNS4HTIbAqMwbVxbtgGx7NKw84tO31V MNImnOgVcV+jLkz1Y8aNhnPparrDyhVFl5AjvO4muESR6n7cLAhoR73u4x/7eXx3WVuE4Zxx+PCh i196yamHRsEOOyt37CB/F/oKv99nnXW252A3ESmbrLO9IW6zpUlEkydP5pLFZtzTJk4YO3aMolpr AZ5FlEvQf1UP0nXDAo+IhA8IjkqZkAF/aS9Psl6hD+SV6OF3pRgZ1Ol4UXX8GTJMwLFk/YYxH4yY gR+Ib8irVxaIolOlaUTPGkWAeKMnFPXJ2xBa5B4DfIZP9IF0+EJSOnTo/AsvuPD883bu2P7Ms0/B sw3s71l43qWsbb3pCCAvp803J8A3bn+6OvJ9147t27BKNFPf/gM3bt6yYcM6tbHOVmzXxWvJIXJh C1cTtBOSK0dkOm6+a/c77rwNP27WLAtrl6xbu+nJpx7ff2BXj25WG/qViHyj2F19qOeu7bs2vbqi V/cuZ559zoSJk3Y2rU8O6luHT8aOSmWxRdYZvBlcdRZJ8+XPjHp/Zv2h3UyTZqofiiTVMcwbG/Go 831KcmoKcOqrfNI5dsrqxDtkp6w6ZVVRwRv4oXtz9auCvCugzKxZ0GT3crYl+DJjxvR3vPNGD5ct WxFfImZQ04xfntqEYXr0izeKCDty1IiBg8qZFMU/VzcnXGwyxaIt+JwxFQOCL7yw+LHHHr//vvvN Rs6LgdhEz6RuvjHxy8gT0z/LrvCo0rZamr2efPJJZWsmtuIMzr6lAFZm9VAa3MfSqfDVgCpKpv86 W7hpTFCbchYJAHTGmadjsLzrXTddf/3bHbBcTroZORqThGeSvVwt7N/bTOvlisusgj/QZ+Genr32 7t/78pKlzL233PLdv/3i337xr//2u9/9Lg40NAKExaqd/aZKLkf55spGz0LSaBBhtYRly12Gpd/c ZJ4D+xwUJ0D0DbW+7IrLfvf3f8cpKmgPZWGhcbEMejphDvPVcfQqRaNgb4tlMaII2I3ts2mdYm1l DJ45cyaIlrWOAKYAqdJ2R8i46u45EvtTTzz9/AsvqKa3zgW85pqrfvGXfkFvuefuu3lPX/nKSm4f bVSlHlQDapovUENR40mjgsUK9yvCiD071vEAmlwSFFEisQd7UnclBmTHCzh+iMYNoPdcYL1syJCh Awb2HzAI8B7AHl+PgooakMQj81Q5PZPi5JBOZ7iOHj226QqH6TzTmbWnTyv48tDB8ECITu5ULKzx tevW3HnHXcuWLi/kloNOLy9MdJA3ipbAnuOLn3HmQgeh8w8zZhybeFEVdDBbAlQZ/g7hO5JpJZZE j4qekNRSTmECqWuf9yqJBMRHYnlbtanYyyPqaHdJylUbKw2nzGqa5sumiODmCC3quvtKBxIrWrpM NcrkyRMNinhMisCjF0Xy4eVLrQzMffsoJY5ZEfaV5St27TYM98P/zepPAd9hnQSFN2bvwiQpHgmN zR7dLVtg0XBBb/Os3rBxQ9tRu3169eEiqGmywj4pWLu4OemuP3GXou0sHT337LN7d+0bOmTQZZdf zJLw+MNPUs/oX+qyv5BOUL67+CGyV9eu3rV7K9Vp1qy5/N1HhavjRQWN+qyo+G03zdSh7SZKS6lZ o+eogqbvODG3fqKT2lHh7xsYMbnU69QX4E2UY6esTrxDdsqqU1a1D7yVv1fdTYftBoNpMmemNIBs xsDBAzAved0yMcR7mmmmmS8LVdruNevvONlMd7yDNb4Fxph9WaeZZnmHMAmJUhx9bNsOEfLQgTlt F1Tsr+by+DqAS4qvt+Y8EYHNwV75Da8glInMUrk8lwKf2Y1Bsbc9Y77UYEQgi4LV6a3iDG4oBABP uaC+4YYbHE38/pt/7kMf+tDFF11y2mkT+w3oW/w8K+LeNkfIMUcFfzRAAQbsbY7nh3vRc4vu/MEd X/r7L3/+L/7yy3//pTvuuEt9Tb2EyYsF+302NQbuxNwYwkMQjysc4ma+HxB0G4F4FVBVZ+tMsZyg wyIkg/ghiick7whDx/1wWSi6BBUyvN658+b+m3/9r3/xF39p0qTJjz/+mAXxeIkJtzv2yCCkwGta 0Dve8Y6GPf9ihQIBWxXaBhykFYAJJYmRzzL7yFEjkSuAXVW1IuHcmVWvrpJaYzktMC6QrkWShS8R pJvPkLepZjuZB7cFa7Yu6Iue9Y3Adzcqbl1FV4kBMr1UlCykKIywWOlO7LSFYNOGzU8//TROQoBm 0G3EHhwpfRITHZXkIx/58Oc+9wvPLHr685//vFaZMP40sA/Dwc0ZZ56BH8zqWyTZo4cj3Klp6Pt2 PmKeeJgtxQHfadlUE151M2zYkMlTJvOFx6pKRQO+MWFgMcqezh/bZxCwQipM7TD+TB0j0voprwM5 uSS7imCitKQRMyiys9bDrC0ECMZSXjtkWrle6RX6WLq3XPLKn+4jutC4hXTfVLbwVTIwY/KvaxcZ pwojqcJ0l2bDX9eIQ4YNvejiSxmhuZ3hJLHIvDgY4uC7wO7GgNxU128UVNUtdI5ipLfOtnmrdYyt Awb1mzFnhhJt37bTeoHdleWkyiKEIkwRND61AmlMgmV89+j5yrKX9+7bNW369AvPv3DI4JHDRo54 +umn7Ono5WCjgu/3HOhycN/h7rv3Hti+edPurZvxl2bNnYf4E0pPlD1XxngU3dYPbDpbHd0B62ms DL12yLv2mXZf6XZp1gRb+0DN6FhxW78z7SLWVz+pAhynvulpb3iVTzrHTlm1E11nv4pAfsSx09mv fob7VfFt0lq9OIJgLzRrmhCZoJ55ahHrYGZi06kbc6edWsx7wNasObMmTZpouXz0KHboHvxPI2aw vII1JnUhmX7NJaYiLOfBQwZlesN3BVVzgKUEGYCB7+pzzTSciTzeG5AEPGHrzUM4DrOahVW/HDFq xOmnL5g6fcrEyRP5hrPjTV9XzgZpFWwhWcUwGQPEV1x5+bvf/e5PffpT/+Sz/+Saq69l5R01cpS3 23du37V7J+NliJhgTaZAMz3ON7TNOgYMbdmyyan13/zmN//if/wFwP0P//ANTvSoBGrH/A/2yYK6 Ei8T5t1UKgjJHByfzTHypdaBRDSBmA89b2RejifMq6o8qJQVAHwbeDd8FSk7McTqAfPe/AXz7Wt0 E+5H4awfOkwLAulwTlBfyJkEpGctPmbUIsYjTGhSlb4/paDhKs6LoiVwAIRk4RYo+vrrr/voxz7C dLns5WXSQZyFMh3oYwVA9ceOG4P1jicyYsRwFUr1NV8qHqSYLCrakHu1yFb8IUDM3rHRhlkR4JjW CWKWSHQwYtTTPIkPSoLSeRSbTT/4Vcikxp8j2I3sFGNkRJ1f6QQUugHlZQGeTZo8sWev7i8896Ij jR555CHdj0ZKMmjGkNy4cUXhRDgRHbLnAYb6NoBnzHFj2NdhKgXIGkW0nTSrGhRi8/YdVMcRI0dY xqFEyRrlG3e6X59+eEpwXnYhZ2nCOM1GiN69ess9WpzUItUIU7GbMrc5R48Wka9/xChYRO1JlMDU NC7zqyKUxhI4Ok+AdRBkmCfRTHQMKej/AYuihwMTQ3i45llUEYUBu/a9iFoZQjSPdxcyUTUZtdHW e3TzxTj/gvNPm3Ba2Qa7fsOh/fvKhgrH0CJ9N7zv7LcsqLtt62WxfBvGOoeOwu3O+g1ryXrY0JGI 9Lt3bd+8ZTP9QmtC+/vKEPSX43VKdyymcBpIv77denTbsH6DdZue3Xq8/YZrRo0Za6fsomefGTig n1oVtcjeTMf9HOpykKP33Tvg+9EjR1grs7XcAM8u1UjYRQLp/3U4t6Lh9LS8inhbkfeJTNv1052x kN83JGLtOTWL49+84QV4zXx/enLslFXHxjpW63TKqlNW9Uv1Vv5etUfeZlzzBBBgnsYb5vCBFZOj NEfEmfVBq9lzZmGAzJkz056zYcWRhR1OJUpO2GYzznp3uLbs36YWsxFowk/bKytW8UzniucNE08c twWhAhbIrzHC5dgR965ALkBWUuglDqfgz5tZl++UiadNGDt+HEDJMLZtazn4Ovb4TN6MiLxuc/T2 Tz7z6c987jNgt72S4yaM1962c3Fegs0SlGDWx5EJ9gUdGMLM7YAC/eHJJ59wcPSXv/Kl//Zf/+QL X/iiU+sZhr0iCiqB8oRwHHtejF4KrMpM+Ex30s/Dc889x4E7IAxQmFWFWKBBRhUnrgBBMqmgKsi7 AWqFXJFlejBu9uxZV111pfOw2b850/i5979v9KjRWC4mfiGzk+973/veF77wV9/85rcoRZSTKDYS CYkimCDGSFl7RRGCvGPgbEVRSh4IJd9grA984Obrb7gBvZWHwRSJWZ/fhqefeoYc0CesgaBiqGI2 O0YgQdupS8gGwbsBfLHEx1gYYOe3INHGtXy1ntZvlq5IaNJpFRrlBJ6m4XD99rGPfdTR4mAfpTEd UvqEYM+AK670AlKrehPYWrczAkxN6wwu7Pk77tb9Fpy+AErmnealxYuLL8JhIwqC7tplxPCRRse2 HbxHH2a0Zmyl6igzgG7PKxxU9JDix28EIhaJyTR5EbsOtnfPPjtTnXKuhACiwP0H9pM+1F4K2a0U khwuuOCCT3ziY5xD2/DMQ4hOAqzHot+Yb9v80wVS50kkXG3bAd/R+tLtA6BdIcxkWab1a6iQ2QmQ ZIUnn1CSAtY9oR6QcyTpzyMDqlDVayOmub0NDI2y52FI5IZDU4uiumgsGL0HGnXDCFeJOXPnLVxw +vZNW19ZtoJCcqALdyXF50njqqTssixXKXSbU5FiBAeNm03P9mhsXLsBE1s2WEYHDx+imKWc+iNJ 6IBNwZTIclbZP83yQAFYv37dvffeTQ+YboBNnbx1+66nnl3kaCzWdH23HKaJw3PooGOWGOTXrFzW 4/BBX8XRY8eSa3Z7qyZ56o2hBqXrRrb1yqDIeKzoPCtarQD9NTFoa/g3KuIblc5rFr5m9ObN8c1b 8lPfOp2y6ijzYw2BTln9DMuqPfLOFM74BlWAv9gmuATcjFxw4QWTp0xiozGHQFCMXYFTgUowHy5H qMaxQYbGAGc4RGblylWOFsesZUxas2Z1TL95G5JusKYpHGkh5EiQXWoxXQtjemZl57XjmmuuvvSy S5ghgZXCOx88WEm4E8FmRi4f0L+4IUcdufLKK+ySBL9cV1xxJYM0bAFtM29vP+L4okIusyHMbK4D KYCzpUuWsG0/9PBD3/jGN/7izz//N3/9N9+95buPPvqYvZgS4biDbVtRFU9RhVda+kMO+glIrUbu wFwElgvOP//f/5//J34LNwvO6FE7sCwHzagaJvGkiZPUlE0ukgkSrd0ujaI5sqv1N3/zNz/zmc8K f/vttxMO1yJ2N4K5gVwBo34VGOz+w//j//jMZz/z9DPP8MgRR2yxfcoiECTwi0kVDLAfr+BjRwU6 prvZ2hb5x3gZL3LYNAMHD5Qgl+FwBtiGrMKVNZCx6NnntHIJ2X8AHA/Na8FY4IK0Ar7TPaIGBA4m QNYB3JQtdc0VUQQlxyd3ElGM2H0DIiN2tmce1h3e+ZGPfuR9733ftGnTVce+Aqbl4pKucUSY44FU 359KktSSSAOAite5uByR5ujRI6+44nKg7dXVq3lp0fqjRo3goseKzeLFi3fv3cVpPaIIcdlYPGLE yLKsge/U36mo+1evWq0flBNYBzZ+r8v5qQPooqqW3h5tig7AvMr83bc374ellAUDNoxqvjWE2bq5 nAxqcM2fP++md79r1sxZFN++fXvzx6I/a1AS098C6KNLVNN1xdytRIgIOX0gal70ZGIPpJZpDNsR e9rCTazXuVEXUVz6ZChJ0SVSgKQc+3e0pvQ6CSpqUogCFnM4cYndrx/0z3pN/eAKqZy0xaRefPnv 32frxZw5c6XzyooVdl4WJ9/ddKQ2NFtwZ+MzsIHfzb8CcpsywNOHujivC8+Ms/DTJk0sx8LvpNt3 7d2jd4/uXY90vjZHMfwT2YCp2DpA3/79Fj//LGP4jFmzTj/znIGDR6xcsWL7js3dbMz03Wu2G/At SJ4afdvmzd26Hi6q+LgJZUf2nnKYl29C/dalh6fjtY7rPMwoUH4C0f1eEw91DBAF9VRGbJfXqS/A myjHTlmdRM9sG96nvGN39qsTb6xOWZ20rNojbyiQ84qzzj5z/oI5NoHx7mcHmDm0X/++/AKw/61b s87MZl8dVyY5KAc0MX8A6z79eBUmnkLsbVybwbnr1q5/deWra9cU8onLwwD0nNWSid/sZT4O9gqO jylUrYSEOS657KJp06fyWDf+tAlmYv9kAeSZsAZCOgMHFp7D+LGg+XXXvf36G67nGPiMhQuRv/fs 37tl65Z16wv3QGpBfi7FMzWG5wqL8yf40IMP3fKd733ly1/5wl994e//7kvIJA898BDjJQvc0GGc dZxGMvFeLCmACbLEaoi1vvJDYnxKjWJnLTijT290Xv7IQZf777/PIefqDrWEmU0IY0aPufraqyCD lxa/xCFM1WcCCisEJzeQBcRgeaV23H///Rxsg/tsvWB30I/Ugp+yFxYAccCnALfddhvudSCvZIO8 IxA3NIEbbryOcc/COk4tHYbZT0mCnIIUAwdFWblqFd+OjzxUtnUyWQoAUDKrs9fyAbKMGrT0ZUdd vrTkJYJSeEVKXsk6wC5FVc4MXc8bWNa2wy8AxePmNNNZAE1YK7GVehvraTgk5bDC7dsvuviif/47 v0PR4heDPHWMjZs23HvfvU8++TQaUtB8FIl6eSgdbQcfF7ck27bVUdQYYvvf/IH3f+DmDygyxUaL M50e2H+wbCkePRLd+IUXXlyydAkMSmkB+wBUCzvLli8nPUwbSsGK5a8QESs42glhAuINdh+taVRW w6lhs8izy85jHHGYEduid9+ySTSodMjQIUpieQH41g9pfcjl+vuUKVNHjRrZnL1qmaKNuF81nCrz qtamK0oqHuuioaWXZtUiRcqIIxNqoWA5QCqtlrWR6EJkhR+SkB5WzK2zRZ9J82XhIl2usWTvyoqN ejVKApZFfPxbICot269/H3op3EwI+F1N95N1sZ3D30OHD7/4kotpkls4I9q6zWbHjGThi/G79Irm zwK5UVGqTbz0In3Qkba+RfrZmPHjOQrcuW3X3t277CJ2rOXBQzZN2vNwyNmVPA024/cANUIH8DdK FVv65KlTL7n4gmHDh2/dtp0+Cb43zlK8KQRx2WvebVu30ACmo75Nm6Y6On/8VEZ7DLDOiIsq4kpL VdgtpO5UxnhzJfxrXnUE1fBvSMSU8DVzTzkzhN/YAhwn65+2HDtl1dpYx2+dTll1yurH8bl40/Wr 9sgb7MblgAJNAABugZ47i6Mx8MU31sSJXzFi1EhQxae27IXavmODBdcNG7awCm52YLP9bbuK2XdP 8VDGjccry0G1VQ5rjCNhc3DwU7gZMQ+7hzbgUdyAbII0ISkA6/JFl1y48IzT5ftqAcG7oOR1a9eV Q0BWr1m+7BUzF1eAF154EVsg/Jf9hZAuDFT4Fbt2QumwXoH1zQzXoOTizu+llxpPhY88ducdd37z G9/46le+9uWvfOWOO+5YtOg5MC6IWXmAKta4TJxihb/uimeSIJjgjGDKfHTqTdQJLv/I58477vjG N/7BYToKaeMj06kCN2RZPgF5QhhEkgyZAEfgu6QCWTJn13laMe6+u7gOfPSRRz3MPjxh4KFp06ZB QsomBc9DO3GQx91332Oy57mFYPF8qqE3BuYGeY+9+JKLJkya4JDAtQ2VnEd2DmQ0h6TC8w4nIWvo qNJxxC5ZT9QOuFdaVBPHN3pFhmCMFgy2i0IVDJcZuoKPyC0orXnVttUMnJHjaRNPO/OsMyZOnmS1 BJNEOrEW+43OIym1vvqaq2+++eYzzzgDklu+YjlR33vvPbd855a77rxbaeWQBiXM8H9iHVR9f9oP +wd/8AeoKa++usoqQRzRSL9//wGUFkeugLws3NQ8sRoFoJj/KT96rJquWrUyZCon7KAhhWJBUqIr W+kwa9bIaOTIEdpdX/dQp5KLtZ53vuudjpq/8sor7EV+4skn9SvbGgr9wv8alaYgs2ZlAKt+1apX aTU4FNagBvQfaGi4QX2hARZ+1BG2dz7rGiUkbFmnspKKPTUgODg7em8WEKIrxnBOAtmoKkA1Uecm pu5m20CbQ+4YsJtRUHpp2jHLEZSxNHTixgqeMG5pzwYlU7d7ZzCFst0EbrysHDzMI2eqY1D4TgwY NPD0M87AMlpnQ4J1gF27LcqUzo/d3eVwMYQ3MPyI1xPG7kJF8ae9Gvoen+E+Gtt37Bg8cEg5gv7Q AUT7xmF4icbYrUM0hnvreIche8pKj569u/Xqvezll7ZudOTQrrPPPc9hTc8temnNmpWlFzXdtTnY /jDqia+YgbBty6bTxo2dPWsWNdk+j+ysjeZZhRNNJn9maNfvhpDZyJHw9fdYMDRfm8i/Xm9IxDqT JbVTX4A3UY6dsqqN9ZodslNWnbLq/F6VaS7H/tXL3AxMMPJt2ri5OPDq1t2kOLrxulDMVz2Ypvqx 9xTcyartcHUr8avX7trBIV1zwsz+fVx/7OYJzErxNuutW9irgq0rCIg1CDgzA8USaR5qgyzOQRw4 kIEZGgDxGfl4itixfSca95rV64rhzbH25Qzp7jSBxlHuQa4JrcArmIxCrc4qeYxJZdreXw5ZtBFq /boNSxa/tGjRogceeOCb3/jWd771nVtvu43l+LnnXrAxzkq/CsZFRtyzFA5A3+KYItv1Cu5vfBEG CucTUwF35sjMUqFwuJK7SZ0LwjC/MThYcDlXkYVZVsrOuJYRx8+gFcEG+mB08MIhu6gBNeVwRv2p ONDZ299+7Xvf+z4Fg0qBJ3gukFS+sVDm8vCMMxb+6q/+MlHfe9998s3DqA3+tDgwZ/YsLTtp8qQp UyYBdu+46cZJk097+KFHgcsYR+OUOsqSdLImXvmsDaDvgXbC154WxL6wWbDRqorDh2CvqpP4M4bS ChG8wtY4//zzcPftHJUs1AV9KiE0vOoVmHgjURQvdT3L4YtunHZkY+vcefN+8Rd+4X3vfS84C+Zy RvmVr371L/7H5zlWx+dOUYNy5FgK1uhmWbvwhDA/9JEPvvMdN+lsgwYP4IR+1mxO3IfCiGJpkYYw sNORihjAqFYwWYGkMF+P7vb/OcRJBe2FYOCHgAlELOLy24DMspnYkebycrDU2658G/2KoIo3yd69 xk8YT71xHuqYsWNhboshCsMpDGoWb5bWHPiZtr501113Oz1ULrozDfapp55mAjcYtf76tetsmViz Zm2WJtQx6y1RqNSd5KshXNmiNYXun6WDdDYmfwVm59bz1TddvcmxjCAdiTSyHzeNLtkjLJF9AeLp +437x+L3UxFCeYKqXWnoclhQX7yU4p2TJBs/Jc6970sUmsjLiE7EfBNoL4JlCOt+hcRVuFvdJ0yE bMcq3jqHwxsOMHdxd+KYy7LNMl5Oyk8e+fG2nFtZfDHpxxvWrEcO0RNGjBnbrUcvWzcxTPr26K69 6ddilTp0Nww5Qj3EQF2OZu3VfZUu+Opqi2vTbKSeNOVw1x4rV71qy2Z3R2EWahZJ2mB62CbjbY7w 2bCuT8/u02fMGDhkqM9gFNfofq6IPSM6T7RdlrPceFWRd77JxwK+dUwdJ8BRwevrjfgTL0Ctxest +amP2CmrfIiO1fFan3fKqlNWP47+8GbpV8XmXYEdQZx9zlmspzaWWc4eP2EcSklQWnH8t2FTMU73 77d/734QAdAp1O0NG03V4Ah7NhtzOACNmecg+2TD5iiGycwxpuHGYFmMjjAQH9X8UcDZeA4wKEjE kud31qwZ8nUiCYeGmzcW/2A2ViFLwBSWmwVAcmDDphtI8LwLzqM8QP3FiNfmMo+zFOXdyqyoYE6D Zo988IGHWEC/c8stNh3eccedTjkRwPxq4uP0mt0UFDbtwR9XXnmlIoEgzou54PwLLr30UtutWH+D s4O5q8RSteCYCsSzRg8HAyjBpl5BLUoeO7piM4+BTdBhEciBIk8CNOkGsp933jlTp08H5oilrlMH RSU1OJjQWGqvuPxyxlq6BJnnkBRhBFCAQP/grXJG4LZtjrZxqrbWDJqp4JtTcDtWQcmhQ4balmrt 4qknn37xxRfUOlQTlxwVW6yccpoNsqEXj4WXxWoWGZhr+bq54ILz6ELW5ZvD1SOtNl0lECSM7UDA IDwbZ3/t13/t6muuIRPnENF5wBHZoUErBjT0gZvf/7lf+AUmcErXO296xy/84i9cetmlDrWZMXMm O7R1gP/yX/7r3/zN3z700EOKFzpTrOyylgVp6NjwOk/cPIpoGogTRcqpT1zIKcDa9euGDBlELyIH JurhI4dDz+JayoEZjQuvgDgKQLOisg3CC/U5NnJ5tToJaTZf8hhdAB/ZXnThRSM5+Rk4YOu2LcX9 Dzcd3bsx36rj8leWf+tb39IBpKMRoXC6B0Ton12zjqm3nqBGRJEmXvziSxQMutadd94pgGkuKk26 R7SpyDbouYJv91GAg/8KPG3awvBRDItdKkj4Klg/iIUEQtdtTKqpbKJ4mOFMhk3/L2lWAkmjY5e3 ffr2AnmBbLLq3rMbxlppiwMHnQxPMJZ6ejHte2/l5FDb1t4k28D9sq1T+HRgv+TTfEy6TZ02DREO YWvLps30bWSmcoxsV6zr+PuGwducnoR9UrwBtnnLLksrhjbWGzM4nUfePlEH9zkHgIW7p4+WqPx8 K5JoAH8XtG+fvIGDseiWvrT48MG911739gXzz+AOlNMn6kCD93G8g/i7HjzcZffePdt3bEHJmTtn 3pix43y1MoICo5Wkqu6ZJIrgjtDACDzrCe2u1k/0awLQdvNZnYpeV8SfeAFOfZVPOsdOWUWBPBbo OSoQz8OTlvlbIWJnv/oZ7ldtbJOMGb9XXX1V/35lT5gHYNPOHSxEjmG2g8ihkQ7A27R+7fpXVsBC Kzdv4kANn6ScCwMTBGJmOvdbpsk9e8Q1l0BpOXCHZdE2uJmzZlxw0flnn3UWviwjeV6J5YYxWEQ+ 8gImit20IY3D94Ag4yLAij77/KLnH3zwYZvn5MufF7Ks6CZULGMAnRn+heeex4Fm3gZcvg3XfPPb P7j9B47jAWJM3lKGzAAO7joU1VQHcwD95vtsYXQ2Ddz6n//L//ee97wXr6A5RPPZirwjqEDtVgie J4EpfqWjvrpOqCmZdL3KIgNmAt92Cv97/+L3brzhRue9v/TSS9AVfAOao9D4ZXOFtEIJaP2oSSfB 4PLbb7sdmSRoSfSsVqtOnL7VZW7CIa4lLy2F8skq1IIkq4RM1BoF4rTILilAx+LAAw8+BON6G9ZB 3FC4iRk7OCwSOP/C8z/8kY84SvC+e++DtuFoMMgNQ74GEiDKQNVbNHEo14GGQR5g64UXXzh18hR+ QrAvtLviyYIt3MZZcOdf/at/NXXK1EmTJwPfF110seNFgTPAC6/87rvu+vzn//Kee+4l6kDhWElj 3Ze+XNzrPLpxgfuHUIAKE2b1mtXy0rX5bGZa9qrs2y2EJedcYpsM0ZcWv7iEinjTu95BJQNPnZJj SytpMw0zfjPl+k93YGI2CGSdlYGCCJvyT58xjdtvrk0oSHfedZcND/0HFNi6edPWF19Y/NKSxdDe woULFYx/mAIgu3aVLnURvDbQYLtGWS1Xxhf1ZtnLy/mLXLZseQBx+lXkHK0vKl82KHtV8XftrtXm rSGwniRiIOvnftNnkmCWCwK1i7/txreJ8KEjDxxoL0FZN/ALfTZpFuo2GzaQTSzliPaejUtvmkbP 0uhE3yhhR/5XqNWFjlJOc29EJ8doXCmhrFVcsxqbClBA897dwg4dNnzh6Wc4NHctAsmWzQ4TpeXA 6aXUjeX7KGa3cgR9OYVHmrTu1atWbdq8ZejwEVhu2NvbrBQd5jWle/HyXT5fxSiPhFI6zv4DVlrQ 732JXn75JaNn3OiR9vIOGjLq+ReXbdtin/QeApAneG9IOXOHxWHrlk2g+/RpFMNZOltWEjSKqyrG +VxkEEWplnV2U3S86if69UKck47YceJPrzhlBTjpkp/6iJ2yOmqnPZGHp76x3kQ5dvarE+lCPyUf zNfVrzr48+7Xn686bsvAblbSwt/YXjjTxS/Izp2mQLADc6PQCBrYpM5mSr8hQsRIBnQ2bgEPwzHz 5s/jiJD5HGeXmZablDlzZ7NamWDYoa2tg6eiMymZehcsnM/6A+4zWucwPziDOdAFZTIHOjUGYH3h +Rc4Mdyxw76preZ4NkVQAGjA8X3gvgd/cPsd9913PxzG3TUf2CtWvKIKZgs5AtzKJnDDBChXbszu WWdXX+nzJMhJ4LjxE4jiz//8zx3HqGrqGyhQmzmGxmBH98E3mUorQwN6y30QeUCzG3Vh0n73u9/1 kQC0/O0AAFzkSURBVI98VPkfuP8B+cbzw4QJpzlsCFXDHr7sw5N17H+Z+VzSNJHb/uXEyjhSrOlT IS6++GLhqUfZgxjUW0BEMemViTPTvN8IwcX+Ogp3uX9/gAnRhYiYdmlc6pfdjWGbpPzJLqIrNsip U9/xjhvZvYvms3IVveyJJ550H2RfDX6NWbRth6V+EnF5EkqMWKAnzxI8YTtVdNzYcXzU8Bl/+eWX LTh9vidgt9WSNWvXIDNhEKBtMG//9V/99Ze/9OW7INq1a1Mw/bBxlb2dzJUwLsljZSRM+gDtkbEz 5ylqdE2skzz99LNLXloiuq2iIB4rPL4H0W3kmWfFSr2CRXP0qDF6Na9zPNmoVDjTxkKjL/Whqu3b i4G1l4Yi333YVtuL2okur2BSeOyx4k9z7eq1hMlG27dfH1sjNm7aeM6558yeNUf5+YqpXCZwL4SN qrAFnKU1C5Y94g8+/SGYOx2M2KWj1dLEfjNOc6UjVahnUOgwKq43hqekaumu1EK7iqkr3ka26kWv y6LNEbUtx+WEZFXM2/pDuSl9LkOhNLn/QZ9SKLG6dQHCvS3+cxqeTLQjlw7mKrtHduyQbDpqVm9I 25+F7paTudY6yOnQjFkzx44avbPYBTbzlo9TIsgR1yZNmWL7Dgml1NnOWCbtwjQqbbd1i8/L8BEj u/foidyi0xgbQlsmoZsVK3pjyEMjt36nDo6j79Gr3wuLnt2weoVd13MXzLNG9PLyZWvXvlps6sX2 X5g2joonwZ27d2pcRgvbYmfMmNkT7bvRwEOra4TW1hbRPLMiob6v6dskzXcSE9JJR+w4/Z/iApx0 yU99xE5ZnUTPTJRT31hvohw7+9XPWL9qj7xVL86wTH6NP9oddpgVHyDFZwkbNj53YY+ElWgmNg2b LOM8K7v6gDZb0/CzOfy+HBni8suA78ISGVjMyUyKVuqhnHvuvpdpOR4DJVXmzu3bx4weDckC3/DD ei4IV6955uln7BFkjQvZOtRVNrMG83VVJjP9GQvPcJq3KVkJv/Pt79x6621cGZrGBGgKM4RtzEwZ hAdM5NhOZY7pV6zg4PiCkP6FF17A+TcI8+/++N89+OCDipfD7YUMIMjitfsgm6CH4J6ASykrrQKA NQ4J59gE/Ob6I45HwqMVhijoIST9xS/8tTLkAKMSvXjGWIHXK33iDZbKtyn9T0YxoQWyZBYPqBLd K8AU2pNFylOvgN2gN1eNjhnA/x0tyDo+XgmAA3YrQ0OvLcbjcAC0uBOIBMs+zvLlKnzdgm+UkFWc 4bypI7/I/dVF3GwyC8onpagBab5Ux69mBZdpON///vdJ7IMf+PCll17GwY7CnHXWmVOnTS27cffx Gv4CRejWW29dvPjFr3/tH771zW9ZOrAekopIAXaM9hKAqKFJL62sm9nES27KgEaPYsSKKmRVTtQI y2jO7Dnl+JWufMIMUwsgWhSYGMrftHkTr4ITJ07CFSEZoij6CT9zmzZTIoqtfGB/Zni52eqA4OsX IcpeQDqh4quXbjDhtNMoJ8uWraDhIHSNGDVKr2LAXrt2HYkpTLplxJWWTe0Uqap2kVtAdkXVBSQ2 V6zdVdlTTtGrFbmqcFEa6RIYVmWAN6ywNIfA5Hb11VfTWyzFpJMX7nWzyhEUrlICo6UBxm5k3p27 PeezlwUHPbysLIWADi6HN1+KCpw2pvTUSJVjSpeCLMjTfbRNbwWLOhFlVZSwxtUO+R7BTHmA2qlT ptCL1m/YSPEpXbHpkM3VYvs+MnCKJ5SydbKcG+9m25bNbAoO1Swe9h2AutNu4GJ4LjD60AGFQOhv PIV3Ya1nwG/4cl3tQnau1pDBA6fPmDJ+wmn02U2bitm8R1khKA5PkM/9Wq6zgWT3ju24WNOn8XDf 1r614SIEV3SSKDMngrzbqvc68Xf9etSbpPN6r5NO560QsZ0w3wpVPuk6dsrq9Q69Gv6kZf5WiPim 6FdHQd5ZEnU1WLO4zHPVXZLFjDdqFGQTHGC2qMv6xTrVswfMDdlMmzHN0RLTp08fMXyUCZlbhpxg 8sqKlc8+/QzM/dBDD8OaLGo4IX7t44TxEHyLI5StWxlNcZc54AO2gPLY13WawJEf4raCHg4C1vIC +3CCH3jwQeExOvC2gezGYdxw2/4skaPnYlN4Ip0A/VQtaB5K8FzWHIH/6Z/8CSjP19h3v/s9FkBI NQa/FCMgu1rjMmUGwgYohP8qvL8oI6PHjAIiFy48o/GpUnztQTbyEowEsBwefvjhxYtfEh3CAIBi iGVYTX1j82uljgQepQyB1MlXjtJUHbBbLg3WLIbqGPVhrGuuvcaGVDpMWKeJpfAIEzNmziA0xQZ2 YRc6z6pXVrJbp3H9Sic0fW2KyW0VggAVgz2/gOYnn6Ij0bo4gJ84adKMmdPZOCUCzgb9x0AeKaVe 6TxZEAiDJTqJ5Q56WlEqunVzyKgFEHb9r37lq9/93ne//vWv333X3TgYzz/3PKKztsjSvJukoJDQ tnaPC8jwkgNDFy48fcGC+UjR/ITobySvJAJHtuJmJYRZGqq+7PJL9XAVbBBZ2VeQky/LjuFt2zBG DI3i2+5gcTKoOkWV2l2WRKh5XI5s2bSFloWLhY6i0TlmsbfywgsvGj92HGzqz5eXLgPZtQ4Dv1j8 9tg7Yb+mrZPNIkMpT3Sk8D2EkaOHae4CDY8soUSGVRV0E/edEbuLEKTQbL1o87BRm95zBSYE4ZUz cD/yFFHbxZ9MOgl5eisdNxkLMGI5Kkh4ReUQsMG6vgBaVKv26lOQepSHYGh9MsA9HSBwPKAzPcSN kmQgVORNgWFC1gpRaKUTytO+AzSg/YzYEyZOmj1vHtL4pg3rd+zYuu/gfki2nDtbyC8/dIofy3ec Dvp00VAbdngXjHpatxW24SNH9ezTb9uOXb4ITsop5HRWgALCi3NDdSzOB7seQIHrP3CwTS6vvLxU Wa6+5trzzr3AQFyy9KVde7YWCzlXg/4d6nrg4OEDhw7ucc7l5s2DBvT3jXLyb86ZDwsrX4y0bxrR nzlJ5zhXO9x84jD6pCMeaybL81NQgJMu+amP2CmrE+8PnbLqlNWP40P3puhXRzlJJxgoM0HMMGqS KTzeIVwQj/kjZldvzZShxqJxn3baBMRrGM5bUHv3nl0Yq/gAqNL8VT+/6Dme+xBIigm9SSFHTsDE 8BBPfwJj3GIFNBbuYrcO1I4ZrFWm/nSJvmLFcqvGWOC33PJdtN3Qyv3SEBga7Z6cO2/OkKFD4fJS nt277Q2VuKTiUkAdg2NSa/upZPe1r331v/6X/wZ8eBWzKJyhJKGJCyBkUlCGTJ/BEDbnXXHllTfd dBMsiyCDGAOiscxdc/XVnKODMlzUgbbIDMkUjAPFikm3UXWiCQTfZzUgRmJZVCpCgJdWgIFY/prj cbraoXjjjTeosjJHKyjOYSZM8Iqc4SrQ85/9s986++yz8MJzardXWeMmLnQO3jaUwqIFIE5QyMTa Ql7Ko5mCvIOSyTyQ2tuUWakb0LxFYE6n582bC1miBhFXKMIxf2aeDiIs7Jdml2euqHZKZWfhAw8+ wAzMWzbCzC233PKlv//SE48/uWRJOS8JCFaMgPiYUcNmVryyuDF8eDkDpdEQqmaoVDrDZz7zmeuv v85iiDQB6Lhj116aVZGUk9CUx1u4kXH6CJepH0wJeNGAyNBWAQokF+NnnX0WWE3DEVftpKNTCTBw 0KBp06f500aIclJS8YhSQGeBel27vvD8c0hQ4W+AejqtovLQwsm3kbabW+sePF4XCnXs1nX0RTNk Vg+vI70iwyGm64rb0jqRSYSggVzprh0/9LpQXc9JT45WFlq81JrNjkWFyxZbKg0buSf2T1IVQkxn FPbb0C3KDcO/Izn18MDurEKEjx7kne9J69gp0Rs6e5oyKLyU/6BTJ7fwfzJiRDnAqLiFaVjg7qKc UNctx+m0NgDYVLt18yZ+kPYfKHEbJ4NH/HwfkVWzDbL8B38334/ybWFhYES3X9PRXCNGjiLQndu2 657NAaJoJwWkK19B8uXMy8O9eWnp3WfDug3UU8mMGuM7M973EvN+nVPuD5btvLZa5siisrS1fRv3 kn179pg1s2itzPIGTSSQ5lOohPSrRY4LvI+OdE9kCj9qmBOJePyZ7MTx90kX4E0UsVNWJ94fOmXV KasTR94/Y7I6is0702fAbpaY/YYn4KEJGCwQINY4wMVk3ICeYcUWzjRVVvD3IGICwQ89+PDjjz4G c4PFFuUbLvUuSM20moX18BBMomyQbLHmnkw/Mgq66gi424Fvf5qbmUWxxp99dpGssyQtYlEVBgwc PXY0NAxDoBHDVXBYSCOZ+AVTmGp/9RyEuv/+BxxaqZoUiSuvfJtdiTAWxFDcMDeHAWXBPWb4SCaw UkVmzZr12c9+BvKGs9HdWe4nT57C7R0QzDmjWA8+8CBrqFiprBu4MAJJIq4I342MYh6uKKqZzYt/ 6E9+8pPnnHM27xZgtJp++CMf/t3f/V3BAGuYT+2K7w7s1W3bcqKHqkL3sKNFBmlqMoEbSNcblDzv gnNhqWaZvcA1kBg/HilIBYMC43A9LcXgrWyx/edtegJ9JlRv4sJBl7ViBHMHXtTaVeQdRKgYubIa UPy1r1nDtaVdoUorfdyMxrF6myU4ixXRSbL3LocTBTtGPQiOF4aXENog+tCkyVNs+WWY1521sp5A MsQepJ5dqkJCog8+8IC9uQUGDRwEPdtl3G9AP5BIwcaNG/9Lv/xLZ55xpiLR5VQ5hanO+LbYBbin 6BvNtsvSvUlAAJJZvmxF41/cIOrPNlwOQG/cbljwGTlqhHo02tceOxepEJ6HqBPEzI/NO9/xDh7f yT8FTu+N9AK+o8PEYl3FLs0IOSGTWqCMYBY61Iu4MuqjS0db8Gf4RXpXnJnoqGC3830aZdjwz8pP sR2z5VOKoiJqFRJu1ZaVM0nV8ZLmi25ZFcsYwmN3j9Zh2y4cbzctZTVdWuPm0xF7thOIrEKwfmsp +5InnjaRMrd185Z9e/c4ZL5IqY3rfYSOVbnfUHTZTdk4AirH4hzkxGb1q6/iovXq1qOfg0j38xK4 n9laLfU9BSiJgezs4bg3PXsMHjyUaJ9/ftGubZtOm+AYrwXDho91zryv3H4m82ZbB853423wAOre 9q1b9u7ZOn78mOkzePAcoKHVJQLP9ydDQPdLMx3rOhZWTuf/cURsl+apL8CbKMdOWVUJvGaH7JRV p6zest+r9sg7tEtXcFWuGIMzF/JAh08CdpiAWVWLgdkpff3LWrDF3+LAjuO0zVthFPCrcZbHIzXP vsU3GUzAv23W+oEes06AQnKJKTTXiVtigj9il83sVUEwLMUAJmVmbIh/6ZKlipRVeLGqQc6TVC0I RnRzIbTxyU998r3ve9+HPvxB5s8f/OCOIA9vVc19OK8pdpSEctO9B1MouIAxDKOwuEMGkm+4HMMZ hhvHFMvijK/ipOgeAUyZgyUb7BjqfMBTlITcS+3aa69tDsW8H84Ohla7e++9N+6fpUAghOytPwVg xsbw4WBRW4webZPh2CAtfByOnG0E3Ll9hza1RCA8tCq1lxYvCdWkcLitaTTVj/FSdlEJgoQUKQsI 8gW4UYb8BuHFsF3BX7BXsF20rAAOT4Cz0kMavai47m527qbjkVjOdonKlGLEEBstqFgWmyuEhIhL maVAMSOut111FQ66Fjr33HNnTJ/ebNhdj0wlWcULaicNHR8SZbBHF6Fg7OG9BO4ssL4P3pJXUyZP XjB/AXcoL9Isn3+xbKhrJCBTRmH3VEhsAiGNFMmGJRL1jO1WUd2jNweY+hO7RhXoeOlRpSfvLHoO Eog/s71VYAdq8lKH8UJ7DPEj3a/1ipAjyYglXSvd26vg6XrJESlL4Iwdl/KnVGK5D1xOWwd8e6Lw TaVsYOV9z7MSIZwof6QF4V1fEH+KHspTci8wt9HYk1H0hwyiDMNopHV4Unu0mhRseczZmVEjE114 +jw6tTKAxDSwKdOm68yaf+vWslnF+Z7lvJsjLhdzuHz5aZSeglMbKniI4YqCXWfDR+kPzsUdMgIp xJIdhaY5pKcribPhi1lU7nJqae/eA/oy+m9bu2nb5i3DRw8/94Lz5s2dv2nzVq5pdu/aQSWRaqNc lbPtLWZt37XdufKTJ0zg86T/wIEamvoX5S1C8BtZuY4DN9u1e/6sH9I3JGK6ylEzOtbzN7YArVn/ lOfYKasT75CdsuqUVef3qkxwrGutXcEkl3XPXJmzK9Ax5RdMOWFsc8Q1CoEl+OL/hA+12FZz1gwD GAIoh9zl+Ote5egTMK5xM7cEgYE5M0cJZnbJ7JvfEwfc7b7LzfzfZv/LBBbDZ3CnJWmZIk8rpGCB jAHZQgaaBMq4CSZmhvzVX/0VFsH777vXcejPP/+CKAHfgb+QTSBgUELUFdAK6mLbNH1iVA8ZMhT+ fuHFF9Bs6Cosc5s3b+KMBfWclEL4TklCOpdyQE/YFzHHMrSH0ZESprRewtAPPfwQsoqHUiBelB4E j9SrmgaFr0jLIfYOu+G0kas+u74kC1zCi4pvI6BfLmhsoNQlWLsfe/RxlAm2VCmENNKgrv6XXnrJ 5MmTYOsgpPymBcGm8LmjCVRhhsCQqwDQZs9fzLRB3n7FIrSQf2L+l5paa8EYBcUCvMIjimd0AQQm xixEaFw3KUMAbpQEnQ1T5rxzi1FfA40aOXrypEl8uQgPf4cVnQaVS44usnrjTx2bB3S89utvuJ4C KS8EdFVw1JT9wV/+8lf0qKbi+l5X8mRzBcbKOfPNVmDsHG7pSQ2g1YABVUqV2g0eghzRDzPBNXSY ag0prX6guGtUGNnFxOvPIGDyYTXX6IrREH/ajoesqkvEWOUZ+UtKqgViNldF3nlCjBas3BNF2rF+ E6MHxrhOtlmZUXKlUtYd25xXdWDg4OJ+vvEH8sND0WVKAwe7jY9g8fC5K5RMGaJ95WFGUIZtGN4Z pOntwscQHu3IRyaML/cKWVJpvINLiYZMwbZp1S5Yeerbm7cUby1ttmqOTaTcdtLOEQZ4qXMbW6yM 354O5NphkNpVTq3VKM7TKUeGYah3pezFeWBxYOKATJ/JLt0O9O3Zp9vhPhbsXl3H63y32TNnUWop ZsaOXaupX1A+LXPvvsO7duzesXXTgAH9Zs6cbhzyh5NVOMEUgPRUs7ZXFdrxYWiTfGnQNzBiTarj N7njkx9HAU59lU86x05ZtUOTx+kPnbLqlNWP43PxputX7ZF3Zrti1Glmxyzls7yabl3MTix5MBgn INAkd2xLlr78SmGSbIINY6Yt1JQePfhuQ1dwbotT9zhLZh+EfcEaiddp9fhQO6I8cSxe8WXSDygM amRlhxRzHGPqFVOuiRiAi6Yhr1jj5Fum8x49EbL/4R/+4X/9r7/jSBHsSBQ31I+YqWKXbUUzsuOw wlY+eMtSAHoJDAddwcRQGpSjbCJCVECWIsUarVSEbG8imEREwaMVQoX3mdX5QJmUxKK25YXGblhg blVgBIjQqkAiCiX/9X/665/+9Kd4PI+f9WzlBGtUpGxLHTmCQZfKoaEZVu+7936LFukP4fs2wLHX wjNOnzxlEmgOHQYehfcfeC2vgr0a2np6UaoTzB2MFY0lFtZazZQ27BQ3ouet4jXbZMu+yfBnBPA8 xuDoeyFIJG6MrxFLoAzbJ3A8ctRwEE0KkefYceOcoUNfowrC7ZLKQoGssxSTfOlsxDJi2Agu5K1m 2MlQ3FR3604Z43JH7iIqp4zmL5h3yaWXGB3Em/UcvixBctEHDR6oGNH6KF3YW2IpJn87VmMctUjn CSOlJLhvb3ER0q17HCMqg4qjKulFiiojqpFaqn5E2uAtOkxbhykI78gqRCSc/hnh1ygRe7NFspx7 WpXANGKUN30yUo0OE9O11QPqtG4I/MeEX+BsYyYP8mvO0LFKoKHKKaqxnbuJQpuSJPcoq1kn8bzh jhdsncGbAgeShoufvsSBDXjdeJov7Ytx7canoqwV7N7tTC/rFdj2tjNyF0gJsABXViSKs8OcLl/+ K/m1GbzbRkob+fuQjwPfLPt379q5fsM6zTJy1Bi2bT4iLY/0Lt4S6RjNkT0WtkD5iLZfj14D0Lq2 vrpiOXXfAhcv3gcPdFmzFvV/c7cunKI4YUcD+u+wMb5px9a1G+wQODB1yqRp02f26FmaPjpSMbd3 8Ofd7hvY+medw9pN5/nzR4l4HBB/agpwLBz846vySefYKasqutdsnU5ZdcrqqB+rt9r3qpwd3Vrn IBszZcidYEqwJusv9MPmh89tMnWcjcNfnLHIi7MddfbkFaixc2c5omL1apj1CXvinnwKVZcJMFzV TM8VFx5L+u2et5s8jh8rgY3t5JJZP/NZYFwAmVcqBc00y/HF2ipK7M0xfAbI2vjIohyDK91DrKz7 Z5Ugp3u4CAe3GyADX4jOWwxvsJsqEicwJfzhw/QQXGHgb/ELi1e+sgo4w30XReKK96lPf+qTn/gE sWNp1zIEgMbQLkcoJCVUkUZt+KF3tgqqAsU6zrhy0ZoM3rDDfffdV6io+/fnjExVmDRpkpIrDBzG NQcj8YYN61atfNV+0CC50G+kYBXE+j62MV9+8b+mSLqQV+EK+zPIO7A7MC5f27ouEZt0oEZAeSs0 D84TIIyL+F+vMC4cX6oUkJrOoMrpsVUD0UbpBjGKq45fLgYZI/VVWxE4aIadhg4ZNmvmTK+ef+EF ikK0hUgvZYs09IE7fnCHhYtwErhf5C6zODDZvBlpyra/tMuC+fPPOfdcPGMHUYHx2YHapENb668W 4LTA+qMOA3CD+xAkK7/w2DwbN2zkRtNWiB1bt+/dU5SWuM+XSJYC4qEFxeg973k3+zoKTZqmLpvU dk8HdlVzeO32EUt+vU3vzRjxMMtEGTtZNCDJKN4NaaQ/jrsvgLMnEaPB7iTrSsg0R5qPgliU10b+ jZG+OJlxk/YKnk5Prtkl04YHXzp5lGGB455SMYympmdyYFKOtCwq6H5G/f1JQV/T0cqCSXP2FnMy BXjiaaf5LG1stooWxneI2s0CQGgmDdO++bMcs1N0mOJJkJ5wuKyl6GbQer8BA3v37Yd2Ao7rrcgr jZW9+8HDjq7sXtLrfrB3/z79Bwz2BVy5/GXC5OF+xqw5ymCgrV+31toDV+MlQzr+4eIhhVfRndu3 dT0g5BRH7QwZWvaPhk8VVaT1SpPVQV1vMmqOc/2IEWvKP2I6p77kpz7HTlmRwAl2yE5ZdcrqqF+t H/E78+bqV8WxWi2xD1Y2q5kpi4V76FCo0TVy9KhJkzkPsEVt8oTTJthhxCYqFuO36OTlGBRsB0Zc YC6epIPDKtoO3n29MPp1hU8tgjkyGWeyzxRu8o4Bz0O1++hHP3LzzTcj1/KhUVikjecQwYA8cRXe RySW/qB20WMdN6nDK2odM6H7cePHnXPOOaCGRDh1kQirGEDTnBZ5CHTEObFvj0yWr1gB5KCeP/HE U0BteBTKyah207veOXPGTEcGOVInODswRY7hnATaRoaxL7rUqGoygVlHlVhiqYjdirff/oMgftAf cHQjEQwiNTLxM9PCIs3iAH/kuy1rZEEgZIyYHq1mQN4eZi9moFWkFGydh4oXKJwAIlagFpt30G06 RmB6tZu6IUAdL80hKYkrMBnGFh4VKDSG9LEYlQGXbAhO33MvsOfSnzqVIXK6tuCEJzAR8OKdY9bs 2Y6nx+IQWCIx1cemnuKRBkEVCvmWreAvG7ZuU9yYd+u6Z/deqz0xZp951pmYBnx6z5gxnTA5iPdQ wwkAVPXt11dEYJR7FsZsmgJllc9BB8GWM166cGe53cDhMJH7wi1bt8o9ZJg0ul9ZM35/7GMfPePM M6dMmTR+3Hg16t2nl/2ssdZn2kv/r2MhD+vQa9VwBIteTUQqXgdLupCQGTJB0rF5F6b10MFeI/dk NAlcO2FuWnsmCcSwncFYS0iwab4UtfaHZJ0o0XjTxJIFu5WWiMreSmHKqZnFrxFrNDVGh9MB2742 2NWHu2B2cf83btwEfmOwX/g84be7sK3L4bwNz7txL1g3JJasG+yd8hfjdpeiaQP6u/fq/Kz4/TBP tm7fqRrakeT13IOHi6uTgP6ycNHbMUD7Xl35imN/OaE/7/zzhw0d8fLLy1evXd2Ab+waXji7HT7Y 9dCBw0rIPs/r+6iRw50sZl0nh5cdH76kKVtbOQV+zeukI7ZL+aTTeStE7JTVa/bDYwV4K3SPk65j Z7/62etXP0Te6RaYAzn2HKMAzp4+berkqZMnTjoNbcJSuxmaJZg3ZUvtZkE421Em3GsEzAW1tKLt 4KrXK7VjIchjpVPDV52p2uGCXP3GcBigxn7/iU99/Kq3vU3RHN0CuSVYY5HvHg8e4IiSB/llQyQg DnzE9AgHAOVMYorELRsEYF8d0dlSKQASduEYDBoogBwb9xGDpbjYmZTbbWVDG3iZ9IT3SsqQN8eI jzzyiFWC2IMlGzykDDFJZjdhoH9waqBq/a28gkgpAarwc1P2v3IE0XBmcC1IRGEsYiiGC9K1Us8N omRZx6HwJ594KqKI5VUBGmCN2VBo8dKM3IDSuGFOcwdjVQBRhdlqIhWsGrwrUvRQmKDAcBsUFaws hsy9eyHg8IyDrV3K4Al9ITmGoh3+t6RiCBc9HiQR7jmEKS44eveJGbWYuPfv484Sb/vBBx8u/iuO nLgZfaNoIg35R9U82bK1OPN++3XX8TlYjmrau5fECgxtMLpXpVnXrBk4yHLKePsclI3UKU2N9XQj 8eg2VChNkNN/dCE7CFe/ugbkKj2TVrNpE7RNx6j9MDZgmJtDelocvbdsuh0wYNLEyVw3ajXMfn0p Ck+uyLNVqhWr5aHA6SSih70dY3+NkupnScdbEogXfNUcMXwYiTl908ZH6zx1sKfT+lMYIRtienOu THMli/RVwfwGbael/KbDu2nOvm3jVmUnZZo7vTdOx0v5OWZne0b+bigxu3ft4fYby0XKsmq6aHPS 0KGDY8aMnTZ9uuawRrG1rCHspyQX2O2/Fk5W26gp5/yE9t2tbJdmsz90cNPGDTYfI4Hz3oS7I2mK hy2d/fr0Kv7AHZpTNlCWf7A3sTiCZ+XK5evWruGv0SFio0aN3bplxysrV/GQg6vS5bAzeqijZdll 7579etj6dav11LlzZ48aM87Xw7f0NdHJ6/2iphVq+77e6DX8SafzVoh4LHj0eqXdKasTl1inrDpl dRwJ/DR3jzbkHVSkoE7PxlOcNXsm2G11Pvak9VwEPv/Co488du899/Ly8eCDDwHcYDcMEVJs5tSK vYLz8tt6c+K9pPVbX+8rsM6T+medVALd8taEnQ1thQzamPD9KiHg4lJyQArSRQIxuwc4FjTWEHyb +bvgdTcxe4dJ3HZsyu5dFtstAMBtsDWMCJpkbx8wLRcTPkDAT5zilONm2E23bnFayto167KmvH17 Oe/9rDPPhNRfXlYOtoT+QS41AuaC9Qs5tblUKmibzS/3sqswq+KYYJdWpaVV/nkeQUn/Ix/5yOc+ 9zleIGDPKVMmh8SPSmADo9MHPWQMxuT2X+zZfgP9k0vUkqCoWsIKpDwJwydNL3BVFSpQ8zwYscCj I/7UAsLSrFoB3qp+Jz2JDTueH6p3i4Dj2F/DSXApmESiGwjQ8Ly7Aa9cZUu6NNChwwjuzz/3HIXn sUcf+/73b2XVTlEjW1nEVJ8/Y/xOTRGIWUf5E1R1Sqo9n43Ll+4bN2wyRqwqoIYbQfgG0lz68tL+ /Yrzn6I5bC7OzskZirUQ420BsiOHo88DlOWA+uYMpjRxFjp0BvVyL4tp06bA9DzfwbsjHXjerdD9 V6565aknn0JpULasBkSY7UZH7QntRiVNIL4g9bcaJu0SI3fM0srA2i0AgDh23BjOrT3UG3FOYpDO KEuXSBOnOVQwKafPxIIugGT9ZtCFiJIolcSfoZedrwopbsTlOXfv8eodYzyttQySLoVZxMhdrNTr Nxp3rPnM2xlHWB9Tpk6jZhh8hcBTfJU4aYd/7tA42j4wzWgruzB/+M0qjrwdDMQ4vY0LGm7Ccdx7 9e67e88+/apXt+5UeQpb8zFqI4pjlfSlkHTpunrlqrVrV9OjHSYwdep0nglXvrLawC9y6t7lUNmf WQzv5cTTXbudFdyvd/fZs+eOGTf+u9/97lG/k/UT/Xq/qCcdsV0xTjqdt0LETlmdxOSeKG+F7nHS dezsVz+r/arssKyIWSVvuPF6pkGT5bat2503yfn0/fc/CHA7G/Lxxx57btHzK15ZkSXRasJs7VUd xdQ665+gEI8KFGrcirNbx21mowou/WlGD0mDsRPEhInjEEN9zcEW+uEkyDsuk2NMrRZl94FcfrN9 MG7XpOlP0IpXiukzZkBR3EIDB3wg5JydoHMYnmmtgMS+fcqJiRs3QHg8LTQI3h7K4hcClAF5bcG0 xrBu/ToGPEbNkMg5eoOloLFUx8MUjJyTS0ySMUYG1MZSnucdJ+ZWeQZUXXzxxaAh9ga4L1+VKvpJ vz4FWPTs+dJLS+A5IDJOLQLpYvOO8APxA++U9tLLLoVAiSLal7eJEl2uYsF8ZGUUyB40VlWI9KI2 HkjDelJOyEkWeRUc7EbicKq4dXNedn/GEB5sl/4Z5J3VDI0OEzpWE4Z74YUXb7/tB48+/CjC/ZP4 Rk89lUJGw4nCE/AXCF67lj+xqpw5unzZ8ob6bJdhb6ZoPkwUxuoAIdiPq1PZwxqCCjJ3Oh6nGZjc iu1P4WUA/wHljPtkSX9g6pZRjt6MHT39wZW6Dxs+VO/Sp3mpxwh/8MEHvve97zsVleE8nnBqUVP+ OihyU5XSqD3Kr+2IK8s4CRO4LGRjtC6EkPiTUSQCnHjahAGDBtBQq1pbGSbp/GlBV/C3UrmiyrpS hsozCYUpCymB4G6y5zhi94TcQr6Keo/BhaxlAFp/U9/Gy2RJubBhGgO8ALyFWN9i5JY+O3fjUGiz Vp08der48eP4+UaptyOluGTRQ8rpONl0metw2YZZRBGjeHcvejYKJpZ3Q7tXqn6Oujx4qMvOHdsP 8UVjP3lP5CUi1YXInOWbBjiwT6++GzduWL5imSdnnHnG7DnzWM2bXeZb9x/cW8hKjWPDg4cO7y/c mAO7dmzjoBKl70tf+Vq772RVaepAPsGP6o8SsbUMP0o6rZNLx0/TsWaEN1eOnbI68Q7ZKatOWf04 Rv2brl8VAmVrVxg0eLC9kaza9993/4MPPugwbW5JXl29GoLJknQm0cCaY0nwjXreLosAoIonMpFX VBQsWEFGmdWaK+AgQJYvOVuaxttcOWGC6ixdugRlJqzu7OGLqTsYLja2gLYy6zdemUEBWMGiv7Po cg5lsw2xGKRjow0/1QytZBasLUfb8gUQlKJ2KYmw0jKU3fCOG5yDyDP0FVdcCTxh7wSgBOgrRvwz po4Bu0Eqcc0RW2+1cUIzYgmZJ60iar3PfOYJZ9WPPPLwAw88iK9fNIdBg2fPmWmfqBxRJvD14Uvm fNUPFIvJX8UDyAoSaS55obBjzFtVf/aZZ0CchA+Sq8g1TZPcg8w8IXYh3aRNA6+jP3giLzmmCQK7 oW2NSALeglykrS1CQQ5pQRjhq7U1ybbCSgsO/Fo++8yzTz7x5NNPPb123VplkCzIG01GNUHmNHor ygmUjCZGLNgd4LuIaAMo8roTjoF+oXKCaRrnOiHqqBotT9XTKEHGykPrs5RE6bJDAEfiqScdSr85 RuV495NWGx+mkbwWd87ltu3b2V/nzJnDvq/LcSv0g9t/oC4Nyi+HO0Ydah2YdbxEyK7aEALraYZD 1M7ULm2UIeBJYLFg0YLsrXQoVfTA2o75FARPp5nySlJRA5KIJ7VLCJByFrTccO5DK0pni2k8nSfa spAxbxcUv3sP23Lp6t27kdXOHbuKj/ay1bKoeUTNT0hxq9Kvr7gZJhLkAkgT6xhTpkzlGUbuELAl COPR0kHpzAB4PizNyZYNBbwYpMMI93+pJT23uIzcYV9sXztgDnXpZuGMj0E2bCZ+/JeokeVwnq49 GPA5rNm2ZfuKZcu2bN444bTxZ59z9pChw5977gVbYSx69OrZu7gGP3ho38HDFpV0aTZybusfeuSJ +v3M8G/tja2v0l5H/dj+6BFrf/hJFaBj1erH/8dU5ZPOsVNWtSu+ZofslFWnrDqO37fg96rAylZB LHqWrXOR017AizgBDGDK9/fUAO5WDH2sj2zrCK92ymCLvArWMZ+BNaGkM1nhMuM3czAH9/Qf0G/7 th1YB6qpXky/CAlB4RIJNSVG2Thf86dp25/2oOItEIedW4groNiaNWtDYsnGOGEcMWIhutnOVTBE WWUvgLPASh7Q3b39+refc/Y5oPne/fuKp/OXypk1QipM6BPKH20nnypXjMTBviFRVOus8odaUw3S rfJpRWCRj1VvdFIwovheWL8epPv4x39+/vwF2YIpi7D2AxZlGq0jXm4atkYRUSBXWbfv3n3Xzt2L F79U0GGDzGJCrg0RZSD4zBXjaKoWdJ4+luGXSsWGXY3rAoPd0iHkQO2Athh3RRQy3TWnxydND7NY 4c9GmdlGbtIpzvv27I2pmBC0WuooNduIQUfBKk79YcEOHRYlyFKmwJwyvO99750+fUY8TOskRolE ZEqqtvSFFSQ18lSMwFNy4ekZjGOoV4zGvFogHfFmI4GKZMUmBmltpL/xqaIf2jyAZCxx6E3rRR9j X6/9JAKJtAumbK4INn/mXhikl7L40xjXAxld0ZrSFbW1XykrVRBwUTAG9Hf+SxooeVVVPF20ovyK rT3PsIokE8tbFYwepZqepGPUfqv1xYoeFS+NXpGhJ4YV+jW9t781B52kaLM7YWi25+ZUn+IVp82c j21SNOHC+C4u1bt25Z5l1uxZlhEs+BTWOH8nRTtufJ6Uw3TKEfGFhFL8fjeeB9vs4fGd2NWRlAj9 u3cXCQweOkxuxi+Xg97RSovzEnsui+378KGuB3v17T1o4ADFW7Z0Cev7xMkT58yda32s8WOznlaF IyVjI6z807sOHNy+c+uy5eWA2LTgUTF36yfxqGD0DYmYNvoJFuCoX/5joZafbFE7ZXV8hbC1dTpl 1SmrdurZGzJ433z9qh3yBshinYo4Kto+li57rO/jj/i8gsV26bSz3uVtK1JPOQM4MscHTLgpex/3 7mXjZ1/s2xwi6Gxn5kPIxvwNdsfDWhgOnvgT7LDZNOZVuAo6Bxc8hL4QCXJsu4gSAa1AmYaVW2ze ZtxpM6bNnDVTxG1bMUQPkGbjkKHxZWZ9eR8a9OHlK5bzmW07Ji8ZqPOKmi19wdDFxte4ba7SkHVo JwGs4VK7gupi3RfRn8GjdQqvcAeE0uJqEX6CMLLAf/Uc5f1LX/oy7+tEJIVYf8PWkKOqhTURjkc6 erNKYOlg6bPPLipHaTYA2qtqek9hYv4MTi/6R4PA0igVDtYAKXMUiUD/VLAgvyb3pJOIpfANSk6C mkxzKGrqK3qsnhFLWOMVZboRvVqLCUQL/l//4f+iVTz00ENByen/yQtvQWCxGp5JobxjCqF9o5Hg 8QuIGIHzwPMzwkNEh8wj5IwZM6RGPqIUrNlY4jW0AFYR3vXudwpw91330AypDfE1FE+I6qulJCWu XzSw/QfLvk9nIdlpUBye7NzVhGytU7mPJlNhd/4soL9hVKfzhMihPHLMvtvIOeg2TA9JeS6AWrgZ PmwICYc3HwVMygInYsX0cklDZ2BmJUGmCRnVJZyWul7hJkBcgLRXeqCs/WlRyJ8hvYgbFE4JER5m pQbqU2g/4kb70gdcxVdPI8ZGlYCYt0fNGFK8Sc4aP24cvG6/eJyl0IEZvAvebnM62PYZaQD4D/er KDr8XbbMrl+v7/Qb0L9H7/72AO/aLpEDPXurddlwCekbtM736d2vpyM4aQROqlq3drV3XNPMm7/A wQfLlq7YvnVbU+yDOcm++SwcWL8BT72tvTIWXvP6RyU80mNfM5YAx4lYtbUfMZ3jR/9xlPzU59gp q3Yy7+xXmTVO5OqU1VtTVu1t3nGRlutY8PdE+tOPEub1ovyUszVWps88rNXx0JQJLU047bTG7UE5 2sK5gMyNZvqAAGAibq1FNMfDCtA2qArlsJPB6LGt+hNOYooTfvbsWTJhO4dUrHE3sObwaZMmvv3a a88686xRo0cLHNRV2CYHsobg7M/CAk76UALWAfZwmL4hc8MrUIK4rXqFRDx0ZRE/Js9UPHglVsMK avMqSMhbKcfS6bm6nHfeuZ/69Kc5NVm06FlcZ+QisFsKxSVic7oKrgP7ImcgRAUjZvNiUBfhBB9I P3TeCulSqkDzislqGwV4pcDCBCLXqSsJ+lNeYe9ED1Hy2qM8ibcZ6WeDb2MMLg7yoj55q/AS8SqY 0n3VwaIVRDKB/skxBnXsEbSZ5ctXyD3lT0hJcaz58Z//mGDLli0PAUNFis/BdWuxih03Hv5PoUzs P7B1W7kn6ne/5903vuNGJtjmyJ6yDVdqAabUgBJm5AjlpwexxTs90XO18ARqJFV4VKlih8Zd6dOv F78o+m2h3fcv6N+OQ/lGGoqa3tJmXG+gd1lvOeJvW7Cq9hCUlNOgOUYx0gjyDhVEMWDfLCNw2FKO 8OxWMHEasWrmaUdxk1E6RlSdFCDdL/pkaPetYzNlyDoGOUfX8tAwTGsKnDUowbK51mXIlONDAfqy F7f4NyzaUaOXGlP+ZETwp5Ax0oc3Uv7ctdNhlZOnTJ06ebL9zhbEaLil2Edo3/H13dYxjtwVGkrp CvB0OTDTsfJbN2/hxqhP34F9+wyi9m7fQTva36cUpjSxNiIR5u+G9t2/Z/deq1YsX75kiXqee8H5 PEJu27zD9o+du3cgh3fHFO96+MB+FvOu23aUL3Dr1+wEv6UZRG9UxDcqnRMp/Btb8lOfY6esjirz ozZrp6w6ZVXn3Lfy96o98g5GrNdJjJMatx1kPJEPoig1x4qeW9PJhN0uqRoyz2NnDZ6rgXMfYDR6 1GjLylwKoI3yr4yI0raK3bUrCNIYFx2uPgZuiLdjsCNuFkAcy8QxnYoSArRjTRw/iXMCN8MrwFbD T+0/bdq0iZMm2n2HOo8PIG4xuu/Zyxs6OFts13v3OsXQBlCn3y1ftgLnJMcxBpjG+ujPwMQKWNVO kQTI+SZhSujBMXsGeSdWOyl5pSKRTPjov/wrv/Sxj/48aMG5B5OcugsT/3EhvUA5H/zgB88//7z7 7rvfrrVs9VPrwNyYVANko7oEb1XhB7kGlqWNMtICxcKrToBoR8GFabiqfogYqRZe786dMbW6FyZ8 DCWJb5bKf0jIgoAbNSkJpgDuFS/dLH0jqwqhwXj12GOPW8EIfCy6R6PkCCCpCy684Jd/+Zfx4J95 5hlNHJ502SY7motJ5PuuqMPO0LH5r/jfPHCIW8ZJEye+933vmztnDtliZgPT2UdYET8JrFldvKpP mTp53NixW52D+Oqr8rLsoCHIP9biMJ7ZUvVu+wvtfkZlHjCwPyBYnII3xzSmOkk596ojL4s2dhhH S0kTCNPg+OGErPqGvGqG8B1px7Wf3kXs7kmjeMycNFFPlm7ZG1oMuqXJoqyms6VxA8fdpEOKmypH /Uv/iYU7uk0eiu5hYHc0pbh28VYJQx9SZveuRi8th67TCcHu1D0DJFs/04fLWNbWjRy4YfG8oOjD xYqPF68/E8vcefMU0qlGzofy4YDk83FpztVptlo2Dggj0ubkneYlxQkf5ZClCWsO20Vk/PZs7669 hw4c7NGLdb+nvZnFAWFDF3d+Zq8+pb62V/LZL9k5s2fPmTu7Z+8+1AOq1BEqmqJa6SoW/QzeetNu LB/rzzcwYruP6qkvwJsox05ZnXiH7JRVp6yqBN7K36vXQN4n+PlrF6xi5Tp/tELq46fZbrLpOPcc azaqyMMUPnnyFPa5iu0CsxIg3p0Z9fAM3AM3wcRmfWg7p3WYIx3r6GGwVzY75uCb2NtUpxgdGwfb ZthZs2byAIFxARYsWLAAVxgaxUBgJy5AfPAQwRqz4t4d2wol18QMMWDBgP7QmH1aHGKUrXe7iv+E QMNYf2OpDS4JoAm0VQZP4KFYAQMua8Sg9lY5ixUjpYcFujUrG6rJDHfr92+1mh/IFfAas3pjbz7w m7/5GzfecKOVAXsKgTBYLT6Vg4AVI2iptm+K57cC7oCtwOvAo1goFTvQsGCZBgqneFEkyDawPrGE pCARL0gKg8bO7SbcaPcx32ovUUg4eFqwWEyDpAMHo8kECwrAPgoxeh6EHT5JRPdz7/+5ObPnYAFF VkjeLzz/IgWJL8EJdsyV3bpTx44bCwSzqjookSond/jMbsux48ewSWOUrFu77tHHHvv2t7/N8bbs AkNLFzrUOMKzetCzB+Kvvjl2/DhnLoJrdrhahyFtoFkhrU4ocJzqOHlHFJ3NifTbtu5YsngJS3lp 0yP7AerQUwsPdb8rrrjinHPOwndyKKluHNaQRFRcAbRC9LRoR27Cs3If8zyxEDRGddFwhgzeWbY1 lrNaW1UpNYq6GOye9m1GWcHWUVMDsiPJrJkEuLsKMj7i0rt2J7EopYLpexpRMdKy6dtc2Gh0voOI cdOGTQBx+D/SFDIVLGOncX9Z+N+ND28CLB2Tw20OAnkSsc106DBUHwrSStseNmzYf2h/oYQVf+HN psswT5rFvyPH7rT5IczuTGN/q+PpN2+kRA4cMLRHd9tA9+7aswu+t2TTk9Pvgs8pTPzYdO0/aODQ EaP4NVzy3LO2V5x+5hmzZs2eMGHSyldeBcdp8VbdJFgWmv6xceHE8fePKeJPvADHmTJ+TFU+6Rw7 ZdUquuO3TqesOmV1HAn8bI/B4lWwdQC0s3mfHPKugLviXU+ONcwqVkiAY43V1ucdw9QnZmXr4++/ +f033HA9rJZjKerbwFOTegyigFrwNPwBjJrpP/HJj5sC163dYFIHERp/ZG1McemUpe0jqALUY1rj UFjy4OC5552LlL1y5So+T0aNGilxGNosLU2YQGqN1dzJ5zbIWW13nkux8DF3vbJixZYthRGRjOJn I0ixMU8edswKBAz92JAXc3K9YuuNZTSiDqxU1CDvVkFJFqL6lV/5lQ9+6GaGVccl4j/wwgHZxC9K 7M0iyv0I8WaXUwDf//73O5vz7rvvJk/KiaLSFirCTlGDnhM9ykkgVNB5xbKhHIR1UPF6NZoGeacA iuRPiSQkQCxToCrb/gLfq5kzaNIVZSkpx5iqrWsfjlE2OoBL4AUL5v/RH/2RLXePP/a4YDGaiiuW xv2jf/tHY0aP+upXvprnmP3ceONYT29OZinIHvUbyt+1q3BL9h20fsLZyNIlL8tn1Ohy9o2aOgf0 gfseALuzhqBGsla70yaddulll0yceBov3ayq3KVwQmcNxKlVA/oNWL9hg1UIIS2/6D/uRY/zRMXT oahzllkefvAhNKf0zOgnMRhHOGo6cOAgtmqdhBfCFctXEI9E4kcSKFevnE/UOnzSZOHSGB04Rs6y RYmGdHVmfOWipDXFiDwj3npfyBYNmE5J3GQHc1SOSDJMKu2lkMHiaTJv017+9MqqkT8dL2rsZI1F 3ISk1RhT5b6LwrCg92ODd1CONg05XtZVoxDMyoAOWnY9Q/y2VB7pG06NxLmZPWvWsCHDbMB9dfUq vRgqp5kX1TGVKwOr7MAsHgiP0Nia56g3ZZDC99Y3fDcwjuxBpgz4FHTjYrx3z269Gv/0FOPCPSls cjoM0by6knr16qjRo84999zpM2etXLlm2fKl+/butE3TGlLHT+UJYpQ3MGK7L/+pL8CbKMdOWR0L J7xmI75mgIol3oJCfgtW+aT7w5tOVj+0eafOJ468/9Ek9I/rHRTY+qyCs47Y+vgia02qGlbbJd6K 3Uv4shWvuHhbvHhxTkhphw+KYbJBYMGsMdQBdtDAmWcunDFjJsTI8s3uaCKP8SwgL6gx5mcTPKUF EIxvwWlTp3A1CM7C+hIHFCAQa80AXDEV9+sPpZXTUpqMqkNAuCc0lRBIIIxsfIwB0gXT3/Sum84+ 62wztelcmFjcKzqBn5QnXlAUI88r0vVnFZqIUyZP+YVf+gXkhwceeMhBpMWxBozYbDnNRsMaPoZD KBrjGb5yDNBdd91FmCqePaYNWaaU05MUtWYd1JW9jB7mNwGCvRJFdtXUWlswoFyY2LyTBXn6DatE IqlpgLVXQCToFpJ9OSCJwnPkEM2UU5gA02DT2NE9JG0EEnQae9/uv/f+tHKQvXvFlBpP9hBSSMYp CTs05ErjwjPhmxIzm4j0lrJ2sW2r1sc5GSiVQYMJysILenSQH1NrVk78qedYJznzrDMGDxnyzNPP 8AhN4CyfQHw5QrZ0mUFYKFA1hQj49kgDudS07LkkvYMHNm3Y/NTTT2sUpQ3BWr00ZWj6qY5fRPBV r65yKL3o6cNpryyYpCvW5gjklYuQihT1ssGyfRj4IcWCmAcOTPi0gsufnhNO6O9upBMPiYXE02Qa O3dBn43LIDfx0pOR2Ai8vNVekTPZkhIVMa5+kqbfaHRl5erIKo3iqT21Lwxy9WrTexudLeNa+sW7 fnPIZXqjwE3J3R+yaOKcy5kzZtA5Xlm+gmmcPburLZfFs4l+20Y5aTN3x3kpZF2o3+WoS780MBup rVo1rG4aBWLJDohc1Xv36Mn0XUztBw/417tvn/4DBvE8uHzpsjWrVw4dNuSss8+ePWt2oZy9vJwD REsox5p+XnNaesMjvt757A0vwKmv8knn2Cmrjvj7NYV5LGB9gsJ8zfR/BjrkCYqiBvsZqPJJN+ub SFb/iG1iQjoO8q7wqFUu9b6+fb3Yut3Yqwm2k37FT5np25WhgOsG63trlgVimMpwsmP6be2UgXGu WK8FTlw3Zn0n1YlrVp44cdJ1111HGtBPeMl+q20VjAjDGGxl/2MItNzMRLdl69bvfe97Jn5nQY8c PbLhMXcFjoEDceEz3IMGefMJWNwwA3+hxAQcBDIGuQoPu1x//fW///u/f/rpp9/5gzv4og46CXSQ i7hKwg4tcNi6MS66YmmulkgVLHLrctj2wdtuvd3hPmyZyg9XSS10mmC1gBL3MJyLac7OyxcXL3a4 6U033WQ7JnpDA8oPJsfafJGhP6vBO69Sr3pFksklhYyqkDYN6yA27yQVbSfCD8JL2wnjxm/guCqH hRJHHGi7Ea8wcRgSmYSOUnuLPx9++KFbb70NwTqFkXIS1yas11o/sN7b4sC70YW4MAdD33nTO8eM HnPPPXffc889ehr1SUZOdJ86bZrSOhOeCZYLObQUtG821FKHHuU08jZqflfO7wrt/nu3fP/V1a8K qfxQu7N+ELgZcZu1jsJo12GUP0c5ao742uMgsfiWbjx5V6VLHa1OKLxXeajA2eDrN/bmalcOQM8A yTpG4G+CKazqxOKuV3A9PmfuHE+E9zbbHIUJkI0GFaW0jrW0TvjcUVyVJ5g7AD39MwqYFqkqpVIJ LGuCMmQC3D3UYbLhWET8HCLV9J43o6xs7iz8k6YbyDFfocRKXfC7woHysNrahWQyL71x/15+2c8+ +5yB/QasWL5sz+6djbtMXrobZ0TFwXchfP/ws3PkrvTb5rMjbd6OrHsYBAMGDjncrcfO7dv279lF SL16Y7AU3ndJ7LD9lL36DRqIc7Nh9drlSxf36Nl93vy5Z555plZ64YUlNi8cZ+LJODqJyfWkI7ab zE46nbdCxE5ZvV7o0/q5OMUd+03UITv71c9ev2pD3umFqmemb1fJjn/mu1/hy7ECHCudjpC6guaO 8m01NmcKbwXZwaAdY5nLKyis2LoWO1gheC7oRBjI4+qrr/rd3/2dhQtPP/OsMx0bgrH98stLFy16 LvbXmHtdDbe4bE2DA0Ci8RPGAUBW82GFKVMmYdMyfA4dNszpJ7z/SpbBe/iw4SgEDfh+lS0TLXgv z3MNbA30rIDSE0WKKxXWu7jJcwj5/fffDx8HYgbuKLy4WYgXGMJIAHBERvEJGFtjlA2vPOTZfNDA QaC8YPGpx2iqkJFkQLAr3NzspARoCITD7xvf8Y4RI4Z95zu3SDPe5bLdLbA+Oo9E2hmzU8H6mRM+ ZtGKvKvKEbN0ulaaJvLxMCAvKkHs8VGcCnJqzlhxo5lkhGSP8KNs4YV7CLPG0C5BGDSm3+gkgY9I FN5Cq0GifqXJsK3iQeoa3f3cuXP8wnn+xL5wGKZGueOOO+LiRgpKNazZFAg9P/vsM6tWrjrnnHMu ufSS5tz4fVkh4VpHzlhMlDRmaoszBP/KK2jGK2IARixhm9W5aIC8UlpIKQrburWxZ5fE16xpcizc Bw2hqMHN4WkovMRDIIk861pNbSl1TI3SAysrIyPLn0Gx6e2ywKFwyv2MWTNpDqB/EK0GTQO5knKV VSqSpknfi7TryI0CIKMA8fT5aERuYtJ270ZlVS3tlVdtvbpv7779irsb4lLZENOj1MmUoNJS0Qfy UJlxoNIT0qPSYz3xqmyWOFx8nM+bP597Q+ztV1es3F9oJ8Xldv3OtH1rGgfg7S4KggUKtPmtW7YX 2vegwU4MOLj/wM7du6TckHcaK7qTlQ4d5MwE7XvQwCEb1q95afEzWzZvXbjwLDs+h48Y9cwzTxwV WNdPdMbyUcO8sRHbVfDUF+BNlGOnrE68Q3bKqlNW6QNv5e9VQd4xVeY6DvJunTs7zDttQLxOrh0D RNAdZZ35O5ArKDlxM0cmVgBEHsI3mTLrpF4RRmB0VOc692e2TuDa2HkSg1xemb8vvvginGazr8n+ lu/c8uUvfxnTIJa5XEmZ/YzJM44FYQi74grPYWth8WIgjBk7xlZLtBOb4BBRgL94tBg0ZNDQIWXh fnkhdjuG+oekEfdBq8GXkYC8YG6luvfee3PCJawc9xSEkPIHecMNihT/a65gJhGz+C4RcYOkpem+ 8VDe+9VXVzHownCKnSYIPBIygCxMDwZ1MB1+tbMQUfiuO+9iAlcM6QifXZIRbPCWisSE3wCdUqlc qa8AgpF5wH0NEOUnrZzUiMJNoLBY2UNJU8gagnu5V11IrZM7xDZy5CiAFcrGNaKK6C2koZoNz34/ GapOsF2WCy688EKY2Fme4YEEhgqWo1hiLXa94x3v+O1//tvkYK8kCzcAyg/jo48+hhxMFDGyogoA 0AgSsK/DlUjh8isuGzF82K233r527frTJk4YM2504ZIMKX7f9QHB4sLSsseyZS9LVnbpkGz26udc +slTJqnvunUbVr7ySmmOsWOUgZJAXwr8dWU1oCLv2IA9LEb2xmAclbUOIhXUYykkohjvkXBGQVoz uJz0JFX8hJRD1g+fddZZ5MCvSxjbAcoZoWnZFCDLO26yhhDafUqSEe15vA2mywmc7pc+kLEfHZJg yYSglEFl8bIkJRFW6pQhKej5ZKKJSU/HiJcbryIHBasQv3a/fHDS5dxLthZs8NDB8+efPnr0mC0b N7366srs0Sy9sSFqt9fyW/eQ2HNJHl17IKts2rzRylbf/gP6DhgknoWJLkC8AzZ79ujWHKeltiji 3fv0HDR40O7tO1FcXnzhBf5JL7zowi9+8a87fiRbP9ER0VHx9xsYMbnU69QX4E2UY6esTrxDdsqq U1a1D7yVv1dm93JyR71OxObdbvD8KH9mzq5TbwXNaRIfXyAg/oy9qqavTJwxZWVrnek2jt7ijU7g IIO4RKjYorXJhZFCvBqbqhk+GRq/+93vff3r/8Csm1V+uCF4FD6Qi/KYxRVj2rSpvDvbVoUSgHGL mAvV4fsCH1OmTXFmB6zsT2vU8DfKs6Nqhgy1KW4ILAUi2IgpfVhQwTIOYxguqKIxEw4bNnzTJr4W NoD448eN529BGLZcdWEFzKRbTZXx4wEpBmEranZMVguxxOP/JMqD8NjJgd0SFD47/4L5rrvu7b/4 i79kRyDQE9I5qQKUZEIHeOqpp8NeEFemoXAEo0dtCMM7V3BzNJ+U2RW4JlYyra2TMGk7wdQlRRVA sTVrFA/BMF6sOcTIrQAyCmhuUNrW4oejf/+1a9dB3h4SmigqW4g9+/Z+9nOf+63f+mfr161/4YUX SInQ/LrPWS1VuYq9NgBRLhoLi8MNCdiQmu7UNEE5Dsm9J6myKPB0dqB6LvA3v/mte+65F8tImpY+ 7L7VB8aMGztwwEDn1r/w/AurVq0OyMgaQpQrF5jKgTfLt0oVZal3L6ZxDUdPgETJH/qXI1we73sR VPpS0HaUk0Dw9IooCSoiim6fpkwPrCsVCZbWJPYRI0Z6rfMvXLjQgKAvhCiSIVnbK6A2WyDcZ8ty RbpSk0v6ibjaPWXLuk06c0ZW+ozsvPIk5Q+s174pf/pt5ZZUy7pghrPfkG0kG655qxySad6Gl+VJ KCvFLn5gP3AN10+aMuXsc89ztrsdDvsPFM6YU2lL7y3C+iH+Tjdomz/KSfM0ga4oKqpox4F9twcP dek3YGD3br12bt+9B328+2G6Psl2Lfs4D+7vcrC3g+iHjJDkqpXL1qxcNWv2nL/70pdaJ6QoV8f/ xtbwb2DEmtRPqgCnvsonnWOnrNqJ7jgdslNWnbLq/F4VBGsObu0KFXm3QqVjfZKOanc5/ver9W3N IjAlc5jLZJz1YkAk283Mu55Xk3AwNwARwiisUHa0DR4slurE+V0oItWaVS0ordNYg3ELgxYKia3u ueeeX7t2jdm6geMFgpi2gSG/gTjBgqbqUSNHomu/9NJiZAC6g2V/mBgYwp8G5lmIX3oJZbOfk1lg jF17iil69Kgx/fsVr8yLX1wcK2BSVrZqw1YG7uogQuVkiFWASy+/lCmdvVk5USAYO8UK4qnAnXwk GGtfXkWenudAllTfw2As5Y8jRYHVFEMdImwOSjz86U9/6l3vuukrX/lKNqeKpUiuoO3gLakpvNxl R87RAYQJENeFsl8z9WrtSKmmKwTcgPJ0iUzwyhNVJ8hbIrGV6gaqrwDaetYsp38jc5cTFhlHSYmF mMQkiJVRnqxYgRMf5CdlCtV55537K7/6K+98542M79yPPPXkUzkUSQrxb5PAsQrn0tDx8Oi5CvIt yLsLNK9g0lT+RnFqOwwoMon6lEqlFnQnOoDNtVzHs4LbZ4mDZJ9iv/44S/1HjhohAVTtWITDcpG4 8pAkGTbA9LAdC3opRyj62MtLl3JAifUxfsJ4Asn+WkAT6UJ1gnqrwFOGBsSXdYYsC0hT4mWbZrNg kjJnh24kEBqGX52tbCDu3UvukydNHDNujIPTQwdPY8VAniyiN8YUnTRrXmlfzysdJb5HFEkwDZFG rxA86rQoKZIrCrDnMWYX39tdu1BlY8zOOkk+CKlmTOnp/1E5At9lkS9J+qo6RmuNxmIgeGWw4HX7 tXjisPcB/QdgDTls0rqEz0EbBi7sb1ssfwiII4SCyrsedhg92363Lt2dDasLQfU2VWK8467oit1x hFi+e3ZzcGVxD36oC5WF5aB/v4G7dux+9umnnlv8UlI7EchbP6eJ8gZGTEd6TdD/4yvAa84jb3iV TzrHTll1FN2xWqdTVp2yql+qt/L36pjI+1j9I1NC6wTf7uN7VDjeCr9q+AAF81/QW6bA/HpiBg2k MzsKFkqrXxA2wDo3LvgAOADOYirLojZcAijHbGl6drW2d6Zhrxh0WbuHDh3mHkIy+4JhsZOBTd6G ISoXAWJ2ZUAtaK8xbTJqhjNgRldaXgI3b9oI/jNdAn/wGLIHeMSRmYootWQZw15avETiIDsoqSJK IhdXzH7Tp09zrsrUqZN4/b7/vvvlyz05QBkAqmxyTL1SBXWJCTnby2SU8gccx9AYBFNbrcaVI3bp X/7lX37uc5976KEHlyxZCmL+1V99wWkygaGl8I3ukdUDuRDFhz/84f/4H/+jTaIPP/xInIHEiqku bgDBEA9arzrG0n+qwT5hWif4QNhYT934jeETLRY+PuOM0xeesXD9+g2aSVsDshdeeIHjCEGc8Ddc bMk5RVwDgaTXvv3a3/7t37rqbVfNmzf/jtt/8Cd/8qdOnYy1NQsjgdHKXy/lj7pCgAWKNcgyJBwP sxQQkC167M35U0XS/SJqv4GVIlpA4b5db7Dh0iKGliLbseNwWnqsWP6KJY5QaEJDl0v8pp++8HRU 70WLFllaOe/885jeMaDgzqlTpxgBmC2UAfpePHiImPOVUp7YemvhY9mND/ug3vQfgUOJFjICyfiS FCkxlw8fMcw/vOqiohgdfHQcWapKTRPRJXTWWzxJxfM8UpJp1MLW7udVoHMSEYAEijfDvn2bbQll h2XCSEHJSx0HD1Q8XGuNq+Jx5Z7uLYv46okMo6tHqwnIjmqRt7k8Ma49zKiJ/DWQXqnap59+xuhR oxY9+4xlq4Mcczc7Gso+ycbFYP2kpBtHFOWmHHVZhK8bkdn2HdsHDxk0ZNhwVHTbq41PSj2nKAI6 6nLvgb0KZO9Iz379ly5/6ZWVa9qNiHZD6ah/1hF04li53dBrF/GNSuc1C/+Gl/zU59gpq44yP1az dsqqU1at37c3qj+8Uemcsq/H0ZF3u2pU0JY5td18c6yytoKtGiZJVdOmjLL8HbZx7G2u8BDypwCx SQeeBn/HjhUuCnwcwBGgGZ6x6Ix2wDcQFjJ0ylNnR/dBHjNnzmSZVoa4x2YRjrETgjSvoysASTCf SyHlbr6HDCRbHWVIRLaSV1qGcAvOADcICDcwexeX3v2LJz5pQi7OHn/gvvtvuw33d42KxDWHuT6O GhRJCUeOHG5iHjqkuBZ5/IknQhYPeyRG5ZhsK5KWQtgd2bumPJFwhT4dKy4w8c6ZM4dTBcRoW+nu ve++5597jjIQJknSlIus6QkqrglIQCx7T9n12YApIXFOF/uxi0xIJpD0WIOhAq92pRJFCmkpLett Ax+LgTFsddlp2rLEMXjQ7Nkzr73u2muuveb8888fNXL0omcXYYykwPmNrFwzZky/8sq3WbCgVHDh V/bZNaBcLkGoVTmJxIK201HdpB/W6gQ45tsRHClAniR6uykn/a1Rhw6effZZC89YgPXrz359+2G/ 2Gt76MBhrdzoaQW1K5ieHHCvNYsS0rittE7ivPT58+edd/65OtVjj5Yru0hlETc7DP+Nj/nCBknf 9puCBYKn2GUn6LBhnsSnTVohaoNeKnB8mOgGzdHxA9iYjY6+fXo/v+h5z+NaO9WsX4YIPMhbyukA UKy+GlJHso640uHdp2ARUWVjG316kTK4wTCJGkAmOY4UWUNqKbCaZuCHNiPr+ECUeFSjtKCbaHGy EyWqaRpdlGB6lwJkQSCLPA0fbJdvDYeD02dM37p58/JXVnD13QwsZ+iU+pTql6MuW7r6kSf+v+i+ PXsjiG/bWipifahPv/4OlTd4NYx08L6L6ZzgyUTHMeSHDXvqyWdf8+vfMUDJ7sjH+XVFP+mI7XI5 6XTeChE7ZfW6+mRr4LdC9zjpOnb2qzdvv3ptm3crVD2OYtEa7DgTg2AxYgXKVIyYaTL4wG/gdZm5 GopquAfCeBtsGlAebFEptqEOx9qXadVNLMSm1URM2Wpfx61FUZk5e7oDTXhqZkOdPGXyiy8AaS8K kzk4HNPkEvtZzJ8x9NbV7dzLBamA4zluQJgn2TLFsqnO+dKcDyJCgEowvXkdnkhJRIkZ0p/gTkH2 W7YVl86DB44ZM/a555578cXFWeWXY9BSYIo6pkb5jXU2RugEiMG4YhopRMHwKsoJ5G0X4Pe/9/2/ /sLfOFhHLqSXGhWMBcUMGECAASvZygYPIUY7gkcTcbqsOnBSOoY0Y1IN4DvqlXZPgXPT2nPyNn0g AgFBoasbb7yBO5AHHniAzRV+/dSnP3nO2edOGD+e/fWRRx5+9JFHIVduW0i1kljSHNIBHDGkv/71 r/2P//E/Nm/ZosyqqVIRyxHTZ4FlCe8mRSpVI/YGEHuS7lfLnKKKHsyaWHmbblzfCqMHslL/3u/+ nq2wTz7+FFYC/slWZ/Ns5pmxaFCKrfDgo66ugcIUb/ZWriNVZSZ2CxHqwgPd2668yp+PPPJoObJn 1OiJEycKEM+J8o3tVtPp/8oWTSblzyAydtJJKFTxEZ4eKKKaihVNwwXNQ3RIJvrhgEGWg7YCi650 klrNQNusShVDb8Nxik1dIgHZhWd/5JScCCdCEywMrjoWouOVihT9pC/zc4QjmK2VWO/GVw66yhpX 6iivGOmj+LnK6fFHtlanWdMiIX/Lpdi2m3WhLOmouASFTAfOOoBDd+BqOs2UKdPQQ2x4ELi4G2ws 1oXxXU67LBX6IV2uYYPblkp0BX43G1SZzC3J7N93sF//Qb379i/nae3dY0smjbdn154HyzrCIb5P uEV86OEn6zfqWIOo9Xk+ZVWBqV+D14x7/IjtBuZxUvsxFeBNlGOnrE68Q3bKqlNWnd+rAhKOxfNO /6h4In8GFbVCpfo882jHz2XFMZmDTc+Z/2KuTvi6Hh2jlFfJKBg6JrSab2brIOzAPhNz47mi7YCV wF8PmUiBlcygmYxb4VFqEfMnoMzvsjne2Xg88j72qP2RJSKDrrhZyhfYE4jNjSJV+3QmnoAzN4U8 2rC3p8+YASIsXvwSyMgYOX7cuCUvLVm+bAW3d+r27CJHze/h5yJ+i5XWjJ79glgc1qA5tZB7YSZ0 7wnpxtFExdARTkqVK1+02KThqsB0pSJPb2MGVmzZCVZ9DrrxUPGQiVW5kijUWmH++otfuPyyy7/0 pS8FSXsY39jnnHP2VVddZWmBfw+OF+NWT2n9tppR23WGtGl+a5lb/6xNHPxaCSHpFdQV3B4FwDa5 4orLgZrHn3jslu9896GHHn780ccdYaS+yi+i/lPVNhE9VE5xw3YAN8HZ8BaUWeDKJ06XyPPiDrJ/ /y/+7RcvvuTi73z7O2zt6eHp5LXYMS1XaOtGjlUtDNhNYI2ybv2673//+0hNWVqh9ZWj2BvWfvq8 skkwnKKknG242ezriQArli0Hfylyajlu7DhdN5ukY+CPKbfRmIoLoLDYVVYds/JDgPC0AKm1MFnP Sb0CnUlAmrZ1Ru/FRxozdpRFGCrwEczcZk2PxBQsOl4dUxkdEVcqksNiY2NO7y06akM0T8nTx6QQ jasM20MHofvomW2Dt5vdk5vAVsJMrMhWsaMWuglRzWhS6wDuJJuFo0SpQDzjJctu0VFr2dqI4Hts R95M+uR84UUXDR40aOlLS3hq1x/seW1YJ00RSs1T+7JE0+TYbMQs3r7Zsg3DPrD2xg3rKVpDh49C 3eFtsHTXQ10H9iufQZs7u+0/2L1rl4cfe6aOjjoi2g2l+mck3O7D21aOI1aGo8Z9zYgVIXX82rcm +JrpnPqSn/ocO2V14h2yU1adsur8XhXkza7W+qliKKp/Huube/xvcZ02EqzOcwEfpt6A5ozAmpT5 L5AluDnGqlzVqOwmc3D4JLkyr2fazmQfs3Q2jQX3hPkau1rFf8k6yKPLocNTpkyFLTZv2vLIQxbx V2e+l6ApuVrvkqOIsQEHJSTHzEAxGUIuTFyMkf5j5GYvB1kaJxuHodtt27dbgIYI7NhkrbRfUF7h Rpv7ixO3sl+zD99kjan+wIABAxlDBQh+kqmscxPUUpFfFIywFMJbzSuCVbbKKwiIFxf8AgG513jp paWoL+QAgv/hH/4hex6sH5LPAw88iEkcUBXo7yGZCHDnnXcAJcp/zTXXCKC0OWoxhNqjdpLWFm8N 0O55dC2Fl1HwN3DDjYzs1GXN6tW33/aDO++8yz9LEySj08o3lldNkEWS0AbSLqmLS5qxyCqhlsrm 3VDkI73AONgUZoU4/8W/+D0LIN/8xre8rcqV0iZwxd95Im6FdDJN30s1pUnsTz/9tKxHjBxRDv3Z h6+v2Lv345wcKbybUJjS/6NZxU9IUkMeZu6F4cDu8ePHFoZSQ91uBa+iaALaRQ6ArOMo+Jh13CXl WHZFjGLplT9VKrbk6CQeNmsvg2D9Yv1tKpm+F5t3ah2RZoHIkwjcmDRIyh7CRgnUjoWcfUTdzQgS 2Ku0UWpNArb2UrchVG4vm8HrLNhGZ8aK1mnteRxQNl2E2Z/emI+GMIpNYVCk8FX08Ji06zqMiBka dTgEsqelwjJqTOllR2bYMl6pHXVa55o/f/7UKVPsc3WUD8UAjbwg64YQxTZe3HwHgAd2l2FQPjms 5l6TF8c/DXl91aGuDr1nt+/H+ffB/Xt79+3Zr3fPg3v3Hzh0+PGnnm/9IB91HGV8pbMdJ8BRMejr jfgTL0DrfHRqqnzSOXbK6sQ7ZKesOmX14/jQvVn6VbF5t+Ke8F9r6eu0nW/9670yp/pcxtwYvFI/ /RWjx0aY3wCauu4fPB2sGcjuJoY9V7BCpvDYgKv9O5ggoDk31Upd6xLkLaRzcJTQZA9mbdq8SWCT erUTp1QpbQW7sVPWNesKy7KEfWB/ATRIJkoLA+GcmN2lAxIxgNlAOWPmjGLh3tMG7pmNY5WPVVtR Gx75LqxxaAD4URhWQ68SJtA5zRGsk/oGwcTaFxaBPwOJgjbCSMmYl5QyNGbgAuulcMYZC//gD/+A hRiTwZ+PP/4E2J22SEaRCTgC1akgC/pnP/fZj33soytWLOdIMWpVRd7teksybe1RaYjW53kSIBWX NZE8MIN0K2XlpMlg4DDSM2PHB3ZAWyRQkE6LJqY8Eal0otpJJCsk6TzpS+lgBdo2oD+We79/+fm/ /NLff0kR6w6E9LTadSPGdPKMmuiNKYPn6Rh+DbT4CA9SxPhvdiDsYs4Ocq36gFiehPXhJg3tHrvm 7HPOnDN3NrFQzMr5lbtBw+1RPNLzKSeQq0sbBdQqWJWzUhFgDM8pZ7gZKXa0zeSbjYa6ByIE+Mhl yPp1G+ilUthHaWChPdA2GGNLLoXnU69r2QSpoRSPU8yNmzZFDgHrxiKLNY6N7JIXFRTrJopHxrWB ICksM3ZlOeJjiM4L566du+1ZDKk9Pbnp9kXVoq3gu3uisqGlUcYKgf7goT1790SZIStdIJ1T48T3 jmqWPY5N8eQrqXBXFC81EqbE3LXLUsNzi55/7LHHN2zcaC1r+pRp+3bv5bbmwKEDhXeiZM3ZOg2V rZ6yU/gn6ZOxPpde1IvPUOtshLNJ1+DzhG8gp/bos917dKMv7j904MmnX0zvar3afZOPD0DfkIg/ 8QKc+iqfdI6dsjrxDtkpq05Zdfy+1SdvnTHY1f7CTMxHJokfwu52AgrYPY7UfpR0TroAb6KIHT86 JyfzN1GVT7qonbI66kDrHIMRS2e/OvHu0SmrTllFAkf9epx09zjpiJ3f9hPvkJ2y+lmVVRsz+zUh 9fEBd3170um8FSJ21GROUKpvwYhvwSqf9BDolNXJjaNgkZOL+1aI2NmvTq5vdPar1yW3t8JQOuk6 do7B19WXWgOftMxPTcSj7Ik8EbvaiYjjpNN5K0TsOKJOrr07ZXUiXfE4Jp8Tif4mEnJnvzqRBj1p O8pbNmJnv+rsV8eRwEl/ITv7VWe/emv2q6Mg7x8RpnSOpc6x9NYcS8eq9UlPSycdsXMMdo7BzjHY zgB2ik0bnWOwcwx2jsHOMXisz84xkXcn/n69H45OnHTiEuuUVaesfhzTUme/6uxXnf3qJwt3Osdg 5xjsHIOvOQZfA3lX/O3m5GwG7Upwcukk65MowJsoYkcbyc98lU+6dTpldeIf905Zdcrq+BPhyX1n OvtVZ7/q7Fc/WXjTOQbfvGPw/w+66EPvZ/R90gAAAABJRU5ErkJggg== ------=_NextPart_000_01EE_01CF595C.C626AB40 Content-Type: image/png; name="3.png" Content-Transfer-Encoding: base64 Content-ID: <7949C435DA5D469D9E5F3B64C4FF14ED@dntgga> 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 ------=_NextPart_000_01EE_01CF595C.C626AB40-- From neilb@suse.de Tue Apr 15 23:17:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 416527F4E for ; Tue, 15 Apr 2014 23:17:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2A58F8F8049 for ; Tue, 15 Apr 2014 21:17:49 -0700 (PDT) X-ASG-Debug-ID: 1397621866-04cb6c2439727f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 3L6Ox5dTJTW2Ve5G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:17:47 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E71ABAB0E; Wed, 16 Apr 2014 04:17:45 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:35 +1000 Subject: [PATCH/RFC 00/19] Support loop-back NFS mounts Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH/RFC 00/19] Support loop-back NFS mounts cc: Peter Zijlstra , Ingo Molnar cc: Ming Lei Cc: netdev@vger.kernel.org Message-ID: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621867 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Loop-back NFS mounts are when the NFS client and server run on the same host. The use-case for this is a high availability cluster with shared storage. The shared filesystem is mounted on any one machine and NFS-mounted on the others. If the nfs server fails, some other node will take over that service, and then it will have a loop-back NFS mount which needs to keep working. This patch set addresses the "keep working" bit and specifically addresses deadlocks and livelocks. Allowing the fail-over itself to be deadlock free is a separate challenge for another day. The short description of how this works is: deadlocks: - Elevate PF_FSTRANS to apply globally instead of just in NFS and XFS. PF_FSTRANS disables __GFP_NS in the same way that PF_MEMALLOC_NOIO disables __GFP_IO. - Set PF_FSTRANS in nfsd when handling requests related to memory reclaim, or requests which could block requests related to memory reclaim. - Use lockdep to find all consequent deadlocks from some other thread allocating memory while holding a lock that nfsd might want. - Fix those other deadlocks by setting PF_FSTRANS or using GFP_NOFS as appropriate. livelocks: - identify throttling during reclaim and bypass it when PF_LESS_THROTTLE is set - only set PF_LESS_THROTTLE for nfsd when handling write requests from the local host. The last 12 patches address various deadlocks due to locking chains. 11 were found by lockdep, 2 by testing. There is a reasonable chance that there are more, I just need to exercise more code while testing.... There is one issue that lockdep reports which I haven't fixed (I've just hacked the code out for my testing). That issue relates to freeze_super(). I may not be interpreting the lockdep reports perfectly, but I think they are basically saying that if I were to freeze a filesystem that was exported to the local host, then we could end up deadlocking. This is to be expected. The NFS filesystem would need to be frozen first. I don't know how to tell lockdep that I know that is a problem and I don't want to be warned about it. Suggestions welcome. Until this is addressed I cannot really ask others to test the code with lockdep enabled. There are more subsidiary places that I needed to add PF_FSTRANS than I would have liked. The thought keeps crossing my mind that maybe we can get rid of __GFP_FS and require that memory reclaim never ever block on a filesystem. Then most of these patches go away. Now that writeback doesn't happen from reclaim (but from kswapd) much of the calls from reclaim to FS are gone. The ->releasepage call is the only one that I *know* causes me problems so I'd like to just say that that must never block. I don't really understand the consequences of that though. There are a couple of other places where __GFP_FS is used and I'd need to carefully analyze those. But if someone just said "no, that is impossible", I could be happy and stick with the current approach.... I've cc:ed Peter Zijlstra and Ingo Molnar only on the lockdep-related patches, Ming Lei only on the PF_MEMALLOC_NOIO related patches, and net-dev only on the network-related patches. There are probably other people I should CC. Apologies if I missed you. I'll ensure better coverage if the nfs/mm/xfs people are reasonably happy. Comments, criticisms, etc most welcome. Thanks, NeilBrown --- NeilBrown (19): Promote current_{set,restore}_flags_nested from xfs to global. lockdep: lockdep_set_current_reclaim_state should save old value lockdep: improve scenario messages for RECLAIM_FS errors. Make effect of PF_FSTRANS to disable __GFP_FS universal. SUNRPC: track whether a request is coming from a loop-back interface. nfsd: set PF_FSTRANS for nfsd threads. nfsd and VM: use PF_LESS_THROTTLE to avoid throttle in shrink_inactive_list. Set PF_FSTRANS while write_cache_pages calls ->writepage XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. NET: set PF_FSTRANS while holding sk_lock FS: set PF_FSTRANS while holding mmap_sem in exec.c NET: set PF_FSTRANS while holding rtnl_lock MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. driver core: set PF_FSTRANS while holding gdp_mutex nfsd: set PF_FSTRANS when client_mutex is held. VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. VFS: set PF_FSTRANS while namespace_sem is held. nfsd: set PF_FSTRANS during nfsd4_do_callback_rpc. XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks drivers/base/core.c | 3 ++ drivers/base/power/runtime.c | 6 ++--- drivers/block/nbd.c | 6 ++--- drivers/md/dm-bufio.c | 6 ++--- drivers/md/dm-ioctl.c | 6 ++--- drivers/mtd/nand/nandsim.c | 28 ++++++--------------- drivers/scsi/iscsi_tcp.c | 6 ++--- drivers/usb/core/hub.c | 6 ++--- fs/dcache.c | 4 ++- fs/exec.c | 6 +++++ fs/fs-writeback.c | 5 ++-- fs/namespace.c | 4 +++ fs/nfs/file.c | 3 +- fs/nfsd/nfs4callback.c | 5 ++++ fs/nfsd/nfs4state.c | 3 ++ fs/nfsd/nfssvc.c | 24 ++++++++++++++---- fs/nfsd/vfs.c | 6 +++++ fs/xfs/kmem.h | 2 -- fs/xfs/xfs_aops.c | 7 ----- fs/xfs/xfs_bmap_util.c | 4 +++ fs/xfs/xfs_file.c | 12 +++++++++ fs/xfs/xfs_linux.h | 7 ----- include/linux/lockdep.h | 8 +++--- include/linux/sched.h | 32 +++++++++--------------- include/linux/sunrpc/svc.h | 2 ++ include/linux/sunrpc/svc_xprt.h | 1 + include/net/sock.h | 1 + kernel/locking/lockdep.c | 51 ++++++++++++++++++++++++++++----------- kernel/softirq.c | 6 ++--- mm/migrate.c | 9 +++---- mm/page-writeback.c | 3 ++ mm/page_alloc.c | 18 ++++++++------ mm/percpu.c | 4 +++ mm/slab.c | 2 ++ mm/slob.c | 2 ++ mm/slub.c | 1 + mm/vmscan.c | 31 +++++++++++++++--------- net/core/dev.c | 6 ++--- net/core/rtnetlink.c | 9 ++++++- net/core/sock.c | 8 ++++-- net/sunrpc/sched.c | 5 ++-- net/sunrpc/svc.c | 6 +++++ net/sunrpc/svcsock.c | 10 ++++++++ net/sunrpc/xprtrdma/transport.c | 5 ++-- net/sunrpc/xprtsock.c | 17 ++++++++----- 45 files changed, 247 insertions(+), 149 deletions(-) -- Signature From neilb@suse.de Tue Apr 15 23:18:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DB6527F3F for ; Tue, 15 Apr 2014 23:18:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A239AC001 for ; Tue, 15 Apr 2014 21:17:57 -0700 (PDT) X-ASG-Debug-ID: 1397621874-04cb6c2436727f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 59Btm1Li09FoImQU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:17:55 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C1AE9AC2B; Wed, 16 Apr 2014 04:17:53 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 01/19] Promote current_{set, restore}_flags_nested from xfs to global. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/19] Promote current_{set, restore}_flags_nested from xfs to global. cc: Ming Lei Message-ID: <20140416040335.10604.80681.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621874 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- These are useful macros from xfs for modifying current->flags. Other places in the kernel perform the same task in various different ways. This patch moves the macros from xfs to include/linux/sched.h and changes all code which temporarily sets a current->flags flag to use these macros. This does not change functionality in any important, but does fix a few sites which assume that PF_FSTRANS is not already set and so arbitrarily set and then clear it. The new code is more careful and will only clear it if it was previously clear. Signed-off-by: NeilBrown --- drivers/base/power/runtime.c | 6 +++--- drivers/block/nbd.c | 6 +++--- drivers/md/dm-bufio.c | 6 +++--- drivers/md/dm-ioctl.c | 6 +++--- drivers/mtd/nand/nandsim.c | 28 ++++++++-------------------- drivers/scsi/iscsi_tcp.c | 6 +++--- drivers/usb/core/hub.c | 6 +++--- fs/fs-writeback.c | 5 +++-- fs/xfs/xfs_linux.h | 7 ------- include/linux/sched.h | 27 ++++++++------------------- kernel/softirq.c | 6 +++--- mm/migrate.c | 9 ++++----- mm/page_alloc.c | 10 ++++++---- mm/vmscan.c | 10 ++++++---- net/core/dev.c | 6 +++--- net/core/sock.c | 6 +++--- net/sunrpc/sched.c | 5 +++-- net/sunrpc/xprtrdma/transport.c | 5 +++-- net/sunrpc/xprtsock.c | 17 ++++++++++------- 19 files changed, 78 insertions(+), 99 deletions(-) diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 72e00e66ecc5..02448f11c879 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -348,7 +348,7 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev) return -ENOSYS; if (dev->power.memalloc_noio) { - unsigned int noio_flag; + unsigned int pflags; /* * Deadlock might be caused if memory allocation with @@ -359,9 +359,9 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev) * device, so network device and its ancestor should * be marked as memalloc_noio too. */ - noio_flag = memalloc_noio_save(); + current_set_flags_nested(&pflags, PF_MEMALLOC_NOIO); retval = __rpm_callback(cb, dev); - memalloc_noio_restore(noio_flag); + current_restore_flags_nested(&pflags, PF_MEMALLOC_NOIO); } else { retval = __rpm_callback(cb, dev); } diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 55298db36b2d..d3ddfa8a4da4 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -158,7 +158,7 @@ static int sock_xmit(struct nbd_device *nbd, int send, void *buf, int size, struct msghdr msg; struct kvec iov; sigset_t blocked, oldset; - unsigned long pflags = current->flags; + unsigned int pflags; if (unlikely(!sock)) { dev_err(disk_to_dev(nbd->disk), @@ -172,7 +172,7 @@ static int sock_xmit(struct nbd_device *nbd, int send, void *buf, int size, siginitsetinv(&blocked, sigmask(SIGKILL)); sigprocmask(SIG_SETMASK, &blocked, &oldset); - current->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); do { sock->sk->sk_allocation = GFP_NOIO | __GFP_MEMALLOC; iov.iov_base = buf; @@ -220,7 +220,7 @@ static int sock_xmit(struct nbd_device *nbd, int send, void *buf, int size, } while (size > 0); sigprocmask(SIG_SETMASK, &oldset, NULL); - tsk_restore_flags(current, pflags, PF_MEMALLOC); + current_restore_flags_nested(&pflags, PF_MEMALLOC); return result; } diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 66c5d130c8c2..f5fa93ea3a59 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -322,7 +322,7 @@ static void __cache_size_refresh(void) static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, enum data_mode *data_mode) { - unsigned noio_flag; + unsigned int pflags; void *ptr; if (c->block_size <= DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT) { @@ -350,12 +350,12 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, */ if (gfp_mask & __GFP_NORETRY) - noio_flag = memalloc_noio_save(); + current_set_flags_nested(&pflags, PF_MEMALLOC_NOIO); ptr = __vmalloc(c->block_size, gfp_mask | __GFP_HIGHMEM, PAGE_KERNEL); if (gfp_mask & __GFP_NORETRY) - memalloc_noio_restore(noio_flag); + current_restore_flags_nested(&pflags, PF_MEMALLOC_NOIO); return ptr; } diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 51521429fb59..5409533f22b5 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1716,10 +1716,10 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern } if (!dmi) { - unsigned noio_flag; - noio_flag = memalloc_noio_save(); + unsigned int pflags; + current_set_flags_nested(&pflags, PF_MEMALLOC_NOIO); dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_REPEAT | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL); - memalloc_noio_restore(noio_flag); + current_restore_flags_nested(&pflags, PF_MEMALLOC_NOIO); if (dmi) *param_flags |= DM_PARAMS_VMALLOC; } diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c index 42e8a770e631..8c995f9bb020 100644 --- a/drivers/mtd/nand/nandsim.c +++ b/drivers/mtd/nand/nandsim.c @@ -1373,31 +1373,18 @@ static int get_pages(struct nandsim *ns, struct file *file, size_t count, loff_t return 0; } -static int set_memalloc(void) -{ - if (current->flags & PF_MEMALLOC) - return 0; - current->flags |= PF_MEMALLOC; - return 1; -} - -static void clear_memalloc(int memalloc) -{ - if (memalloc) - current->flags &= ~PF_MEMALLOC; -} - static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t pos) { ssize_t tx; - int err, memalloc; + int err; + unsigned int pflags; err = get_pages(ns, file, count, pos); if (err) return err; - memalloc = set_memalloc(); + current_set_flags_nested(&pflags, PF_MEMALLOC); tx = kernel_read(file, pos, buf, count); - clear_memalloc(memalloc); + current_restore_flags_nested(&pflags, PF_MEMALLOC); put_pages(ns); return tx; } @@ -1405,14 +1392,15 @@ static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_ static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t pos) { ssize_t tx; - int err, memalloc; + int err; + unsigned int pflags; err = get_pages(ns, file, count, pos); if (err) return err; - memalloc = set_memalloc(); + current_set_flags_nested(&pflags, PF_MEMALLOC); tx = kernel_write(file, buf, count, pos); - clear_memalloc(memalloc); + current_restore_flags_nested(&pflags, PF_MEMALLOC); put_pages(ns); return tx; } diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index add6d1566ec8..834cc3afaadf 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -371,10 +371,10 @@ static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn) static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task) { struct iscsi_conn *conn = task->conn; - unsigned long pflags = current->flags; + unsigned int pflags; int rc = 0; - current->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); while (iscsi_sw_tcp_xmit_qlen(conn)) { rc = iscsi_sw_tcp_xmit(conn); @@ -387,7 +387,7 @@ static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task) rc = 0; } - tsk_restore_flags(current, pflags, PF_MEMALLOC); + current_restore_flags_nested(&pflags, PF_MEMALLOC); return rc; } diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 64ea21971be2..7622b8b09163 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -5282,7 +5282,7 @@ int usb_reset_device(struct usb_device *udev) { int ret; int i; - unsigned int noio_flag; + unsigned int pflags; struct usb_host_config *config = udev->actconfig; if (udev->state == USB_STATE_NOTATTACHED || @@ -5301,7 +5301,7 @@ int usb_reset_device(struct usb_device *udev) * because the device 'memalloc_noio' flag may have * not been set before reseting the usb device. */ - noio_flag = memalloc_noio_save(); + current_set_flags_nested(&pflags, PF_MEMALLOC_NOIO); /* Prevent autosuspend during the reset */ usb_autoresume_device(udev); @@ -5347,7 +5347,7 @@ int usb_reset_device(struct usb_device *udev) } usb_autosuspend_device(udev); - memalloc_noio_restore(noio_flag); + current_restore_flags_nested(&pflags, PF_MEMALLOC_NOIO); return ret; } EXPORT_SYMBOL_GPL(usb_reset_device); diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index d754e3cf99a8..73beb4d86ab1 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1012,9 +1012,10 @@ void bdi_writeback_workfn(struct work_struct *work) struct bdi_writeback, dwork); struct backing_dev_info *bdi = wb->bdi; long pages_written; + unsigned int pflags; set_worker_desc("flush-%s", dev_name(bdi->dev)); - current->flags |= PF_SWAPWRITE; + current_set_flags_nested(&pflags, PF_SWAPWRITE); if (likely(!current_is_workqueue_rescuer() || list_empty(&bdi->bdi_list))) { @@ -1044,7 +1045,7 @@ void bdi_writeback_workfn(struct work_struct *work) queue_delayed_work(bdi_wq, &wb->dwork, msecs_to_jiffies(dirty_writeback_interval * 10)); - current->flags &= ~PF_SWAPWRITE; + current_restore_flags_nested(&pflags, PF_SWAPWRITE); } /* diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index f9bb590acc0e..7c5b9eaebd0d 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -154,13 +154,6 @@ typedef __uint64_t __psunsigned_t; #define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) -#define current_test_flags(f) (current->flags & (f)) -#define current_set_flags_nested(sp, f) \ - (*(sp) = current->flags, current->flags |= (f)) -#define current_clear_flags_nested(sp, f) \ - (*(sp) = current->flags, current->flags &= ~(f)) -#define current_restore_flags_nested(sp, f) \ - (current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) #define spinlock_destroy(lock) diff --git a/include/linux/sched.h b/include/linux/sched.h index a781dec1cd0b..56fa52a0654c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1826,6 +1826,14 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */ #define PF_SUSPEND_TASK 0x80000000 /* this thread called freeze_processes and should not be frozen */ +#define current_test_flags(f) (current->flags & (f)) +#define current_set_flags_nested(sp, f) \ + (*(sp) = current->flags, current->flags |= (f)) +#define current_clear_flags_nested(sp, f) \ + (*(sp) = current->flags, current->flags &= ~(f)) +#define current_restore_flags_nested(sp, f) \ + (current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) + /* * Only the _current_ task can read/write to tsk->flags, but other * tasks can access tsk->flags in readonly mode for example @@ -1859,18 +1867,6 @@ static inline gfp_t memalloc_noio_flags(gfp_t flags) return flags; } -static inline unsigned int memalloc_noio_save(void) -{ - unsigned int flags = current->flags & PF_MEMALLOC_NOIO; - current->flags |= PF_MEMALLOC_NOIO; - return flags; -} - -static inline void memalloc_noio_restore(unsigned int flags) -{ - current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; -} - /* * task->jobctl flags */ @@ -1927,13 +1923,6 @@ static inline void rcu_copy_process(struct task_struct *p) #endif -static inline void tsk_restore_flags(struct task_struct *task, - unsigned long orig_flags, unsigned long flags) -{ - task->flags &= ~flags; - task->flags |= orig_flags & flags; -} - #ifdef CONFIG_SMP extern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); diff --git a/kernel/softirq.c b/kernel/softirq.c index 490fcbb1dc5b..dff051dae277 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -225,7 +225,7 @@ static inline void lockdep_softirq_end(bool in_hardirq) { } asmlinkage void __do_softirq(void) { unsigned long end = jiffies + MAX_SOFTIRQ_TIME; - unsigned long old_flags = current->flags; + unsigned int pflags; int max_restart = MAX_SOFTIRQ_RESTART; struct softirq_action *h; bool in_hardirq; @@ -238,7 +238,7 @@ asmlinkage void __do_softirq(void) * softirq. A softirq handled such as network RX might set PF_MEMALLOC * again if the socket is related to swap */ - current->flags &= ~PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); pending = local_softirq_pending(); account_irq_enter_time(current); @@ -295,7 +295,7 @@ restart: account_irq_exit_time(current); __local_bh_enable(SOFTIRQ_OFFSET); WARN_ON_ONCE(in_interrupt()); - tsk_restore_flags(current, old_flags, PF_MEMALLOC); + current_restore_flags_nested(&pflags, PF_MEMALLOC); } asmlinkage void do_softirq(void) diff --git a/mm/migrate.c b/mm/migrate.c index bed48809e5d0..2b7574860b2b 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1107,11 +1107,11 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, int pass = 0; struct page *page; struct page *page2; - int swapwrite = current->flags & PF_SWAPWRITE; + unsigned int pflags; int rc; - if (!swapwrite) - current->flags |= PF_SWAPWRITE; + + current_set_flags_nested(&pflags, PF_SWAPWRITE); for(pass = 0; pass < 10 && retry; pass++) { retry = 0; @@ -1155,8 +1155,7 @@ out: count_vm_events(PGMIGRATE_FAIL, nr_failed); trace_mm_migrate_pages(nr_succeeded, nr_failed, mode, reason); - if (!swapwrite) - current->flags &= ~PF_SWAPWRITE; + current_restore_flags_nested(&pflags, PF_SWAPWRITE); return rc; } diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3bac76ae4b30..a3d1f5da2f21 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2254,6 +2254,7 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, bool *contended_compaction, bool *deferred_compaction, unsigned long *did_some_progress) { + unsigned int pflags; if (!order) return NULL; @@ -2262,11 +2263,11 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, return NULL; } - current->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); *did_some_progress = try_to_compact_pages(zonelist, order, gfp_mask, nodemask, sync_migration, contended_compaction); - current->flags &= ~PF_MEMALLOC; + current_restore_flags_nested(&pflags, PF_MEMALLOC); if (*did_some_progress != COMPACT_SKIPPED) { struct page *page; @@ -2325,12 +2326,13 @@ __perform_reclaim(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist, { struct reclaim_state reclaim_state; int progress; + unsigned int pflags; cond_resched(); /* We now go into synchronous reclaim */ cpuset_memory_pressure_bump(); - current->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); lockdep_set_current_reclaim_state(gfp_mask); reclaim_state.reclaimed_slab = 0; current->reclaim_state = &reclaim_state; @@ -2339,7 +2341,7 @@ __perform_reclaim(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist, current->reclaim_state = NULL; lockdep_clear_current_reclaim_state(); - current->flags &= ~PF_MEMALLOC; + current_restore_flags_nested(&pflags, PF_MEMALLOC); cond_resched(); diff --git a/mm/vmscan.c b/mm/vmscan.c index a9c74b409681..94acf53d9abf 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3343,8 +3343,9 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) struct zonelist *zonelist = node_zonelist(numa_node_id(), sc.gfp_mask); struct task_struct *p = current; unsigned long nr_reclaimed; + unsigned int pflags; - p->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); lockdep_set_current_reclaim_state(sc.gfp_mask); reclaim_state.reclaimed_slab = 0; p->reclaim_state = &reclaim_state; @@ -3353,7 +3354,7 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) p->reclaim_state = NULL; lockdep_clear_current_reclaim_state(); - p->flags &= ~PF_MEMALLOC; + current_restore_flags_nested(&pflags, PF_MEMALLOC); return nr_reclaimed; } @@ -3530,6 +3531,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) .gfp_mask = sc.gfp_mask, }; unsigned long nr_slab_pages0, nr_slab_pages1; + unsigned int pflags; cond_resched(); /* @@ -3537,7 +3539,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) * and we also need to be able to write out pages for RECLAIM_WRITE * and RECLAIM_SWAP. */ - p->flags |= PF_MEMALLOC | PF_SWAPWRITE; + current_set_flags_nested(&pflags, PF_MEMALLOC | PF_SWAPWRITE); lockdep_set_current_reclaim_state(gfp_mask); reclaim_state.reclaimed_slab = 0; p->reclaim_state = &reclaim_state; @@ -3587,7 +3589,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) } p->reclaim_state = NULL; - current->flags &= ~(PF_MEMALLOC | PF_SWAPWRITE); + current_restore_flags_nested(&pflags, PF_MEMALLOC | PF_SWAPWRITE); lockdep_clear_current_reclaim_state(); return sc.nr_reclaimed >= nr_pages; } diff --git a/net/core/dev.c b/net/core/dev.c index 45fa2f11f84d..b4eaac7c0d63 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3664,7 +3664,7 @@ static int __netif_receive_skb(struct sk_buff *skb) int ret; if (sk_memalloc_socks() && skb_pfmemalloc(skb)) { - unsigned long pflags = current->flags; + unsigned int pflags; /* * PFMEMALLOC skbs are special, they should @@ -3675,9 +3675,9 @@ static int __netif_receive_skb(struct sk_buff *skb) * Use PF_MEMALLOC as this saves us from propagating the allocation * context down to all allocation sites. */ - current->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); ret = __netif_receive_skb_core(skb, true); - tsk_restore_flags(current, pflags, PF_MEMALLOC); + current_restore_flags_nested(&pflags, PF_MEMALLOC); } else ret = __netif_receive_skb_core(skb, false); diff --git a/net/core/sock.c b/net/core/sock.c index c0fc6bdad1e3..cf9bd24e4099 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -318,14 +318,14 @@ EXPORT_SYMBOL_GPL(sk_clear_memalloc); int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) { int ret; - unsigned long pflags = current->flags; + unsigned int pflags; /* these should have been dropped before queueing */ BUG_ON(!sock_flag(sk, SOCK_MEMALLOC)); - current->flags |= PF_MEMALLOC; + current_set_flags_nested(&pflags, PF_MEMALLOC); ret = sk->sk_backlog_rcv(sk, skb); - tsk_restore_flags(current, pflags, PF_MEMALLOC); + current_restore_flags_nested(&pflags, PF_MEMALLOC); return ret; } diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index ff3cc4bf4b24..c110dec833cd 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -820,9 +820,10 @@ void rpc_execute(struct rpc_task *task) static void rpc_async_schedule(struct work_struct *work) { - current->flags |= PF_FSTRANS; + unsigned int pflags; + current_set_flags_nested(&pflags, PF_FSTRANS); __rpc_execute(container_of(work, struct rpc_task, u.tk_work)); - current->flags &= ~PF_FSTRANS; + current_restore_flags_nested(&pflags, PF_FSTRANS); } /** diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 285dc0884115..ac339b5ccf22 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c @@ -199,8 +199,9 @@ xprt_rdma_connect_worker(struct work_struct *work) container_of(work, struct rpcrdma_xprt, rdma_connect.work); struct rpc_xprt *xprt = &r_xprt->xprt; int rc = 0; + unsigned int pflags; - current->flags |= PF_FSTRANS; + current_set_flags_nested(&pflags, PF_FSTRANS); xprt_clear_connected(xprt); dprintk("RPC: %s: %sconnect\n", __func__, @@ -211,7 +212,7 @@ xprt_rdma_connect_worker(struct work_struct *work) dprintk("RPC: %s: exit\n", __func__); xprt_clear_connecting(xprt); - current->flags &= ~PF_FSTRANS; + current_restore_flags_nested(&pflags, PF_FSTRANS); } /* diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 0addefca8e77..8015e7b7d87c 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -1932,8 +1932,9 @@ static int xs_local_setup_socket(struct sock_xprt *transport) struct rpc_xprt *xprt = &transport->xprt; struct socket *sock; int status = -EIO; + unsigned int pflags; - current->flags |= PF_FSTRANS; + current_set_flags_nested(&pflags, PF_FSTRANS); clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); status = __sock_create(xprt->xprt_net, AF_LOCAL, @@ -1973,7 +1974,7 @@ static int xs_local_setup_socket(struct sock_xprt *transport) out: xprt_clear_connecting(xprt); xprt_wake_pending_tasks(xprt, status); - current->flags &= ~PF_FSTRANS; + current_restore_flags_nested(&pflags, PF_FSTRANS); return status; } @@ -2076,8 +2077,9 @@ static void xs_udp_setup_socket(struct work_struct *work) struct rpc_xprt *xprt = &transport->xprt; struct socket *sock = transport->sock; int status = -EIO; + unsigned int pflags; - current->flags |= PF_FSTRANS; + current_set_flags_nested(&pflags, PF_FSTRANS); /* Start by resetting any existing state */ xs_reset_transport(transport); @@ -2098,7 +2100,7 @@ static void xs_udp_setup_socket(struct work_struct *work) out: xprt_clear_connecting(xprt); xprt_wake_pending_tasks(xprt, status); - current->flags &= ~PF_FSTRANS; + current_restore_flags_nested(&pflags, PF_FSTRANS); } /* @@ -2234,8 +2236,9 @@ static void xs_tcp_setup_socket(struct work_struct *work) struct socket *sock = transport->sock; struct rpc_xprt *xprt = &transport->xprt; int status = -EIO; + unsigned int pflags; - current->flags |= PF_FSTRANS; + current_set_flags_nested(&pflags, PF_FSTRANS); if (!sock) { clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); @@ -2282,7 +2285,7 @@ static void xs_tcp_setup_socket(struct work_struct *work) case -EINPROGRESS: case -EALREADY: xprt_clear_connecting(xprt); - current->flags &= ~PF_FSTRANS; + current_restore_flags_nested(&pflags, PF_FSTRANS); return; case -EINVAL: /* Happens, for instance, if the user specified a link @@ -2299,7 +2302,7 @@ out_eagain: out: xprt_clear_connecting(xprt); xprt_wake_pending_tasks(xprt, status); - current->flags &= ~PF_FSTRANS; + current_restore_flags_nested(&pflags, PF_FSTRANS); } /** From neilb@suse.de Tue Apr 15 23:18:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1555F7F56 for ; Tue, 15 Apr 2014 23:18:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2006304089 for ; Tue, 15 Apr 2014 21:18:03 -0700 (PDT) X-ASG-Debug-ID: 1397621882-04cb6c243772810001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id do6SAqeaDqcBQSo9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:02 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 90127AC2B; Wed, 16 Apr 2014 04:18:01 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 02/19] lockdep: lockdep_set_current_reclaim_state should save old value Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/19] lockdep: lockdep_set_current_reclaim_state should save old value cc: Peter Zijlstra , Ingo Molnar Message-ID: <20140416040336.10604.59714.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621882 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently kswapd sets current->lockdep_reclaim_gfp but the first memory allocation call will clear it. So the setting does no good. Thus the lockdep_set_current_reclaim_state call in kswapd() is ineffective. With this patch we always save the old value and then restore it, so lockdep gets to properly check the locks that kswapd takes. Signed-off-by: NeilBrown --- include/linux/lockdep.h | 8 ++++---- kernel/locking/lockdep.c | 8 +++++--- mm/page_alloc.c | 5 +++-- mm/vmscan.c | 10 ++++++---- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 92b1bfc5da60..18eedd692d16 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -351,8 +351,8 @@ static inline void lock_set_subclass(struct lockdep_map *lock, lock_set_class(lock, lock->name, lock->key, subclass, ip); } -extern void lockdep_set_current_reclaim_state(gfp_t gfp_mask); -extern void lockdep_clear_current_reclaim_state(void); +extern gfp_t lockdep_set_current_reclaim_state(gfp_t gfp_mask); +extern void lockdep_restore_current_reclaim_state(gfp_t old_mask); extern void lockdep_trace_alloc(gfp_t mask); # define INIT_LOCKDEP .lockdep_recursion = 0, .lockdep_reclaim_gfp = 0, @@ -379,8 +379,8 @@ static inline void lockdep_on(void) # define lock_release(l, n, i) do { } while (0) # define lock_set_class(l, n, k, s, i) do { } while (0) # define lock_set_subclass(l, s, i) do { } while (0) -# define lockdep_set_current_reclaim_state(g) do { } while (0) -# define lockdep_clear_current_reclaim_state() do { } while (0) +# define lockdep_set_current_reclaim_state(g) (0) +# define lockdep_restore_current_reclaim_state(g) do { } while (0) # define lockdep_trace_alloc(g) do { } while (0) # define lockdep_init() do { } while (0) # define lockdep_info() do { } while (0) diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index eb8a54783fa0..e05b82e92373 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -3645,14 +3645,16 @@ int lock_is_held(struct lockdep_map *lock) } EXPORT_SYMBOL_GPL(lock_is_held); -void lockdep_set_current_reclaim_state(gfp_t gfp_mask) +gfp_t lockdep_set_current_reclaim_state(gfp_t gfp_mask) { + gfp_t old = current->lockdep_reclaim_gfp; current->lockdep_reclaim_gfp = gfp_mask; + return old; } -void lockdep_clear_current_reclaim_state(void) +void lockdep_restore_current_reclaim_state(gfp_t gfp_mask) { - current->lockdep_reclaim_gfp = 0; + current->lockdep_reclaim_gfp = gfp_mask; } #ifdef CONFIG_LOCK_STAT diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a3d1f5da2f21..ff8b91aa0b87 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2327,20 +2327,21 @@ __perform_reclaim(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist, struct reclaim_state reclaim_state; int progress; unsigned int pflags; + gfp_t old_mask; cond_resched(); /* We now go into synchronous reclaim */ cpuset_memory_pressure_bump(); current_set_flags_nested(&pflags, PF_MEMALLOC); - lockdep_set_current_reclaim_state(gfp_mask); + old_mask = lockdep_set_current_reclaim_state(gfp_mask); reclaim_state.reclaimed_slab = 0; current->reclaim_state = &reclaim_state; progress = try_to_free_pages(zonelist, order, gfp_mask, nodemask); current->reclaim_state = NULL; - lockdep_clear_current_reclaim_state(); + lockdep_restore_current_reclaim_state(old_mask); current_restore_flags_nested(&pflags, PF_MEMALLOC); cond_resched(); diff --git a/mm/vmscan.c b/mm/vmscan.c index 94acf53d9abf..67165f839936 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3344,16 +3344,17 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) struct task_struct *p = current; unsigned long nr_reclaimed; unsigned int pflags; + gfp_t old_mask; current_set_flags_nested(&pflags, PF_MEMALLOC); - lockdep_set_current_reclaim_state(sc.gfp_mask); + old_mask = lockdep_set_current_reclaim_state(sc.gfp_mask); reclaim_state.reclaimed_slab = 0; p->reclaim_state = &reclaim_state; nr_reclaimed = do_try_to_free_pages(zonelist, &sc, &shrink); p->reclaim_state = NULL; - lockdep_clear_current_reclaim_state(); + lockdep_restore_current_reclaim_state(old_mask); current_restore_flags_nested(&pflags, PF_MEMALLOC); return nr_reclaimed; @@ -3532,6 +3533,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) }; unsigned long nr_slab_pages0, nr_slab_pages1; unsigned int pflags; + gfp_t old_mask; cond_resched(); /* @@ -3540,7 +3542,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) * and RECLAIM_SWAP. */ current_set_flags_nested(&pflags, PF_MEMALLOC | PF_SWAPWRITE); - lockdep_set_current_reclaim_state(gfp_mask); + old_mask = lockdep_set_current_reclaim_state(gfp_mask); reclaim_state.reclaimed_slab = 0; p->reclaim_state = &reclaim_state; @@ -3590,7 +3592,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) p->reclaim_state = NULL; current_restore_flags_nested(&pflags, PF_MEMALLOC | PF_SWAPWRITE); - lockdep_clear_current_reclaim_state(); + lockdep_restore_current_reclaim_state(old_mask); return sc.nr_reclaimed >= nr_pages; } From neilb@suse.de Tue Apr 15 23:18:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 231BE7F5A for ; Tue, 15 Apr 2014 23:18:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BF938F8049 for ; Tue, 15 Apr 2014 21:18:11 -0700 (PDT) X-ASG-Debug-ID: 1397621889-04cbb06e9b738a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id w39BXNKc2kd7AwG6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:10 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 51D5EAC86; Wed, 16 Apr 2014 04:18:09 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 03/19] lockdep: improve scenario messages for RECLAIM_FS errors. cc: Peter Zijlstra , Ingo Molnar X-ASG-Orig-Subj: [PATCH 03/19] lockdep: improve scenario messages for RECLAIM_FS errors. Cc: xfs@oss.sgi.com Message-ID: <20140416040336.10604.19304.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621890 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- lockdep can check for locking problems involving reclaim using the same infrastructure as used for interrupts. However a number of the messages still refer to interrupts even if it was actually a reclaim-related problem. So determine where the problem was caused by reclaim or irq and adjust messages accordingly. Signed-off-by: NeilBrown --- kernel/locking/lockdep.c | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index e05b82e92373..33d2ac7519dc 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -1423,7 +1423,8 @@ static void print_irq_lock_scenario(struct lock_list *safe_entry, struct lock_list *unsafe_entry, struct lock_class *prev_class, - struct lock_class *next_class) + struct lock_class *next_class, + int reclaim) { struct lock_class *safe_class = safe_entry->class; struct lock_class *unsafe_class = unsafe_entry->class; @@ -1455,20 +1456,27 @@ print_irq_lock_scenario(struct lock_list *safe_entry, printk("\n\n"); } - printk(" Possible interrupt unsafe locking scenario:\n\n"); + if (reclaim) + printk(" Possible reclaim unsafe locking scenario:\n\n"); + else + printk(" Possible interrupt unsafe locking scenario:\n\n"); printk(" CPU0 CPU1\n"); printk(" ---- ----\n"); printk(" lock("); __print_lock_name(unsafe_class); printk(");\n"); - printk(" local_irq_disable();\n"); + if (!reclaim) + printk(" local_irq_disable();\n"); printk(" lock("); __print_lock_name(safe_class); printk(");\n"); printk(" lock("); __print_lock_name(middle_class); printk(");\n"); - printk(" \n"); + if (reclaim) + printk(" \n"); + else + printk(" \n"); printk(" lock("); __print_lock_name(safe_class); printk(");\n"); @@ -1487,6 +1495,8 @@ print_bad_irq_dependency(struct task_struct *curr, enum lock_usage_bit bit2, const char *irqclass) { + int reclaim = strncmp(irqclass, "RECLAIM", 7) == 0; + if (!debug_locks_off_graph_unlock() || debug_locks_silent) return 0; @@ -1528,7 +1538,7 @@ print_bad_irq_dependency(struct task_struct *curr, printk("\nother info that might help us debug this:\n\n"); print_irq_lock_scenario(backwards_entry, forwards_entry, - hlock_class(prev), hlock_class(next)); + hlock_class(prev), hlock_class(next), reclaim); lockdep_print_held_locks(curr); @@ -2200,7 +2210,7 @@ static void check_chain_key(struct task_struct *curr) } static void -print_usage_bug_scenario(struct held_lock *lock) +print_usage_bug_scenario(struct held_lock *lock, enum lock_usage_bit new_bit) { struct lock_class *class = hlock_class(lock); @@ -2210,7 +2220,11 @@ print_usage_bug_scenario(struct held_lock *lock) printk(" lock("); __print_lock_name(class); printk(");\n"); - printk(" \n"); + if (new_bit == LOCK_USED_IN_RECLAIM_FS || + new_bit == LOCK_USED_IN_RECLAIM_FS_READ) + printk(" \n"); + else + printk(" \n"); printk(" lock("); __print_lock_name(class); printk(");\n"); @@ -2246,7 +2260,7 @@ print_usage_bug(struct task_struct *curr, struct held_lock *this, print_irqtrace_events(curr); printk("\nother info that might help us debug this:\n"); - print_usage_bug_scenario(this); + print_usage_bug_scenario(this, new_bit); lockdep_print_held_locks(curr); @@ -2285,13 +2299,17 @@ print_irq_inversion_bug(struct task_struct *curr, struct lock_list *entry = other; struct lock_list *middle = NULL; int depth; + int reclaim = strncmp(irqclass, "RECLAIM", 7) == 0; if (!debug_locks_off_graph_unlock() || debug_locks_silent) return 0; printk("\n"); printk("=========================================================\n"); - printk("[ INFO: possible irq lock inversion dependency detected ]\n"); + if (reclaim) + printk("[ INFO: possible memory reclaim lock inversion dependency detected ]\n"); + else + printk("[ INFO: possible irq lock inversion dependency detected ]\n"); print_kernel_ident(); printk("---------------------------------------------------------\n"); printk("%s/%d just changed the state of lock:\n", @@ -2302,6 +2320,9 @@ print_irq_inversion_bug(struct task_struct *curr, else printk("but this lock was taken by another, %s-safe lock in the past:\n", irqclass); print_lock_name(other->class); + if (reclaim) + printk("\n\nand memory reclaim could create inverse lock ordering between them.\n\n"); + else printk("\n\nand interrupts could create inverse lock ordering between them.\n\n"); printk("\nother info that might help us debug this:\n"); @@ -2319,10 +2340,10 @@ print_irq_inversion_bug(struct task_struct *curr, } while (entry && entry != root && (depth >= 0)); if (forwards) print_irq_lock_scenario(root, other, - middle ? middle->class : root->class, other->class); + middle ? middle->class : root->class, other->class, reclaim); else print_irq_lock_scenario(other, root, - middle ? middle->class : other->class, root->class); + middle ? middle->class : other->class, root->class, reclaim); lockdep_print_held_locks(curr); From neilb@suse.de Tue Apr 15 23:18:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 45F3B29DF7 for ; Tue, 15 Apr 2014 23:18:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 116A08F8049 for ; Tue, 15 Apr 2014 21:18:20 -0700 (PDT) X-ASG-Debug-ID: 1397621897-04bdf04554753e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id b8vNFfjVA9GrXHJO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:18 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C22D2AB0E; Wed, 16 Apr 2014 04:18:16 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. cc: Ming Lei Message-ID: <20140416040336.10604.58240.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621897 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently both xfs and nfs will handle PF_FSTRANS by disabling __GFP_FS. Make this effect global by repurposing memalloc_noio_flags (which does the same thing for PF_MEMALLOC_NOIO and __GFP_IO) to generally impost the task flags on a gfp_t. Due to this repurposing we change the name of memalloc_noio_flags to gfp_from_current(). As PF_FSTRANS now uniformly removes __GFP_FS we can remove special code for this from xfs and nfs. As we can now expect other code to set PF_FSTRANS, its meaning is more general, so the WARN_ON in xfs_vm_writepage() which checks PF_FSTRANS is not set is no longer appropriate. PF_FSTRANS may be set for other reasons than an XFS transaction. As lockdep cares about __GFP_FS, we need to translate PF_FSTRANS to __GFP_FS before calling lockdep_alloc_trace() in various places. Signed-off-by: NeilBrown --- fs/nfs/file.c | 3 +-- fs/xfs/kmem.h | 2 -- fs/xfs/xfs_aops.c | 7 ------- include/linux/sched.h | 5 ++++- mm/page_alloc.c | 3 ++- mm/slab.c | 2 ++ mm/slob.c | 2 ++ mm/slub.c | 1 + mm/vmscan.c | 4 ++-- 9 files changed, 14 insertions(+), 15 deletions(-) diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 5bb790a69c71..ed863f52bae7 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -472,8 +472,7 @@ static int nfs_release_page(struct page *page, gfp_t gfp) /* Only do I/O if gfp is a superset of GFP_KERNEL, and we're not * doing this memory reclaim for a fs-related allocation. */ - if (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL && - !(current->flags & PF_FSTRANS)) { + if (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL) { int how = FLUSH_SYNC; /* Don't let kswapd deadlock waiting for OOM RPC calls */ diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index 64db0e53edea..882b86270ebe 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -50,8 +50,6 @@ kmem_flags_convert(xfs_km_flags_t flags) lflags = GFP_ATOMIC | __GFP_NOWARN; } else { lflags = GFP_KERNEL | __GFP_NOWARN; - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) - lflags &= ~__GFP_FS; } if (flags & KM_ZERO) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index db2cfb067d0b..207a7f86d5d7 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -952,13 +952,6 @@ xfs_vm_writepage( PF_MEMALLOC)) goto redirty; - /* - * Given that we do not allow direct reclaim to call us, we should - * never be called while in a filesystem transaction. - */ - if (WARN_ON(current->flags & PF_FSTRANS)) - goto redirty; - /* Is this page beyond the end of the file? */ offset = i_size_read(inode); end_index = offset >> PAGE_CACHE_SHIFT; diff --git a/include/linux/sched.h b/include/linux/sched.h index 56fa52a0654c..f3291ed33c27 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1860,10 +1860,13 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, #define used_math() tsk_used_math(current) /* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags */ -static inline gfp_t memalloc_noio_flags(gfp_t flags) +/* __GFP_FS isn't allowed if PF_FSTRANS is set in current->flags */ +static inline gfp_t gfp_from_current(gfp_t flags) { if (unlikely(current->flags & PF_MEMALLOC_NOIO)) flags &= ~__GFP_IO; + if (unlikely(current->flags & PF_FSTRANS)) + flags &= ~__GFP_FS; return flags; } diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ff8b91aa0b87..5e9225df3447 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2718,6 +2718,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, struct mem_cgroup *memcg = NULL; gfp_mask &= gfp_allowed_mask; + gfp_mask = gfp_from_current(gfp_mask); lockdep_trace_alloc(gfp_mask); @@ -2765,7 +2766,7 @@ retry_cpuset: * can deadlock because I/O on the device might not * complete. */ - gfp_mask = memalloc_noio_flags(gfp_mask); + gfp_mask = gfp_from_current(gfp_mask); page = __alloc_pages_slowpath(gfp_mask, order, zonelist, high_zoneidx, nodemask, preferred_zone, migratetype); diff --git a/mm/slab.c b/mm/slab.c index b264214c77ea..914d88661f3d 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -3206,6 +3206,7 @@ slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid, int slab_node = numa_mem_id(); flags &= gfp_allowed_mask; + flags = gfp_from_current(flags); lockdep_trace_alloc(flags); @@ -3293,6 +3294,7 @@ slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller) void *objp; flags &= gfp_allowed_mask; + flags = gfp_from_current(flags); lockdep_trace_alloc(flags); diff --git a/mm/slob.c b/mm/slob.c index 4bf8809dfcce..18206f54d227 100644 --- a/mm/slob.c +++ b/mm/slob.c @@ -431,6 +431,7 @@ __do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller) void *ret; gfp &= gfp_allowed_mask; + flags = gfp_from_current(flags); lockdep_trace_alloc(gfp); @@ -539,6 +540,7 @@ void *slob_alloc_node(struct kmem_cache *c, gfp_t flags, int node) void *b; flags &= gfp_allowed_mask; + flags = gfp_from_current(flags); lockdep_trace_alloc(flags); diff --git a/mm/slub.c b/mm/slub.c index 25f14ad8f817..ff7c15e977da 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -961,6 +961,7 @@ static inline void kfree_hook(const void *x) static inline int slab_pre_alloc_hook(struct kmem_cache *s, gfp_t flags) { flags &= gfp_allowed_mask; + flags = gfp_from_current(flags); lockdep_trace_alloc(flags); might_sleep_if(flags & __GFP_WAIT); diff --git a/mm/vmscan.c b/mm/vmscan.c index 67165f839936..05de3289d031 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2592,7 +2592,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, { unsigned long nr_reclaimed; struct scan_control sc = { - .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), + .gfp_mask = (gfp_mask = gfp_from_current(gfp_mask)), .may_writepage = !laptop_mode, .nr_to_reclaim = SWAP_CLUSTER_MAX, .may_unmap = 1, @@ -3524,7 +3524,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) .may_unmap = !!(zone_reclaim_mode & RECLAIM_SWAP), .may_swap = 1, .nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX), - .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), + .gfp_mask = (gfp_mask = gfp_from_current(gfp_mask)), .order = order, .priority = ZONE_RECLAIM_PRIORITY, }; From neilb@suse.de Tue Apr 15 23:18:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9584D29DFE for ; Tue, 15 Apr 2014 23:18:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A2A1304077 for ; Tue, 15 Apr 2014 21:18:26 -0700 (PDT) X-ASG-Debug-ID: 1397621904-04cb6c243872840001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id lAPQ9ImsTQDptQeB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:25 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 325ABAB0E; Wed, 16 Apr 2014 04:18:24 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 05/19] SUNRPC: track whether a request is coming from a loop-back interface. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/19] SUNRPC: track whether a request is coming from a loop-back interface. Cc: netdev@vger.kernel.org Message-ID: <20140416040336.10604.14822.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621905 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- If an incoming NFS request is coming from the local host, then nfsd will need to perform some special handling. So detect that possibility and make the source visible in rq_local. Signed-off-by: NeilBrown --- include/linux/sunrpc/svc.h | 1 + include/linux/sunrpc/svc_xprt.h | 1 + net/sunrpc/svcsock.c | 10 ++++++++++ 3 files changed, 12 insertions(+) diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 04e763221246..a0dbbd1e00e9 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -254,6 +254,7 @@ struct svc_rqst { u32 rq_prot; /* IP protocol */ unsigned short rq_secure : 1; /* secure port */ + unsigned short rq_local : 1; /* local request */ void * rq_argp; /* decoded arguments */ void * rq_resp; /* xdr'd results */ diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index b05963f09ebf..b99bdfb0fcf9 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h @@ -63,6 +63,7 @@ struct svc_xprt { #define XPT_DETACHED 10 /* detached from tempsocks list */ #define XPT_LISTENER 11 /* listening endpoint */ #define XPT_CACHE_AUTH 12 /* cache auth info */ +#define XPT_LOCAL 13 /* connection from loopback interface */ struct svc_serv *xpt_server; /* service for transport */ atomic_t xpt_reserved; /* space on outq that is rsvd */ diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index b6e59f0a9475..193115fe968c 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -811,6 +811,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) struct socket *newsock; struct svc_sock *newsvsk; int err, slen; + struct dst_entry *dst; RPC_IFDEBUG(char buf[RPC_MAX_ADDRBUFLEN]); dprintk("svc: tcp_accept %p sock %p\n", svsk, sock); @@ -867,6 +868,14 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) } svc_xprt_set_local(&newsvsk->sk_xprt, sin, slen); + clear_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); + rcu_read_lock(); + dst = rcu_dereference(newsock->sk->sk_dst_cache); + if (dst && dst->dev && + (dst->dev->features & NETIF_F_LOOPBACK)) + set_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); + rcu_read_unlock(); + if (serv->sv_stats) serv->sv_stats->nettcpconn++; @@ -1112,6 +1121,7 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) rqstp->rq_xprt_ctxt = NULL; rqstp->rq_prot = IPPROTO_TCP; + rqstp->rq_local = !!test_bit(XPT_LOCAL, &svsk->sk_xprt.xpt_flags); p = (__be32 *)rqstp->rq_arg.head[0].iov_base; calldir = p[1]; From neilb@suse.de Tue Apr 15 23:18:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B0DC329E01 for ; Tue, 15 Apr 2014 23:18:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E4B28F8052 for ; Tue, 15 Apr 2014 21:18:35 -0700 (PDT) X-ASG-Debug-ID: 1397621912-04bdf0455375410001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id xhnY1PRYw1Pc1G4e (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:33 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 715C0AB0E; Wed, 16 Apr 2014 04:18:32 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 06/19] nfsd: set PF_FSTRANS for nfsd threads. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/19] nfsd: set PF_FSTRANS for nfsd threads. cc: Peter Zijlstra , Ingo Molnar Message-ID: <20140416040336.10604.60493.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621913 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- If a localhost mount is present, then it is easy to deadlock NFS by nfsd entering direct reclaim and calling nfs_release_page() which requires nfsd to perform an fsync() (which it cannot do because it is reclaiming memory). By setting PF_FSTRANS we stop the memory allocator from ever attempting any FS operation would could deadlock. We need this flag set for any thread which is handling a request from the local host, but we also need to always have it for at least 1 or 2 threads so that we don't end up with all threads blocked in allocation. When we set PF_FSTRANS we also tell lockdep that we are handling reclaim so that it can detect deadlocks for us. Signed-off-by: NeilBrown --- fs/nfsd/nfssvc.c | 18 ++++++++++++++++++ include/linux/sunrpc/svc.h | 1 + net/sunrpc/svc.c | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 9a4a5f9e7468..6af8bc2daf7d 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -565,6 +565,8 @@ nfsd(void *vrqstp) struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list); struct net *net = perm_sock->xpt_net; int err; + unsigned int pflags = 0; + gfp_t reclaim_state = 0; /* Lock module and set up kernel thread */ mutex_lock(&nfsd_mutex); @@ -611,14 +613,30 @@ nfsd(void *vrqstp) ; if (err == -EINTR) break; + if (rqstp->rq_local && !current_test_flags(PF_FSTRANS)) { + current_set_flags_nested(&pflags, PF_FSTRANS); + atomic_inc(&rqstp->rq_pool->sp_nr_fstrans); + reclaim_state = lockdep_set_current_reclaim_state(GFP_KERNEL); + } validate_process_creds(); svc_process(rqstp); validate_process_creds(); + if (current_test_flags(PF_FSTRANS) && + atomic_dec_if_positive(&rqstp->rq_pool->sp_nr_fstrans) >= 0) { + current_restore_flags_nested(&pflags, PF_FSTRANS); + lockdep_restore_current_reclaim_state(reclaim_state); + } } /* Clear signals before calling svc_exit_thread() */ flush_signals(current); + if (current_test_flags(PF_FSTRANS)) { + current_restore_flags_nested(&pflags, PF_FSTRANS); + lockdep_restore_current_reclaim_state(reclaim_state); + atomic_dec(&rqstp->rq_pool->sp_nr_fstrans); + } + mutex_lock(&nfsd_mutex); nfsdstats.th_cnt --; diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index a0dbbd1e00e9..4b274aba51dd 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -48,6 +48,7 @@ struct svc_pool { struct list_head sp_threads; /* idle server threads */ struct list_head sp_sockets; /* pending sockets */ unsigned int sp_nrthreads; /* # of threads in pool */ + atomic_t sp_nr_fstrans; /* # threads with PF_FSTRANS */ struct list_head sp_all_threads; /* all server threads */ struct svc_pool_stats sp_stats; /* statistics on pool operation */ int sp_task_pending;/* has pending task */ diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 5de6801cd924..8b13f35b6cbb 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -477,6 +477,12 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools, INIT_LIST_HEAD(&pool->sp_threads); INIT_LIST_HEAD(&pool->sp_sockets); INIT_LIST_HEAD(&pool->sp_all_threads); + /* The number of threads with PF_FSTRANS set + * should never be reduced below 2, except when + * threads exit. So we use atomic_dec_if_positive() + * on this value. + */ + atomic_set(&pool->sp_nr_fstrans, -2); spin_lock_init(&pool->sp_lock); } From neilb@suse.de Tue Apr 15 23:18:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E8C437F50 for ; Tue, 15 Apr 2014 23:18:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF74F30407F for ; Tue, 15 Apr 2014 21:18:41 -0700 (PDT) X-ASG-Debug-ID: 1397621919-04cbb06e9c738d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Iqpb414RH3g9ylok (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:40 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9FCE4AC2B; Wed, 16 Apr 2014 04:18:39 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 07/19] nfsd and VM: use PF_LESS_THROTTLE to avoid throttle in shrink_inactive_list. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/19] nfsd and VM: use PF_LESS_THROTTLE to avoid throttle in shrink_inactive_list. Message-ID: <20140416040336.10604.55772.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621920 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- nfsd already uses PF_LESS_THROTTLE (and is the only user) to avoid throttling while dirtying pages. Use it also to avoid throttling while doing direct reclaim as this can stall nfsd in the same way. Also only set PF_LESS_THROTTLE when handling a 'write' request for a local connection. This is the only time when the throttling can cause a problem. In other cases we should throttle if the system is busy. Signed-off-by: NeilBrown --- fs/nfsd/nfssvc.c | 6 ------ fs/nfsd/vfs.c | 6 ++++++ mm/vmscan.c | 7 +++++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 6af8bc2daf7d..cd24aa76e58d 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -593,12 +593,6 @@ nfsd(void *vrqstp) nfsdstats.th_cnt++; mutex_unlock(&nfsd_mutex); - /* - * We want less throttling in balance_dirty_pages() so that nfs to - * localhost doesn't cause nfsd to lock up due to all the client's - * dirty pages. - */ - current->flags |= PF_LESS_THROTTLE; set_freezable(); /* diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 6d7be3f80356..be2d7af3beee 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -913,6 +913,10 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, int stable = *stablep; int use_wgather; loff_t pos = offset; + unsigned int pflags; + + if (rqstp->rq_local) + current_set_flags_nested(&pflags, PF_LESS_THROTTLE); dentry = file->f_path.dentry; inode = dentry->d_inode; @@ -950,6 +954,8 @@ out_nfserr: err = 0; else err = nfserrno(host_err); + if (rqstp->rq_local) + current_restore_flags_nested(&pflags, PF_LESS_THROTTLE); return err; } diff --git a/mm/vmscan.c b/mm/vmscan.c index 05de3289d031..1b7c4e44f0a1 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1552,7 +1552,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, * implies that pages are cycling through the LRU faster than * they are written so also forcibly stall. */ - if (nr_unqueued_dirty == nr_taken || nr_immediate) + if ((nr_unqueued_dirty == nr_taken || nr_immediate) + && !current_test_flags(PF_LESS_THROTTLE)) congestion_wait(BLK_RW_ASYNC, HZ/10); } @@ -1561,7 +1562,9 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, * is congested. Allow kswapd to continue until it starts encountering * unqueued dirty pages or cycling through the LRU too quickly. */ - if (!sc->hibernation_mode && !current_is_kswapd()) + if (!sc->hibernation_mode && + !current_is_kswapd() && + !current_test_flags(PF_LESS_THROTTLE)) wait_iff_congested(zone, BLK_RW_ASYNC, HZ/10); trace_mm_vmscan_lru_shrink_inactive(zone->zone_pgdat->node_id, From neilb@suse.de Tue Apr 15 23:18:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0B0D329DF7 for ; Tue, 15 Apr 2014 23:18:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9C038F8052 for ; Tue, 15 Apr 2014 21:18:48 -0700 (PDT) X-ASG-Debug-ID: 1397621927-04cb6c243672860001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id lFD1bxrC6IYOAH36 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:48 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id AAB50AC2B; Wed, 16 Apr 2014 04:18:46 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 08/19] Set PF_FSTRANS while write_cache_pages calls ->writepage Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/19] Set PF_FSTRANS while write_cache_pages calls ->writepage Message-ID: <20140416040336.10604.34673.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621927 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It is normally safe for direct reclaim to enter filesystems even when a page is locked - as can happen if ->writepage allocates memory with GFP_KERNEL (which xfs does). However if a localhost NFS mount is present, then a flush-* thread might hold a page locked and then in direct reclaim, ask nfs to commit an inode (nfs_release_page). When nfsd performs the fsync it might try to lock the same page, which leads to a deadlock. A ->writepage should not allocate much memory, or do so very often, so it is safe to set PF_FSTRANS, and this removes the possible deadlock. This was not detected by lockdep as it doesn't monitor the page lock. It was found as a real deadlock in testing. Signed-off-by: NeilBrown --- mm/page-writeback.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 7106cb1aca8e..572e70b9a3f7 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -1909,6 +1909,7 @@ retry: for (i = 0; i < nr_pages; i++) { struct page *page = pvec.pages[i]; + unsigned int pflags; /* * At this point, the page may be truncated or @@ -1960,8 +1961,10 @@ continue_unlock: if (!clear_page_dirty_for_io(page)) goto continue_unlock; + current_set_flags_nested(&pflags, PF_FSTRANS); trace_wbc_writepage(wbc, mapping->backing_dev_info); ret = (*writepage)(page, wbc, data); + current_restore_flags_nested(&pflags, PF_FSTRANS); if (unlikely(ret)) { if (ret == AOP_WRITEPAGE_ACTIVATE) { unlock_page(page); From neilb@suse.de Tue Apr 15 23:18:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 900B67F4E for ; Tue, 15 Apr 2014 23: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 1AAC9AC002 for ; Tue, 15 Apr 2014 21:18:55 -0700 (PDT) X-ASG-Debug-ID: 1397621933-04cbb06e9d73900001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 4uT5VMzjvtLl7fB5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:18:54 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A9BD5AC2B; Wed, 16 Apr 2014 04:18:53 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. Message-ID: <20140416040336.10604.90380.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621934 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_file_*_read holds an inode lock while calling a generic 'read' function. These functions perform read-ahead and are quite likely to allocate memory. So set PF_FSTRANS to ensure they avoid __GFP_FS and so don't recurse into a filesystem to free memory. This can be a problem with loop-back NFS mounts, if free_pages ends up wating in nfs_release_page(), and nfsd is blocked waiting for the lock that this code holds. This was found both by lockdep and as a real deadlock during testing. Signed-off-by: NeilBrown --- fs/xfs/xfs_file.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 64b48eade91d..88b33ef64668 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -243,6 +243,7 @@ xfs_file_aio_read( ssize_t ret = 0; int ioflags = 0; xfs_fsize_t n; + unsigned int pflags; XFS_STATS_INC(xs_read_calls); @@ -290,6 +291,10 @@ xfs_file_aio_read( * proceeed concurrently without serialisation. */ xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); + /* As we hold a lock, we must ensure that any allocation + * in generic_file_aio_read avoid __GFP_FS + */ + current_set_flags_nested(&pflags, PF_FSTRANS); if ((ioflags & IO_ISDIRECT) && inode->i_mapping->nrpages) { xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); @@ -313,6 +318,7 @@ xfs_file_aio_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); + current_restore_flags_nested(&pflags, PF_FSTRANS); xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -328,6 +334,7 @@ xfs_file_splice_read( struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); int ioflags = 0; ssize_t ret; + unsigned int pflags; XFS_STATS_INC(xs_read_calls); @@ -338,6 +345,10 @@ xfs_file_splice_read( return -EIO; xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); + /* As we hold a lock, we must ensure that any allocation + * in generic_file_splice_read avoid __GFP_FS + */ + current_set_flags_nested(&pflags, PF_FSTRANS); trace_xfs_file_splice_read(ip, count, *ppos, ioflags); @@ -345,6 +356,7 @@ xfs_file_splice_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); + current_restore_flags_nested(&pflags, PF_FSTRANS); xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } From neilb@suse.de Tue Apr 15 23:19:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4374E29DF7 for ; Tue, 15 Apr 2014 23:19:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C0008F8052 for ; Tue, 15 Apr 2014 21:19:03 -0700 (PDT) X-ASG-Debug-ID: 1397621941-04cbb06e9d73920001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TYT7kMHLLaWZ8aLE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:02 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 23AEDAB0E; Wed, 16 Apr 2014 04:19:01 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock Cc: netdev@vger.kernel.org Message-ID: <20140416040336.10604.96000.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621941 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- sk_lock can be taken while reclaiming memory (in nfsd for loop-back NFS mounts, and presumably in nfs), and memory can be allocated while holding sk_lock, at least via: inet_listen -> inet_csk_listen_start ->reqsk_queue_alloc So to avoid deadlocks, always set PF_FSTRANS while holding sk_lock. This deadlock was found by lockdep. Signed-off-by: NeilBrown --- include/net/sock.h | 1 + net/core/sock.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index b9586a137cad..27c355637e44 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -324,6 +324,7 @@ struct sock { #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr socket_lock_t sk_lock; + unsigned int sk_pflags; /* process flags before taking lock */ struct sk_buff_head sk_receive_queue; /* * The backlog queue is special, it is always used with diff --git a/net/core/sock.c b/net/core/sock.c index cf9bd24e4099..8bc677ef072e 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2341,6 +2341,7 @@ void lock_sock_nested(struct sock *sk, int subclass) /* * The sk_lock has mutex_lock() semantics here: */ + current_set_flags_nested(&sk->sk_pflags, PF_FSTRANS); mutex_acquire(&sk->sk_lock.dep_map, subclass, 0, _RET_IP_); local_bh_enable(); } @@ -2352,6 +2353,7 @@ void release_sock(struct sock *sk) * The sk_lock has mutex_unlock() semantics: */ mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_); + current_restore_flags_nested(&sk->sk_pflags, PF_FSTRANS); spin_lock_bh(&sk->sk_lock.slock); if (sk->sk_backlog.tail) From neilb@suse.de Tue Apr 15 23:19:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D7247F3F for ; Tue, 15 Apr 2014 23:19:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F24A1304053 for ; Tue, 15 Apr 2014 21:19:10 -0700 (PDT) X-ASG-Debug-ID: 1397621948-04bdf0455375460001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id CAaHLA958u8HPwih (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:09 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 272B5AB0E; Wed, 16 Apr 2014 04:19:08 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 11/19] FS: set PF_FSTRANS while holding mmap_sem in exec.c Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/19] FS: set PF_FSTRANS while holding mmap_sem in exec.c Message-ID: <20140416040336.10604.31309.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621949 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Because mmap_sem is sometimes(*) taken while holding a sock lock, and the sock lock might be needed for reclaim (at least when loop-back NFS is active), we must not block on FS reclaim while mmap_sem is held. exec.c allocates memory while holding mmap_sem, and so needs PF_FSTRANS protection. * lockdep reports: [ 57.653355] [] lock_acquire+0xa8/0x1f0 [ 57.653355] [] might_fault+0x84/0xb0 [ 57.653355] [] do_ip_setsockopt.isra.18+0x93d/0xed0 [ 57.653355] [] ip_setsockopt+0x27/0x90 [ 57.653355] [] udp_setsockopt+0x16/0x30 [ 57.653355] [] sock_common_setsockopt+0xf/0x20 [ 57.653355] [] SyS_setsockopt+0x5e/0xc0 [ 57.653355] [] system_call_fastpath+0x16/0x1b to explain why mmap_sem might be taken while sock lock is held. Signed-off-by: NeilBrown --- fs/exec.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/exec.c b/fs/exec.c index 3d78fccdd723..2c70a03ddb2b 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -652,6 +652,7 @@ int setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_size; unsigned long stack_expand; unsigned long rlim_stack; + unsigned int pflags; #ifdef CONFIG_STACK_GROWSUP /* Limit stack size to 1GB */ @@ -688,6 +689,7 @@ int setup_arg_pages(struct linux_binprm *bprm, down_write(&mm->mmap_sem); vm_flags = VM_STACK_FLAGS; + current_set_flags_nested(&pflags, PF_FSTRANS); /* * Adjust stack execute permissions; explicitly enable for @@ -741,6 +743,7 @@ int setup_arg_pages(struct linux_binprm *bprm, ret = -EFAULT; out_unlock: + current_restore_flags_nested(&pflags, PF_FSTRANS); up_write(&mm->mmap_sem); return ret; } @@ -1369,6 +1372,7 @@ int search_binary_handler(struct linux_binprm *bprm) bool need_retry = IS_ENABLED(CONFIG_MODULES); struct linux_binfmt *fmt; int retval; + unsigned int pflags; /* This allows 4 levels of binfmt rewrites before failing hard. */ if (bprm->recursion_depth > 5) @@ -1381,6 +1385,7 @@ int search_binary_handler(struct linux_binprm *bprm) retval = -ENOENT; retry: read_lock(&binfmt_lock); + current_set_flags_nested(&pflags, PF_FSTRANS); list_for_each_entry(fmt, &formats, lh) { if (!try_module_get(fmt->module)) continue; @@ -1396,6 +1401,7 @@ int search_binary_handler(struct linux_binprm *bprm) read_lock(&binfmt_lock); put_binfmt(fmt); } + current_restore_flags_nested(&pflags, PF_FSTRANS); read_unlock(&binfmt_lock); if (need_retry && retval == -ENOEXEC) { From neilb@suse.de Tue Apr 15 23:19:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1AE8C29DF7 for ; Tue, 15 Apr 2014 23:19:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6BE5304077 for ; Tue, 15 Apr 2014 21:19:18 -0700 (PDT) X-ASG-Debug-ID: 1397621956-04cb6c2436728d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id LGMoKAyEkJ1yCiEi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:16 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 800B2AB0E; Wed, 16 Apr 2014 04:19:15 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 12/19] NET: set PF_FSTRANS while holding rtnl_lock Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/19] NET: set PF_FSTRANS while holding rtnl_lock Cc: netdev@vger.kernel.org Message-ID: <20140416040336.10604.81658.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621956 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- As rtnl_mutex can be taken while holding sk_lock, and sk_lock can be taken while performing memory reclaim (at least when loop-back NFS is active), any memory allocation under rtnl_mutex must avoid __GFP_FS, which is most easily done by setting PF_MEMALLOC. CPU0 CPU1 ---- ---- lock(rtnl_mutex); lock(sk_lock-AF_INET); lock(rtnl_mutex); lock(sk_lock-AF_INET); *** DEADLOCK *** 1/ rtnl_mutex is taken while holding sk_lock: [] rtnl_lock+0x12/0x20 [] ip_mc_leave_group+0x2a/0x160 [] do_ip_setsockopt.isra.18+0x96b/0xed0 [] ip_setsockopt+0x27/0x90 [] udp_setsockopt+0x16/0x30 [] sock_common_setsockopt+0xf/0x20 [] SyS_setsockopt+0x5e/0xc0 2/ memory is allocated under rtnl_mutex: [] kobject_set_name_vargs+0x21/0x70 [] dev_set_name+0x42/0x50 [] netdev_register_kobject+0x57/0x130 [] register_netdevice+0x354/0x550 [] register_netdev+0x15/0x30 Signed-off-by: NeilBrown --- net/core/rtnetlink.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 120eecc0f5a4..6870211e93a6 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -61,15 +61,18 @@ struct rtnl_link { }; static DEFINE_MUTEX(rtnl_mutex); +static int rtnl_pflags; void rtnl_lock(void) { mutex_lock(&rtnl_mutex); + current_set_flags_nested(&rtnl_pflags, PF_FSTRANS); } EXPORT_SYMBOL(rtnl_lock); void __rtnl_unlock(void) { + current_restore_flags_nested(&rtnl_pflags, PF_FSTRANS); mutex_unlock(&rtnl_mutex); } @@ -82,7 +85,11 @@ EXPORT_SYMBOL(rtnl_unlock); int rtnl_trylock(void) { - return mutex_trylock(&rtnl_mutex); + if (mutex_trylock(&rtnl_mutex)) { + current_set_flags_nested(&rtnl_pflags, PF_FSTRANS); + return 1; + } + return 0; } EXPORT_SYMBOL(rtnl_trylock); From neilb@suse.de Tue Apr 15 23:19:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B39367F3F for ; Tue, 15 Apr 2014 23:19:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9BD1D8F8054 for ; Tue, 15 Apr 2014 21:19:24 -0700 (PDT) X-ASG-Debug-ID: 1397621962-04cbb06e9a73940001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id OZ4FLD589wKGqq6O (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:23 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8E9F8AB0E; Wed, 16 Apr 2014 04:19:22 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. Message-ID: <20140416040336.10604.67456.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621963 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- lockdep reports a locking chain sk_lock-AF_INET --> rtnl_mutex --> pcpu_alloc_mutex As sk_lock may be needed to reclaim memory, allowing that reclaim while pcu_alloc_mutex is held can lead to deadlock. So set PF_FSTRANS while it is help to avoid the FS reclaim. pcpu_alloc_mutex can be taken when rtnl_mutex is held: [] pcpu_alloc+0x49/0x960 [] __alloc_percpu+0xb/0x10 [] loopback_dev_init+0x17/0x60 [] register_netdevice+0xec/0x550 [] register_netdev+0x15/0x30 Signed-off-by: NeilBrown --- mm/percpu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mm/percpu.c b/mm/percpu.c index 036cfe07050f..77dd24032f41 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -712,6 +712,7 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved) int slot, off, new_alloc; unsigned long flags; void __percpu *ptr; + unsigned int pflags; if (unlikely(!size || size > PCPU_MIN_UNIT_SIZE || align > PAGE_SIZE)) { WARN(true, "illegal size (%zu) or align (%zu) for " @@ -720,6 +721,7 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved) } mutex_lock(&pcpu_alloc_mutex); + current_set_flags_nested(&pflags, PF_FSTRANS); spin_lock_irqsave(&pcpu_lock, flags); /* serve reserved allocations from the reserved chunk if available */ @@ -801,6 +803,7 @@ area_found: goto fail_unlock; } + current_restore_flags_nested(&pflags, PF_FSTRANS); mutex_unlock(&pcpu_alloc_mutex); /* return address relative to base address */ @@ -811,6 +814,7 @@ area_found: fail_unlock: spin_unlock_irqrestore(&pcpu_lock, flags); fail_unlock_mutex: + current_restore_flags_nested(&pflags, PF_FSTRANS); mutex_unlock(&pcpu_alloc_mutex); if (warn_limit) { pr_warning("PERCPU: allocation failed, size=%zu align=%zu, " From neilb@suse.de Tue Apr 15 23:19:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4974629DF7 for ; Tue, 15 Apr 2014 23:19:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C808FAC001 for ; Tue, 15 Apr 2014 21:19:31 -0700 (PDT) X-ASG-Debug-ID: 1397621969-04cbb06e9a73950001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id iYfGcsgyrWUCBmz3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:30 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8BB48AB0E; Wed, 16 Apr 2014 04:19:29 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:36 +1000 Subject: [PATCH 14/19] driver core: set PF_FSTRANS while holding gdp_mutex Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 14/19] driver core: set PF_FSTRANS while holding gdp_mutex Message-ID: <20140416040336.10604.223.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621970 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- lockdep reports a locking chain: sk_lock-AF_INET --> rtnl_mutex --> gdp_mutex As sk_lock can be needed for memory reclaim (when loop-back NFS is in use at least), any memory allocation under gdp_mutex needs to be protected by PF_FSTRANS. The path frome rtnl_mutex to gdp_mutex is [] get_device_parent+0x4c/0x1f0 [] device_add+0xe6/0x610 [] netdev_register_kobject+0x7a/0x130 [] register_netdevice+0x354/0x550 [] register_netdev+0x15/0x30 Signed-off-by: NeilBrown --- drivers/base/core.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/base/core.c b/drivers/base/core.c index 2b567177ef78..1a2735237650 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -750,6 +750,7 @@ static struct kobject *get_device_parent(struct device *dev, struct kobject *kobj = NULL; struct kobject *parent_kobj; struct kobject *k; + unsigned int pflags; #ifdef CONFIG_BLOCK /* block disks show up in /sys/block */ @@ -788,7 +789,9 @@ static struct kobject *get_device_parent(struct device *dev, } /* or create a new class-directory at the parent device */ + current_set_flags_nested(&pflags, PF_FSTRANS); k = class_dir_create_and_add(dev->class, parent_kobj); + current_restore_flags_nested(&pflags, PF_FSTRANS); /* do not emit an uevent for this simple "glue" directory */ mutex_unlock(&gdp_mutex); return k; From neilb@suse.de Tue Apr 15 23:19:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7556F29E1A for ; Tue, 15 Apr 2014 23:19:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0FE1AAC001 for ; Tue, 15 Apr 2014 21:19:39 -0700 (PDT) X-ASG-Debug-ID: 1397621976-04bdf04554754a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id yAtZfxp6V6Y8pFPt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:37 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 88305AB0E; Wed, 16 Apr 2014 04:19:36 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:37 +1000 Subject: [PATCH 15/19] nfsd: set PF_FSTRANS when client_mutex is held. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 15/19] nfsd: set PF_FSTRANS when client_mutex is held. Message-ID: <20140416040336.10604.67828.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621977 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- When loop-back NFS with NFSv4 is in use, client_mutex might be needed to reclaim memory, so any memory allocation while client_mutex is held must avoid __GFP_FS, so best to set PF_FSTRANS. Signed-off-by: NeilBrown --- fs/nfsd/nfs4state.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index d5d070fbeb35..7b7fbcbe20cb 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -75,6 +75,7 @@ static int check_for_locks(struct nfs4_file *filp, struct nfs4_lockowner *lowner /* Currently used for almost all code touching nfsv4 state: */ static DEFINE_MUTEX(client_mutex); +static unsigned int client_mutex_pflags; /* * Currently used for the del_recall_lru and file hash table. In an @@ -93,6 +94,7 @@ void nfs4_lock_state(void) { mutex_lock(&client_mutex); + current_set_flags_nested(&client_mutex_pflags, PF_FSTRANS); } static void free_session(struct nfsd4_session *); @@ -127,6 +129,7 @@ static __be32 nfsd4_get_session_locked(struct nfsd4_session *ses) void nfs4_unlock_state(void) { + current_restore_flags_nested(&client_mutex_pflags, PF_FSTRANS); mutex_unlock(&client_mutex); } From neilb@suse.de Tue Apr 15 23:19:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2C9837F3F for ; Tue, 15 Apr 2014 23:19:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD91AAC004 for ; Tue, 15 Apr 2014 21:19:45 -0700 (PDT) X-ASG-Debug-ID: 1397621984-04cb6c243772900001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id x3LPSpwk0ba3Ld9H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:44 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 83835AC2B; Wed, 16 Apr 2014 04:19:43 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:37 +1000 Subject: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Message-ID: <20140416040337.10604.61837.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621984 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- __d_alloc can be called with i_mutex held, so it is safer to use GFP_NOFS. lockdep reports this can deadlock when loop-back NFS is in use, as nfsd may be required to write out for reclaim, and nfsd certainly takes i_mutex. Signed-off-by: NeilBrown --- fs/dcache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index ca02c13a84aa..3651ff6185b4 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1483,7 +1483,7 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) struct dentry *dentry; char *dname; - dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL); + dentry = kmem_cache_alloc(dentry_cache, GFP_NOFS); if (!dentry) return NULL; @@ -1495,7 +1495,7 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) */ dentry->d_iname[DNAME_INLINE_LEN-1] = 0; if (name->len > DNAME_INLINE_LEN-1) { - dname = kmalloc(name->len + 1, GFP_KERNEL); + dname = kmalloc(name->len + 1, GFP_NOFS); if (!dname) { kmem_cache_free(dentry_cache, dentry); return NULL; From neilb@suse.de Tue Apr 15 23:19:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C22D729E06 for ; Tue, 15 Apr 2014 23:19:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AA8118F8054 for ; Tue, 15 Apr 2014 21:19:52 -0700 (PDT) X-ASG-Debug-ID: 1397621990-04cbb06e9a73970001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id BE0lGpKMKtdwsHNm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:51 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 879F1AC2B; Wed, 16 Apr 2014 04:19:50 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:37 +1000 Subject: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. Message-ID: <20140416040337.10604.86740.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621991 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- namespace_sem can be taken while various i_mutex locks are held, so we need to avoid reclaim from blocking on an FS (particularly loop-back NFS). A memory allocation happens under namespace_sem at least in: [] kmem_cache_alloc+0x4f/0x290 [] alloc_vfsmnt+0x1f/0x1d0 [] clone_mnt+0x2a/0x310 [] copy_tree+0x53/0x380 [] copy_mnt_ns+0x7f/0x280 [] create_new_namespaces+0x5c/0x190 [] unshare_nsproxy_namespaces+0x59/0x90 So set PF_FSTRANS in namespace_lock() and restore in namespace_unlock(). Signed-off-by: NeilBrown --- fs/namespace.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/namespace.c b/fs/namespace.c index 2ffc5a2905d4..83dcd5083dbb 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -63,6 +63,7 @@ static struct hlist_head *mount_hashtable __read_mostly; static struct hlist_head *mountpoint_hashtable __read_mostly; static struct kmem_cache *mnt_cache __read_mostly; static DECLARE_RWSEM(namespace_sem); +static unsigned long namespace_sem_pflags; /* /sys/fs */ struct kobject *fs_kobj; @@ -1196,6 +1197,8 @@ static void namespace_unlock(void) struct mount *mnt; struct hlist_head head = unmounted; + current_restore_flags_nested(&namespace_sem_pflags, PF_FSTRANS); + if (likely(hlist_empty(&head))) { up_write(&namespace_sem); return; @@ -1220,6 +1223,7 @@ static void namespace_unlock(void) static inline void namespace_lock(void) { down_write(&namespace_sem); + current_set_flags_nested(&namespace_sem_pflags, PF_FSTRANS); } /* From neilb@suse.de Tue Apr 15 23:20:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E3437F3F for ; Tue, 15 Apr 2014 23:20:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9DE3304081 for ; Tue, 15 Apr 2014 21:19:59 -0700 (PDT) X-ASG-Debug-ID: 1397621998-04cb6c243772920001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 52umEIG0GuHVaqgw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:19:58 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 978D6AB0E; Wed, 16 Apr 2014 04:19:57 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:37 +1000 Subject: [PATCH 18/19] nfsd: set PF_FSTRANS during nfsd4_do_callback_rpc. Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 18/19] nfsd: set PF_FSTRANS during nfsd4_do_callback_rpc. Message-ID: <20140416040337.10604.52860.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397621998 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- nfsd will sometimes call flush_workqueue on the workqueue running nfsd4_do_callback_rpc, so we must ensure that it doesn't block in filesystem reclaim. So set PF_FSTRANS. Signed-off-by: NeilBrown --- fs/nfsd/nfs4callback.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 7f05cd140de3..7784b5d4edf0 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -997,6 +997,9 @@ static void nfsd4_do_callback_rpc(struct work_struct *w) struct nfsd4_callback *cb = container_of(w, struct nfsd4_callback, cb_work); struct nfs4_client *clp = cb->cb_clp; struct rpc_clnt *clnt; + unsigned int pflags; + + current_set_flags_nested(&pflags, PF_FSTRANS); if (clp->cl_flags & NFSD4_CLIENT_CB_FLAG_MASK) nfsd4_process_cb_update(cb); @@ -1005,11 +1008,13 @@ static void nfsd4_do_callback_rpc(struct work_struct *w) if (!clnt) { /* Callback channel broken, or client killed; give up: */ nfsd4_release_cb(cb); + current_restore_flags_nested(&pflags, PF_FSTRANS); return; } cb->cb_msg.rpc_cred = clp->cl_cb_cred; rpc_call_async(clnt, &cb->cb_msg, RPC_TASK_SOFT | RPC_TASK_SOFTCONN, cb->cb_ops, cb); + current_restore_flags_nested(&pflags, PF_FSTRANS); } void nfsd4_init_callback(struct nfsd4_callback *cb) From neilb@suse.de Tue Apr 15 23:20:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 84B4229E06 for ; Tue, 15 Apr 2014 23:20:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0FA81AC001 for ; Tue, 15 Apr 2014 21:20:06 -0700 (PDT) X-ASG-Debug-ID: 1397622004-04cbb06e9b73990001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id rHHIgX2DFDGxCr5i (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:20:05 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 99360AB0E; Wed, 16 Apr 2014 04:20:04 +0000 (UTC) From: NeilBrown To: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org Date: Wed, 16 Apr 2014 14:03:37 +1000 Subject: [PATCH 19/19] XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 19/19] XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks Message-ID: <20140416040337.10604.7488.stgit@notabene.brown> In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397622005 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- memory allocates can happen while the xfs ilock is held in xfs_free_eofblocks, particularly [] kmem_zone_alloc+0x67/0xc0 [] xfs_trans_add_item+0x25/0x50 [] xfs_trans_ijoin+0x2c/0x60 [] xfs_itruncate_extents+0xbe/0x400 [] xfs_free_eofblocks+0x1c4/0x240 So set PF_FSTRANS to avoid this causing a deadlock. Care is needed here as xfs_trans_reserve() also sets PF_FSTRANS, while xfs_trans_cancel and xfs_trans_commit will clear it. So our extra setting must fully nest these calls. Signed-off-by: NeilBrown --- fs/xfs/xfs_bmap_util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index f264616080ca..53761fe4fada 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -889,6 +889,7 @@ xfs_free_eofblocks( xfs_filblks_t map_len; int nimaps; xfs_bmbt_irec_t imap; + unsigned int pflags; /* * Figure out if there are any blocks beyond the end @@ -929,12 +930,14 @@ xfs_free_eofblocks( } } + current_set_flags_nested(&pflags, PF_FSTRANS); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); if (error) { ASSERT(XFS_FORCED_SHUTDOWN(mp)); xfs_trans_cancel(tp, 0); if (need_iolock) xfs_iunlock(ip, XFS_IOLOCK_EXCL); + current_restore_flags_nested(&pflags, PF_FSTRANS); return error; } @@ -964,6 +967,7 @@ xfs_free_eofblocks( xfs_inode_clear_eofblocks_tag(ip); } + current_restore_flags_nested(&pflags, PF_FSTRANS); xfs_iunlock(ip, XFS_ILOCK_EXCL); if (need_iolock) xfs_iunlock(ip, XFS_IOLOCK_EXCL); From viro@ftp.linux.org.uk Tue Apr 15 23:46:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1853129DFD for ; Tue, 15 Apr 2014 23:46:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E959330404E for ; Tue, 15 Apr 2014 21:46:24 -0700 (PDT) X-ASG-Debug-ID: 1397623582-04cbb06e9c743d0001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id D8SGEm6zxQN8Az3P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 21:46:23 -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 1WaHjm-0001xK-Ss; Wed, 16 Apr 2014 04:46:18 +0000 Date: Wed, 16 Apr 2014 05:46:18 +0100 From: Al Viro To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. Message-ID: <20140416044618.GX18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.86740.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040337.10604.86740.stgit@notabene.brown> 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: 1397623583 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > namespace_sem can be taken while various i_mutex locks are held, so we > need to avoid reclaim from blocking on an FS (particularly loop-back > NFS). I would really prefer to deal with that differently - by explicit change of gfp_t arguments of allocators. The thing is, namespace_sem is held *only* over allocations, and not a lot of them, at that - only mnt_alloc_id(), mnt_alloc_group_id(), alloc_vfsmnt() and new_mountpoint(). That is all that is allowed. Again, actual work with filesystems (setup, shutdown, remount, pathname resolution, etc.) is all done outside of namespace_sem; it's held only for manipulations of fs/{namespace,pnode}.c data structures and the only reason it isn't a spinlock is that we need to do some allocations. So I'd rather slap GFP_NOFS on those few allocations... From tytso@thunk.org Tue Apr 15 23:58:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABDBA7F76 for ; Tue, 15 Apr 2014 23:58:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 90B118F8039 for ; Tue, 15 Apr 2014 21:58:30 -0700 (PDT) X-ASG-Debug-ID: 1397624308-04cb6c243673880001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id pIHCBaZaEtlH65Ns (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 21:58:28 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WaHvX-0004sn-CQ; Wed, 16 Apr 2014 04:58:27 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 76403580893; Wed, 16 Apr 2014 00:58:26 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397624306; bh=PXcDIpGad/UQeXpztQuZ8eP8oDnAPwpamnfycssnrJk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h6xSJ3qXQbc/530Kd9G7pPd07ZO2bZo2tv9A5+dJV+CS2KUM1d9swWOosfUAiNn1X 81+SEZ88bRT6PTIEC9Oq1ttgWFV4z9lw9lms99XPLsalLBdXPtSkFXP3If7l7KEMgb psdbMQ9VXv8Sfqa/Ytnp0eekApNP9DyW1F+ShyLo= From: Theodore Ts'o To: xfs@oss.sgi.com Cc: Ext4 Developers List , Theodore Ts'o Subject: [PATCH -v2] check: add support for an external file containing tests to exclude Date: Wed, 16 Apr 2014 00:58:22 -0400 X-ASG-Orig-Subj: [PATCH -v2] check: add support for an external file containing tests to exclude Message-Id: <1397624302-9577-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 In-Reply-To: <20140416001530.GU15995@dastard> References: <20140416001530.GU15995@dastard> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397624308 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Currently the -X option is intended to specify a set of expunging files which are stored in each test/* subdirectory. As described in the commit description for 0b1e8abd4, in order to exclude the test generic/280, the -X option is used as follows: $ cat tests/generic/3.0-stable-avoid 280 $ sudo ./check -X 3.0-stable-avoid generic/280 However, it is sometimes useful to store the set of expunged tests in a single file, outside of tests/* subdirectories. This commit enables the following: $ cat /root/conf/data_journal.exclude generic/068 ext4/301 $ sudo ./check -E /root/conf/data_journal.exclude -g auto Signed-off-by: "Theodore Ts'o" --- check | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/check b/check index e7ace63..b1eaed2 100755 --- a/check +++ b/check @@ -81,6 +81,7 @@ testlist options -g group[,group...] include tests from these groups -x group[,group...] exclude tests from these groups -X file exclude individual tests + -E external_file exclude individual tests [testlist] include tests matching names in testlist ' exit 0 @@ -222,6 +223,11 @@ while [ $# -gt 0 ]; do done done ;; + -E) xfile=$2; shift ; + if [ -f $xfile ]; then + cat "$xfile" >> $tmp.xlist + fi + ;; -s) RUN_SECTION="$RUN_SECTION $2"; shift ;; -l) diff="diff" ;; -udiff) diff="$diff -u" ;; -- 1.9.0 From eric.dumazet@gmail.com Wed Apr 16 00:14:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D35E37F5F for ; Wed, 16 Apr 2014 00:14:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B96FC8F8068 for ; Tue, 15 Apr 2014 22:13:49 -0700 (PDT) X-ASG-Debug-ID: 1397625228-04bdf0455376ae0001-NocioJ Received: from mail-pd0-f181.google.com (mail-pd0-f181.google.com [209.85.192.181]) by cuda.sgi.com with ESMTP id 5TUCLaOuYQAHjro1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 22:13:48 -0700 (PDT) X-Barracuda-Envelope-From: eric.dumazet@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.181 Received: by mail-pd0-f181.google.com with SMTP id p10so10249902pdj.40 for ; Tue, 15 Apr 2014 22:13:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:cc:date:in-reply-to:references :content-type:content-transfer-encoding:mime-version; bh=xD9DIIaID91y+ESCvfXO5o/T2UrOqB3PRddDdod4zWQ=; b=hfAL7yISP8AIC3Dp2qe/J11jhTDeUkI/hm4Nf9b0KKZfVrx5C/VseUQY7feF2HTtdS OtoO5WgO3tZt1aTw7dQXV/z7sa+IE1W61FjqlH0JbBGpqQT/rL9AipASDbE8EsQpwQBn 8GkFbhUeMUcHfocSi1v0UGnVQ5FDXSIUTzKA0mdnAv+AieloZZBwt3aGMwtLf60HmE/E 4Rr8gAHNu4Gciucn6RNohqM5ciX4qeVCgxWpLv0fSx/mjWqDf+xgaezKFkWxYO4u0gVh ZFMtK1aFRDAmnUUWgSbWDGMkONpCR7rFPaAW/CsqtfRn5WIy71l3yccxJSNoGSrAXytx uzdw== X-Barracuda-BBL-IP: nil X-Received: by 10.68.133.229 with SMTP id pf5mr6195016pbb.115.1397625228315; Tue, 15 Apr 2014 22:13:48 -0700 (PDT) Received: from [172.19.251.9] ([172.19.251.9]) by mx.google.com with ESMTPSA id eb5sm105339015pad.22.2014.04.15.22.13.47 for (version=SSLv3 cipher=RC4-SHA bits=128/128); Tue, 15 Apr 2014 22:13:47 -0700 (PDT) Message-ID: <1397625226.4222.113.camel@edumazet-glaptop2.roam.corp.google.com> Subject: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock From: Eric Dumazet X-ASG-Orig-Subj: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, netdev@vger.kernel.org Date: Tue, 15 Apr 2014 22:13:46 -0700 In-Reply-To: <20140416040336.10604.96000.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.96000.stgit@notabene.brown> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-Barracuda-Connect: mail-pd0-f181.google.com[209.85.192.181] X-Barracuda-Start-Time: 1397625228 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, 2014-04-16 at 14:03 +1000, NeilBrown wrote: > sk_lock can be taken while reclaiming memory (in nfsd for loop-back > NFS mounts, and presumably in nfs), and memory can be allocated while > holding sk_lock, at least via: > > inet_listen -> inet_csk_listen_start ->reqsk_queue_alloc > > So to avoid deadlocks, always set PF_FSTRANS while holding sk_lock. > > This deadlock was found by lockdep. Wow, this is adding expensive stuff in fast path, only for nfsd :( BTW, why should the current->flags should be saved on a socket field, and not a current->save_flags. This really looks a thread property, not a socket one. Why nfsd could not have PF_FSTRANS in its current->flags ? For applications handling millions of sockets, this makes a difference. From david@fromorbit.com Wed Apr 16 00:38:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AF13F7F3F for ; Wed, 16 Apr 2014 00:38:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 981068F8049 for ; Tue, 15 Apr 2014 22:38:37 -0700 (PDT) X-ASG-Debug-ID: 1397626711-04cbb06e9a759a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id kMo8en3WUDSz1V8Y for ; Tue, 15 Apr 2014 22:38:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: As9SAAkXTlN5LEcvPGdsb2JhbABODIMGg1OFCrYLhV6BJBcDAQEBATg1giUBAQEDAR0KExwjBQsIAxgJJQ8FJQMHGhOHdAfGQhcWjWZmB4MkgRQEmGKKZ4sjKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 15:07:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaIXk-0006s0-VT; Wed, 16 Apr 2014 15:37:56 +1000 Date: Wed, 16 Apr 2014 15:37:56 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ming Lei , xfs@oss.sgi.com Subject: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. Message-ID: <20140416053756.GC15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.58240.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040336.10604.58240.stgit@notabene.brown> 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: 1397626711 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > Currently both xfs and nfs will handle PF_FSTRANS by disabling > __GFP_FS. > > Make this effect global by repurposing memalloc_noio_flags (which > does the same thing for PF_MEMALLOC_NOIO and __GFP_IO) to generally > impost the task flags on a gfp_t. > Due to this repurposing we change the name of memalloc_noio_flags > to gfp_from_current(). > > As PF_FSTRANS now uniformly removes __GFP_FS we can remove special > code for this from xfs and nfs. > > As we can now expect other code to set PF_FSTRANS, its meaning is more > general, so the WARN_ON in xfs_vm_writepage() which checks PF_FSTRANS > is not set is no longer appropriate. PF_FSTRANS may be set for other > reasons than an XFS transaction. So PF_FSTRANS no longer means "filesystem in transaction context". Are you going to rename to match whatever it's meaning is now? I'm not exactly clear on what it means now... > As lockdep cares about __GFP_FS, we need to translate PF_FSTRANS to > __GFP_FS before calling lockdep_alloc_trace() in various places. > > Signed-off-by: NeilBrown .... > diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h > index 64db0e53edea..882b86270ebe 100644 > --- a/fs/xfs/kmem.h > +++ b/fs/xfs/kmem.h > @@ -50,8 +50,6 @@ kmem_flags_convert(xfs_km_flags_t flags) > lflags = GFP_ATOMIC | __GFP_NOWARN; > } else { > lflags = GFP_KERNEL | __GFP_NOWARN; > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > - lflags &= ~__GFP_FS; > } I think KM_NOFS needs to remain here, as it has use outside of transaction contexts that set PF_FSTRANS.... > if (flags & KM_ZERO) > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index db2cfb067d0b..207a7f86d5d7 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -952,13 +952,6 @@ xfs_vm_writepage( > PF_MEMALLOC)) > goto redirty; > > - /* > - * Given that we do not allow direct reclaim to call us, we should > - * never be called while in a filesystem transaction. > - */ > - if (WARN_ON(current->flags & PF_FSTRANS)) > - goto redirty; We still need to ensure this rule isn't broken. If it is, the filesystem will silently deadlock in delayed allocation rather than gracefully handle the problem with a warning.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Wed Apr 16 00:47:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D52FE7F4E for ; Wed, 16 Apr 2014 00:47:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B594E30406A for ; Tue, 15 Apr 2014 22:47:52 -0700 (PDT) X-ASG-Debug-ID: 1397627270-04cbb06e9d75e50001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id JETZwWhQ8ifOHGrj (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 15 Apr 2014 22:47:51 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WaIhI-0005B8-JX; Wed, 16 Apr 2014 05:47:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C4225580893; Wed, 16 Apr 2014 01:47:47 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397627267; bh=Oubi9wejipf876hMbA0ubb9iejMwABJCc5PO1cvdw3g=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=wBKMmMg1I3b3rWzZ+/r0R2Z71gWyIKa9uZu7iZSz2tQfEa1PFWMxhkduzJ08Avft+ 1/zDatDVsAP0kViiiwaFtkl838jDZoMJL4R3L2n9w9ELQCe7Oby64XwbI46DnhyUBs wgtHRR10AqlfNZ8EUSEw5s2g0zxijlrB/vSC2Gdo= Date: Wed, 16 Apr 2014 01:47:47 -0400 From: Theodore Ts'o To: Dave Chinner Cc: Eric Sandeen , =?utf-8?B?THVrw6HFoQ==?= Czerner , Ext4 Developers List , Namjae Jeon , xfs@oss.sgi.com Subject: Re: [PATCH] ext4: add fallocate mode blocking for debugging purposes Message-ID: <20140416054747.GE21807@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] ext4: add fallocate mode blocking for debugging purposes References: <1397420518-29218-1-git-send-email-tytso@mit.edu> <20140413220016.GD8122@thunk.org> <534D5B2D.70408@redhat.com> <20140415184442.GC4456@thunk.org> <534DB38B.7030805@redhat.com> <20140415233039.GR4456@thunk.org> <20140416000634.GT15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416000634.GT15995@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397627271 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Apr 16, 2014 at 10:06:35AM +1000, Dave Chinner wrote: > > Some of the work that I've > > been doing with kvm-xfstests and why I created a github tytso/xfstests > > git tree is specifically to make sure things go much more smoothly > > this time around. > > Ted, this looks and sounds like you're preparing to fork xfstests. > Why? What's the problem with working upstream on test development > and refinement like everyone else does? I'd prefer not to fork xfstests. However, I do want to get more ext4 developers using automated xfstests testing, so I can scale better. In order to do that, I need to be able to make it really easy for people to who aren't hard-core xfstests people to be able to use it. One of the nice things about kvm-xfstests is that a *lot* easier for people to figure out how to use it. If I can lower the activation energy required to get people to use xfstests, it saves me time in the end. The reason why I created the github repository is because if I'm going to be shipping a KVM test appliance image that people can use in a turn-key environment, I'd prefer that all of the sources, including any local changes that I might need to make the tests run as smoothly as possible, are available in a public repository. (And at one point, I did have up to 12 local changes, which is why I wanted it tracked in a repo.) Every single local change I made was either a test or commit that hadn't been accepted into the upstream xfstests repository yet, or a fix I wrote that I sent upstream. And as soon as the fixes made it into the upstream xfstests repository, I rebased them away. At the moment, there's only once commit in my xfstests github repository which isn't upstream and it's the: check: add support for an external file containing tests to exclude commit for which I've sent the V2 version to you. So for the most part, I want to keep the repo as close to upstream as possible, and ideally identical to upstream, and I've been working towards that end. > This thread is a demonstration of how avoiding upstream interaction > results in nasty hacks being proposed. If you asked the question on > the xfs mailing list of how to avoid various fsstress/fsx > operations, we woul dhave told you that using FSSTRESS_AVOID and > adding an equivalent FSX_AVOID to xfstests is all that is needed. > i.e. we already have partial infrastructure support for what you > need in xfstests and it would be about 30 minutes work to add > FSX_AVOID.... > > Is that fast enough for you? > > Indeed, we could also use similar env vars to ensure various > _requires_* checks fail and to populate FSSTRESS_AVOID/FSX_AVOID > automatically and so tests that require this functionality are not > run. Well, it took me about 1 minute to write the dozen line kernel patch. I really didn't want to ask you to make changes to xfstests for me, but if you're willing to make those changes, that would be great. I really didn't want to presume, though. And if the answer is that I need to spend the time making all of these changes --- I'll try, but if I don't have time, I may end up taking the more expedient path. > IOWs, it's in your best interests to work with upstream to add the > functionality you require to xfstests. History tells us that forking > development into private repositories has never worked out well for > anyone, so I'd really, really like you to *at least try* to work > with upstream as your primary test development environment.... As I said, every single patch which I put in my local xfstests tree I also sent upstream. That being said, I wasn't sure whether you were going to accept that last change, since there was similar, but for me, not usable functionality in the form of the -X option. So if you weren't going to accept a change to allow the excluded list of tests to be kept in a single file outside of the tests/* subdirectory, I probably would have carried it as a separate patch --- because it's something I need, and the current -X functionality really isn't easy to maintain (you need to have many more files, and they have to be dropped into the xfstests tests/* subdirectory). I know that you and I haven't seen eye to eye in the past. For example, the NO_HIDE_STALE out of tree patch which is running on thousands and thousands numbers of machines inside Google, but which the XFS folks have considered evil incarnate. I will freely admit that I'm much more of a pragmatist and much less of a purist on certain matters. So sure, I'm certainly going to _try_ to work with upstream xfstests. I've done that to date. But I'm certainly not going to presume that you're going to like or accept all of the changes I might want to propose. Regards, - Ted From neilb@suse.de Wed Apr 16 00:48:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CEC3B7F55 for ; Wed, 16 Apr 2014 00:48:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66D0AAC006 for ; Tue, 15 Apr 2014 22:47:57 -0700 (PDT) X-ASG-Debug-ID: 1397627274-04bdf0455477a50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id WenAnI8J81PV2sLr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 22:47:55 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 5F5E3AC2B; Wed, 16 Apr 2014 05:47:54 +0000 (UTC) Date: Wed, 16 Apr 2014 15:47:46 +1000 From: NeilBrown To: Eric Dumazet Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, netdev@vger.kernel.org Subject: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock Message-ID: <20140416154746.7dbb4485@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock In-Reply-To: <1397625226.4222.113.camel@edumazet-glaptop2.roam.corp.google.com> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.96000.stgit@notabene.brown> <1397625226.4222.113.camel@edumazet-glaptop2.roam.corp.google.com> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/YX/W05=F6X9qrxW7nKLwnOj"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397627275 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/YX/W05=F6X9qrxW7nKLwnOj Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Tue, 15 Apr 2014 22:13:46 -0700 Eric Dumazet wrote: > On Wed, 2014-04-16 at 14:03 +1000, NeilBrown wrote: > > sk_lock can be taken while reclaiming memory (in nfsd for loop-back > > NFS mounts, and presumably in nfs), and memory can be allocated while > > holding sk_lock, at least via: > >=20 > > inet_listen -> inet_csk_listen_start ->reqsk_queue_alloc > >=20 > > So to avoid deadlocks, always set PF_FSTRANS while holding sk_lock. > >=20 > > This deadlock was found by lockdep. >=20 > Wow, this is adding expensive stuff in fast path, only for nfsd :( Yes, this was probably one part that I was least comfortable about. >=20 > BTW, why should the current->flags should be saved on a socket field, > and not a current->save_flags. This really looks a thread property, not > a socket one. >=20 > Why nfsd could not have PF_FSTRANS in its current->flags ? nfsd does have PF_FSTRANS set in current->flags. But some other processes might not. If any process takes sk_lock, allocates memory, and then blocks in reclaim = it could be waiting for nfsd. If nfsd waits for that sk_lock, it would cause a deadlock. Thinking a bit more carefully .... I suspect that any socket that nfsd created would only ever be locked by nfsd. If that is the case then the problem can be resolved entirely within nfsd. We would need to tell lockdep that there are two sorts of sk_locks, those which nfsd uses and all the rest. That might get a little messy, but wouldn't impact performance. Is it justified to assume that sockets created by nfsd threads would only ever be locked by nfsd threads (and interrupts, which won't be allocating memory so don't matter), or might there be locked by other threads - e.g for 'netstat -a' etc?? >=20 > For applications handling millions of sockets, this makes a difference. >=20 Thanks, NeilBrown --Sig_/YX/W05=F6X9qrxW7nKLwnOj Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU04Zgjnsnt1WYoG5AQKvxBAAv9gDOMnc/LfCUMBQxzIaIokErrHkCKxM 8u1W93ux2PFls2k6qTlSCVSBpO6chk1Avr9SWPyJZvTFYUnh98PiDV1tKVxJCek8 42kflXGTxHUFXkSBV1ue21mOdn7gw0R3myuMZ8zXD/JFl9sDylwuUbg28hexfWky sPEu3OCd9DiKm+2uWSe+wlFDWDHkzknRw6g0Ym5/PfuiOl6SgNcHT4w97+Jp1hkd Xs/TQSIv3aRevVoBtFdtQ90vHE2lEakCOShqyH+oH2ryYmaCsAV2nJzOcpYxZTsL FTo3Xh+NqDIWUZEsulJtN1vrkOpAIEeJgRcGxwIEauYi/+mGEFF6O+Xo2QK8Dq0c /rJrDsNvzJ0EHkaIZACsYXQRHljRPzYGmRCoSnsSnnea/Uqda9sluxPzR7Gsxc0B DqyJd00t6fTQHwWGBG/XEvf1htts4s7rFwLysfBOnK5W5Rc3rih6/ue+i4Ebptmu tzekBzYicl83hb8KXhpUD4h+PkW1UtUJsbmP5qhMK8wRqzhnsyliil8yxJDY2YTo Z+qCD7lsacI2NtAvB0hwNQmXG1rq7oYn0rF7s/1vwl+AQSEaYHELWUm6cb9cE+42 OhlnV7nle5yy/mPF93G54m+qwRDlFM8xM7PH7t9JoGdFRXDW/QMh7ma9k2HjVBH/ jxxIu5TYBIw= =PGsl -----END PGP SIGNATURE----- --Sig_/YX/W05=F6X9qrxW7nKLwnOj-- From david@fromorbit.com Wed Apr 16 00:49:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 13D3C7F4E for ; Wed, 16 Apr 2014 00:49:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF85F8F8049 for ; Tue, 15 Apr 2014 22:49:49 -0700 (PDT) X-ASG-Debug-ID: 1397627387-04bdf0455577b30001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id oortFk9al9iZPpM2 for ; Tue, 15 Apr 2014 22:49:48 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AstSAGMZTlN5LEcvPGdsb2JhbABZgwaDU4UKtguFXoEkFwMBAQEBODWCJQEBAQQnExwjEAgDGAklDwUlAwcaExuHYMYuFxaOTAeDJIEUAQOYYopniVKBUSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 15:19:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaIj8-0006tt-D2; Wed, 16 Apr 2014 15:49:42 +1000 Date: Wed, 16 Apr 2014 15:49:42 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. Message-ID: <20140416054942.GD15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.67456.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040336.10604.67456.stgit@notabene.brown> 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: 1397627387 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > lockdep reports a locking chain > > sk_lock-AF_INET --> rtnl_mutex --> pcpu_alloc_mutex > > As sk_lock may be needed to reclaim memory, allowing that > reclaim while pcu_alloc_mutex is held can lead to deadlock. > So set PF_FSTRANS while it is help to avoid the FS reclaim. > > pcpu_alloc_mutex can be taken when rtnl_mutex is held: > > [] pcpu_alloc+0x49/0x960 > [] __alloc_percpu+0xb/0x10 > [] loopback_dev_init+0x17/0x60 > [] register_netdevice+0xec/0x550 > [] register_netdev+0x15/0x30 > > Signed-off-by: NeilBrown This looks like a workaround to avoid passing a gfp mask around to describe the context in which the allocation is taking place. Whether or not that's the right solution, I can't say, but spreading this "we can turn off all reclaim of filesystem objects" mechanism all around the kernel doesn't sit well with me... And, again, PF_FSTRANS looks plainly wrong in this code - it sure isn't a fs transaction context we are worried about here... -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 00:52:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D214B7F58 for ; Wed, 16 Apr 2014 00:52:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5CF2304077 for ; Tue, 15 Apr 2014 22:52:40 -0700 (PDT) X-ASG-Debug-ID: 1397627557-04cb6c2436754a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id XtplvLST19mHBqDI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 22:52:38 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9CB26AC2B; Wed, 16 Apr 2014 05:52:37 +0000 (UTC) Date: Wed, 16 Apr 2014 15:52:30 +1000 From: NeilBrown To: Al Viro Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. Message-ID: <20140416155230.4d02e4b9@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. In-Reply-To: <20140416044618.GX18016@ZenIV.linux.org.uk> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.86740.stgit@notabene.brown> <20140416044618.GX18016@ZenIV.linux.org.uk> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/AHIx/=TRorm595oyDqzGVg8"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397627558 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/AHIx/=TRorm595oyDqzGVg8 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 05:46:18 +0100 Al Viro wrote: > On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > > namespace_sem can be taken while various i_mutex locks are held, so we > > need to avoid reclaim from blocking on an FS (particularly loop-back > > NFS). >=20 > I would really prefer to deal with that differently - by explicit change = of > gfp_t arguments of allocators. >=20 > The thing is, namespace_sem is held *only* over allocations, and not a lot > of them, at that - only mnt_alloc_id(), mnt_alloc_group_id(), alloc_vfsmn= t() > and new_mountpoint(). That is all that is allowed. >=20 > Again, actual work with filesystems (setup, shutdown, remount, pathname > resolution, etc.) is all done outside of namespace_sem; it's held only > for manipulations of fs/{namespace,pnode}.c data structures and the only > reason it isn't a spinlock is that we need to do some allocations. >=20 > So I'd rather slap GFP_NOFS on those few allocations... So something like this? I put that in to my testing instead. Thanks, NeilBrown diff --git a/fs/namespace.c b/fs/namespace.c index 83dcd5083dbb..8e103b8c8323 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -103,7 +103,7 @@ static int mnt_alloc_id(struct mount *mnt) int res; =20 retry: - ida_pre_get(&mnt_id_ida, GFP_KERNEL); + ida_pre_get(&mnt_id_ida, GFP_NOFS); spin_lock(&mnt_id_lock); res =3D ida_get_new_above(&mnt_id_ida, mnt_id_start, &mnt->mnt_id); if (!res) @@ -134,7 +134,7 @@ static int mnt_alloc_group_id(struct mount *mnt) { int res; =20 - if (!ida_pre_get(&mnt_group_ida, GFP_KERNEL)) + if (!ida_pre_get(&mnt_group_ida, GFP_NOFS)) return -ENOMEM; =20 res =3D ida_get_new_above(&mnt_group_ida, @@ -193,7 +193,7 @@ unsigned int mnt_get_count(struct mount *mnt) =20 static struct mount *alloc_vfsmnt(const char *name) { - struct mount *mnt =3D kmem_cache_zalloc(mnt_cache, GFP_KERNEL); + struct mount *mnt =3D kmem_cache_zalloc(mnt_cache, GFP_NOFS); if (mnt) { int err; =20 @@ -202,7 +202,7 @@ static struct mount *alloc_vfsmnt(const char *name) goto out_free_cache; =20 if (name) { - mnt->mnt_devname =3D kstrdup(name, GFP_KERNEL); + mnt->mnt_devname =3D kstrdup(name, GFP_NOFS); if (!mnt->mnt_devname) goto out_free_id; } @@ -682,7 +682,7 @@ static struct mountpoint *new_mountpoint(struct dentry = *dentry) } } =20 - mp =3D kmalloc(sizeof(struct mountpoint), GFP_KERNEL); + mp =3D kmalloc(sizeof(struct mountpoint), GFP_NOFS); if (!mp) return ERR_PTR(-ENOMEM); =20 --Sig_/AHIx/=TRorm595oyDqzGVg8 Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU04anjnsnt1WYoG5AQIhrg/8CkSLV3X4c4pMegKcWjixLvjggV9C0nmD Ki7J2WYAcQLErKW3y+NMuIGWo5ZHNizwEeaSIFbqdzSiMzebtGI5lreK3Vgm6Kom yxHsQgu528mbaZj1W29ifjwd6qyaDjmx8hgIEkBZOz1/SrRJ0QiphaQS5/VaZF4j 25qwbmPyTA92q75q7eOdy+n4y/hpZj6gPAAwjKOmLPFw7YnG1hajhUKReU7z86X1 cLCX/9ppr+KM8sHpBQfNkzIdC7+PXsHSy38R+ZRLlsdNYuIIxKHJBu1M5EsZejI4 uPAhNgws4bQohRmPQ0wDzjoiYPeYvPOM1lgln3w3JQuQ9H5/4Nr0EMRBx+BZuIAs iUNjLNSxh7I+5Xb+kTH5ea7O75mhmDg6h0KnsFIyL7585/ve872HwTeWnjqhkaRk B/gSXw7j6a6CUjGhk8Vpl6aKEgdyieoG0oxIU6xgkUzIjh7V54N+qRNbijGEIrXX XwExDi31ptdiBoX8OYTpL5dtKIpJFI3+M9brUs/OHEiMTGxP+gBBoZjygvqQnooD /UBY2sdOBQaDS843VQnYUlIhv4XpmwNGZrp7P+lgsTZmgnL39Mt2hfTC3iGvvw4o /9lAjXcUCg19a0llfGfqMWXNWEHH8Bjo5OovO4DpN7wWccy6GhXI6U+yd0WNI4k5 Rte0ii4ppow= =vIwc -----END PGP SIGNATURE----- --Sig_/AHIx/=TRorm595oyDqzGVg8-- From david@fromorbit.com Wed Apr 16 01:05:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E397E7F54 for ; Wed, 16 Apr 2014 01:05:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F1E4AC003 for ; Tue, 15 Apr 2014 23:05:07 -0700 (PDT) X-ASG-Debug-ID: 1397628301-04cb6c243675af0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tKAaJeQ8STYRANox for ; Tue, 15 Apr 2014 23:05: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: AsxSAKscTlN5LEcvPGdsb2JhbABagwaDU4UKtgyFXoEkFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3QHxj0XFo5MB4MkgRQEmGKKZ4lSgVEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 15:35:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaIxv-0006wR-Nw; Wed, 16 Apr 2014 16:04:59 +1000 Date: Wed, 16 Apr 2014 16:04:59 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. Message-ID: <20140416060459.GE15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.90380.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040336.10604.90380.stgit@notabene.brown> 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: 1397628301 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > xfs_file_*_read holds an inode lock while calling a generic 'read' > function. These functions perform read-ahead and are quite likely to > allocate memory. Yes, that's what reading data from disk requires. > So set PF_FSTRANS to ensure they avoid __GFP_FS and so don't recurse > into a filesystem to free memory. We already have that protection via the > > This can be a problem with loop-back NFS mounts, if free_pages ends up > wating in nfs_release_page(), and nfsd is blocked waiting for the lock > that this code holds. > > This was found both by lockdep and as a real deadlock during testing. > > Signed-off-by: NeilBrown > --- > fs/xfs/xfs_file.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 64b48eade91d..88b33ef64668 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -243,6 +243,7 @@ xfs_file_aio_read( > ssize_t ret = 0; > int ioflags = 0; > xfs_fsize_t n; > + unsigned int pflags; > > XFS_STATS_INC(xs_read_calls); > > @@ -290,6 +291,10 @@ xfs_file_aio_read( > * proceeed concurrently without serialisation. > */ > xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); > + /* As we hold a lock, we must ensure that any allocation > + * in generic_file_aio_read avoid __GFP_FS > + */ > + current_set_flags_nested(&pflags, PF_FSTRANS); Ugh. No. This is Simply Wrong. We handle the memory allocations in the IO path with GFP_NOFS/KM_NOFS where necessary. We also do this when setting up regular file inodes in xfs_setup_inode(): /* * Ensure all page cache allocations are done from GFP_NOFS context to * prevent direct reclaim recursion back into the filesystem and blowing * stacks or deadlocking. */ gfp_mask = mapping_gfp_mask(inode->i_mapping); mapping_set_gfp_mask(inode->i_mapping, (gfp_mask & ~(__GFP_FS))); Which handles all of the mapping allocations that occur within the page cache read/write paths. Remember, you removed the KM_NOFS code from the XFS allocator that caused it to clear __GFP_FS in an earlier patch - the read Io path is one of the things you broke by doing that.... If there are places where we don't use GFP_NOFS context allocations that we should, then we need to fix them individually.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 01:17:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D2A2B7F37 for ; Wed, 16 Apr 2014 01:17:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D65E304071 for ; Tue, 15 Apr 2014 23:17:37 -0700 (PDT) X-ASG-Debug-ID: 1397629055-04bdf04554787a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id blGgjLdvAvBJlWpV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 23:17:36 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8807AAC2B; Wed, 16 Apr 2014 06:17:34 +0000 (UTC) Date: Wed, 16 Apr 2014 16:17:26 +1000 From: NeilBrown To: Dave Chinner Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ming Lei , xfs@oss.sgi.com Subject: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. Message-ID: <20140416161726.51b506e2@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. In-Reply-To: <20140416053756.GC15995@dastard> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.58240.stgit@notabene.brown> <20140416053756.GC15995@dastard> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/Oo0=qxWoYRMUFxVoAOmvLbc"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397629055 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/Oo0=qxWoYRMUFxVoAOmvLbc Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 15:37:56 +1000 Dave Chinner wrote: > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > Currently both xfs and nfs will handle PF_FSTRANS by disabling > > __GFP_FS. > >=20 > > Make this effect global by repurposing memalloc_noio_flags (which > > does the same thing for PF_MEMALLOC_NOIO and __GFP_IO) to generally > > impost the task flags on a gfp_t. > > Due to this repurposing we change the name of memalloc_noio_flags > > to gfp_from_current(). > >=20 > > As PF_FSTRANS now uniformly removes __GFP_FS we can remove special > > code for this from xfs and nfs. > >=20 > > As we can now expect other code to set PF_FSTRANS, its meaning is more > > general, so the WARN_ON in xfs_vm_writepage() which checks PF_FSTRANS > > is not set is no longer appropriate. PF_FSTRANS may be set for other > > reasons than an XFS transaction. >=20 > So PF_FSTRANS no longer means "filesystem in transaction context". > Are you going to rename to match whatever it's meaning is now? > I'm not exactly clear on what it means now... I did consider renaming it to "PF_MEMALLOC_NOFS" as it is similar to "PF_MEMALLOC_NOIO", except that it disables __GFP_FS rather than __GFP_IO. Maybe I should go ahead with that. >=20 >=20 > > As lockdep cares about __GFP_FS, we need to translate PF_FSTRANS to > > __GFP_FS before calling lockdep_alloc_trace() in various places. > >=20 > > Signed-off-by: NeilBrown > .... > > diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h > > index 64db0e53edea..882b86270ebe 100644 > > --- a/fs/xfs/kmem.h > > +++ b/fs/xfs/kmem.h > > @@ -50,8 +50,6 @@ kmem_flags_convert(xfs_km_flags_t flags) > > lflags =3D GFP_ATOMIC | __GFP_NOWARN; > > } else { > > lflags =3D GFP_KERNEL | __GFP_NOWARN; > > - if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) > > - lflags &=3D ~__GFP_FS; > > } >=20 > I think KM_NOFS needs to remain here, as it has use outside of > transaction contexts that set PF_FSTRANS.... Argh, yes of course. I'll have to re-test the other xfs changes now to see if they are really needed. Thanks! >=20 > > if (flags & KM_ZERO) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > > index db2cfb067d0b..207a7f86d5d7 100644 > > --- a/fs/xfs/xfs_aops.c > > +++ b/fs/xfs/xfs_aops.c > > @@ -952,13 +952,6 @@ xfs_vm_writepage( > > PF_MEMALLOC)) > > goto redirty; > > =20 > > - /* > > - * Given that we do not allow direct reclaim to call us, we should > > - * never be called while in a filesystem transaction. > > - */ > > - if (WARN_ON(current->flags & PF_FSTRANS)) > > - goto redirty; >=20 > We still need to ensure this rule isn't broken. If it is, the > filesystem will silently deadlock in delayed allocation rather than > gracefully handle the problem with a warning.... Hmm... that might be tricky. The 'new' PF_FSTRANS can definitely be set wh= en xfs_vm_writepage is called and we really want the write to happen. I don't suppose there is any other way to detect if a transaction is happening? Thanks, NeilBrown --Sig_/Oo0=qxWoYRMUFxVoAOmvLbc Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU04gdjnsnt1WYoG5AQJjow//evh86FCU/MZNvwJIfgaA7CJS8ZBO2vac JkRsYYSmmSyFY4gWC9gDQfRJD01TaQRR55toAqxbZg8L1HbbL5i4ZBEpJQVYel8Y pdI2N75oZ6GCufLuivZ0hw6TGotfcwtGQFXjewpcpBDrx2Dr0+yxhObkKAh8W1ae f5dvKrZ0sYAaEGYj+XHzPb6STEYspdmnflzOOzRXLsCWOeM/uKEt9Cv0l12TXvyr kBYoY3HBMnKCBsvJPakCGZB+eSyR9PKLL5t846/ZL0Pfwic8OdCU6nBTncGbf2w/ TCWWLxF2trF2f1aMx9TZef+IulH2KdZm5s1HALZ/edGnto8Wz2wgMGNpoj95rhT1 3n5Qn7+P+B491bBGNVbbw2ObPl+aB1k5FgDwy++M7wSBUVjqqGaGAjqEXcgQJ9RV zBM6mMZyICqnSqy/3h5ACDK9xmCcb/lVXscSMFuGlEIcqiz9ehnmZWWJrsWjvLa7 gOpO51fbFepKaA6MbhGlyOiOLH3XOpwuGQcsvpxCgT6vRs8C2yRutFbtbtVliaPQ I+g/hpkMJEqUvsRu/Dk44ndA3U64gnQuoFzgcYxZoFdCbzq/xP7w5LH7MbNeSSvH SvgiEpGCVhHsOfP8Z1pt01kCsnONRkMTQP8KxGDycDLnKAEC1YPvWCFB0Za5acJ6 YVnpDRofW5g= =0rPl -----END PGP SIGNATURE----- --Sig_/Oo0=qxWoYRMUFxVoAOmvLbc-- From david@fromorbit.com Wed Apr 16 01:18:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 056C67F37 for ; Wed, 16 Apr 2014 01:18:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C5A718F8039 for ; Tue, 15 Apr 2014 23:18:38 -0700 (PDT) X-ASG-Debug-ID: 1397629115-04bdf0455278800001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id LE1ExLfccMlWi5LA for ; Tue, 15 Apr 2014 23:18:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AspSADAgTlN5LEcvPGdsb2JhbABagwaDU4UKtgyFXoEkFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTHoddxkIXFo5MB4MkgRQBA5hiimeLIys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 15:48:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaJAq-0006yY-34; Wed, 16 Apr 2014 16:18:20 +1000 Date: Wed, 16 Apr 2014 16:18:20 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/19] XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks Message-ID: <20140416061819.GF15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/19] XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.7488.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040337.10604.7488.stgit@notabene.brown> 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: 1397629115 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > memory allocates can happen while the xfs ilock is held in > xfs_free_eofblocks, particularly > > [] kmem_zone_alloc+0x67/0xc0 > [] xfs_trans_add_item+0x25/0x50 > [] xfs_trans_ijoin+0x2c/0x60 > [] xfs_itruncate_extents+0xbe/0x400 > [] xfs_free_eofblocks+0x1c4/0x240 > > So set PF_FSTRANS to avoid this causing a deadlock. Another "You broke KM_NOFS" moment. You win a Kit Kat. ;) xfs_trans_add_item(): lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); KM_NOFS needs to work, otherwise XFS is just a huge steaming pile of memory reclaim deadlocks regardless of whether you are using loopback NFS or not. Cheers, Dave. -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 01:22:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B88D7F63 for ; Wed, 16 Apr 2014 01:22:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38DD78F8039 for ; Tue, 15 Apr 2014 23:22:12 -0700 (PDT) X-ASG-Debug-ID: 1397629330-04cbb06e9b76d80001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id bYVsUrq0Txm95hsh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 23:22:11 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 526D1AC2B; Wed, 16 Apr 2014 06:22:10 +0000 (UTC) Date: Wed, 16 Apr 2014 16:22:01 +1000 From: NeilBrown To: Dave Chinner Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. Message-ID: <20140416162201.5dc9ff5c@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. In-Reply-To: <20140416054942.GD15995@dastard> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.67456.stgit@notabene.brown> <20140416054942.GD15995@dastard> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/TpJzKIhGobsDEwUger9I.iQ"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397629331 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/TpJzKIhGobsDEwUger9I.iQ Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 15:49:42 +1000 Dave Chinner wrote: > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > lockdep reports a locking chain > >=20 > > sk_lock-AF_INET --> rtnl_mutex --> pcpu_alloc_mutex > >=20 > > As sk_lock may be needed to reclaim memory, allowing that > > reclaim while pcu_alloc_mutex is held can lead to deadlock. > > So set PF_FSTRANS while it is help to avoid the FS reclaim. > >=20 > > pcpu_alloc_mutex can be taken when rtnl_mutex is held: > >=20 > > [] pcpu_alloc+0x49/0x960 > > [] __alloc_percpu+0xb/0x10 > > [] loopback_dev_init+0x17/0x60 > > [] register_netdevice+0xec/0x550 > > [] register_netdev+0x15/0x30 > >=20 > > Signed-off-by: NeilBrown >=20 > This looks like a workaround to avoid passing a gfp mask around to > describe the context in which the allocation is taking place. > Whether or not that's the right solution, I can't say, but spreading > this "we can turn off all reclaim of filesystem objects" mechanism > all around the kernel doesn't sit well with me... We are (effectively) passing a gfp mask around, except that it lives in 'current' rather than lots of other places. I actually like the idea of discarding PF_MEMALLOC, PF_FSTRANS and PF_MEMALLOC_NOIO, and just having current->gfp_allowed_mask (to match the global variable of the same name). >=20 > And, again, PF_FSTRANS looks plainly wrong in this code - it sure > isn't a fs transaction context we are worried about here... So would PF_MEMALLOC_NOFS work for you? NeilBrown --Sig_/TpJzKIhGobsDEwUger9I.iQ Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU04hijnsnt1WYoG5AQKhaw//Yc1D4fJSwJa8YNO+4NafUYk50u9cMoRi WQjcopF1cKZmSifPbH/r5M3SKqOKf4kQklPb1pccCc6Nw2oPCD98rrpu2dePn6NM 9FaxI6xOkkT0z7VpDjeP4VA1C7ekhxqqDGOLi1ezu0aWmqu4sBsHxGAojmA8y7IX A+VHECsFBgrz4sjLqfV0U/jml9sfGNoutZVzftRHpZJXCn1+vzMHKKp+6TdlriUZ anJHOj+URUenE6hv6/4JDkSAb0F0awvjyjXvblLMzvLWagF9KpGwMPP94fxOp+kI si2uP7CtQkhACfBPxhmuUXXB2k0Ueb20GIzguqGMp9Qj+mToGqcyBqmaBaP4NxKr x+jKgmq5l7OfJO2ERlBD+j/AnKKGZXeGyxh7ed2DhYR03nc2f6Lx6sMKzXlUrOc6 a5GzSslT1EA/fmEPJ/D1oyoVnSXuPYGGC91DuDzV4SP13w6xdQoqMsShs+RxIKUr dRsfkuuDw3Euef4VE6y0G7Ird/kmS1pvLN/A4ZqRVmpgKAHD8wPJiPKd6TqgAUfX tq4usUTitBM1NRqHxagj+/MksyqC1sNZv0F8xlsicqM0/ygslKSUq6vpJlVLjk68 43QZbKAAQIkXaZ/yxOvYKPrUOUejOQGUbrjIuISGcu8M78KKxaIXSxCnLlYwsomj YJ9hOBTRuiE= =Ofmb -----END PGP SIGNATURE----- --Sig_/TpJzKIhGobsDEwUger9I.iQ-- From david@fromorbit.com Wed Apr 16 01:25:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 56FC67F5E for ; Wed, 16 Apr 2014 01:25:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA077AC001 for ; Tue, 15 Apr 2014 23:25:23 -0700 (PDT) X-ASG-Debug-ID: 1397629521-04bdf0455478ac0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 3O29evQlmPHYApkf for ; Tue, 15 Apr 2014 23:25:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AslSAFkhTlN5LEcvPGdsb2JhbABZgwaDU4UKtgyFXoEdFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3vGQxcWjkwHhDgBA5hiimeLIys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 15:55:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaJHc-0006zf-LS; Wed, 16 Apr 2014 16:25:20 +1000 Date: Wed, 16 Apr 2014 16:25:20 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Message-ID: <20140416062520.GG15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.61837.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040337.10604.61837.stgit@notabene.brown> 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: 1397629521 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > __d_alloc can be called with i_mutex held, so it is safer to > use GFP_NOFS. > > lockdep reports this can deadlock when loop-back NFS is in use, > as nfsd may be required to write out for reclaim, and nfsd certainly > takes i_mutex. But not the same i_mutex as is currently held. To me, this seems like a false positive? If you are holding the i_mutex on an inode, then you have a reference to the inode and hence memory reclaim won't ever take the i_mutex on that inode. FWIW, this sort of false positive was a long stabding problem for XFS - we managed to get rid of most of the false positives like this by ensuring that only the ilock is taken within memory reclaim and memory reclaim can't be entered while we hold the ilock. You can't do that with the i_mutex, though.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 01:27:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2DAA77F5E for ; Wed, 16 Apr 2014 01:27:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE07230407B for ; Tue, 15 Apr 2014 23:27:55 -0700 (PDT) X-ASG-Debug-ID: 1397629673-04bdf0455278c20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id FSzFSgHli71TeXT3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 23:27:54 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id D7764AC2B; Wed, 16 Apr 2014 06:27:52 +0000 (UTC) Date: Wed, 16 Apr 2014 16:27:45 +1000 From: NeilBrown To: Dave Chinner Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. Message-ID: <20140416162745.67442b07@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. In-Reply-To: <20140416060459.GE15995@dastard> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.90380.stgit@notabene.brown> <20140416060459.GE15995@dastard> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/MvhSwDVhkQM3eTbru=iHpwX"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397629673 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/MvhSwDVhkQM3eTbru=iHpwX Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 16:04:59 +1000 Dave Chinner wrote: > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > xfs_file_*_read holds an inode lock while calling a generic 'read' > > function. These functions perform read-ahead and are quite likely to > > allocate memory. >=20 > Yes, that's what reading data from disk requires. >=20 > > So set PF_FSTRANS to ensure they avoid __GFP_FS and so don't recurse > > into a filesystem to free memory. >=20 > We already have that protection via the > >=20 > > This can be a problem with loop-back NFS mounts, if free_pages ends up > > wating in nfs_release_page(), and nfsd is blocked waiting for the lock > > that this code holds. > >=20 > > This was found both by lockdep and as a real deadlock during testing. > >=20 > > Signed-off-by: NeilBrown > > --- > > fs/xfs/xfs_file.c | 12 ++++++++++++ > > 1 file changed, 12 insertions(+) > >=20 > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > index 64b48eade91d..88b33ef64668 100644 > > --- a/fs/xfs/xfs_file.c > > +++ b/fs/xfs/xfs_file.c > > @@ -243,6 +243,7 @@ xfs_file_aio_read( > > ssize_t ret =3D 0; > > int ioflags =3D 0; > > xfs_fsize_t n; > > + unsigned int pflags; > > =20 > > XFS_STATS_INC(xs_read_calls); > > =20 > > @@ -290,6 +291,10 @@ xfs_file_aio_read( > > * proceeed concurrently without serialisation. > > */ > > xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); > > + /* As we hold a lock, we must ensure that any allocation > > + * in generic_file_aio_read avoid __GFP_FS > > + */ > > + current_set_flags_nested(&pflags, PF_FSTRANS); >=20 > Ugh. No. This is Simply Wrong. >=20 > We handle the memory allocations in the IO path with > GFP_NOFS/KM_NOFS where necessary. >=20 > We also do this when setting up regular file inodes in > xfs_setup_inode(): >=20 > /* > * Ensure all page cache allocations are done from GFP_NOFS conte= xt to > * prevent direct reclaim recursion back into the filesystem and = blowing > * stacks or deadlocking. > */ > gfp_mask =3D mapping_gfp_mask(inode->i_mapping); > mapping_set_gfp_mask(inode->i_mapping, (gfp_mask & ~(__GFP_FS))); >=20 > Which handles all of the mapping allocations that occur within the > page cache read/write paths. >=20 > Remember, you removed the KM_NOFS code from the XFS allocator that > caused it to clear __GFP_FS in an earlier patch - the read Io path > is one of the things you broke by doing that.... >=20 > If there are places where we don't use GFP_NOFS context allocations > that we should, then we need to fix them individually.... >=20 > Cheers, >=20 > Dave. Thanks Dave. Having fixed the KM_NOFS error I'll start retesting with all the other xfs patches removed. NeilBrown --Sig_/MvhSwDVhkQM3eTbru=iHpwX Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU04i4Tnsnt1WYoG5AQLIng//dBc4GkVWQndYfJfRIYKQW2/Qp2VQNTrH QwogU8BASNXT5qpc1XzaQYOxkK09+w+6QiWjUGdtmxeca4vNynxYEVsVosaUPzPY 0YgVm+0k4xBCGRhZZ8y5YWqizoYR2chAlE6gIIzFaNRCHajzP8Xet09XxNTR9tYi EcxV88isRZ8zKGmXnu5emZxq+XdZmf3yjD9YsRlidhny2AnIs5bcjhDad87njled knLHfb2oDGwZqvjE6giqHoCRwUodRXHzPQ3yKG9YMuzvp6/DKe5Zp4R4byUcwWNk mngvZ9K82T1D8o6Q7t6GsiwszXF0VIhl4eP2Og4hlhPWd777WR/fCFqumJqrFCEW UyrRvTUoY2zr8b9SRIEXKaK5BslTkoaQxTBodLmb2x/BtnpyTWXmF8ProhEEgTcl rbS42PSuxrrjCvoxcM/PTeUeErwb4m16laziroWfx4WblVrtcKB1Zjvnt03N/zRf 2sE9WOqxtP4nZmOiQaLyMeto7QOwUWTS1BcpzUQ1/bqh18u91odzQqFA5dozTg6a 5kX2sujAyBb++B0ixYhBkjAaSTE6KgShEsCit+VcefOEYm3nHvOM4a7A+dIrlaes PN6E0STK5yi+ZOgKIQpU0uh1JNLOR0Rmu2/6/Hrizpt6OUGpMrtKAfnxRgpPg2Ha l67YsKqaHVI= =Ny7o -----END PGP SIGNATURE----- --Sig_/MvhSwDVhkQM3eTbru=iHpwX-- From david@fromorbit.com Wed Apr 16 01:30:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B0B3B7F5E for ; Wed, 16 Apr 2014 01:30:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 255BCAC001 for ; Tue, 15 Apr 2014 23:30:41 -0700 (PDT) X-ASG-Debug-ID: 1397629839-04cb6c2437767e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ZEK090ZFFOCIBoDB for ; Tue, 15 Apr 2014 23:30:39 -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: AsxSALMiTlN5LEcvPGdsb2JhbABYgwaDU4UKtgyFXoEcFwMBAQEBODWCJQEBAQMBJxMcIxAIAxgJJQ8FJQMHGhMbh1kHxWEXFo5MB4Q4BJhiimeJUoFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 16:00:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaJMk-00070N-6f; Wed, 16 Apr 2014 16:30:38 +1000 Date: Wed, 16 Apr 2014 16:30:38 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. Message-ID: <20140416063038.GH15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 13/19] MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.67456.stgit@notabene.brown> <20140416054942.GD15995@dastard> <20140416162201.5dc9ff5c@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416162201.5dc9ff5c@notabene.brown> 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: 1397629839 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 04:22:01PM +1000, NeilBrown wrote: > On Wed, 16 Apr 2014 15:49:42 +1000 Dave Chinner wrote: > > > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > > lockdep reports a locking chain > > > > > > sk_lock-AF_INET --> rtnl_mutex --> pcpu_alloc_mutex > > > > > > As sk_lock may be needed to reclaim memory, allowing that > > > reclaim while pcu_alloc_mutex is held can lead to deadlock. > > > So set PF_FSTRANS while it is help to avoid the FS reclaim. > > > > > > pcpu_alloc_mutex can be taken when rtnl_mutex is held: > > > > > > [] pcpu_alloc+0x49/0x960 > > > [] __alloc_percpu+0xb/0x10 > > > [] loopback_dev_init+0x17/0x60 > > > [] register_netdevice+0xec/0x550 > > > [] register_netdev+0x15/0x30 > > > > > > Signed-off-by: NeilBrown > > > > This looks like a workaround to avoid passing a gfp mask around to > > describe the context in which the allocation is taking place. > > Whether or not that's the right solution, I can't say, but spreading > > this "we can turn off all reclaim of filesystem objects" mechanism > > all around the kernel doesn't sit well with me... > > We are (effectively) passing a gfp mask around, except that it lives in > 'current' rather than lots of other places. > I actually like the idea of discarding PF_MEMALLOC, PF_FSTRANS and > PF_MEMALLOC_NOIO, and just having current->gfp_allowed_mask (to match the > global variable of the same name). Given that we've had problems getting gfp flags propagated into the VM code (vmalloc, I'm looking at you!) making the current task carry the valid memory allocation and reclaim context mask woul dbe a good idea. That's effectively the problem PF_MEMALLOC_NOIO is working around, and we've recently added it to XFS to silence all the lockdep warnings using vm_map_ram in GFP_NOFS contexts have been causing us.... > > And, again, PF_FSTRANS looks plainly wrong in this code - it sure > > isn't a fs transaction context we are worried about here... > > So would PF_MEMALLOC_NOFS work for you? Better than PF_FSTRANS, that's for sure ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 01:31:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EEA237F60 for ; Wed, 16 Apr 2014 01:31:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72EDFAC001 for ; Tue, 15 Apr 2014 23:31:32 -0700 (PDT) X-ASG-Debug-ID: 1397629890-04cbb06e9b77180001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id PX8a1iBBSTT4mHiv for ; Tue, 15 Apr 2014 23:31:30 -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: AslSALMiTlN5LEcvPGdsb2JhbABYgwaDU4UKtgyFXoEcFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3vFYRcWjkwHhDgBA5hiimeJUoFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 16:01:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaJNZ-00070Y-7q; Wed, 16 Apr 2014 16:31:29 +1000 Date: Wed, 16 Apr 2014 16:31:29 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. Message-ID: <20140416063129.GI15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 09/19] XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.90380.stgit@notabene.brown> <20140416060459.GE15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416060459.GE15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397629890 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 04:04:59PM +1000, Dave Chinner wrote: > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > xfs_file_*_read holds an inode lock while calling a generic 'read' > > function. These functions perform read-ahead and are quite likely to > > allocate memory. > > Yes, that's what reading data from disk requires. > > > So set PF_FSTRANS to ensure they avoid __GFP_FS and so don't recurse > > into a filesystem to free memory. > > We already have that protection via the Oops, stray paste. Ignore that comment. -Dave. -- Dave Chinner david@fromorbit.com From BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 16 01:36:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 37A097F6B for ; Wed, 16 Apr 2014 01:36:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1140130404E for ; Tue, 15 Apr 2014 23:36:30 -0700 (PDT) X-ASG-Debug-ID: 1397630188-04bdf04554790d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id RMzBkWVQtELj0LK3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 23:36:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaJSE-0004VB-0z; Wed, 16 Apr 2014 06:36:18 +0000 Date: Tue, 15 Apr 2014 23:36:18 -0700 From: Christoph Hellwig To: Lukas Czerner Cc: Michael Kerrisk , linux-man@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 0/6][RFC] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate Message-ID: <20140416063618.GA12498@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/6][RFC] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate References: <1392649703-10772-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1392649703-10772-1-git-send-email-lczerner@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397630188 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 17, 2014 at 04:08:17PM +0100, Lukas Czerner wrote: > Introduce new FALLOC_FL_ZERO_RANGE flag for fallocate. This has the same > functionality as xfs ioctl XFS_IOC_ZERO_RANGE. Lukas, can you please also send a man page update for FALLOC_FL_ZERO_RANGE now that is has been merged? > > It can be used to convert a range of file to zeros preferably without > issuing data IO. Blocks should be preallocated for the regions that span > holes in the file, and the entire range is preferable converted to > unwritten extents - even though file system may choose to zero out the > extent or do whatever which will result in reading zeros from the range > while the range remains allocated for the file. > > This can be also used to preallocate blocks past EOF in the same way as > with fallocate. Flag FALLOC_FL_KEEP_SIZE which should cause the inode > size to remain the same. > > You can test this feature yourself using xfstests, of fallocate(1) however > you'll need patches for util_linux, xfsprogs and xfstests which you > can find here: > > http://people.redhat.com/lczerner/zero_range/ From david@fromorbit.com Wed Apr 16 01:40:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 17E307F3F for ; Wed, 16 Apr 2014 01:40:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D26F2304071 for ; Tue, 15 Apr 2014 23:40:21 -0700 (PDT) X-ASG-Debug-ID: 1397630419-04bdf04553795c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0ATlTk4SO6FpKCOC for ; Tue, 15 Apr 2014 23:40:19 -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: AspSAOEkTlN5LEcvPGdsb2JhbABaDoJ4g1OFCrYMhV6BHBcDAQEBATg1giUBAQEEOhwjEAgDGAklDwUlAwcaE4d7xgAXFo5MB4Q4BJR2g2yUOX9SKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 16:10:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaJW6-00072E-90; Wed, 16 Apr 2014 16:40:18 +1000 Date: Wed, 16 Apr 2014 16:40:18 +1000 From: Dave Chinner To: Theodore Ts'o Cc: xfs@oss.sgi.com, Ext4 Developers List Subject: Re: [PATCH -v2] check: add support for an external file containing tests to exclude Message-ID: <20140416064018.GJ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH -v2] check: add support for an external file containing tests to exclude References: <20140416001530.GU15995@dastard> <1397624302-9577-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397624302-9577-1-git-send-email-tytso@mit.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: 1397630419 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 12:58:22AM -0400, Theodore Ts'o wrote: > Currently the -X option is intended to specify a set of expunging > files which are stored in each test/* subdirectory. As described in > the commit description for 0b1e8abd4, in order to exclude the test > generic/280, the -X option is used as follows: > > $ cat tests/generic/3.0-stable-avoid > 280 > $ sudo ./check -X 3.0-stable-avoid generic/280 > > However, it is sometimes useful to store the set of expunged tests in > a single file, outside of tests/* subdirectories. This commit enables > the following: > > $ cat /root/conf/data_journal.exclude > generic/068 > ext4/301 > $ sudo ./check -E /root/conf/data_journal.exclude -g auto > > Signed-off-by: "Theodore Ts'o" > --- > check | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/check b/check > index e7ace63..b1eaed2 100755 > --- a/check > +++ b/check > @@ -81,6 +81,7 @@ testlist options > -g group[,group...] include tests from these groups > -x group[,group...] exclude tests from these groups > -X file exclude individual tests > + -E external_file exclude individual tests > [testlist] include tests matching names in testlist > ' > exit 0 > @@ -222,6 +223,11 @@ while [ $# -gt 0 ]; do > done > done > ;; > + -E) xfile=$2; shift ; > + if [ -f $xfile ]; then > + cat "$xfile" >> $tmp.xlist > + fi > + ;; > -s) RUN_SECTION="$RUN_SECTION $2"; shift ;; > -l) diff="diff" ;; > -udiff) diff="$diff -u" ;; Looks good. Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 01:49:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D05587F75 for ; Wed, 16 Apr 2014 01:49:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ADCE98F8052 for ; Tue, 15 Apr 2014 23:49:51 -0700 (PDT) X-ASG-Debug-ID: 1397630989-04cbb06e9d77cb0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TQEQT6wP1ou1dYxl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 15 Apr 2014 23:49:50 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 3691AAC2B; Wed, 16 Apr 2014 06:49:49 +0000 (UTC) Date: Wed, 16 Apr 2014 16:49:41 +1000 From: NeilBrown To: Dave Chinner Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Message-ID: <20140416164941.37587da6@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. In-Reply-To: <20140416062520.GG15995@dastard> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.61837.stgit@notabene.brown> <20140416062520.GG15995@dastard> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/EPq.7eSTqOBYBZMF/T4NZ0K"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397630989 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4962 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/EPq.7eSTqOBYBZMF/T4NZ0K Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 16:25:20 +1000 Dave Chinner wrote: > On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > > __d_alloc can be called with i_mutex held, so it is safer to > > use GFP_NOFS. > >=20 > > lockdep reports this can deadlock when loop-back NFS is in use, > > as nfsd may be required to write out for reclaim, and nfsd certainly > > takes i_mutex. >=20 > But not the same i_mutex as is currently held. To me, this seems > like a false positive? If you are holding the i_mutex on an inode, > then you have a reference to the inode and hence memory reclaim > won't ever take the i_mutex on that inode. >=20 > FWIW, this sort of false positive was a long stabding problem for > XFS - we managed to get rid of most of the false positives like this > by ensuring that only the ilock is taken within memory reclaim and > memory reclaim can't be entered while we hold the ilock. >=20 > You can't do that with the i_mutex, though.... >=20 > Cheers, >=20 > Dave. I'm not sure this is a false positive. You can call __d_alloc when creating a file and so are holding i_mutex on t= he directory. nfsd might also want to access that directory. If there was only 1 nfsd thread, it would need to get i_mutex and do it's thing before replying to that request and so before it could handle the COMMIT which __d_alloc is waiting for. Obviously we would normally have multiple nfsd threads but if they were all blocked on an i_mutex which itself was blocked on nfs_release_page which was waiting for an nfsd thread to handling its COMMIT request, this could be a real deadlock. Thanks, NeilBrown --Sig_/EPq.7eSTqOBYBZMF/T4NZ0K Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU04oBTnsnt1WYoG5AQIv2A/+JHPHOXvvSEvBvND3/I/bvU7038Xt9P09 ROQ9m01KrCbUdCBztnzYFBBQRHb+TGX7/oqNbgR5xz5xQp5udSIOGfW50DvPsmRj evA2RwwB24XWG4TpZcfAnZXNXNGmjNXYzKcSrrD3Jr1hh54BnYkSmvxk1rjZb77V lPAtmazM12wyG3OTAP9iKMeNohqzKmL8ZAF3NXBtA7VvAx3Q/bW5Ouk3NDO9sMjP fP9rvVgZqGBGraTBp/j7hAliuwMdR47OvUvtmlj2Yu8BLwWdmK4uLcgCtiASvhox IOCQQ/mKw8d0c/vC1kl759kwgXuK87rRQ136xBpcgogBd7g8ER9Z+WmfBHUVndg6 9HjduCoAju0ruvnfHD3Ky4GcMEPPmbwe7nV7LMY8VkLTDjUBLLnoBROdgsbLL2bj at1fyaeJxQ/lRt3FzQ3ep0n4n366FM1kyHs84J3EiRMImrxAedb/wdZmDN7rQi0s g4ubAThts0zmUrYsTO+beqxVGNYqmnUdJVWMBX513HBGZ6kZ+sjFIpD2sBkCRIgK 98bXu9ZEz2ZqAACq42uYdNvEIgPrcog80+yLZJQ7GJaPHsdfOWEMrAJPrO5iaSQH vUbfbjwe722ZicSNlEgw5b5ZWMGb9ssZVeP28fJt0i8k5XNBa13+svkK+6ITOoJz FZOwEWIhv2A= =6+ZP -----END PGP SIGNATURE----- --Sig_/EPq.7eSTqOBYBZMF/T4NZ0K-- From peterz@infradead.org Wed Apr 16 02:22:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 38D717F58 for ; Wed, 16 Apr 2014 02:22:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 086658F8054 for ; Wed, 16 Apr 2014 00:22:08 -0700 (PDT) X-ASG-Debug-ID: 1397632925-04bdf045557aa00001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id pHsVKYRTtXnTCr6G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 00:22:06 -0700 (PDT) X-Barracuda-Envelope-From: peterz@infradead.org X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from dhcp-077-248-225-117.chello.nl ([77.248.225.117] helo=laptop) by merlin.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaKAW-00029f-4p; Wed, 16 Apr 2014 07:22:04 +0000 Received: by laptop (Postfix, from userid 1000) id 1E0021088671F; Wed, 16 Apr 2014 09:22:02 +0200 (CEST) Date: Wed, 16 Apr 2014 09:22:02 +0200 From: Peter Zijlstra To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ingo Molnar , xfs@oss.sgi.com Subject: Re: [PATCH 03/19] lockdep: improve scenario messages for RECLAIM_FS errors. Message-ID: <20140416072202.GM26782@laptop.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: [PATCH 03/19] lockdep: improve scenario messages for RECLAIM_FS errors. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.19304.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040336.10604.19304.stgit@notabene.brown> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1397632926 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4962 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > lockdep can check for locking problems involving reclaim using > the same infrastructure as used for interrupts. > > However a number of the messages still refer to interrupts even > if it was actually a reclaim-related problem. > > So determine where the problem was caused by reclaim or irq and adjust > messages accordingly. > > Signed-off-by: NeilBrown > --- > kernel/locking/lockdep.c | 43 ++++++++++++++++++++++++++++++++----------- > 1 file changed, 32 insertions(+), 11 deletions(-) > > diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c > index e05b82e92373..33d2ac7519dc 100644 > --- a/kernel/locking/lockdep.c > +++ b/kernel/locking/lockdep.c > @@ -1423,7 +1423,8 @@ static void > print_irq_lock_scenario(struct lock_list *safe_entry, > struct lock_list *unsafe_entry, > struct lock_class *prev_class, > - struct lock_class *next_class) > + struct lock_class *next_class, > + int reclaim) I would rather we just pass enum lock_usage_bit along from the callsites. > { > struct lock_class *safe_class = safe_entry->class; > struct lock_class *unsafe_class = unsafe_entry->class; > @@ -1487,6 +1495,8 @@ print_bad_irq_dependency(struct task_struct *curr, > enum lock_usage_bit bit2, > const char *irqclass) > { > + int reclaim = strncmp(irqclass, "RECLAIM", 7) == 0; > + irqclass := state_name(bit2), so instead of relying on the unreliable, why not use the lock_usage_bit ? > if (!debug_locks_off_graph_unlock() || debug_locks_silent) > return 0; > > @@ -1528,7 +1538,7 @@ print_bad_irq_dependency(struct task_struct *curr, > > printk("\nother info that might help us debug this:\n\n"); > print_irq_lock_scenario(backwards_entry, forwards_entry, > - hlock_class(prev), hlock_class(next)); > + hlock_class(prev), hlock_class(next), reclaim); So that would become bit2. > > lockdep_print_held_locks(curr); > > @@ -2200,7 +2210,7 @@ static void check_chain_key(struct task_struct *curr) > } > > static void > -print_usage_bug_scenario(struct held_lock *lock) > +print_usage_bug_scenario(struct held_lock *lock, enum lock_usage_bit new_bit) Like you did here. > { > struct lock_class *class = hlock_class(lock); > > @@ -2210,7 +2220,11 @@ print_usage_bug_scenario(struct held_lock *lock) > printk(" lock("); > __print_lock_name(class); > printk(");\n"); > - printk(" \n"); > + if (new_bit == LOCK_USED_IN_RECLAIM_FS || > + new_bit == LOCK_USED_IN_RECLAIM_FS_READ) And if we're going to do this all over, we might want a helper for this condition. > + printk(" \n"); > + else > + printk(" \n"); > printk(" lock("); > __print_lock_name(class); > printk(");\n"); Same for the rest I think.. From peterz@infradead.org Wed Apr 16 02:28:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 66CFF7F76 for ; Wed, 16 Apr 2014 02:28:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3DA468F8052 for ; Wed, 16 Apr 2014 00:28:07 -0700 (PDT) X-ASG-Debug-ID: 1397633285-04cbb06e9a78f50001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id 6zEZ32RW80Ljvkn3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 00:28:06 -0700 (PDT) X-Barracuda-Envelope-From: peterz@infradead.org X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from dhcp-077-248-225-117.chello.nl ([77.248.225.117] helo=laptop) by merlin.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaKGK-0002DL-Ip; Wed, 16 Apr 2014 07:28:04 +0000 Received: by laptop (Postfix, from userid 1000) id 45DCD1088671F; Wed, 16 Apr 2014 09:28:03 +0200 (CEST) Date: Wed, 16 Apr 2014 09:28:03 +0200 From: Peter Zijlstra To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Ingo Molnar Subject: Re: [PATCH 06/19] nfsd: set PF_FSTRANS for nfsd threads. Message-ID: <20140416072803.GN26782@laptop.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: [PATCH 06/19] nfsd: set PF_FSTRANS for nfsd threads. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.60493.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416040336.10604.60493.stgit@notabene.brown> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1397633286 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4962 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > If a localhost mount is present, then it is easy to deadlock NFS by > nfsd entering direct reclaim and calling nfs_release_page() which > requires nfsd to perform an fsync() (which it cannot do because it is > reclaiming memory). > > By setting PF_FSTRANS we stop the memory allocator from ever > attempting any FS operation would could deadlock. > > We need this flag set for any thread which is handling a request from > the local host, but we also need to always have it for at least 1 or 2 > threads so that we don't end up with all threads blocked in allocation. > > When we set PF_FSTRANS we also tell lockdep that we are handling > reclaim so that it can detect deadlocks for us. > > Signed-off-by: NeilBrown > --- > fs/nfsd/nfssvc.c | 18 ++++++++++++++++++ > include/linux/sunrpc/svc.h | 1 + > net/sunrpc/svc.c | 6 ++++++ > 3 files changed, 25 insertions(+) > > diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c > index 9a4a5f9e7468..6af8bc2daf7d 100644 > --- a/fs/nfsd/nfssvc.c > +++ b/fs/nfsd/nfssvc.c > @@ -565,6 +565,8 @@ nfsd(void *vrqstp) > struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list); > struct net *net = perm_sock->xpt_net; > int err; > + unsigned int pflags = 0; > + gfp_t reclaim_state = 0; > > /* Lock module and set up kernel thread */ > mutex_lock(&nfsd_mutex); > @@ -611,14 +613,30 @@ nfsd(void *vrqstp) > ; > if (err == -EINTR) > break; > + if (rqstp->rq_local && !current_test_flags(PF_FSTRANS)) { > + current_set_flags_nested(&pflags, PF_FSTRANS); > + atomic_inc(&rqstp->rq_pool->sp_nr_fstrans); > + reclaim_state = lockdep_set_current_reclaim_state(GFP_KERNEL); > + } > validate_process_creds(); > svc_process(rqstp); > validate_process_creds(); > + if (current_test_flags(PF_FSTRANS) && > + atomic_dec_if_positive(&rqstp->rq_pool->sp_nr_fstrans) >= 0) { Yuck, that function has horrible semantics :/ Not your fault though. > + current_restore_flags_nested(&pflags, PF_FSTRANS); > + lockdep_restore_current_reclaim_state(reclaim_state); > + } Not really knowing much about NFS anymore (all I did know seems to have bitrotten) the above looks ok I suppose. Refcounting that task state in something !task_struct feels weird though. > } > > /* Clear signals before calling svc_exit_thread() */ > flush_signals(current); > > + if (current_test_flags(PF_FSTRANS)) { > + current_restore_flags_nested(&pflags, PF_FSTRANS); > + lockdep_restore_current_reclaim_state(reclaim_state); > + atomic_dec(&rqstp->rq_pool->sp_nr_fstrans); > + } > + > mutex_lock(&nfsd_mutex); > nfsdstats.th_cnt --; > > diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h > index a0dbbd1e00e9..4b274aba51dd 100644 > --- a/include/linux/sunrpc/svc.h > +++ b/include/linux/sunrpc/svc.h > @@ -48,6 +48,7 @@ struct svc_pool { > struct list_head sp_threads; /* idle server threads */ > struct list_head sp_sockets; /* pending sockets */ > unsigned int sp_nrthreads; /* # of threads in pool */ > + atomic_t sp_nr_fstrans; /* # threads with PF_FSTRANS */ > struct list_head sp_all_threads; /* all server threads */ > struct svc_pool_stats sp_stats; /* statistics on pool operation */ > int sp_task_pending;/* has pending task */ > diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c > index 5de6801cd924..8b13f35b6cbb 100644 > --- a/net/sunrpc/svc.c > +++ b/net/sunrpc/svc.c > @@ -477,6 +477,12 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools, > INIT_LIST_HEAD(&pool->sp_threads); > INIT_LIST_HEAD(&pool->sp_sockets); > INIT_LIST_HEAD(&pool->sp_all_threads); > + /* The number of threads with PF_FSTRANS set > + * should never be reduced below 2, except when > + * threads exit. So we use atomic_dec_if_positive() > + * on this value. > + */ > + atomic_set(&pool->sp_nr_fstrans, -2); Its not my code, but that's not the recommended multi-line comment style. > spin_lock_init(&pool->sp_lock); > } > > > From johannes.truschnigg@geizhals.at Wed Apr 16 03:21:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 27A037F75 for ; Wed, 16 Apr 2014 03:21:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AF910AC003 for ; Wed, 16 Apr 2014 01:21:51 -0700 (PDT) X-ASG-Debug-ID: 1397636507-04cb6c24377a000001-NocioJ Received: from morework.geizhals.at (morework.geizhals.at [78.142.138.3]) by cuda.sgi.com with ESMTP id TXilJxo6V7ZnOiSM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 01:21:48 -0700 (PDT) X-Barracuda-Envelope-From: johannes.truschnigg@geizhals.at X-Barracuda-Apparent-Source-IP: 78.142.138.3 Received: from localhost (localhost [127.0.0.1]) by morework.geizhals.at (Postfix) with ESMTP id 878381248382; Wed, 16 Apr 2014 10:21:47 +0200 (CEST) X-Virus-Scanned: amavisd-new at geizhals.at Received: from morework.geizhals.at ([127.0.0.1]) by localhost (morework.geizhals.at [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ObdPoZf9p8h7; Wed, 16 Apr 2014 10:21:45 +0200 (CEST) Received: from [10.0.0.137] (unknown [10.0.0.137]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: jt) by morework.geizhals.at (Postfix) with ESMTPSA id 54FD3124837F; Wed, 16 Apr 2014 10:21:45 +0200 (CEST) Message-ID: <534E3D98.3000600@geizhals.at> Date: Wed, 16 Apr 2014 10:21:44 +0200 From: Johannes Truschnigg User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131103 Icedove/17.0.10 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md References: <534D24AB.1050605@geizhals.at> <20140415213408.GL15995@dastard> X-ASG-Orig-Subj: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md In-Reply-To: <20140415213408.GL15995@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: morework.geizhals.at[78.142.138.3] X-Barracuda-Start-Time: 1397636507 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On 04/15/2014 11:34 PM, Dave Chinner wrote: > On Tue, Apr 15, 2014 at 02:23:07PM +0200, Johannes Truschnigg wrote: >> Hi list, >> [...] >> o Intel C606-based Dual 4-Port SATA/SAS HBA (PCIID 8086:1d68) > > How much write cache does this have? It's a plain HBA; it doesn't have write cache (or a BBU) of its own. >> o 6x Samsung 830 SSD with 512GB each, 25% reserved for HPA > > 830? That's the previous generation of drives - do you mean 840? No, I really mean 830 - we've tested 840 EVO as well, and they performed quite well, too, however from what I've seen on the web the longevity of Samsung's TLC flash choice in 840 disks isn't as promising as those of the 830s MLC variant. We might be switching over to 840 EVO or one of their successors once the 830s wear out, or we need to expand capacity, but we do have a number of 830s in stock that we'll use first. >> When benchmarking the individual SSDs with fio (using the libaio >> backend), the IOPS we've seen were in the 30k-35k range overall for >> 4K block sizes. > > They don't sustain that performance over 20+ minutes of constant IO, > though. Even if you have 840s (I have 840 EVOs in my test rig), the > sustained performance of 4k random write IOPS is somewhere around > 4-6k each. See, for example, the performance consistency graphs here: > > http://www.anandtech.com/show/7173/samsung-ssd-840-evo-review-120gb-250gb-500gb-750gb-1tb-models-tested/6 > > Especially the last one that shows a zoomed view of the steady state > behaviour between 1400s and 2000s of constant load. I used tkperf[0] to benchmark the devices, both on Intel's SAS HBA and on a LSI 2108 SAS RAID-Controller. I did runs for the 512GB 830 with 25% over-provisioning, and runs for 1TB 840 EVO with 0% op and 25% op (two different disks with the same firmware). tkperf tries hard to achieve steady state by torturing the devices for a few hours before the actual benchmarking takes place, and will only do so after that steady state has been reached. From what I've seen, the over-provisioning is absolutely crucial to get anywhere near acceptable performance; since Anandtech doesn't seem to use it, I'll trust my tests more. For reference: the 750GB usable-space EVO clocked in at ~35k 4k IOPS on the LSI 2108, whilst the 1000GB usable-space sister disk still hasn't finished the benchmark run, because it's _so much slower_. The benchmark was started about ten days ago for both disks; the 750GB disk finished after some 2 or 3 days, and I'm _still_ waiting for the 1000GB disk to finish benchmarking. Only then I'll be able to look at the pretty graphs and tables tkperf generates, but when tailing the log and watching iostat, I can already draw some early conclusions as to how these two configurations perform, and they're not in the same ballpark at all. > The 830 series are old enough that they were reviewed before this > was considered an important metric for SSD comparison, and so there > is no equivalent information available for them. However, they are > likely to be significantly slower and less deterministic in their > behaviour than the 840s under the same load... Afaik, 840 EVO's relatively high peak performance stems from the DRAM buffer these disks supposedly have built in, while the 830 lacks that kind of trick. Given that the EVO's performance drops after that buffer has worked its magic, I'd actually expect the 830 to perform _more consistent_ (not necessarily better, even on average, though) than the 840 EVO. We'll see if that holds true if/when we put 840 EVOs into service, I guess. >> The host will be on the receiving end of a pg9.0 >> streaming replication cluster setup where the master handles ~50k >> IOPS peak, and I'm thinking what'd be a good approach to design the >> local storage stack (with availability in mind) in a way that has a >> chance to keep up with our flash-based FC SAN. > > I'd be surprised if it can keep up after a couple of months of > production level IO going to the SSDs... Yeah, that remains to be seen, and it'll be very interesting - if anyone's interested, I'll be happy to share our learnings from this project once we have enough data worth talking about. Remember, the numbers I posted are _peak_ load at the master though, most of the time, we don't exceed 10k IOPS, and some of the time, the system is practically idle. That might give the SSD controllers enough time to work their garbage collection secret sauce magic, and sustain high(er) performance over most of their lifetimes. >> After digging through linux-raid archives, I think the most sensible >> approach are two-disk pairs in RAID1 that are concatenated via >> either LVM2 or md (leaning towards the latter, since I'd expect that >> to have a tad less overhead), > > I'd stripe them (i.e. RAID10), not concantenate them so as to load > both RAID1 legs evenly. Afaik, the problem with md is that each array (I'm pretty convinced that also holds true for RAID10, but I'm not 100% sure) only has one associated kernel thread for writes, which should make that kind of setup worse, at least in theory and in terms of achiveable parallelism, than the setup I described. I'd be very happy to see a comparison between the two setups for high-IOPS devices, but I haven't yet found one anywhere. > [...] >> I've experimented with mkfs.xfs (on top of LVM only; I don't know if >> it takes into account lower block layers and seen that it supposedly >> chooses to default to an agcount of 4, which seems insufficient >> given the max. bandwidth our setup should be able to provide. > > The number of AGs has no bearing on acheivable bandwidth. The number > of AGs affects allocation concurrency. Hence if you have 24 CPU > cores, I'd expect that you want 32 AGs. Normally with a RAID array > this will be the default, but it seems that RAID1 is not triggering > the "optimise for allocation concurrency" heuristics in mkfs.... Thanks, that is a very useful heads-up! What's the formula used to get to 32 AGs for 24 CPUs - just (num_cpus * 4/3), and is there a simple explanation for why this is an ideal starting point? And is that an advisable rule of thumb for xfs in general? >> Apart from that, is there any kind of advice you can share for >> tuning xfs to run postgres (9.0 initially, but we're planning to >> upgrade to 9.3 or later eventually) on in 2014, especially >> performance-wise? > > Apart from the AG count and perhaps tuning the sunit/swidth to match > the RAID0 part of the equation, I wouldn't touch a thing unless you > know that there's a problem that needs fixing and you know exactly > what knob will fix the problem you have... OK, I'll read up on stripe width impact and will (hopefully) have enough time to test a number of configs that should make sense. Many thanks for your contribution and advice! :) [0]: http://www.thomas-krenn.com/en/oss/tkperf.html -- Mit freundlichen Grüßen Johannes Truschnigg Senior System Administrator -- mailto:johannes.truschnigg@geizhals.at (in dringenden Fällen bitte an info@geizhals.at) Geizhals(R) - Preisvergleich Internet Services AG Obere Donaustrasse 63/2 A-1020 Wien Tel: +43 1 5811609/87 Fax: +43 1 5811609/55 http://geizhals.at => Preisvergleich für Österreich http://geizhals.de => Preisvergleich für Deutschland http://geizhals.eu => Preisvergleich EU-weit Handelsgericht Wien | FN 197241K | Firmensitz Wien From lczerner@redhat.com Wed Apr 16 03:29:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A73957F3F for ; Wed, 16 Apr 2014 03:29:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 776588F8049 for ; Wed, 16 Apr 2014 01:29:50 -0700 (PDT) X-ASG-Debug-ID: 1397636989-04bdf045527c6c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id R3zonrb6TARRmXiF for ; Wed, 16 Apr 2014 01:29: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-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 s3G8Tl8e028550 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 16 Apr 2014 04:29:47 -0400 Received: from vpn1-7-198.ams2.redhat.com (vpn1-7-198.ams2.redhat.com [10.36.7.198]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3G8Tii8025180 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 16 Apr 2014 04:29:46 -0400 Date: Wed, 16 Apr 2014 10:29:43 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file In-Reply-To: <20140415220220.GR15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Message-ID: References: <1397580076-19826-1-git-send-email-lczerner@redhat.com> <1397580076-19826-2-git-send-email-lczerner@redhat.com> <20140415220220.GR15995@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397636989 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 16 Apr 2014, Dave Chinner wrote: > Date: Wed, 16 Apr 2014 08:02:20 +1000 > From: Dave Chinner > To: Lukas Czerner > Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 2/3 v2] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append > only file > > On Tue, Apr 15, 2014 at 06:41:15PM +0200, Lukas Czerner wrote: > > Currently punch hole and collapse range fallocate operation are not > > allowed on append only file. This should be case for zero range as well. > > Fix it by allowing only pure fallocate (possibly with keep size set). > > > > Signed-off-by: Lukas Czerner > > --- > > v2: Change the condition to be future proof as suggested by hch > > > > fs/open.c | 6 ++---- > > 1 file changed, 2 insertions(+), 4 deletions(-) > > > > diff --git a/fs/open.c b/fs/open.c > > index 631aea81..fe48b2f 100644 > > --- a/fs/open.c > > +++ b/fs/open.c > > @@ -254,11 +254,9 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) > > return -EBADF; > > > > /* > > - * It's not possible to punch hole or perform collapse range > > - * on append only file > > + * We can only allow pure fallocate on append only files > > */ > > - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) > > - && IS_APPEND(inode)) > > + if (mode & ~FALLOC_FL_KEEP_SIZE && IS_APPEND(inode)) > > if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode)) > > gcc normally complains when you mix & and && in the same logic > statement without () to separate the logic. I agree with gcc here, > because the () indicate the intent of the logic and make it easy to > determine that the & and && haven't been mixed up or fat-fingered... Yeah, I was thinking about this and then left it to operator precedence. But having () in there is fine as well. -Lukas > > Cheers, > > Dave. > From david@fromorbit.com Wed Apr 16 04:00:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F5807F5E for ; Wed, 16 Apr 2014 04:00:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EDAF8F8039 for ; Wed, 16 Apr 2014 02:00:56 -0700 (PDT) X-ASG-Debug-ID: 1397638853-04cbb06e9c7b770001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id MemxOQvd0zAZ5094 for ; Wed, 16 Apr 2014 02:00:54 -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: AiRyAPJFTlN5LEcvPGdsb2JhbABZgwaDU4UKoiqTW4VggR4XAwEBAQE4NYIlAQEBBCcTHCMQCAMYCSUPBSUDBxoTh3vHIBcWjkwHhDgEmGWKaYskKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 18:30:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaLi7-0007M0-A2; Wed, 16 Apr 2014 19:00:51 +1000 Date: Wed, 16 Apr 2014 19:00:51 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Message-ID: <20140416090051.GK15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.61837.stgit@notabene.brown> <20140416062520.GG15995@dastard> <20140416164941.37587da6@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416164941.37587da6@notabene.brown> 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: 1397638853 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4964 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 04:49:41PM +1000, NeilBrown wrote: > On Wed, 16 Apr 2014 16:25:20 +1000 Dave Chinner wrote: > > > On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > > > __d_alloc can be called with i_mutex held, so it is safer to > > > use GFP_NOFS. > > > > > > lockdep reports this can deadlock when loop-back NFS is in use, > > > as nfsd may be required to write out for reclaim, and nfsd certainly > > > takes i_mutex. > > > > But not the same i_mutex as is currently held. To me, this seems > > like a false positive? If you are holding the i_mutex on an inode, > > then you have a reference to the inode and hence memory reclaim > > won't ever take the i_mutex on that inode. > > > > FWIW, this sort of false positive was a long stabding problem for > > XFS - we managed to get rid of most of the false positives like this > > by ensuring that only the ilock is taken within memory reclaim and > > memory reclaim can't be entered while we hold the ilock. > > > > You can't do that with the i_mutex, though.... > > > > Cheers, > > > > Dave. > > I'm not sure this is a false positive. > You can call __d_alloc when creating a file and so are holding i_mutex on the > directory. > nfsd might also want to access that directory. > > If there was only 1 nfsd thread, it would need to get i_mutex and do it's > thing before replying to that request and so before it could handle the > COMMIT which __d_alloc is waiting for. That seems wrong - the NFS client in __d_alloc holds a mutex on a NFS client directory inode. The NFS server can't access that specific mutex - it's on the other side of the "network". The NFS server accesses mutexs from local filesystems, so __d_alloc would have to be blocked on a local filesystem inode i_mutex for the nfsd to get hung up behind it... However, my confusion comes from the fact that we do GFP_KERNEL memory allocation with the i_mutex held all over the place. If the problem is: local fs access -> i_mutex ..... nfsd -> i_mutex (blocked) ..... local fs access -> kmalloc(GFP_KERNEL) -> direct reclaim -> nfs_release_page -> then why is it just __d_alloc that needs this fix? Either this is a problem *everywhere* or it's not a problem at all. If it's a problem everywhere it means that we simply can't allow reclaim from localhost NFS mounts to run from contexts that could block an NFSD. i.e. you cannot run NFS client memory reclaim from filesystems that are NFS server exported filesystems..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 04:31:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5AEC17F5E for ; Wed, 16 Apr 2014 04:31:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0CCF9AC002 for ; Wed, 16 Apr 2014 02:31:23 -0700 (PDT) X-ASG-Debug-ID: 1397640681-04bdf045557e030001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JkkuFaAnxtjLQFLO for ; Wed, 16 Apr 2014 02:31:21 -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: AulbACJNTlN5LEcvPGdsb2JhbAA/GoMGO4MYpy8Gk1uFYIEfFwMBAQEBODWCJQEBAQMBOhwjBQsIAxgJDBkPBSUDBxoTh3QHDjbHBBaOTAcKhC4EmGWBOJRVK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Apr 2014 19:01:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaMBO-0007Qf-CP; Wed, 16 Apr 2014 19:31:06 +1000 Date: Wed, 16 Apr 2014 19:31:06 +1000 From: Dave Chinner To: Johannes Truschnigg Cc: xfs@oss.sgi.com Subject: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md Message-ID: <20140416093106.GL15995@dastard> X-ASG-Orig-Subj: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md References: <534D24AB.1050605@geizhals.at> <20140415213408.GL15995@dastard> <534E3D98.3000600@geizhals.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534E3D98.3000600@geizhals.at> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1397640681 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4964 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Apr 16, 2014 at 10:21:44AM +0200, Johannes Truschnigg wrote: > Hi Dave, > > On 04/15/2014 11:34 PM, Dave Chinner wrote: > >On Tue, Apr 15, 2014 at 02:23:07PM +0200, Johannes Truschnigg wrote: > >>Hi list, > >>[...] > >>o Intel C606-based Dual 4-Port SATA/SAS HBA (PCIID 8086:1d68) > > > >How much write cache does this have? > > It's a plain HBA; it doesn't have write cache (or a BBU) of its own. Ok, so nothing to isolate nasty bad IO patterns from the drives, or to soak up write peaks. IOWs, what the drives give you is all you're going to get. You might want to think about dropping $1000 on a good quality LSI SAS RAID HBA and putting the disks behind that... > >>o 6x Samsung 830 SSD with 512GB each, 25% reserved for HPA > > > >830? That's the previous generation of drives - do you mean 840? > > No, I really mean 830 - we've tested 840 EVO as well, and they > performed quite well, too, however from what I've seen on the web > the longevity of Samsung's TLC flash choice in 840 disks isn't as > promising as those of the 830s MLC variant. We might be switching > over to 840 EVO or one of their successors once the 830s wear out, > or we need to expand capacity, but we do have a number of 830s in > stock that we'll use first. What I've read is "there's really no difference". Yes, there are less write/erase cycles for the 21nm TLC compared to the 27nm MLC in the 830s, but the controller in the 840 is far better at handling wear levelling. > >>When benchmarking the individual SSDs with fio (using the libaio > >>backend), the IOPS we've seen were in the 30k-35k range overall for > >>4K block sizes. > > > >They don't sustain that performance over 20+ minutes of constant IO, > >though. Even if you have 840s (I have 840 EVOs in my test rig), the > >sustained performance of 4k random write IOPS is somewhere around > >4-6k each. See, for example, the performance consistency graphs here: > > > >http://www.anandtech.com/show/7173/samsung-ssd-840-evo-review-120gb-250gb-500gb-750gb-1tb-models-tested/6 > > > >Especially the last one that shows a zoomed view of the steady state > >behaviour between 1400s and 2000s of constant load. > > I used tkperf[0] to benchmark the devices, both on Intel's SAS HBA > and on a LSI 2108 SAS RAID-Controller. I did runs for the 512GB 830 > with 25% over-provisioning, and runs for 1TB 840 EVO with 0% op and > 25% op (two different disks with the same firmware). tkperf tries > hard to achieve steady state by torturing the devices for a few > hours before the actual benchmarking takes place, and will only do > so after that steady state has been reached. > > From what I've seen, the over-provisioning is absolutely crucial to > get anywhere near acceptable performance; since Anandtech doesn't > seem to use it, I'll trust my tests more. Oh, they do, just not in every SSD review they do: http://anandtech.com/show/7864/crucial-m550-review-128gb-256gb-512gb-and-1tb-models-tested/3 Unfortunately, there aren't 25% spare area numbers for the 840EVO... > For reference: the 750GB usable-space EVO clocked in at ~35k 4k IOPS > on the LSI 2108, whilst the 1000GB usable-space sister disk still > hasn't finished the benchmark run, because it's _so much slower_. Yes, apart from validation effort, that's the main difference between consumer and enterprise SSDs; enterprise SSDs usually run 20-25% over provisioned space but are otherwise mostly identical hardware and firmware to the consumer drives. That's why you get 200, 400 and 800GB enterprise drives rather than 250, 500, and 1TB capacities... > >>After digging through linux-raid archives, I think the most sensible > >>approach are two-disk pairs in RAID1 that are concatenated via > >>either LVM2 or md (leaning towards the latter, since I'd expect that > >>to have a tad less overhead), > > > >I'd stripe them (i.e. RAID10), not concantenate them so as to load > >both RAID1 legs evenly. > > Afaik, the problem with md is that each array (I'm pretty convinced > that also holds true for RAID10, but I'm not 100% sure) only has one > associated kernel thread for writes, I think it used to have a single thread for parity calculations, which is not used for raid 0/1/10, so I don't think that's true anymore. There were patches to multithread the parity calculations, no idea what the status of that work ended being... > which should make that kind of > setup worse, at least in theory and in terms of achiveable > parallelism, than the setup I described. I'd be very happy to see a > comparison between the two setups for high-IOPS devices, but I > haven't yet found one anywhere. I don't think it makes any difference at all. I have both LVM and MD RAID 0 SSD stripes, and neither MD nor DM are the performance limiting factor, nor do they show up anywhere in profiles. > > [...] > >>I've experimented with mkfs.xfs (on top of LVM only; I don't know if > >>it takes into account lower block layers and seen that it supposedly > >>chooses to default to an agcount of 4, which seems insufficient > >>given the max. bandwidth our setup should be able to provide. > > > >The number of AGs has no bearing on acheivable bandwidth. The number > >of AGs affects allocation concurrency. Hence if you have 24 CPU > >cores, I'd expect that you want 32 AGs. Normally with a RAID array > >this will be the default, but it seems that RAID1 is not triggering > >the "optimise for allocation concurrency" heuristics in mkfs.... > > Thanks, that is a very useful heads-up! What's the formula used to > get to 32 AGs for 24 CPUs - just (num_cpus * 4/3), and is there a > simple explanation for why this is an ideal starting point? And is > that an advisable rule of thumb for xfs in general? Simple explanation: 32 is the default for RAID5/6 based devices between 1-32TB in size. General rule of thumb: http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E > >>Apart from that, is there any kind of advice you can share for > >>tuning xfs to run postgres (9.0 initially, but we're planning to > >>upgrade to 9.3 or later eventually) on in 2014, especially > >>performance-wise? > > > >Apart from the AG count and perhaps tuning the sunit/swidth to match > >the RAID0 part of the equation, I wouldn't touch a thing unless you > >know that there's a problem that needs fixing and you know exactly > >what knob will fix the problem you have... > > OK, I'll read up on stripe width impact and will (hopefully) have > enough time to test a number of configs that should make sense. http://xfs.org/index.php/XFS_FAQ#Q:_How_to_calculate_the_correct_sunit.2Cswidth_values_for_optimal_performance Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Wed Apr 16 05:43:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B5D997F5A for ; Wed, 16 Apr 2014 05:43:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 546C8AC003 for ; Wed, 16 Apr 2014 03:43:42 -0700 (PDT) X-ASG-Debug-ID: 1397645020-04cb6c24397dcb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CdjBE1bgmHuVmSen for ; Wed, 16 Apr 2014 03:43:41 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3GAhF62006194 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 16 Apr 2014 06:43:16 -0400 Received: from vpn1-4-17.ams2.redhat.com (vpn1-4-17.ams2.redhat.com [10.36.4.17]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3GAhAiB027799 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 16 Apr 2014 06:43:13 -0400 Date: Wed, 16 Apr 2014 12:43:09 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: Michael Kerrisk , linux-man@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 0/6][RFC] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate In-Reply-To: <20140416063618.GA12498@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/6][RFC] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate Message-ID: References: <1392649703-10772-1-git-send-email-lczerner@redhat.com> <20140416063618.GA12498@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397645021 X-Barracuda-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, 15 Apr 2014, Christoph Hellwig wrote: > Date: Tue, 15 Apr 2014 23:36:18 -0700 > From: Christoph Hellwig > To: Lukas Czerner > Cc: Michael Kerrisk , linux-man@vger.kernel.org, > linux-ext4@vger.kernel.org, tytso@mit.edu, linux-fsdevel@vger.kernel.org, > xfs@oss.sgi.com > Subject: Re: [PATCH 0/6][RFC] Introduce FALLOC_FL_ZERO_RANGE flag for > fallocate > > On Mon, Feb 17, 2014 at 04:08:17PM +0100, Lukas Czerner wrote: > > Introduce new FALLOC_FL_ZERO_RANGE flag for fallocate. This has the same > > functionality as xfs ioctl XFS_IOC_ZERO_RANGE. > > Lukas, can you please also send a man page update for > FALLOC_FL_ZERO_RANGE now that is has been merged? Right, I'll do that. Thanks! -Lukas > > > > > It can be used to convert a range of file to zeros preferably without > > issuing data IO. Blocks should be preallocated for the regions that span > > holes in the file, and the entire range is preferable converted to > > unwritten extents - even though file system may choose to zero out the > > extent or do whatever which will result in reading zeros from the range > > while the range remains allocated for the file. > > > > This can be also used to preallocate blocks past EOF in the same way as > > with fallocate. Flag FALLOC_FL_KEEP_SIZE which should cause the inode > > size to remain the same. > > > > You can test this feature yourself using xfstests, of fallocate(1) however > > you'll need patches for util_linux, xfsprogs and xfstests which you > > can find here: > > > > http://people.redhat.com/lczerner/zero_range/ > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From service77@hlrichl.com Wed Apr 16 05:59:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=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: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 200A07F58 for ; Wed, 16 Apr 2014 05:59:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0243AC005 for ; Wed, 16 Apr 2014 03:59:41 -0700 (PDT) X-ASG-Debug-ID: 1397645974-04cb6c24397e430001-NocioJ Received: from mail.hlrichl.com (hlrichl.com [23.244.68.65]) by cuda.sgi.com with ESMTP id JuHAizMSEgCskMCM for ; Wed, 16 Apr 2014 03:59:35 -0700 (PDT) X-Barracuda-Envelope-From: service77@hlrichl.com X-Barracuda-Apparent-Source-IP: 23.244.68.65 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.hlrichl.com 42D2D14907C61 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=hlrichl.com; s=hlrichl; t=1397645974; bh=ddsPIMVoHqY7DkwKM1efi2T1PnKRJzKu0mab8DrSyx4=; h=Reply-To:Message-ID:From:To:Subject:Date:MIME-Version: Content-Type; b=iofFZuYHAG8aFRhdLyDCrPWnB/T+4mU8nmBkm2SVfaIGuoqllExNN5cZzd/7RpHJx 0M78uFOHekhhAmN3K3TMzydO1W5/IIKex9Pr0ZK4DrVbnm+MdmfEWVlmZ+TIdml/Wx iVf0aQGdugCho8GxEISK8NHGw1B8xluGlO68LsGE= Reply-To: Message-ID: <41F429E97C601BBD698A707C628AE638@wptlz> From: "Alex" To: Subject: Fashion lady bag (Newest item) Date: Wed, 16 Apr 2014 18:59:17 +0800 X-ASG-Orig-Subj: Fashion lady bag (Newest item) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0540_01C1B4DB.1908A1E0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Barracuda-Connect: hlrichl.com[23.244.68.65] X-Barracuda-Start-Time: 1397645974 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_0540_01C1B4DB.1908A1E0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBGcmllbmRzLA0KV2FybSByZWdhcmRzIQ0KV2UgYXJlIHByb2Zlc3Npb25hbCBtYW51ZmFj dHVyZXIgbG9jYXRlZCBpbiBTaGlsaW5nIEd1YW5nemhvdSwgdGhlIGJhZyBhbmQgY2FzZSBtYW51 ZmFjdHVyZSBjZW50ZXIgb2YgQ2hpbmEuDQpPdXIgZmFjdG9yeSBtYWtlcyBkaWZmZXJlbnQga2lu ZHMgb2YgaGlnaCBxdWFsaXR5IFBVIGFuZCBsZWF0aGVyIGhhbmRiYWdzLCBzaG91bGRlciBiYWdz IGFuZCBiYWNrcGFja3Mgd2l0aCBwcmV0dHkgcmVhc29uYWJsZSBwcmljZS4NCklmIHlvdXIgY29t cGFueSBuZWVkcyBhIHF1YWxpdHkgc3VwcGxpZXIgd2l0aCB2YXN0IGV4cGVyaWVuY2UgaW4gZGV2 ZWxvcGluZyBuZXcgbWFya2V0cywgY29udGFjdCB1cyBzbyB0aGF0IHdlIG1heSBleHBsb3JlIHBv dGVudGlhbCBzdHJhdGVnaWMgcmVsYXRpb25zaGlwcy4NCkFsZXggV3UNClNhbGVzIE1hbmFnZXIN ClRlbC9mYXg6IDAwODYgMDc2OSAyMjMwNzk4NQ0KRW1haWw6IGFsZXh3dUB4aW5jaGFuZ2JhZy5j b20gDQpTYWxlcyBPZmZpY2U6IDVELCBOby4yIEJ1aWxkaW5nLCBTYWt1bGEgR2FyZGVuLCBEb25n Y2hlbmcgQ2VudGVyLCBEb25nY2hlbmcgUm9hZCwgRG9uZ2NoZW5nIERpc3RyaWN0LCBEb25nZ3Vh biBDaXR5LCBDaGluYQ0KRmFjdG9yeTogIE5PLjYwIFppYmlhbiBUdWFuamllIFd1ZHVpLCBIZWNo ZW5nIFZpbGxhZ2UsIFNoaWxpbmcgVG93biwgSHVhZHUgRGlzdHJpY3QsIEd1YW5nemhvdSBDaXR5 LCBDaGluYS4= ------=_NextPart_000_0540_01C1B4DB.1908A1E0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIg aHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTM2Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQPjxGT05UIGNvbG9yPWJs dWU+RGVhciBGcmllbmRzLDwvRk9OVD48L1A+DQo8UD48Rk9OVCBjb2xvcj1ibHVlPldhcm0gcmVn YXJkcyE8L0ZPTlQ+PC9QPg0KPFA+PEZPTlQgY29sb3I9Ymx1ZT5XZSBhcmUgcHJvZmVzc2lvbmFs IG1hbnVmYWN0dXJlciBsb2NhdGVkIGluIFNoaWxpbmcgDQpHdWFuZ3pob3UsIHRoZSBiYWcgYW5k IGNhc2UgbWFudWZhY3R1cmUgY2VudGVyIG9mIENoaW5hLjxCUj5PdXIgZmFjdG9yeSBtYWtlcyAN CmRpZmZlcmVudCBraW5kcyBvZiBoaWdoIHF1YWxpdHkgUFUgYW5kIGxlYXRoZXIgaGFuZGJhZ3Ms IHNob3VsZGVyIGJhZ3MgYW5kIA0KYmFja3BhY2tzIHdpdGggcHJldHR5IHJlYXNvbmFibGUgcHJp Y2UuPC9GT05UPjwvUD4NCjxQPjxGT05UIGNvbG9yPWJsdWU+SWYgeW91ciBjb21wYW55IG5lZWRz IGEgcXVhbGl0eSBzdXBwbGllciB3aXRoIHZhc3QgDQpleHBlcmllbmNlIGluIGRldmVsb3Bpbmcg bmV3IG1hcmtldHMsIGNvbnRhY3QgdXMgc28gdGhhdCB3ZSBtYXkgZXhwbG9yZSANCnBvdGVudGlh bCBzdHJhdGVnaWMgcmVsYXRpb25zaGlwcy48L0ZPTlQ+PC9QPg0KPFA+PEZPTlQgY29sb3I9Ymx1 ZT5BbGV4IFd1PC9GT05UPjxGT05UIGNvbG9yPWJsdWU+PEJSPlNhbGVzIE1hbmFnZXI8QlI+VGVs L2ZheDogDQowMDg2IDA3NjkgMjIzMDc5ODU8QlI+RW1haWw6IGFsZXh3dUB4aW5jaGFuZ2JhZy5j b20gPEJSPlNhbGVzIE9mZmljZTogNUQsIE5vLjIgDQpCdWlsZGluZywgU2FrdWxhIEdhcmRlbiwg RG9uZ2NoZW5nIENlbnRlciwgRG9uZ2NoZW5nIFJvYWQsIERvbmdjaGVuZyBEaXN0cmljdCwgDQpE b25nZ3VhbiBDaXR5LCBDaGluYTxCUj5GYWN0b3J5OiZuYnNwOyBOTy42MCBaaWJpYW4gVHVhbmpp ZSBXdWR1aSwgSGVjaGVuZyANClZpbGxhZ2UsIFNoaWxpbmcgVG93biwgSHVhZHUgRGlzdHJpY3Qs IEd1YW5nemhvdSBDaXR5LCANCkNoaW5hLjxCUj48L1A+PC9GT05UPjwvQk9EWT48L0hUTUw+DQo= ------=_NextPart_000_0540_01C1B4DB.1908A1E0-- From BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 16 06:14:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 04BCD7F5D for ; Wed, 16 Apr 2014 06:14:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E09D18F8066 for ; Wed, 16 Apr 2014 04:14:07 -0700 (PDT) X-ASG-Debug-ID: 1397646846-04cbb06e9d7f050001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id MjOiNU53AbplHaGH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 04:14:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaNn0-0003os-Rx; Wed, 16 Apr 2014 11:14:02 +0000 Date: Wed, 16 Apr 2014 04:14:02 -0700 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Brian Foster , linux-man@vger.kernel.org, xfs@oss.sgi.com, linux-security-module@vger.kernel.org, Al Viro , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140416111402.GA32350@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> <20140410121947.GA14124@bfoster.bfoster> <20140410122944.GA6579@infradead.org> <20140415175228.GE26404@infradead.org> <1188577823.463241.1397590262478.JavaMail.zimbra@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1188577823.463241.1397590262478.JavaMail.zimbra@linbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397646846 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 15, 2014 at 09:31:02PM +0200, Andreas Gruenbacher wrote: > from how O_TMPFILE is documented right now [*], creating such a file and > then linking it into the namespace is one of the obvious use cases. Btw, I think the man page is wrong - given that the tmpfile is not visible in the namespace it is obviously not created in the directory. The directory passed in is just a handle for the filesystem it should be created in. Michael, should I send you an update for this, or do you want to do it yourself as you can probably come up with better language anyway? > The > intent seems to be to make it seem like the file was created and populated > atomically, possibly with inherited permissions and all. > I think this > behavior require that the O_TMPFILE file inherits from the directory it > was "created" in. > > Adding code to achieve the effect of create-time inheritance at link > time, only for O_TMPFILE files or files without any links, doesn't seem > reasonable to me: it would duplicate create code in the link code path, > and it would make it harder to override inherited permissions or labels. Inheriting any ACL on creating an anonymous file seems utterly wrong. Inheriting on link seems somewhat more sensible and not too bad in terms of code, but very confusing in terms of semantics. I think the best method is to make sure it simply does not inherit any ACL and document that clearly. > (Trying to fake inheritance by reimplementing it in user space seems like > a much worse idea still.) We don't fake inheritance when linking any other file either. And creating a file in a /tmp without any ACL and then linking it into the filesystem already is very common today. From sds@tycho.nsa.gov Wed Apr 16 07:56:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F3A357F56 for ; Wed, 16 Apr 2014 07:56:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD5FA8F8064 for ; Wed, 16 Apr 2014 05:56:10 -0700 (PDT) X-ASG-Debug-ID: 1397652967-04bdf0455485590001-NocioJ Received: from emvm-gh1-uea09.nsa.gov (emvm-gh1-uea09.nsa.gov [63.239.67.10]) by cuda.sgi.com with ESMTP id bLCvyCZNUfUKAzfu for ; Wed, 16 Apr 2014 05:56:07 -0700 (PDT) X-Barracuda-Envelope-From: sds@tycho.nsa.gov X-Barracuda-Apparent-Source-IP: 63.239.67.10 X-TM-IMSS-Message-ID: Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by nsa.gov ([63.239.67.10]) with ESMTP (TREND IMSS SMTP Service 7.1; TLSv1/SSLv3 DHE-RSA-AES256-SHA (256/256)) id c32f79180000e06d ; Wed, 16 Apr 2014 08:57:29 -0400 Received: from moss-pluto.infosec.tycho.ncsc.mil (moss-pluto [192.168.25.131]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id s3GCskhg032055; Wed, 16 Apr 2014 08:54:57 -0400 Message-ID: <534E7CDA.2060805@tycho.nsa.gov> Date: Wed, 16 Apr 2014 08:51:38 -0400 From: Stephen Smalley Organization: National Security Agency User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: Brian Foster , linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, xfs@oss.sgi.com, Eric Paris , Paul Moore Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> <534D90D0.9090805@tycho.nsa.gov> <20140415202222.GA10928@infradead.org> <534D94E4.8070606@tycho.nsa.gov> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation In-Reply-To: <534D94E4.8070606@tycho.nsa.gov> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: emvm-gh1-uea09.nsa.gov[63.239.67.10] X-Barracuda-Start-Time: 1397652967 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4968 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/15/2014 04:21 PM, Stephen Smalley wrote: > On 04/15/2014 04:22 PM, Christoph Hellwig wrote: >> On Tue, Apr 15, 2014 at 04:04:32PM -0400, Stephen Smalley wrote: >>> Is there a reason that xfs_init_security() isn't called from the inode >>> allocation function (e.g. xfs_ialloc), as in ext4 (__ext4_new_inode >>> calls ext4_init_security and also calls ext4_init_acl)? That would have >>> ensured that tmpfile inodes would have been labeled without requiring a >>> separate change and more generally ensures complete coverage for all inodes. >> >> Really just code structuring - we don't like callouts to high level VFS >> functions from deep down in the guts of the filesystem. >> >>> For SELinux, we need the tmpfile inodes to be labeled at creation time, >>> not just if linked into the namespace, since they may be shared via >>> local socket IPC or inherited across a label-changing exec and since we >>> revalidate access on transfer or use. >>> >>> Labeling based on the provided directory could be a bit random, although >>> it will work out with current policy if the provided directory >>> corresponds to existing tmpfile locations (e.g. /tmp, /var/tmp) and >>> therefore already has a label associated with temporary files. >>> Otherwise we might want some indication that it is a tmpfile passed into >>> security_inode_init_security() so that we can always select a stable >>> label irrespective of the directory. >> >> Just check for I_LINKABLE in i_flags. > > Thanks, that should allow us to handle it cleanly in the security modules! Maybe I spoke too soon. IIUC, I_LINKABLE doesn't necessarily distinguish tmpfiles from other files, as some tmpfiles may be linkable and others not. But what we want is a way to identify all tmpfiles when security_inode_init_security() is called if we are going to label them independently of the provided dir. Also, in that situation, we would need to likewise distinguish them during the create-time checking, i.e. when security_inode_create() is called (from may_o_create), as we have to determine the label that will be applied at that point for permission checking. And there we do not have the inode yet so we do not even have I_LINKABLE as a distinguisher. So I think we need __O_TMPFILE or similar flag passed down to may_o_create() -> security_inode_create() and to security_inode_init_security() if we are going to label these files independently of the provided directory. From davem@davemloft.net Wed Apr 16 08:00:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4EE77F37 for ; Wed, 16 Apr 2014 08:00:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5FCC7AC001 for ; Wed, 16 Apr 2014 06:00:06 -0700 (PDT) X-ASG-Debug-ID: 1397653204-04cb6c243683740001-NocioJ Received: from shards.monkeyblade.net (shards.monkeyblade.net [149.20.54.216]) by cuda.sgi.com with ESMTP id J2prpCbmZ6pGzqfF for ; Wed, 16 Apr 2014 06:00:04 -0700 (PDT) X-Barracuda-Envelope-From: davem@davemloft.net X-Barracuda-Apparent-Source-IP: 149.20.54.216 Received: from localhost (cpe-66-65-72-221.nyc.res.rr.com [66.65.72.221]) (Authenticated sender: davem-davemloft) by shards.monkeyblade.net (Postfix) with ESMTPSA id CF00158835C; Wed, 16 Apr 2014 06:00:03 -0700 (PDT) Date: Wed, 16 Apr 2014 09:00:02 -0400 (EDT) Message-Id: <20140416.090002.2186526865564557549.davem@davemloft.net> To: eric.dumazet@gmail.com Cc: neilb@suse.de, linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, netdev@vger.kernel.org Subject: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock From: David Miller X-ASG-Orig-Subj: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock In-Reply-To: <1397625226.4222.113.camel@edumazet-glaptop2.roam.corp.google.com> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.96000.stgit@notabene.brown> <1397625226.4222.113.camel@edumazet-glaptop2.roam.corp.google.com> X-Mailer: Mew version 6.5 on Emacs 24.3 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.5.7 (shards.monkeyblade.net [149.20.54.216]); Wed, 16 Apr 2014 06:00:04 -0700 (PDT) X-Barracuda-Connect: shards.monkeyblade.net[149.20.54.216] X-Barracuda-Start-Time: 1397653204 X-Barracuda-URL: http://192.48.176.15: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_MISMATCH_TO, BSF_SC7_SA298e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4968 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 BSF_SC7_SA298e Custom Rule SA298e From: Eric Dumazet Date: Tue, 15 Apr 2014 22:13:46 -0700 > For applications handling millions of sockets, this makes a difference. Indeed, this really is not acceptable. From bfoster@redhat.com Wed Apr 16 08:23:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CA5997F37 for ; Wed, 16 Apr 2014 08:23:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90127304062 for ; Wed, 16 Apr 2014 06:23:39 -0700 (PDT) X-ASG-Debug-ID: 1397654618-04bdf0455488a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1QaPKy5cF3fDJRhD for ; Wed, 16 Apr 2014 06:23:38 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3GDNb8X026082 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 16 Apr 2014 09:23:37 -0400 Received: from laptop.bfoster (vpn-63-46.rdu2.redhat.com [10.10.63.46]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3GDNacd030275; Wed, 16 Apr 2014 09:23:36 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 329A4120AC3; Wed, 16 Apr 2014 09:23:36 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3GDNYHf004318; Wed, 16 Apr 2014 09:23:34 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 16 Apr 2014 09:23:34 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 7/9] repair: remove more dirv1 leftovers Message-ID: <20140416132332.GA4180@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 7/9] repair: remove more dirv1 leftovers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397654618 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 15, 2014 at 06:24:59PM +1000, Dave Chinner wrote: > From: Dave Chinner > > get_bmapi() and it's children were only called by dirv1 code. There > are no current callers, so remove them. > > Signed-off-by: Dave Chinner > --- > repair/dinode.c | 239 -------------------------------------------------------- > repair/dinode.h | 6 -- > 2 files changed, 245 deletions(-) > > diff --git a/repair/dinode.c b/repair/dinode.c > index 48f17ac..b086bec 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c ... > -xfs_dfsbno_t > -get_bmapi(xfs_mount_t *mp, xfs_dinode_t *dino_p, > - xfs_ino_t ino_num, xfs_dfiloff_t bno, int whichfork) > -{ > - xfs_dfsbno_t fsbno; > - > - switch (XFS_DFORK_FORMAT(dino_p, whichfork)) { > - case XFS_DINODE_FMT_EXTENTS: > - fsbno = getfunc_extlist(mp, ino_num, dino_p, bno, whichfork); > - break; > - case XFS_DINODE_FMT_BTREE: > - fsbno = getfunc_btree(mp, ino_num, dino_p, bno, whichfork); > - break; > - case XFS_DINODE_FMT_LOCAL: > - do_error(_("get_bmapi() called for local inode %" PRIu64 "\n"), > - ino_num); I'm not quite familiar with how we manage the .po translation files, but FYI this string appears in a couple of them. Not sure whether there is value in keeping the translation around. The string does include the specific function name. Brian > - fsbno = NULLDFSBNO; > - break; > - default: > - /* > - * shouldn't happen > - */ > - do_error(_("bad inode format for inode %" PRIu64 "\n"), ino_num); > - fsbno = NULLDFSBNO; > - } > - > - return(fsbno); > -} > - > -/* > * higher level inode processing stuff starts here: > * first, one utility routine for each type of inode > */ > diff --git a/repair/dinode.h b/repair/dinode.h > index 5ee51ca..80f3e4e 100644 > --- a/repair/dinode.h > +++ b/repair/dinode.h > @@ -119,12 +119,6 @@ get_agino_buf(xfs_mount_t *mp, > xfs_agino_t agino, > xfs_dinode_t **dipp); > > -xfs_dfsbno_t > -get_bmapi(xfs_mount_t *mp, > - xfs_dinode_t *dip, > - xfs_ino_t ino_num, > - xfs_dfiloff_t bno, > - int whichfork ); > > void dinode_bmbt_translation_init(void); > char * get_forkname(int whichfork); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Apr 16 08:24:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2DE4C7F37 for ; Wed, 16 Apr 2014 08:24:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C9FEFAC004 for ; Wed, 16 Apr 2014 06:24:01 -0700 (PDT) X-ASG-Debug-ID: 1397654639-04bdf0455588b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GzhDPUc6618A4eXW for ; Wed, 16 Apr 2014 06:24:00 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3GDNxYK030792 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 16 Apr 2014 09:23:59 -0400 Received: from laptop.bfoster (vpn-63-46.rdu2.redhat.com [10.10.63.46]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3GDNwIJ030363; Wed, 16 Apr 2014 09:23:58 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 3E483120AC3; Wed, 16 Apr 2014 09:23:58 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3GDNvUx004327; Wed, 16 Apr 2014 09:23:57 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 16 Apr 2014 09:23:56 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] repair: handle remote sylmlink CRC errors Message-ID: <20140416132356.GB4180@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 8/9] repair: handle remote sylmlink CRC errors References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397654640 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 15, 2014 at 06:25:00PM +1000, Dave Chinner wrote: > From: Dave Chinner > Just a couple nits... otherwise it looks good to me. There's a typo in the patch subject... > We can't really repair broken symlink buffer contents, but we can at > least warn about it and correct the CRC error so the symlink is > again readable. > > Signed-off-by: Dave Chinner > --- > repair/dinode.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/repair/dinode.c b/repair/dinode.c > index b086bec..51863c4 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -1254,6 +1254,7 @@ process_symlink_remote( > while (pathlen > 0) { > int blk_cnt = 1; > int byte_cnt; > + int dirty = 0; > > fsbno = blkmap_get(blkmap, i); > if (fsbno == NULLDFSBNO) { > @@ -1284,6 +1285,12 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), > lino, i, fsbno); > return 1; > } > + if (bp->b_error == EFSBADCRC) { > + do_warn( > +_("Bad symlink buffer CRC block %" PRIu64 ", inode %" PRIu64 ".\n" "Bad symlink buffer CRC, block ..." ... and sticking a comma or some separator in that message makes it a little easier to read, IMO. Brian > + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); > + dirty = 1; > + } > > byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); > byte_cnt = MIN(pathlen, byte_cnt); > @@ -1307,7 +1314,10 @@ _("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n") > offset += byte_cnt; > i++; > > - libxfs_putbuf(bp); > + if (dirty) > + libxfs_writebuf(bp, 0); > + else > + libxfs_putbuf(bp); > } > return 0; > } > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Apr 16 08:25:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 23FCE7F37 for ; Wed, 16 Apr 2014 08:25:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D19EE8F8066 for ; Wed, 16 Apr 2014 06:25:08 -0700 (PDT) X-ASG-Debug-ID: 1397654707-04bdf0455588df0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WavtcbLCpbDpFShA for ; Wed, 16 Apr 2014 06:25:07 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3GDP6Wp023595 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 16 Apr 2014 09:25:06 -0400 Received: from laptop.bfoster (vpn-63-46.rdu2.redhat.com [10.10.63.46]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3GDP5jt023579; Wed, 16 Apr 2014 09:25:06 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 6A3D5120AC3; Wed, 16 Apr 2014 09:25:05 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3GDP4YD004330; Wed, 16 Apr 2014 09:25:04 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 16 Apr 2014 09:25:04 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-ID: <20140416132503.GC4180@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397654707 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 15, 2014 at 06:25:01PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Currently the attribute code will not detect and correct errors in > the attribute tree. It also fails to validate the CRCs and headers > on remote attribute blocks. Ensure that all the attribute blocks are > CRC checked and that the processing functions understand the correct > block formats for decoding. > > Signed-off-by: Dave Chinner > --- > repair/attr_repair.c | 35 ++++++++++++++++++++++++++++------- > 1 file changed, 28 insertions(+), 7 deletions(-) > > diff --git a/repair/attr_repair.c b/repair/attr_repair.c > index ba85ac2..13ec90e 100644 > --- a/repair/attr_repair.c > +++ b/repair/attr_repair.c > @@ -611,6 +611,8 @@ verify_da_path(xfs_mount_t *mp, > ASSERT(cursor->level[this_level].dirty == 0 || > (cursor->level[this_level].dirty && !no_modify)); > > + if (bp->b_error == EFSBADCRC) > + cursor->level[this_level].dirty++; I was wondering why this wasn't checked closer to the readbuf call, then I noticed the assert. Any reason not to be consistent with the other changes, move this up closer to the call and nuke the assert? > if (cursor->level[this_level].dirty && !no_modify) > libxfs_writebuf(cursor->level[this_level].bp, 0); > else > @@ -974,6 +976,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, > xfs_dfsbno_t bno; > xfs_buf_t *bp; > int clearit = 0, i = 0, length = 0, amountdone = 0; > + int hdrsize = 0; > + > + if (xfs_sb_version_hascrc(&mp->m_sb)) > + hdrsize = sizeof(struct xfs_attr3_rmt_hdr); > > /* ASSUMPTION: valuelen is a valid number, so use it for looping */ > /* Note that valuelen is not a multiple of blocksize */ > @@ -986,16 +992,26 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, > break; > } > bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), > - XFS_FSB_TO_BB(mp, 1), 0, NULL); > + XFS_FSB_TO_BB(mp, 1), 0, > + &xfs_attr3_rmt_buf_ops); > if (!bp) { > do_warn( > _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); > clearit = 1; > break; > } > + > + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { > + do_warn( > + _("Corrupt remote block for attributes of inode %" PRIu64 "\n"), ino); > + clearit = 1; > + break; > + } > + > ASSERT(mp->m_sb.sb_blocksize == XFS_BUF_COUNT(bp)); > - length = MIN(XFS_BUF_COUNT(bp), valuelen - amountdone); > - memmove(value, XFS_BUF_PTR(bp), length); > + > + length = MIN(XFS_BUF_COUNT(bp) - hdrsize, valuelen - amountdone); > + memmove(value, XFS_BUF_PTR(bp) + hdrsize, length); > amountdone += length; > value += length; > i++; > @@ -1320,13 +1336,16 @@ process_leaf_attr_level(xfs_mount_t *mp, > } > > bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), > - XFS_FSB_TO_BB(mp, 1), 0, NULL); > + XFS_FSB_TO_BB(mp, 1), 0, > + &xfs_attr3_leaf_buf_ops); > if (!bp) { > do_warn( > _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), > da_bno, dev_bno, ino); > goto error_out; > } > + if (bp->b_error == EFSBADCRC) > + repair++; Could you remind me why we only check EFSBADCRC in some places and EFSCORRUPTED as well in others? > > leaf = bp->b_addr; > xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); > @@ -1382,9 +1401,9 @@ process_leaf_attr_level(xfs_mount_t *mp, > > current_hashval = greatest_hashval; > > - if (repair && !no_modify) > + if (repair && !no_modify) > libxfs_writebuf(bp, 0); > - else > + else > libxfs_putbuf(bp); > } while (da_bno != 0); > > @@ -1512,6 +1531,8 @@ process_longform_attr( > ino); > return(1); > } > + if (bp->b_error == EFSBADCRC) > + (*repair)++; Note that repair is unconditionally reset to 0 at the beginning of process_leaf_attr_block() (in the XFS_ATTR_LEAF_MAGIC case further down this function). Brian > > /* verify leaf block */ > leaf = (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); > @@ -1555,7 +1576,7 @@ process_longform_attr( > 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) { > + if (*repair || repairlinks) { > *repair = 1; > libxfs_writebuf(bp, 0); > } else > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From fdmanana@gmail.com Wed Apr 16 09:01:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 F40D629DF9 for ; Wed, 16 Apr 2014 09:01:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C9BBAC002 for ; Wed, 16 Apr 2014 07:01:30 -0700 (PDT) X-ASG-Debug-ID: 1397656887-04cbb06e9c8b500001-NocioJ Received: from mail-we0-f177.google.com (mail-we0-f177.google.com [74.125.82.177]) by cuda.sgi.com with ESMTP id Kwatt4SK2GhzV4Tn (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 07:01:28 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.177 Received: by mail-we0-f177.google.com with SMTP id u57so10952651wes.36 for ; Wed, 16 Apr 2014 07:01:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=U7YXgssESJ46C9XxdygTTZJs4iTdeq2FQ3rDmhVlpSQ=; b=od66bsI8ID1NnB5XTgQnDhe3WeP/NVjuND3Uz+EWGKZnwJQPqOKkHE8UuVEenmoMog 6cldyrFz0N6eOp8/4soWc1tnbsTWwH5LxGTCr3Y/8NC//LeG2gcIMGSGUDihTB4o9fLc rb78fwjtD7EOOoYwnNJXi+GA4mTCnpUCmfeWCmtiytqrovxkS1AiBJGZ4QZANJEBoJgL BmqamtKwKiuQXyA36Fo1smTgAmxM7MhfDWSOMCdW2r31z+uMzZGa2Ck7Sw+ahzBhdoSp +fRD2b/DWTF2TRORiWrcR1hHQAVrQ/m/fdxtdIRm0oDA1vg1pA0G1LIRMUQvcAZAkf0Q 5SOQ== X-Received: by 10.180.98.1 with SMTP id ee1mr19853693wib.10.1397656886798; Wed, 16 Apr 2014 07:01:26 -0700 (PDT) Received: from debian-vm3.lan (bl10-198-83.dsl.telepac.pt. [85.243.198.83]) by mx.google.com with ESMTPSA id ct2sm34478575wjb.33.2014.04.16.07.01.25 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Apr 2014 07:01:25 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v2] xfstests: btrfs, test send's ability to punch holes and prealloc extents Date: Wed, 16 Apr 2014 16:01:49 +0100 X-ASG-Orig-Subj: [PATCH v2] xfstests: btrfs, test send's ability to punch holes and prealloc extents Message-Id: <1397660509-8237-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-we0-f177.google.com[74.125.82.177] X-Barracuda-Start-Time: 1397656887 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name 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 verifies that after an incremental btrfs send the replicated file has the same exact hole and data structure as in the origin filesystem. This didn't use to be the case before the send stream version 2 - holes were sent as write operations of 0 valued bytes instead of punching holes with the fallocate system call, and pre-allocated extents were sent as well as write operations of 0 valued bytes instead of intructions for the receiver to use the fallocate system call. It also checks that prealloc extents that lie beyond the file's size are replicated by an incremental send. Signed-off-by: Filipe David Borba Manana --- V2: Addressed Dave's comments, and updated btrfs send invocation, by specifying the new command line option (-a) that enables use of fallocate - added function _require_btrfs_send_fallocate_flag() to skip the test when an old version of btrfs-progs is found. common/rc | 9 ++++ tests/btrfs/047 | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/047.out | 27 ++++++++++++ tests/btrfs/group | 1 + 4 files changed, 158 insertions(+) create mode 100755 tests/btrfs/047 create mode 100644 tests/btrfs/047.out diff --git a/common/rc b/common/rc index acf419b..e94e51c 100644 --- a/common/rc +++ b/common/rc @@ -2262,6 +2262,15 @@ _run_btrfs_util_prog() run_check $BTRFS_UTIL_PROG $* } +_require_btrfs_send_fallocate_flag() +{ + $BTRFS_UTIL_PROG send 2>&1 | \ + grep '^[ \t]*\-a[ \t]\+.* fallocate ' > /dev/null 2>&1 + if [ $? -ne 0 ]; then + _notrun "Missing btrfs-progs send -a command line option, skipped this test" + fi +} + init_rc() { if [ "$iam" == new ] diff --git a/tests/btrfs/047 b/tests/btrfs/047 new file mode 100755 index 0000000..c8171a5 --- /dev/null +++ b/tests/btrfs/047 @@ -0,0 +1,121 @@ +#! /bin/bash +# FS QA Test No. btrfs/047 +# +# Verify that after an incremental btrfs send the replicated file has +# the same exact hole and data structure as in the origin filesystem. +# This didn't use to be the case before the send stream version 2 - +# holes were sent as write operations of 0 valued bytes instead of punching +# holes with the fallocate system call, and pre-allocated extents were sent +# as well as write operations of 0 valued bytes instead of intructions for +# the receiver to use the fallocate system call. Also check that prealloc +# extents that lie beyond the file's size are replicated by an incremental +# send. +# +# More specifically, this structure preserving guarantee was added by the +# following linux kernel commits: +# +# Btrfs: send, use fallocate command to punch holes +# Btrfs: send, use fallocate command to allocate extents +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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" + +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_require_xfs_io_fiemap +_require_btrfs_send_fallocate_flag +_need_to_be_root + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +$XFS_IO_PROG -f -c "pwrite -S 0x01 -b 300000 0 300000" $SCRATCH_MNT/foo \ + | _filter_xfs_io + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +$XFS_IO_PROG -c "fpunch 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "pwrite -S 0xff -b 1000 120000 1000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "fpunch 250000 20000" $SCRATCH_MNT/foo + +$XFS_IO_PROG -c "falloc -k 300000 1000000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc -k 9000000 2000000" $SCRATCH_MNT/foo + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send -a $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap +_run_btrfs_util_prog send -a -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap + +_scratch_unmount +_check_scratch_fs + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/047.out b/tests/btrfs/047.out new file mode 100644 index 0000000..f298b58 --- /dev/null +++ b/tests/btrfs/047.out @@ -0,0 +1,27 @@ +QA output created by 047 +wrote 300000/300000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1000/1000 bytes at offset 120000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +0: [496..17575]: hole +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +0: [496..17575]: hole diff --git a/tests/btrfs/group b/tests/btrfs/group index 3a6d34e..d4e3fc1 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -49,3 +49,4 @@ 044 auto quick 045 auto quick 046 auto quick +047 auto quick -- 1.9.1 From fdmanana@gmail.com Wed Apr 16 09:03:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3C0E07F4E for ; Wed, 16 Apr 2014 09:03:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B33D7AC003 for ; Wed, 16 Apr 2014 07:03:51 -0700 (PDT) X-ASG-Debug-ID: 1397657028-04cbb06e9a8b9d0001-NocioJ Received: from mail-we0-f176.google.com (mail-we0-f176.google.com [74.125.82.176]) by cuda.sgi.com with ESMTP id fCy5LwgvAq4GvOYL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 07:03:49 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.176 Received: by mail-we0-f176.google.com with SMTP id x48so10621870wes.7 for ; Wed, 16 Apr 2014 07:03:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=P4oqU7WKOw8tgday26C3ZIBU11rcCwAX24+tfKxNRvg=; b=qszgHb1N1yIqCXuXmROyQvW9IG5jNjZYyhjZ6jF5ItojXA1oqgvFXICqQx/rw7ZyOx e6sjfdIjIqsh1iLqnzYFwp22x33GV7/fniNuurnVFPP3xPcHItpKfe8PZ+haVrS9NDCT I6EPbqGmSu7oG4mYpxBM97qo+FpdZ4cJC9+tM8La5q+xge+4vB2xvJEFnwvRcFZJ/cFV 9yzwQcQ0g43WXrISGxbggcOUU5nwf4xhM8mZ8KDC0yvvD1IAt5lQ+9yxZbxGydxEaSQ9 a2EiNfZmQEC6rXlRc/blFfZjijd5OMIxhEJ2IFarpJHIq2POgz3j9xT66/3XNAMRJTna t5Lg== X-Received: by 10.180.218.197 with SMTP id pi5mr7691249wic.21.1397657027966; Wed, 16 Apr 2014 07:03:47 -0700 (PDT) Received: from debian-vm3.lan (bl10-198-83.dsl.telepac.pt. [85.243.198.83]) by mx.google.com with ESMTPSA id ll1sm34507320wjc.6.2014.04.16.07.03.46 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Apr 2014 07:03:47 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v2] xfstests: btrfs, add test for btrfs properties Date: Wed, 16 Apr 2014 16:04:26 +0100 X-ASG-Orig-Subj: [PATCH v2] xfstests: btrfs, add test for btrfs properties Message-Id: <1397660666-8300-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1397591424-25439-1-git-send-email-fdmanana@gmail.com> References: <1397591424-25439-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-we0-f176.google.com[74.125.82.176] X-Barracuda-Start-Time: 1397657029 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name 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 case verifies the btrfs properties feature, a new feature introduced in the linux kernel version 3.14. Signed-off-by: Filipe David Borba Manana --- V2: Addressed Dave's comments, removed function to check for existence of the btrfs-progs property command and use instead existing function _require_btrfs which checks if a btrfs-progs command exists and is equivalent to what I had before. tests/btrfs/048 | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/048.out | 78 +++++++++++++++++++ tests/btrfs/group | 1 + 3 files changed, 299 insertions(+) create mode 100755 tests/btrfs/048 create mode 100644 tests/btrfs/048.out diff --git a/tests/btrfs/048 b/tests/btrfs/048 new file mode 100755 index 0000000..e998f97 --- /dev/null +++ b/tests/btrfs/048 @@ -0,0 +1,220 @@ +#! /bin/bash +# FS QA Test No. btrfs/048 +# +# Btrfs properties test. The btrfs properties feature was introduced in the +# linux kernel 3.14. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_btrfs "property" +_need_to_be_root + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +echo "Testing label property" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT label +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT label foobar +$BTRFS_UTIL_PROG property get $SCRATCH_MNT label +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT label '' +$BTRFS_UTIL_PROG property get $SCRATCH_MNT label +echo "***" +mkdir $SCRATCH_MNT/testdir +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir label +echo "***" + +echo -e "\nTesting subvolume ro property" +_run_btrfs_util_prog subvolume create $SCRATCH_MNT/sv1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 ro +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro foo +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro true +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 ro +echo "***" +touch $SCRATCH_MNT/sv1/foobar 2>&1 | _filter_scratch +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro false +touch $SCRATCH_MNT/sv1/foobar 2>&1 | _filter_scratch +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 +echo "***" + +echo -e "\nTesting compression property" +mkdir $SCRATCH_MNT/testdir/subdir1 +touch $SCRATCH_MNT/testdir/file1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression \ + foo 2>&1 | _filter_scratch +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression lzo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression + +# Verify property was persisted. +_scratch_unmount +_check_scratch_fs +_scratch_mount +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression zlib +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression '' +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression + +# Test compression property inheritance. +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression lzo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +echo "***" +mkdir $SCRATCH_MNT/testdir/subdir1/subsubdir +touch $SCRATCH_MNT/testdir/subdir1/some_file +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression +echo "***" +mkdir $SCRATCH_MNT/testdir/subdir1/subsubdir/foo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir/foo \ + compression +echo "***" + +# Verify property was persisted. +_scratch_unmount +_check_scratch_fs +_scratch_mount +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir/foo \ + compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1/subsubdir \ + compression '' +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1/some_file \ + compression '' +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression '' +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression +echo "***" +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +echo "***" +touch $SCRATCH_MNT/testdir/subdir1/some_file_2 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file_2 \ + compression +echo "***" + +# Verify send is able to replicate properties. +echo -e "\nTesting properties with send" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression lzo +touch $SCRATCH_MNT/testdir/subdir1/foobar +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/foobar compression +echo "***" + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 +touch $SCRATCH_MNT/testdir/subdir1/foobar2 +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $send_files_dir/2.snap + +_scratch_unmount +_check_scratch_fs +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1 compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1/foobar \ + compression +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1/foobar2 \ + compression +echo "***" + +_scratch_unmount +_check_scratch_fs +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +echo -e "\nTesting subvolume properties" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'lzo' +$BTRFS_UTIL_PROG property get $SCRATCH_MNT compression +echo "***" +touch $SCRATCH_MNT/file1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/file1 compression +echo "***" +mkdir $SCRATCH_MNT/dir1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1 compression +echo "***" +mkdir $SCRATCH_MNT/dir1/subdir1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1/subdir1 compression +echo "***" +$BTRFS_UTIL_PROG property set $SCRATCH_MNT/dir1/subdir1 compression 'zlib' +touch $SCRATCH_MNT/dir1/subdir1/foo +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1/subdir1/foo compression + +echo -e "\nTesting subvolume property inheritance" +_run_btrfs_util_prog subvolume create $SCRATCH_MNT/sv1 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 compression +touch $SCRATCH_MNT/sv1/file2 +$BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1/file2 compression + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/048.out b/tests/btrfs/048.out new file mode 100644 index 0000000..0b20d0b --- /dev/null +++ b/tests/btrfs/048.out @@ -0,0 +1,78 @@ +QA output created by 048 +Testing label property +label= +*** +label=foobar +*** +ro=false +label=foobar +*** +label= +*** +ERROR: object is not compatible with property +*** + +Testing subvolume ro property +ro=false +*** +ERROR: invalid value for property. +*** +*** +ro=true +*** +touch: cannot touch 'SCRATCH_MNT/sv1/foobar': Read-only file system +*** +ro=false +*** + +Testing compression property +*** +ERROR: failed to set compression for SCRATCH_MNT/testdir/file1. Invalid argument +*** +compression=lzo +compression=lzo +compression=zlib +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +*** +*** +*** +*** +*** + +Testing properties with send +compression=lzo +compression=lzo +*** +compression=lzo +compression=lzo +compression=lzo +*** + +Testing subvolume properties +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=lzo +*** +compression=zlib + +Testing subvolume property inheritance +compression=lzo +compression=lzo diff --git a/tests/btrfs/group b/tests/btrfs/group index d4e3fc1..af60c79 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -50,3 +50,4 @@ 045 auto quick 046 auto quick 047 auto quick +048 auto quick -- 1.9.1 From BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 16 09:14:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB2D77F50 for ; Wed, 16 Apr 2014 09:14:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B2BEF8F804B for ; Wed, 16 Apr 2014 07:14:13 -0700 (PDT) X-ASG-Debug-ID: 1397657651-04cbb06e9c8cde0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AbeoGsZeqNfc2he8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 07:14:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaQbJ-0007BT-LI; Wed, 16 Apr 2014 14:14:09 +0000 Date: Wed, 16 Apr 2014 07:14:09 -0700 From: Christoph Hellwig To: Stephen Smalley Cc: Brian Foster , linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, xfs@oss.sgi.com, Eric Paris , Paul Moore Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation Message-ID: <20140416141409.GA21743@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> <534D90D0.9090805@tycho.nsa.gov> <20140415202222.GA10928@infradead.org> <534D94E4.8070606@tycho.nsa.gov> <534E7CDA.2060805@tycho.nsa.gov> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534E7CDA.2060805@tycho.nsa.gov> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397657652 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 16, 2014 at 08:51:38AM -0400, Stephen Smalley wrote: > Maybe I spoke too soon. IIUC, I_LINKABLE doesn't necessarily > distinguish tmpfiles from other files, as some tmpfiles may be linkable > and others not. But what we want is a way to identify all tmpfiles when > security_inode_init_security() is called if we are going to label them > independently of the provided dir. Oh, right. If O_EXCL is specified (another annoying overload of the flag..) the tmpfile can't ever be linked back into the filesystem and thus doesn't have I_LINKABLE set. I guess the best way to fix this is using the magic qstr you suggested before. That means security_inode_init_security would need to be called after d_tmpfile, which most filesystems don't do right now. From sds@tycho.nsa.gov Wed Apr 16 09:18:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 36B557F66 for ; Wed, 16 Apr 2014 09:18:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F2D0304087 for ; Wed, 16 Apr 2014 07:18:16 -0700 (PDT) X-ASG-Debug-ID: 1397657894-04bdf0455590260001-NocioJ Received: from emvm-gh1-uea09.nsa.gov (emvm-gh1-uea09.nsa.gov [63.239.67.10]) by cuda.sgi.com with ESMTP id GoD7uG8F1I9Rg5bF for ; Wed, 16 Apr 2014 07:18:15 -0700 (PDT) X-Barracuda-Envelope-From: sds@tycho.nsa.gov X-Barracuda-Apparent-Source-IP: 63.239.67.10 X-TM-IMSS-Message-ID: Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by nsa.gov ([63.239.67.10]) with ESMTP (TREND IMSS SMTP Service 7.1; TLSv1/SSLv3 DHE-RSA-AES256-SHA (256/256)) id c37b2bf40000f7a2 ; Wed, 16 Apr 2014 10:20:10 -0400 Received: from moss-pluto.infosec.tycho.ncsc.mil (moss-pluto [192.168.25.131]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id s3GEHQd4006982; Wed, 16 Apr 2014 10:17:36 -0400 Message-ID: <534E903B.7060305@tycho.nsa.gov> Date: Wed, 16 Apr 2014 10:14:19 -0400 From: Stephen Smalley Organization: National Security Agency User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: Brian Foster , linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, xfs@oss.sgi.com, Eric Paris , Paul Moore Subject: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation References: <1397578706-5385-1-git-send-email-bfoster@redhat.com> <1397578706-5385-3-git-send-email-bfoster@redhat.com> <20140415175033.GB26404@infradead.org> <534D90D0.9090805@tycho.nsa.gov> <20140415202222.GA10928@infradead.org> <534D94E4.8070606@tycho.nsa.gov> <534E7CDA.2060805@tycho.nsa.gov> <20140416141409.GA21743@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: initialize inode security on tmpfile creation In-Reply-To: <20140416141409.GA21743@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: emvm-gh1-uea09.nsa.gov[63.239.67.10] X-Barracuda-Start-Time: 1397657894 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/16/2014 10:14 AM, Christoph Hellwig wrote: > On Wed, Apr 16, 2014 at 08:51:38AM -0400, Stephen Smalley wrote: >> Maybe I spoke too soon. IIUC, I_LINKABLE doesn't necessarily >> distinguish tmpfiles from other files, as some tmpfiles may be linkable >> and others not. But what we want is a way to identify all tmpfiles when >> security_inode_init_security() is called if we are going to label them >> independently of the provided dir. > > Oh, right. If O_EXCL is specified (another annoying overload of the > flag..) the tmpfile can't ever be linked back into the filesystem > and thus doesn't have I_LINKABLE set. > > I guess the best way to fix this is using the magic qstr you suggested > before. That means security_inode_init_security would need to be > called after d_tmpfile, which most filesystems don't do right now. I think one could just pass NULL for the qstr as an indicator, which ext4 already does, so it doesn't require moving after d_tmpfile) IIUC. However, that doesn't solve the problem for security_inode_create(), which also needs to know it is dealing with a tmpfile. So we might want to just pass an explicit flag to both. From BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 16 09:18:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 839687F66 for ; Wed, 16 Apr 2014 09:18:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0CC9AAC001 for ; Wed, 16 Apr 2014 07:18:30 -0700 (PDT) X-ASG-Debug-ID: 1397657908-04cbb06e9b8d700001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FNyfcnpJXvb9c9tf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 07:18:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaQfR-0001JN-L6; Wed, 16 Apr 2014 14:18:25 +0000 Date: Wed, 16 Apr 2014 07:18:25 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Miklos Szeredi , Miklos Szeredi , xfs@oss.sgi.com Subject: Re: [PATCH 2/4] renameat2 syscall: check plain rename Message-ID: <20140416141825.GA32449@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] renameat2 syscall: check plain rename References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> <1397231517-4641-2-git-send-email-miklos@szeredi.hu> <20140414023020.GJ27694@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414023020.GJ27694@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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397657909 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 14, 2014 at 12:30:20PM +1000, Dave Chinner wrote: > IOWs, XFS is returning EEXIST rather than ENOTEMPTY for several of > these rename tests. The rename man page says this about the errors: > > ENOTEMPTY or EEXIST > newpath is a nonempty directory, that is, contains > entries other than "." and "..". > > Which implies that both errors are valid and so the test should pass > in either case. Can you send a patch to handle these > different-but-valid error returns? I would much prefer if all Linux filesystems behaved uniformly here. While EEXIST sounds much more logical to me in this case I suspect most other filesystems have copy & pasted from ext2, and we should switch to ENOTEMPTY as well. From BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 16 09:27:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 268B529DFD for ; Wed, 16 Apr 2014 09:27:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F26848F8033 for ; Wed, 16 Apr 2014 07:27:51 -0700 (PDT) X-ASG-Debug-ID: 1397658469-04bdf0455591620001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 84g5UUj4RBHXSHiw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 07:27:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaQoW-0002rO-Ci; Wed, 16 Apr 2014 14:27:48 +0000 Date: Wed, 16 Apr 2014 07:27:48 -0700 From: Christoph Hellwig To: Brian Foster Cc: Dave Chinner , bob.mastors@solidfire.com, snitzer@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount Message-ID: <20140416142748.GB32449@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: unmount does not wait for shutdown during unmount References: <1397104955-7247-1-git-send-email-david@fromorbit.com> <20140414192824.GC62307@bfoster.bfoster> <20140415021546.GD31578@dastard> <20140415145924.GA3470@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140415145924.GA3470@laptop.bfoster> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397658469 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 15, 2014 at 10:59:25AM -0400, Brian Foster wrote: > Yeah, I noticed that the completion wouldn't fire as is since it appears > that doesn't occur if a b_iodone call is provided. FWIW, the thought > process was more to inherit the use of b_iowait in xlog_iodone(). That doesn't mean the b_iodone callback couldn't do the wakeup on b_iowait. I have to say it makes me a bit uneasy that we had to find this race the hard way for the superblock, and now for the logbufs again. Seems like all other uncached buffers are only read and written synchronously, so for this should be the last issue, but I fear about new ones showing up in the future and would prefer a more general solution. Reluctantly: Reviewed-by: Christoph Hellwig From fdmanana@gmail.com Wed Apr 16 09:39:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F203D7F5A for ; Wed, 16 Apr 2014 09:39:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B534AC001 for ; Wed, 16 Apr 2014 07:39:22 -0700 (PDT) X-ASG-Debug-ID: 1397659159-04cbb06e9c8fe80001-NocioJ Received: from mail-lb0-f173.google.com (mail-lb0-f173.google.com [209.85.217.173]) by cuda.sgi.com with ESMTP id vd2DAy18mW88Csf8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 07:39:20 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.173 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.173] Received: by mail-lb0-f173.google.com with SMTP id p9so8261241lbv.32 for ; Wed, 16 Apr 2014 07:39:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.173] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.173] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=55S8IIwYMgJqdTGEaanI6sxGgHqDw+nSAaYSht7vVfY=; b=a2oy7Z1TwBKxq8WgO1lRzFtpOTHmLYHiZVSj2xDh+pDcldeKXnmrMGzcgUT9dvVu3F zmby3aFN4P0b3r7v4pij2c/+ZNvSexHyGOewyxUQpU2P1bwcXjMuJsI84majvbZRVuK9 s8f6tXAQQSmpV1HEB7y90U0SwoDFC6j3VQb35GQ1IWd/Q74Zf1XbG+sD6cvz+HfMKnP+ PsYqRjlBgn0WRUyngrV0YonEtXJRfydYoN78mt5oM/JXSDgECAPonXIBXDXUIteNXr6k vhUiZsyhOJHjvO2x1uOnFPtFH5ZFKSjWS1BVaJcaBXfYJICICatmmwoqDJTt/Q9PCpMX J4OQ== MIME-Version: 1.0 X-Received: by 10.152.183.162 with SMTP id en2mr100818lac.76.1397659158638; Wed, 16 Apr 2014 07:39:18 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Wed, 16 Apr 2014 07:39:18 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <20140416002349.GV15995@dastard> References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> <20140416002349.GV15995@dastard> Date: Wed, 16 Apr 2014 15:39:18 +0100 Message-ID: Subject: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents From: Filipe David Manana X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents To: Dave Chinner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , Josef Bacik Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f173.google.com[209.85.217.173] X-Barracuda-Start-Time: 1397659159 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Apr 16, 2014 at 1:23 AM, Dave Chinner wrote: > On Tue, Apr 15, 2014 at 05:43:21PM +0100, Filipe David Borba Manana wrote: >> This test verifies that after an incremental btrfs send the replicated file has >> the same exact hole and data structure as in the origin filesystem. This didn't >> use to be the case before the send stream version 2 - holes were sent as write >> operations of 0 valued bytes instead of punching holes with the fallocate system >> call, and pre-allocated extents were sent as well as write operations of 0 valued >> bytes instead of intructions for the receiver to use the fallocate system call. >> Also checks that prealloc extents that lie beyond the file's size are replicated >> by an incremental send. > > Can you wrap commit messages at 68 columns? > > .... >> +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch >> +# List all hole and data segments. >> +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo >> +# List all extents, we're interested here in prealloc extents that lie beyond >> +# the file's size. >> +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch > > That dumps raw block numbers into the golden output. _filter_fiemap > is probably needed here. Hum, just tried it and uploaded a v2. However I'm now noticing it doesn't do everything I had in mind. _filter_fiemap is not showing the extents falloc -k created, only a collapsed range of holes. So my intention is to verify not just holes, but also the extents created by 'falloc -k'. The following filter I just made locally gives me that: _filter_all_fiemap() { awk --posix ' $3 ~ /hole/ { print $1, $2, $3; next; } $3 ~ /[[:xdigit:]]*..[[:xdigit:]]/ { print $1, $2, "extent"; next; }' } (nicely printed/indented at https://friendpaste.com/1JtG5bts2Sz0LWhUutCpzE, as e-mail is not good for code pasting) Which gives me: 0: [0..191]: extent 1: [192..199]: extent 2: [200..231]: extent 3: [232..239]: extent 4: [240..287]: extent 5: [288..295]: extent 6: [296..487]: extent 7: [488..495]: extent 8: [496..519]: hole 9: [520..527]: extent 10: [528..583]: extent 11: [584..591]: extent 12: [592..2543]: extent 13: [2544..17575]: hole 14: [17576..21487]: extent Versus only (from _filter_fiemap): 0: [496..17575]: hole I couldn't find any existing similar filter. Is it ok to add this new filter? If so, does this name makes sense and does it make sense to add it to common/punch file or some other file? Thanks Dave > >> +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch >> +# List all hole and data segments. >> +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo >> +# List all extents, we're interested here in prealloc extents that lie beyond >> +# the file's size. >> +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch > > Same here. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From jlayton@redhat.com Wed Apr 16 09:42:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B91487F6A for ; Wed, 16 Apr 2014 09:42:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8EDDD304043 for ; Wed, 16 Apr 2014 07:42:38 -0700 (PDT) X-ASG-Debug-ID: 1397659357-04cbb06e9c90720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kEo73fxBru4YMoFW for ; Wed, 16 Apr 2014 07:42:37 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@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 s3GEg97Z031465 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 16 Apr 2014 10:42:10 -0400 Received: from tlielax.poochiereds.net (vpn-63-49.rdu2.redhat.com [10.10.63.49]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3GEg8RF013226; Wed, 16 Apr 2014 10:42:08 -0400 Date: Wed, 16 Apr 2014 10:42:07 -0400 From: Jeff Layton To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Peter Zijlstra , Ingo Molnar , Ming Lei , netdev@vger.kernel.org Subject: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts Message-ID: <20140416104207.75b044e8@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts In-Reply-To: <20140416033623.10604.69237.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII 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: 1397659357 X-Barracuda-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, 16 Apr 2014 14:03:35 +1000 NeilBrown wrote: > Loop-back NFS mounts are when the NFS client and server run on the > same host. > > The use-case for this is a high availability cluster with shared > storage. The shared filesystem is mounted on any one machine and > NFS-mounted on the others. > If the nfs server fails, some other node will take over that service, > and then it will have a loop-back NFS mount which needs to keep > working. > > This patch set addresses the "keep working" bit and specifically > addresses deadlocks and livelocks. > Allowing the fail-over itself to be deadlock free is a separate > challenge for another day. > > The short description of how this works is: > > deadlocks: > - Elevate PF_FSTRANS to apply globally instead of just in NFS and XFS. > PF_FSTRANS disables __GFP_NS in the same way that PF_MEMALLOC_NOIO > disables __GFP_IO. > - Set PF_FSTRANS in nfsd when handling requests related to > memory reclaim, or requests which could block requests related > to memory reclaim. > - Use lockdep to find all consequent deadlocks from some other > thread allocating memory while holding a lock that nfsd might > want. > - Fix those other deadlocks by setting PF_FSTRANS or using GFP_NOFS > as appropriate. > > livelocks: > - identify throttling during reclaim and bypass it when > PF_LESS_THROTTLE is set > - only set PF_LESS_THROTTLE for nfsd when handling write requests > from the local host. > > The last 12 patches address various deadlocks due to locking chains. > 11 were found by lockdep, 2 by testing. There is a reasonable chance > that there are more, I just need to exercise more code while > testing.... > > There is one issue that lockdep reports which I haven't fixed (I've > just hacked the code out for my testing). That issue relates to > freeze_super(). > I may not be interpreting the lockdep reports perfectly, but I think > they are basically saying that if I were to freeze a filesystem that > was exported to the local host, then we could end up deadlocking. > This is to be expected. The NFS filesystem would need to be frozen > first. I don't know how to tell lockdep that I know that is a problem > and I don't want to be warned about it. Suggestions welcome. > Until this is addressed I cannot really ask others to test the code > with lockdep enabled. > > There are more subsidiary places that I needed to add PF_FSTRANS than > I would have liked. The thought keeps crossing my mind that maybe we > can get rid of __GFP_FS and require that memory reclaim never ever > block on a filesystem. Then most of these patches go away. > > Now that writeback doesn't happen from reclaim (but from kswapd) much > of the calls from reclaim to FS are gone. > The ->releasepage call is the only one that I *know* causes me > problems so I'd like to just say that that must never block. I don't > really understand the consequences of that though. > There are a couple of other places where __GFP_FS is used and I'd need > to carefully analyze those. But if someone just said "no, that is > impossible", I could be happy and stick with the current approach.... > > I've cc:ed Peter Zijlstra and Ingo Molnar only on the lockdep-related > patches, Ming Lei only on the PF_MEMALLOC_NOIO related patches, > and net-dev only on the network-related patches. > There are probably other people I should CC. Apologies if I missed you. > I'll ensure better coverage if the nfs/mm/xfs people are reasonably happy. > > Comments, criticisms, etc most welcome. > > Thanks, > NeilBrown > I've only given this a once-over, but the basic concept seems a bit flawed. IIUC, the basic idea is to disallow allocations done in knfsd threads context from doing fs-based reclaim. This seems very heavy-handed, and like it could cause problems on a busy NFS server. Those sorts of servers are likely to have a lot of data in pagecache and thus we generally want to allow them to do do writeback when memory is tight. It's generally acceptable for knfsd to recurse into local filesystem code for writeback. What you want to avoid in this situation is reclaim on NFS filesystems that happen to be from knfsd on the same box. If you really want to fix this, what may make more sense is trying to plumb that information down more granularly. Maybe GFP_NONETFS and/or PF_NETFSTRANS flags? > > --- > > NeilBrown (19): > Promote current_{set,restore}_flags_nested from xfs to global. > lockdep: lockdep_set_current_reclaim_state should save old value > lockdep: improve scenario messages for RECLAIM_FS errors. > Make effect of PF_FSTRANS to disable __GFP_FS universal. > SUNRPC: track whether a request is coming from a loop-back interface. > nfsd: set PF_FSTRANS for nfsd threads. > nfsd and VM: use PF_LESS_THROTTLE to avoid throttle in shrink_inactive_list. > Set PF_FSTRANS while write_cache_pages calls ->writepage > XFS: ensure xfs_file_*_read cannot deadlock in memory allocation. > NET: set PF_FSTRANS while holding sk_lock > FS: set PF_FSTRANS while holding mmap_sem in exec.c > NET: set PF_FSTRANS while holding rtnl_lock > MM: set PF_FSTRANS while allocating per-cpu memory to avoid deadlock. > driver core: set PF_FSTRANS while holding gdp_mutex > nfsd: set PF_FSTRANS when client_mutex is held. > VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. > VFS: set PF_FSTRANS while namespace_sem is held. > nfsd: set PF_FSTRANS during nfsd4_do_callback_rpc. > XFS: set PF_FSTRANS while ilock is held in xfs_free_eofblocks > > > drivers/base/core.c | 3 ++ > drivers/base/power/runtime.c | 6 ++--- > drivers/block/nbd.c | 6 ++--- > drivers/md/dm-bufio.c | 6 ++--- > drivers/md/dm-ioctl.c | 6 ++--- > drivers/mtd/nand/nandsim.c | 28 ++++++--------------- > drivers/scsi/iscsi_tcp.c | 6 ++--- > drivers/usb/core/hub.c | 6 ++--- > fs/dcache.c | 4 ++- > fs/exec.c | 6 +++++ > fs/fs-writeback.c | 5 ++-- > fs/namespace.c | 4 +++ > fs/nfs/file.c | 3 +- > fs/nfsd/nfs4callback.c | 5 ++++ > fs/nfsd/nfs4state.c | 3 ++ > fs/nfsd/nfssvc.c | 24 ++++++++++++++---- > fs/nfsd/vfs.c | 6 +++++ > fs/xfs/kmem.h | 2 -- > fs/xfs/xfs_aops.c | 7 ----- > fs/xfs/xfs_bmap_util.c | 4 +++ > fs/xfs/xfs_file.c | 12 +++++++++ > fs/xfs/xfs_linux.h | 7 ----- > include/linux/lockdep.h | 8 +++--- > include/linux/sched.h | 32 +++++++++--------------- > include/linux/sunrpc/svc.h | 2 ++ > include/linux/sunrpc/svc_xprt.h | 1 + > include/net/sock.h | 1 + > kernel/locking/lockdep.c | 51 ++++++++++++++++++++++++++++----------- > kernel/softirq.c | 6 ++--- > mm/migrate.c | 9 +++---- > mm/page-writeback.c | 3 ++ > mm/page_alloc.c | 18 ++++++++------ > mm/percpu.c | 4 +++ > mm/slab.c | 2 ++ > mm/slob.c | 2 ++ > mm/slub.c | 1 + > mm/vmscan.c | 31 +++++++++++++++--------- > net/core/dev.c | 6 ++--- > net/core/rtnetlink.c | 9 ++++++- > net/core/sock.c | 8 ++++-- > net/sunrpc/sched.c | 5 ++-- > net/sunrpc/svc.c | 6 +++++ > net/sunrpc/svcsock.c | 10 ++++++++ > net/sunrpc/xprtrdma/transport.c | 5 ++-- > net/sunrpc/xprtsock.c | 17 ++++++++----- > 45 files changed, 247 insertions(+), 149 deletions(-) > -- Jeff Layton From jlayton@poochiereds.net Wed Apr 16 09:47:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 19AE77F75 for ; Wed, 16 Apr 2014 09:47:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F311F8F804B for ; Wed, 16 Apr 2014 07:47:07 -0700 (PDT) X-ASG-Debug-ID: 1397659625-04cb6c243890bf0001-NocioJ Received: from mail-qa0-f54.google.com (mail-qa0-f54.google.com [209.85.216.54]) by cuda.sgi.com with ESMTP id HnGzPbeHE1auBoe9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 07:47:05 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.54 Received: by mail-qa0-f54.google.com with SMTP id w8so10910483qac.27 for ; Wed, 16 Apr 2014 07:47:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=rDfERvPPoflwP44/Uf/Ph4XN4dJZ/36Epqm1g6y8i/c=; b=hJxgocacYEntEkNmQrgQBQhfdA6L2DD5N/utXbaZST9Q04GVtTHB9AfD25AXQEMK7j fA5mU6Dj5lv9XWrmfkcFvmzFIGOj5Rn2cvP8+MHkhqSQ2KFo4LsXDz3Ij8PhRZAbhJ1j 7GCBcQbKB/9YU2SJPX67nSDVUjk6QAdVka9TQLT5pAH31E/Q2kRtUxZTrJotbuPcANs7 98k+VIlYrmvhs9q3euiCbZioEJiwGr/Gfys4PVR2805cV9R48O4fWL8Tor2ApJdB69pB Im5Wbt7tezzMSCXS51gfsB2/HnS3cPyENwJvIx2evtK/EiaV+lEbYbAwV9k/GYVnlFJr H9kw== X-Gm-Message-State: ALoCoQlQxhqHCuQdPxwC0hNS4HmKqpWjBWS0i/E/UyFfKiN/smsNDu3yhke4/EEey16tUTYt7mAO X-Received: by 10.140.18.175 with SMTP id 44mr2876333qgf.105.1397659624764; Wed, 16 Apr 2014 07:47:04 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id 21sm28874874qgh.23.2014.04.16.07.47.04 for (version=SSLv3 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Apr 2014 07:47:04 -0700 (PDT) Date: Wed, 16 Apr 2014 10:47:02 -0400 From: Jeff Layton To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, netdev@vger.kernel.org Subject: Re: [PATCH 05/19] SUNRPC: track whether a request is coming from a loop-back interface. Message-ID: <20140416104702.264cde48@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: [PATCH 05/19] SUNRPC: track whether a request is coming from a loop-back interface. In-Reply-To: <20140416040336.10604.14822.stgit@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.14822.stgit@notabene.brown> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qa0-f54.google.com[209.85.216.54] X-Barracuda-Start-Time: 1397659625 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, 16 Apr 2014 14:03:36 +1000 NeilBrown wrote: > If an incoming NFS request is coming from the local host, then > nfsd will need to perform some special handling. So detect that > possibility and make the source visible in rq_local. > > Signed-off-by: NeilBrown > --- > include/linux/sunrpc/svc.h | 1 + > include/linux/sunrpc/svc_xprt.h | 1 + > net/sunrpc/svcsock.c | 10 ++++++++++ > 3 files changed, 12 insertions(+) > > diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h > index 04e763221246..a0dbbd1e00e9 100644 > --- a/include/linux/sunrpc/svc.h > +++ b/include/linux/sunrpc/svc.h > @@ -254,6 +254,7 @@ struct svc_rqst { > u32 rq_prot; /* IP protocol */ > unsigned short > rq_secure : 1; /* secure port */ > + unsigned short rq_local : 1; /* local request */ > > void * rq_argp; /* decoded arguments */ > void * rq_resp; /* xdr'd results */ > diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h > index b05963f09ebf..b99bdfb0fcf9 100644 > --- a/include/linux/sunrpc/svc_xprt.h > +++ b/include/linux/sunrpc/svc_xprt.h > @@ -63,6 +63,7 @@ struct svc_xprt { > #define XPT_DETACHED 10 /* detached from tempsocks list */ > #define XPT_LISTENER 11 /* listening endpoint */ > #define XPT_CACHE_AUTH 12 /* cache auth info */ > +#define XPT_LOCAL 13 /* connection from loopback interface */ > > struct svc_serv *xpt_server; /* service for transport */ > atomic_t xpt_reserved; /* space on outq that is rsvd */ > diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c > index b6e59f0a9475..193115fe968c 100644 > --- a/net/sunrpc/svcsock.c > +++ b/net/sunrpc/svcsock.c > @@ -811,6 +811,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) > struct socket *newsock; > struct svc_sock *newsvsk; > int err, slen; > + struct dst_entry *dst; > RPC_IFDEBUG(char buf[RPC_MAX_ADDRBUFLEN]); > > dprintk("svc: tcp_accept %p sock %p\n", svsk, sock); > @@ -867,6 +868,14 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt) > } > svc_xprt_set_local(&newsvsk->sk_xprt, sin, slen); > > + clear_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); > + rcu_read_lock(); > + dst = rcu_dereference(newsock->sk->sk_dst_cache); > + if (dst && dst->dev && > + (dst->dev->features & NETIF_F_LOOPBACK)) > + set_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); > + rcu_read_unlock(); > + In the use-case you describe, the client is unlikely to have mounted "localhost", but is more likely to be mounting a floating address in the cluster. Will this flag end up being set in such a situation? It looks like NETIF_F_LOOPBACK isn't set on all adapters -- mostly on "lo" and a few others that support MAC-LOOPBACK. > if (serv->sv_stats) > serv->sv_stats->nettcpconn++; > > @@ -1112,6 +1121,7 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) > > rqstp->rq_xprt_ctxt = NULL; > rqstp->rq_prot = IPPROTO_TCP; > + rqstp->rq_local = !!test_bit(XPT_LOCAL, &svsk->sk_xprt.xpt_flags); > > p = (__be32 *)rqstp->rq_arg.head[0].iov_base; > calldir = p[1]; > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Jeff Layton From Paul.Gortmaker@windriver.com Wed Apr 16 11:09:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 32DA429DFD for ; Wed, 16 Apr 2014 11:09:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1940E304077 for ; Wed, 16 Apr 2014 09:09:44 -0700 (PDT) X-ASG-Debug-ID: 1397664572-04bdf045539e600001-NocioJ Received: from mail.windriver.com (mail.windriver.com [147.11.1.11]) by cuda.sgi.com with ESMTP id mTMCp0YIhg77zK1C (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 09:09:33 -0700 (PDT) X-Barracuda-Envelope-From: Paul.Gortmaker@windriver.com X-Barracuda-Apparent-Source-IP: 147.11.1.11 Received: from ALA-HCB.corp.ad.wrs.com (ala-hcb.corp.ad.wrs.com [147.11.189.41]) by mail.windriver.com (8.14.5/8.14.5) with ESMTP id s3GG9O55027220 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL); Wed, 16 Apr 2014 09:09:25 -0700 (PDT) Received: from [128.224.56.57] (128.224.56.57) by ALA-HCB.corp.ad.wrs.com (147.11.189.41) with Microsoft SMTP Server id 14.3.169.1; Wed, 16 Apr 2014 09:09:24 -0700 Message-ID: <534EAB41.60901@windriver.com> Date: Wed, 16 Apr 2014 12:09:37 -0400 From: Paul Gortmaker User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner CC: , "linux-next@vger.kernel.org" Subject: new 64 bit math link fail in xfs in linux-next today Content-Type: text/plain; charset="ISO-8859-1" X-ASG-Orig-Subj: new 64 bit math link fail in xfs in linux-next today Content-Transfer-Encoding: 7bit X-Originating-IP: [128.224.56.57] X-Barracuda-Connect: mail.windriver.com[147.11.1.11] X-Barracuda-Start-Time: 1397664572 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_SA717 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4971 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 Hi Dave, Not sure if this has been reported yet, but this new failure showed up in the xtensa link of today's linux-next builds. http://kisskb.ellerman.id.au/kisskb/buildresult/10938384/ Paul. From viro@ftp.linux.org.uk Wed Apr 16 11:37:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 65C3D7F61 for ; Wed, 16 Apr 2014 11:37:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 57272304062 for ; Wed, 16 Apr 2014 09:37:47 -0700 (PDT) X-ASG-Debug-ID: 1397666264-04cbb06e9c9dbe0001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id hOQLax1QNLKd42y6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 09:37:45 -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 1WaSqD-0001Fy-G6; Wed, 16 Apr 2014 16:37:41 +0000 Date: Wed, 16 Apr 2014 17:37:41 +0100 From: Al Viro To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. Message-ID: <20140416163741.GY18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: [PATCH 17/19] VFS: set PF_FSTRANS while namespace_sem is held. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.86740.stgit@notabene.brown> <20140416044618.GX18016@ZenIV.linux.org.uk> <20140416155230.4d02e4b9@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416155230.4d02e4b9@notabene.brown> 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: 1397666265 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4972 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 03:52:30PM +1000, NeilBrown wrote: > So something like this? I put that in to my testing instead. Something like this, yes... And TBH I would prefer the same approach elsewhere - this kind of hidden state makes it hard to do any kind of analysis. Put it that way - the simplest situation is when the allocation flags depend only on the call site. Next one is when it's a function of call chain - somewhat harder to review. And the worst is when it's a function of previous history of execution - not just the call chain, but the things that had been called (and returned) prior to that one. How many of those locations need to be of the third kind? All fs/namespace.c ones are of the first one... From andreas.gruenbacher@linbit.com Wed Apr 16 12:29:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7EF6F7F61 for ; Wed, 16 Apr 2014 12:29:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 720B78F8033 for ; Wed, 16 Apr 2014 10:29:32 -0700 (PDT) X-ASG-Debug-ID: 1397669370-04cb6c2437a3730001-NocioJ Received: from zimbra13.linbit.com (zimbra13.linbit.com [212.69.166.240]) by cuda.sgi.com with ESMTP id FRHEmmxFQSz3Fx8U for ; Wed, 16 Apr 2014 10:29:30 -0700 (PDT) X-Barracuda-Envelope-From: andreas.gruenbacher@linbit.com X-Barracuda-Apparent-Source-IP: 212.69.166.240 Received: from localhost (localhost [127.0.0.1]) by zimbra13.linbit.com (Postfix) with ESMTP id EF7482B4CC7; Wed, 16 Apr 2014 19:29:29 +0200 (CEST) Received: from zimbra13.linbit.com ([127.0.0.1]) by localhost (zimbra13.linbit.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id VYuqpixgK8qy; Wed, 16 Apr 2014 19:29:29 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by zimbra13.linbit.com (Postfix) with ESMTP id C8C9B2B4CDC; Wed, 16 Apr 2014 19:29:29 +0200 (CEST) X-Virus-Scanned: amavisd-new at linbit.com Received: from zimbra13.linbit.com ([127.0.0.1]) by localhost (zimbra13.linbit.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id ot5GrlHsy_8z; Wed, 16 Apr 2014 19:29:29 +0200 (CEST) Received: from zimbra13.linbit.com (zimbra13.linbit.com [212.69.166.240]) by zimbra13.linbit.com (Postfix) with ESMTP id A55E52B4CC7; Wed, 16 Apr 2014 19:29:29 +0200 (CEST) Date: Wed, 16 Apr 2014 19:29:29 +0200 (CEST) From: Andreas Gruenbacher To: Christoph Hellwig Cc: Brian Foster , linux-man@vger.kernel.org, xfs@oss.sgi.com, linux-security-module@vger.kernel.org, Al Viro , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Message-ID: <359356562.473582.1397669369258.JavaMail.zimbra@linbit.com> In-Reply-To: <20140416111402.GA32350@infradead.org> References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> <20140410121947.GA14124@bfoster.bfoster> <20140410122944.GA6579@infradead.org> <20140415175228.GE26404@infradead.org> <1188577823.463241.1397590262478.JavaMail.zimbra@linbit.com> <20140416111402.GA32350@infradead.org> Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [178.115.133.221] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF24 (Linux)/8.0.6_GA_5922) Thread-Topic: fix tmpfile/selinux deadlock and initialize security/acl Thread-Index: U3M9y4+uPS+Z7wIWaOE62k1kiPmVWA== X-Barracuda-Connect: zimbra13.linbit.com[212.69.166.240] X-Barracuda-Start-Time: 1397669370 X-Barracuda-URL: http://192.48.176.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.3.4974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... On Wed, Apr 16, 2014 at 04:14:02AM -0700, Christoph Hellwig wrote: > On Tue, Apr 15, 2014 at 09:31:02PM +0200, Andreas Gruenbacher wrote: > > from how O_TMPFILE is documented right now [*], creating such a file and > > then linking it into the namespace is one of the obvious use cases. > > Btw, I think the man page is wrong - given that the tmpfile is not > visible in the namespace it is obviously not created in the directory. > The directory passed in is just a handle for the filesystem it should be > created in. I don't agree. If the file is created with O_TMPFILE | O_EXCL, it is clear that the file will never be linked into the namespace. Even then, there are operations which are affected by the inode permissions and label of the anonymous file, and those should still behave reasonably. In this context, I would expect them to behave as if the file was actually created in the specified directory, not in the file system root or "nowhere" with no clearly defined permissions and security label. If the file is created without O_EXCL, then it is clear that the file can later become part of the namespace. In that case, I would also expect the file to be initialized in the context of the specified directory. The file can then be filled with data, permissions and other attributes can be changed if desired, and then the anonymous file can be linked into that directory. > Michael, should I send you an update for this, or do you want to do it > yourself as you can probably come up with better language anyway? > > > The > > intent seems to be to make it seem like the file was created and populated > > atomically, possibly with inherited permissions and all. > > I think this > > behavior require that the O_TMPFILE file inherits from the directory it > > was "created" in. > > > > Adding code to achieve the effect of create-time inheritance at link > > time, only for O_TMPFILE files or files without any links, doesn't seem > > reasonable to me: it would duplicate create code in the link code path, > > and it would make it harder to override inherited permissions or labels. > > Inheriting any ACL on creating an anonymous file seems utterly wrong. Why? > Inheriting on link seems somewhat more sensible and not too bad in terms > of code, but very confusing in terms of semantics. I think the best > method is to make sure it simply does not inherit any ACL and document > that clearly. Again, this approach would make it almost impossible to use O_TMPFILE as a way to atomically create and initialize a file with permission and security label inheritance. This would severely limit the usefulness of O_TMPFILE. > > (Trying to fake inheritance by reimplementing it in user space seems like > > a much worse idea still.) > > We don't fake inheritance when linking any other file either. And > creating a file in a /tmp without any ACL and then linking it into the > filesystem already is very common today. Well, creating a file in /tmp and moving it somewhere else often doesn't even work because of file system boundaries, and sometimes it simply is the wrong thing to do: When the intent is to "create a new file in a directory", such as when saving to a new file in an editor, the result should be as if the file was actually created in that directory. Creating the file in /tmp and then moving it to where it should end up is simply wrong. When the intent is to "move a file from here to there", the file should keep all its attributes, including permissions and security label. It should make no difference in result whether the file could actually be moved or if it had to be copied across file system boundaries. Thanks, Andreas From sandeen@sandeen.net Wed Apr 16 12:40:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 751DF7F6D for ; Wed, 16 Apr 2014 12:40:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 569F68F8064 for ; Wed, 16 Apr 2014 10:40:01 -0700 (PDT) X-ASG-Debug-ID: 1397669999-04cbb06e9aa4890001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FTPVsBy8Qp3AfIPZ for ; Wed, 16 Apr 2014 10:40:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C21A963C5FD4 for ; Wed, 16 Apr 2014 12:39:59 -0500 (CDT) Message-ID: <534EC073.8090006@sandeen.net> Date: Wed, 16 Apr 2014 12:40:03 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/2] xfs: clean up return handling X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH 0/2] xfs: clean up return handling 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: 1397670000 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 2 patches here: First of all, "return" is not a function. "return(EIO);" is silly. "return (EIO);" is even sillier. Stop it. Second of all, XFS_ERROR was designed long ago to trap return values, but it's not runtime configurable, it's not consistently used, and we can do the same thing today with systemtap. So nuke that macro, too. This is a *lot* of churn. It'll make merging across this change hard. So we might want to batch this up with another suggestion of Dave's, to migrate all of xfs to the Linux convention of negative error returns everywhere, so we don't have two nasty points to merge across - that'd be fine with me. But anyway, here it is for now. For posterity, the first patch was generated with: perl -p -i -e 's/return \(([a-zA-Z0-9]*?)\)/return $1/g' *.c perl -p -i -e 's/return\(([a-zA-Z0-9]*?)\)/return $1/g' *.c and the 2nd with: perl -p -i -e 's/return\(XFS_ERROR\(([a-zA-Z0-9]*?)\)\)/return XFS_ERROR($1)/g' *.c perl -p -i -e 's/return \(XFS_ERROR\(([a-zA-Z0-9]*?)\)\)/return XFS_ERROR($1)/g' *.c (Yes, I know I could have done it w/ one regexp - so sue me) ;) -Eric From sandeen@sandeen.net Wed Apr 16 12:44:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E14037F75 for ; Wed, 16 Apr 2014 12:44:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D29A9304089 for ; Wed, 16 Apr 2014 10:44:21 -0700 (PDT) X-ASG-Debug-ID: 1397670257-04cb6c2436a51e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HgtCjeBYLd7c9t1t for ; Wed, 16 Apr 2014 10:44:17 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3705363C5FD4 for ; Wed, 16 Apr 2014 12:44:16 -0500 (CDT) Message-ID: <534EC173.7010903@sandeen.net> Date: Wed, 16 Apr 2014 12:44:19 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 1/2] xfs: return is not a function References: <534EC073.8090006@sandeen.net> X-ASG-Orig-Subj: [PATCH 1/2] xfs: return is not a function In-Reply-To: <534EC073.8090006@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397670257 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=INFO_TLD X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain return is not a function. "return(EIO);" is silly; "return (EIO);" moreso. return is not a function. Nuke the pointless parens. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 01b6a01..95de302 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -151,7 +151,7 @@ xfs_attr_get_int( if (error == EEXIST) error = 0; - return(error); + return error; } int @@ -169,7 +169,7 @@ xfs_attr_get( XFS_STATS_INC(xs_attr_get); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return(EIO); + return EIO; error = xfs_attr_name_to_xname(&xname, name); if (error) @@ -178,7 +178,7 @@ xfs_attr_get( lock_mode = xfs_ilock_attr_map_shared(ip); error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); xfs_iunlock(ip, lock_mode); - return(error); + return error; } /* @@ -254,7 +254,7 @@ xfs_attr_set_int( XFS_ATTR_SF_ENTSIZE_BYNAME(name->len, valuelen); if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) - return(error); + return error; } /* @@ -303,7 +303,7 @@ xfs_attr_set_int( error = xfs_trans_reserve(args.trans, &tres, args.total, 0); if (error) { xfs_trans_cancel(args.trans, 0); - return(error); + return error; } xfs_ilock(dp, XFS_ILOCK_EXCL); @@ -313,7 +313,7 @@ xfs_attr_set_int( if (error) { xfs_iunlock(dp, XFS_ILOCK_EXCL); xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES); - return (error); + return error; } xfs_trans_ijoin(args.trans, dp, 0); @@ -426,14 +426,14 @@ xfs_attr_set_int( error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; out: if (args.trans) xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; } int @@ -450,7 +450,7 @@ xfs_attr_set( XFS_STATS_INC(xs_attr_set); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return (EIO); + return EIO; error = xfs_attr_name_to_xname(&xname, name); if (error) @@ -524,7 +524,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) XFS_ATTRRM_SPACE_RES(mp), 0); if (error) { xfs_trans_cancel(args.trans, 0); - return(error); + return error; } xfs_ilock(dp, XFS_ILOCK_EXCL); @@ -574,14 +574,14 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; out: if (args.trans) xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; } int @@ -596,7 +596,7 @@ xfs_attr_remove( XFS_STATS_INC(xs_attr_remove); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return (EIO); + return EIO; error = xfs_attr_name_to_xname(&xname, name); if (error) @@ -630,27 +630,27 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) retval = xfs_attr_shortform_lookup(args); if ((args->flags & ATTR_REPLACE) && (retval == ENOATTR)) { - return(retval); + return retval; } else if (retval == EEXIST) { if (args->flags & ATTR_CREATE) - return(retval); + return retval; retval = xfs_attr_shortform_remove(args); ASSERT(retval == 0); } if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || args->valuelen >= XFS_ATTR_SF_ENTSIZE_MAX) - return(XFS_ERROR(ENOSPC)); + return XFS_ERROR(ENOSPC); newsize = XFS_ATTR_SF_TOTSIZE(args->dp); newsize += XFS_ATTR_SF_ENTSIZE_BYNAME(args->namelen, args->valuelen); forkoff = xfs_attr_shortform_bytesfit(args->dp, newsize); if (!forkoff) - return(XFS_ERROR(ENOSPC)); + return XFS_ERROR(ENOSPC); xfs_attr_shortform_add(args, forkoff); - return(0); + return 0; } @@ -726,7 +726,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) ASSERT(committed); args->trans = NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } /* @@ -742,13 +742,13 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ error = xfs_trans_roll(&args->trans, dp); if (error) - return (error); + return error; /* * Fob the whole rest of the problem off on the Btree code. */ error = xfs_attr_node_addname(args); - return(error); + return error; } /* @@ -757,7 +757,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ error = xfs_trans_roll(&args->trans, dp); if (error) - return (error); + return error; /* * If there was an out-of-line value, allocate the blocks we @@ -768,7 +768,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) if (args->rmtblkno > 0) { error = xfs_attr_rmtval_set(args); if (error) - return(error); + return error; } /* @@ -784,7 +784,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) */ error = xfs_attr3_leaf_flipflags(args); if (error) - return(error); + return error; /* * Dismantle the "old" attribute/value pair by removing @@ -797,7 +797,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) if (args->rmtblkno) { error = xfs_attr_rmtval_remove(args); if (error) - return(error); + return error; } /* @@ -827,7 +827,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) ASSERT(committed); args->trans = NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } /* @@ -1107,7 +1107,7 @@ restart: if (args->rmtblkno > 0) { error = xfs_attr_rmtval_set(args); if (error) - return(error); + return error; } /* @@ -1136,7 +1136,7 @@ restart: if (args->rmtblkno) { error = xfs_attr_rmtval_remove(args); if (error) - return(error); + return error; } /* @@ -1211,8 +1211,8 @@ out: if (state) xfs_da_state_free(state); if (error) - return(error); - return(retval); + return error; + return retval; } /* @@ -1376,7 +1376,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) out: xfs_da_state_free(state); - return(error); + return error; } /* @@ -1424,7 +1424,7 @@ xfs_attr_fillstate(xfs_da_state_t *state) } } - return(0); + return 0; } /* @@ -1455,7 +1455,7 @@ xfs_attr_refillstate(xfs_da_state_t *state) blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); if (error) - return(error); + return error; } else { blk->bp = NULL; } @@ -1474,13 +1474,13 @@ xfs_attr_refillstate(xfs_da_state_t *state) blk->blkno, blk->disk_blkno, &blk->bp, XFS_ATTR_FORK); if (error) - return(error); + return error; } else { blk->bp = NULL; } } - return(0); + return 0; } /* @@ -1536,5 +1536,5 @@ xfs_attr_node_get(xfs_da_args_t *args) } xfs_da_state_free(state); - return(retval); + return retval; } diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 09480c5..b39e588 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -76,7 +76,7 @@ xfs_attr3_leaf_freextent( error = xfs_bmapi_read(dp, (xfs_fileoff_t)tblkno, tblkcnt, &map, &nmap, XFS_BMAPI_ATTRFORK); if (error) { - return(error); + return error; } ASSERT(nmap == 1); ASSERT(map.br_startblock != DELAYSTARTBLOCK); @@ -102,14 +102,14 @@ xfs_attr3_leaf_freextent( */ error = xfs_trans_roll(trans, dp); if (error) - return (error); + return error; } tblkno += map.br_blockcount; tblkcnt -= map.br_blockcount; } - return(0); + return 0; } /* @@ -256,7 +256,7 @@ xfs_attr3_node_inactive( error = xfs_da3_node_read(*trans, dp, child_fsb, -2, &child_bp, XFS_ATTR_FORK); if (error) - return(error); + return error; if (child_bp) { /* save for re-read later */ child_blkno = XFS_BUF_ADDR(child_bp); @@ -414,7 +414,7 @@ xfs_attr_inactive(xfs_inode_t *dp) error = xfs_trans_reserve(trans, &M_RES(mp)->tr_attrinval, 0, 0); if (error) { xfs_trans_cancel(trans, 0); - return(error); + return error; } xfs_ilock(dp, XFS_ILOCK_EXCL); @@ -443,10 +443,10 @@ xfs_attr_inactive(xfs_inode_t *dp) error = xfs_trans_commit(trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; out: xfs_trans_cancel(trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; } diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index fe9587f..b9d9170 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -546,7 +546,7 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) break; } if (i == end) - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); /* * Fix up the attribute fork data, covering the hole @@ -581,7 +581,7 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) xfs_sbversion_add_attr2(mp, args->trans); - return(0); + return 0; } /* @@ -610,9 +610,9 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) continue; if (!xfs_attr_namesp_match(args->flags, sfe->flags)) continue; - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } /* @@ -639,18 +639,18 @@ xfs_attr_shortform_getvalue(xfs_da_args_t *args) continue; if (args->flags & ATTR_KERNOVAL) { args->valuelen = sfe->valuelen; - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } if (args->valuelen < sfe->valuelen) { args->valuelen = sfe->valuelen; - return(XFS_ERROR(ERANGE)); + return XFS_ERROR(ERANGE); } args->valuelen = sfe->valuelen; memcpy(args->value, &sfe->nameval[args->namelen], args->valuelen); - return(XFS_ERROR(EEXIST)); + return XFS_ERROR(EEXIST); } - return(XFS_ERROR(ENOATTR)); + return XFS_ERROR(ENOATTR); } /* @@ -739,7 +739,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) out: kmem_free(tmpbuffer); - return(error); + return error; } /* @@ -767,12 +767,12 @@ xfs_attr_shortform_allfit( if (entry->flags & XFS_ATTR_INCOMPLETE) continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) - return(0); + return 0; name_loc = xfs_attr3_leaf_name_local(leaf, i); if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) - return(0); + return 0; if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) - return(0); + return 0; bytes += sizeof(struct xfs_attr_sf_entry) - 1 + name_loc->namelen + be16_to_cpu(name_loc->valuelen); @@ -1014,10 +1014,10 @@ xfs_attr3_leaf_split( ASSERT(oldblk->magic == XFS_ATTR_LEAF_MAGIC); error = xfs_da_grow_inode(state->args, &blkno); if (error) - return(error); + return error; error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp); if (error) - return(error); + return error; newblk->blkno = blkno; newblk->magic = XFS_ATTR_LEAF_MAGIC; @@ -1028,7 +1028,7 @@ xfs_attr3_leaf_split( xfs_attr3_leaf_rebalance(state, oldblk, newblk); error = xfs_da3_blk_link(state, oldblk, newblk); if (error) - return(error); + return error; /* * Save info on "old" attribute for "atomic rename" ops, leaf_add() @@ -1050,7 +1050,7 @@ xfs_attr3_leaf_split( */ oldblk->hashval = xfs_attr_leaf_lasthash(oldblk->bp, NULL); newblk->hashval = xfs_attr_leaf_lasthash(newblk->bp, NULL); - return(error); + return error; } /* @@ -1701,7 +1701,7 @@ xfs_attr3_leaf_toosmall( ichdr.usedbytes; if (bytes > (state->blocksize >> 1)) { *action = 0; /* blk over 50%, don't try to join */ - return(0); + return 0; } /* @@ -1720,7 +1720,7 @@ xfs_attr3_leaf_toosmall( error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) - return(error); + return error; if (retval) { *action = 0; } else { @@ -1749,7 +1749,7 @@ xfs_attr3_leaf_toosmall( error = xfs_attr3_leaf_read(state->args->trans, state->args->dp, blkno, -1, &bp); if (error) - return(error); + return error; xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); @@ -1765,7 +1765,7 @@ xfs_attr3_leaf_toosmall( } if (i >= 2) { *action = 0; - return(0); + return 0; } /* @@ -1781,13 +1781,13 @@ xfs_attr3_leaf_toosmall( 0, &retval); } if (error) - return(error); + return error; if (retval) { *action = 0; } else { *action = 1; } - return(0); + return 0; } /* @@ -2486,7 +2486,7 @@ xfs_attr3_leaf_clearflag( */ error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) - return(error); + return error; leaf = bp->b_addr; entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; @@ -2553,7 +2553,7 @@ xfs_attr3_leaf_setflag( */ error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); if (error) - return(error); + return error; leaf = bp->b_addr; #ifdef DEBUG diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 01db96f..3e9a65a 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -52,7 +52,7 @@ xfs_attr_shortform_compare(const void *a, const void *b) if (sa->hash < sb->hash) { return(-1); } else if (sa->hash > sb->hash) { - return(1); + return 1; } else { return(sa->entno - sb->entno); } @@ -86,7 +86,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) sf = (xfs_attr_shortform_t *)dp->i_afp->if_u1.if_data; ASSERT(sf != NULL); if (!sf->hdr.count) - return(0); + return 0; cursor = context->cursor; ASSERT(cursor != NULL); @@ -124,7 +124,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) sfe = XFS_ATTR_SF_NEXTENTRY(sfe); } trace_xfs_attr_list_sf_all(context); - return(0); + return 0; } /* do no more for a search callback */ @@ -188,7 +188,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) } if (i == nsbuf) { kmem_free(sbuf); - return(0); + return 0; } /* @@ -213,7 +213,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) } kmem_free(sbuf); - return(0); + return 0; } STATIC int @@ -244,7 +244,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) error = xfs_da3_node_read(NULL, dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if ((error != 0) && (error != EFSCORRUPTED)) - return(error); + return error; if (bp) { struct xfs_attr_leaf_entry *entries; @@ -295,7 +295,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) cursor->blkno, -1, &bp, XFS_ATTR_FORK); if (error) - return(error); + return error; node = bp->b_addr; magic = be16_to_cpu(node->hdr.info.magic); if (magic == XFS_ATTR_LEAF_MAGIC || @@ -614,7 +614,7 @@ xfs_attr_list( * Validate the cursor. */ if (cursor->pad1 || cursor->pad2) - return(XFS_ERROR(EINVAL)); + return XFS_ERROR(EINVAL); if ((cursor->initted == 0) && (cursor->hashval || cursor->blkno || cursor->offset)) return XFS_ERROR(EINVAL); diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 6e37823..44a57c8 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -448,7 +448,7 @@ xfs_attr_rmtval_set( ASSERT(committed); args->trans = NULL; xfs_bmap_cancel(args->flist); - return(error); + return error; } /* @@ -469,7 +469,7 @@ xfs_attr_rmtval_set( */ error = xfs_trans_roll(&args->trans, dp); if (error) - return (error); + return error; } /* @@ -494,7 +494,7 @@ xfs_attr_rmtval_set( blkcnt, &map, &nmap, XFS_BMAPI_ATTRFORK); if (error) - return(error); + return error; ASSERT(nmap == 1); ASSERT((map.br_startblock != DELAYSTARTBLOCK) && (map.br_startblock != HOLESTARTBLOCK)); @@ -559,7 +559,7 @@ xfs_attr_rmtval_remove( error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, blkcnt, &map, &nmap, XFS_BMAPI_ATTRFORK); if (error) - return(error); + return error; ASSERT(nmap == 1); ASSERT((map.br_startblock != DELAYSTARTBLOCK) && (map.br_startblock != HOLESTARTBLOCK)); @@ -618,7 +618,7 @@ xfs_attr_rmtval_remove( */ error = xfs_trans_roll(&args->trans, args->dp); if (error) - return (error); + return error; } - return(0); + return 0; } diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 6cc5f67..e0588bd 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -315,7 +315,7 @@ xfs_da3_node_create( error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, whichfork); if (error) - return(error); + return error; bp->b_ops = &xfs_da3_node_buf_ops; xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); node = bp->b_addr; @@ -337,7 +337,7 @@ xfs_da3_node_create( XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size)); *bpp = bp; - return(0); + return 0; } /* @@ -386,7 +386,7 @@ xfs_da3_split( case XFS_ATTR_LEAF_MAGIC: error = xfs_attr3_leaf_split(state, oldblk, newblk); if ((error != 0) && (error != ENOSPC)) { - return(error); /* GROT: attr is inconsistent */ + return error; /* GROT: attr is inconsistent */ } if (!error) { addblk = newblk; @@ -408,7 +408,7 @@ xfs_da3_split( &state->extrablk); } if (error) - return(error); /* GROT: attr inconsistent */ + return error; /* GROT: attr inconsistent */ addblk = newblk; break; case XFS_DIR2_LEAFN_MAGIC: @@ -422,7 +422,7 @@ xfs_da3_split( max - i, &action); addblk->bp = NULL; if (error) - return(error); /* GROT: dir is inconsistent */ + return error; /* GROT: dir is inconsistent */ /* * Record the newly split block for the next time thru? */ @@ -439,7 +439,7 @@ xfs_da3_split( xfs_da3_fixhashpath(state, &state->path); } if (!addblk) - return(0); + return 0; /* * Split the root node. @@ -449,7 +449,7 @@ xfs_da3_split( error = xfs_da3_root_split(state, oldblk, addblk); if (error) { addblk->bp = NULL; - return(error); /* GROT: dir is inconsistent */ + return error; /* GROT: dir is inconsistent */ } /* @@ -492,7 +492,7 @@ xfs_da3_split( sizeof(node->hdr.info))); } addblk->bp = NULL; - return(0); + return 0; } /* @@ -670,18 +670,18 @@ xfs_da3_node_split( */ error = xfs_da_grow_inode(state->args, &blkno); if (error) - return(error); /* GROT: dir is inconsistent */ + return error; /* GROT: dir is inconsistent */ error = xfs_da3_node_create(state->args, blkno, treelevel, &newblk->bp, state->args->whichfork); if (error) - return(error); /* GROT: dir is inconsistent */ + return error; /* GROT: dir is inconsistent */ newblk->blkno = blkno; newblk->magic = XFS_DA_NODE_MAGIC; xfs_da3_node_rebalance(state, oldblk, newblk); error = xfs_da3_blk_link(state, oldblk, newblk); if (error) - return(error); + return error; *result = 1; } else { *result = 0; @@ -721,7 +721,7 @@ xfs_da3_node_split( } } - return(0); + return 0; } /* @@ -963,9 +963,9 @@ xfs_da3_join( case XFS_ATTR_LEAF_MAGIC: error = xfs_attr3_leaf_toosmall(state, &action); if (error) - return(error); + return error; if (action == 0) - return(0); + return 0; xfs_attr3_leaf_unbalance(state, drop_blk, save_blk); break; case XFS_DIR2_LEAFN_MAGIC: @@ -985,7 +985,7 @@ xfs_da3_join( xfs_da3_fixhashpath(state, &state->path); error = xfs_da3_node_toosmall(state, &action); if (error) - return(error); + return error; if (action == 0) return 0; xfs_da3_node_unbalance(state, drop_blk, save_blk); @@ -995,12 +995,12 @@ xfs_da3_join( error = xfs_da3_blk_unlink(state, drop_blk, save_blk); xfs_da_state_kill_altpath(state); if (error) - return(error); + return error; error = xfs_da_shrink_inode(state->args, drop_blk->blkno, drop_blk->bp); drop_blk->bp = NULL; if (error) - return(error); + return error; } /* * We joined all the way to the top. If it turns out that @@ -1010,7 +1010,7 @@ xfs_da3_join( 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); + return error; } #ifdef DEBUG @@ -1098,7 +1098,7 @@ xfs_da3_root_join( } xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error = xfs_da_shrink_inode(args, child, bp); - return(error); + return error; } /* @@ -1141,7 +1141,7 @@ xfs_da3_node_toosmall( dp->d_ops->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 */ + return 0; /* blk over 50%, don't try to join */ } /* @@ -1160,13 +1160,13 @@ xfs_da3_node_toosmall( error = xfs_da3_path_shift(state, &state->altpath, forward, 0, &retval); if (error) - return(error); + return error; if (retval) { *action = 0; } else { *action = 2; } - return(0); + return 0; } /* @@ -1193,7 +1193,7 @@ xfs_da3_node_toosmall( error = xfs_da3_node_read(state->args->trans, dp, blkno, -1, &bp, state->args->whichfork); if (error) - return(error); + return error; node = bp->b_addr; dp->d_ops->node_hdr_from_disk(&thdr, node); @@ -1485,7 +1485,7 @@ xfs_da3_node_lookup_int( if (error) { blk->blkno = 0; state->path.active--; - return(error); + return error; } curr = blk->bp->b_addr; blk->magic = be16_to_cpu(curr->magic); @@ -1585,7 +1585,7 @@ xfs_da3_node_lookup_int( error = xfs_da3_path_shift(state, &state->path, 1, 1, &retval); if (error) - return(error); + return error; if (retval == 0) { continue; } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) { @@ -1596,7 +1596,7 @@ xfs_da3_node_lookup_int( break; } *result = retval; - return(0); + return 0; } /*======================================================================== @@ -1691,7 +1691,7 @@ xfs_da3_blk_link( be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) - return(error); + return error; ASSERT(bp != NULL); tmp_info = bp->b_addr; ASSERT(tmp_info->magic == old_info->magic); @@ -1712,7 +1712,7 @@ xfs_da3_blk_link( be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) - return(error); + return error; ASSERT(bp != NULL); tmp_info = bp->b_addr; ASSERT(tmp_info->magic == old_info->magic); @@ -1725,7 +1725,7 @@ xfs_da3_blk_link( 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); + return 0; } /* @@ -1771,7 +1771,7 @@ xfs_da3_blk_unlink( be32_to_cpu(drop_info->back), -1, &bp, args->whichfork); if (error) - return(error); + return error; ASSERT(bp != NULL); tmp_info = bp->b_addr; ASSERT(tmp_info->magic == save_info->magic); @@ -1788,7 +1788,7 @@ xfs_da3_blk_unlink( be32_to_cpu(drop_info->forw), -1, &bp, args->whichfork); if (error) - return(error); + return error; ASSERT(bp != NULL); tmp_info = bp->b_addr; ASSERT(tmp_info->magic == save_info->magic); @@ -1800,7 +1800,7 @@ xfs_da3_blk_unlink( } xfs_trans_log_buf(args->trans, save_blk->bp, 0, sizeof(*save_info) - 1); - return(0); + return 0; } /* @@ -1860,7 +1860,7 @@ xfs_da3_path_shift( if (level < 0) { *result = XFS_ERROR(ENOENT); /* we're out of our tree */ ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); - return(0); + return 0; } /* @@ -1882,7 +1882,7 @@ xfs_da3_path_shift( error = xfs_da3_node_read(args->trans, dp, blkno, -1, &blk->bp, args->whichfork); if (error) - return(error); + return error; info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 868b19f..53f6610 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -327,7 +327,7 @@ xfs_qm_dqalloc( */ if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) { xfs_iunlock(quotip, XFS_ILOCK_EXCL); - return (ESRCH); + return ESRCH; } xfs_trans_ijoin(tp, quotip, XFS_ILOCK_EXCL); @@ -400,7 +400,7 @@ xfs_qm_dqalloc( error0: xfs_iunlock(quotip, XFS_ILOCK_EXCL); - return (error); + return error; } STATIC int @@ -547,7 +547,7 @@ xfs_qm_dqtobp( *O_bpp = bp; *O_ddpp = bp->b_addr + dqp->q_bufoffset; - return (0); + return 0; } @@ -715,7 +715,7 @@ xfs_qm_dqget( if ((! XFS_IS_UQUOTA_ON(mp) && type == XFS_DQ_USER) || (! XFS_IS_PQUOTA_ON(mp) && type == XFS_DQ_PROJ) || (! XFS_IS_GQUOTA_ON(mp) && type == XFS_DQ_GROUP)) { - return (ESRCH); + return ESRCH; } #ifdef DEBUG @@ -723,7 +723,7 @@ xfs_qm_dqget( if ((xfs_dqerror_target == mp->m_ddev_targp) && (xfs_dqreq_num++ % xfs_dqerror_mod) == 0) { xfs_debug(mp, "Returning error in dqget"); - return (EIO); + return EIO; } } @@ -829,7 +829,7 @@ restart: ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); trace_xfs_dqget_miss(dqp); *O_dqpp = dqp; - return (0); + return 0; } diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 73514c0..5515f38 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1693,7 +1693,7 @@ xfs_iext_idx_to_irec( } *idxp = page_idx; *erp_idxp = erp_idx; - return(erp); + return erp; } /* diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index bce53ac..ae82df0 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2944,7 +2944,7 @@ xlog_recover_quotaoff_pass1( if (qoff_f->qf_flags & XFS_GQUOTA_ACCT) log->l_quotaoffs_flag |= XFS_DQ_GROUP; - return (0); + return 0; } /* @@ -2969,7 +2969,7 @@ xlog_recover_dquot_pass2( * Filesystems are required to send in quota flags at mount time. */ if (mp->m_qflags == 0) - return (0); + return 0; recddq = item->ri_buf[1].i_addr; if (recddq == NULL) { @@ -2988,7 +2988,7 @@ xlog_recover_dquot_pass2( type = recddq->d_flags & (XFS_DQ_USER | XFS_DQ_PROJ | XFS_DQ_GROUP); ASSERT(type); if (log->l_quotaoffs_flag & type) - return (0); + return 0; /* * At this point we know that quota was _not_ turned off. @@ -3559,7 +3559,7 @@ xlog_recover_process_data( /* check the log format matches our own - else we can't recover */ if (xlog_header_check_recover(log->l_mp, rhead)) - return (XFS_ERROR(EIO)); + return XFS_ERROR(EIO); while ((dp < lp) && num_logops) { ASSERT(dp + sizeof(xlog_op_header_t) <= lp); @@ -3570,7 +3570,7 @@ xlog_recover_process_data( xfs_warn(log->l_mp, "%s: bad clientid 0x%x", __func__, ohead->oh_clientid); ASSERT(0); - return (XFS_ERROR(EIO)); + return XFS_ERROR(EIO); } tid = be32_to_cpu(ohead->oh_tid); hash = XLOG_RHASH(tid); @@ -3584,7 +3584,7 @@ xlog_recover_process_data( xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, be32_to_cpu(ohead->oh_len)); WARN_ON(1); - return (XFS_ERROR(EIO)); + return XFS_ERROR(EIO); } flags = ohead->oh_flags & ~XLOG_END_TRANS; if (flags & XLOG_WAS_CONT_TRANS) @@ -4387,7 +4387,7 @@ xlog_do_recover( * If IO errors happened during recovery, bail out. */ if (XFS_FORCED_SHUTDOWN(log->l_mp)) { - return (EIO); + return EIO; } /* diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 348e4d2..273ab51 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1634,7 +1634,7 @@ xfs_qm_quotacheck( } } else xfs_notice(mp, "Quotacheck: Done."); - return (error); + return error; } /* @@ -2066,7 +2066,7 @@ xfs_qm_vop_chown_reserve( -((xfs_qcnt_t)delblks), 0, blkflags); } - return (0); + return 0; } int diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 3daf5ea..8b0edbd 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -94,7 +94,7 @@ xfs_qm_scall_quotaoff( /* XXX what to do if error ? Revert back to old vals incore ? */ error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS); - return (error); + return error; } dqtype = 0; @@ -198,7 +198,7 @@ xfs_qm_scall_quotaoff( if (mp->m_qflags == 0) { mutex_unlock(&q->qi_quotaofflock); xfs_qm_destroy_quotainfo(mp); - return (0); + return 0; } /* @@ -375,7 +375,7 @@ xfs_qm_scall_quotaon( sbflags |= XFS_SB_QFLAGS; if ((error = xfs_qm_write_sb_changes(mp, sbflags))) - return (error); + return error; /* * If we aren't trying to switch on quota enforcement, we are done. */ @@ -386,7 +386,7 @@ xfs_qm_scall_quotaon( ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) != (mp->m_qflags & XFS_GQUOTA_ACCT)) || (flags & XFS_ALL_QUOTA_ENFD) == 0) - return (0); + return 0; if (! XFS_IS_QUOTA_RUNNING(mp)) return XFS_ERROR(ESRCH); @@ -398,7 +398,7 @@ xfs_qm_scall_quotaon( mp->m_qflags |= (flags & XFS_ALL_QUOTA_ENFD); mutex_unlock(&mp->m_quotainfo->qi_quotaofflock); - return (0); + return 0; } @@ -425,7 +425,7 @@ xfs_qm_scall_getqstat( if (!xfs_sb_version_hasquota(&mp->m_sb)) { out->qs_uquota.qfs_ino = NULLFSINO; out->qs_gquota.qfs_ino = NULLFSINO; - return (0); + return 0; } out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & @@ -513,7 +513,7 @@ xfs_qm_scall_getqstatv( out->qs_uquota.qfs_ino = NULLFSINO; out->qs_gquota.qfs_ino = NULLFSINO; out->qs_pquota.qfs_ino = NULLFSINO; - return (0); + return 0; } out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & @@ -757,7 +757,7 @@ xfs_qm_log_quotaoff_end( error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_equotaoff, 0, 0); if (error) { xfs_trans_cancel(tp, 0); - return (error); + return error; } qoffi = xfs_trans_get_qoff_item(tp, startqoff, @@ -771,7 +771,7 @@ xfs_qm_log_quotaoff_end( */ xfs_trans_set_sync(tp); error = xfs_trans_commit(tp, 0); - return (error); + return error; } @@ -821,7 +821,7 @@ error0: spin_unlock(&mp->m_sb_lock); } *qoffstartp = qoffi; - return (error); + return error; } @@ -952,7 +952,7 @@ xfs_qm_export_flags( uflags |= FS_QUOTA_GDQ_ENFD; if (flags & XFS_PQUOTA_ENFD) uflags |= FS_QUOTA_PDQ_ENFD; - return (uflags); + return uflags; } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 54a5732..f13452c 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -190,7 +190,7 @@ xfs_trans_reserve( -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - return (XFS_ERROR(ENOSPC)); + return XFS_ERROR(ENOSPC); } tp->t_blk_res += blocks; } @@ -1024,7 +1024,7 @@ xfs_trans_roll( */ error = xfs_trans_commit(trans, 0); if (error) - return (error); + return error; trans = *tpp; diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index b8eef05..73106f2 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -166,7 +166,7 @@ xfs_trans_get_buf_map( ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_recur++; trace_xfs_trans_get_buf_recur(bip); - return (bp); + return bp; } bp = xfs_buf_get_map(target, map, nmaps, flags); @@ -178,7 +178,7 @@ xfs_trans_get_buf_map( _xfs_trans_bjoin(tp, bp, 1); trace_xfs_trans_get_buf(bp->b_fspriv); - return (bp); + return bp; } /* @@ -218,7 +218,7 @@ xfs_trans_getsb(xfs_trans_t *tp, ASSERT(atomic_read(&bip->bli_refcount) > 0); bip->bli_recur++; trace_xfs_trans_getsb_recur(bip); - return (bp); + return bp; } bp = xfs_getsb(mp, flags); @@ -227,7 +227,7 @@ xfs_trans_getsb(xfs_trans_t *tp, _xfs_trans_bjoin(tp, bp, 1); trace_xfs_trans_getsb(bp->b_fspriv); - return (bp); + return bp; } #ifdef DEBUG From sandeen@sandeen.net Wed Apr 16 12:48:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5AE307F73 for ; Wed, 16 Apr 2014 12:48:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C2028F8037 for ; Wed, 16 Apr 2014 10:48:56 -0700 (PDT) X-ASG-Debug-ID: 1397670527-04cbb06e9ca5730001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Zqi973DYHbmnaeTt for ; Wed, 16 Apr 2014 10:48:48 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5D6AB63C5FD4 for ; Wed, 16 Apr 2014 12:48:47 -0500 (CDT) Message-ID: <534EC282.7010905@sandeen.net> Date: Wed, 16 Apr 2014 12:48:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> X-ASG-Orig-Subj: [PATCH 2/2] xfs: Nuke XFS_ERROR macro In-Reply-To: <534EC073.8090006@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397670527 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- XFS_ERROR was designed long ago to trap return values, but it's not runtime configurable, it's not consistently used, and we can do the same thing today with systemtap, using something like: probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } Just nuke XFS_ERROR and associated bits. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 75df77d..05ab4ed 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -308,14 +308,14 @@ xfs_map_blocks( int nimaps = 1; if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; if (type == XFS_IO_UNWRITTEN) bmapi_flags |= XFS_BMAPI_IGSTATE; if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) { if (nonblocking) - return -XFS_ERROR(EAGAIN); + return -EAGAIN; xfs_ilock(ip, XFS_ILOCK_SHARED); } @@ -332,14 +332,14 @@ xfs_map_blocks( xfs_iunlock(ip, XFS_ILOCK_SHARED); if (error) - return -XFS_ERROR(error); + return -error; if (type == XFS_IO_DELALLOC && (!nimaps || isnullstartblock(imap->br_startblock))) { error = xfs_iomap_write_allocate(ip, offset, imap); if (!error) trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); - return -XFS_ERROR(error); + return -error; } #ifdef DEBUG @@ -1216,7 +1216,7 @@ __xfs_get_blocks( int new = 0; if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; offset = (xfs_off_t)iblock << inode->i_blkbits; ASSERT(bh_result->b_size >= (1 << inode->i_blkbits)); diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 95de302..ab0218b 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -538,7 +538,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) * Decide on what work routines to call based on the inode size. */ if (!xfs_inode_hasattr(dp)) { - error = XFS_ERROR(ENOATTR); + error = ENOATTR; goto out; } if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { @@ -605,7 +605,7 @@ xfs_attr_remove( xfs_ilock(dp, XFS_ILOCK_SHARED); if (!xfs_inode_hasattr(dp)) { xfs_iunlock(dp, XFS_ILOCK_SHARED); - return XFS_ERROR(ENOATTR); + return ENOATTR; } xfs_iunlock(dp, XFS_ILOCK_SHARED); @@ -640,14 +640,14 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || args->valuelen >= XFS_ATTR_SF_ENTSIZE_MAX) - return XFS_ERROR(ENOSPC); + return ENOSPC; newsize = XFS_ATTR_SF_TOTSIZE(args->dp); newsize += XFS_ATTR_SF_ENTSIZE_BYNAME(args->namelen, args->valuelen); forkoff = xfs_attr_shortform_bytesfit(args->dp, newsize); if (!forkoff) - return XFS_ERROR(ENOSPC); + return ENOSPC; xfs_attr_shortform_add(args, forkoff); return 0; diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index b39e588..f19d1ef 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -227,7 +227,7 @@ xfs_attr3_node_inactive( */ if (level > XFS_DA_NODE_MAXDEPTH) { xfs_trans_brelse(*trans, bp); /* no locks for later trans */ - return XFS_ERROR(EIO); + return EIO; } node = bp->b_addr; @@ -277,7 +277,7 @@ xfs_attr3_node_inactive( child_bp); break; default: - error = XFS_ERROR(EIO); + error = EIO; xfs_trans_brelse(*trans, child_bp); break; } @@ -360,7 +360,7 @@ xfs_attr3_root_inactive( error = xfs_attr3_leaf_inactive(trans, dp, bp); break; default: - error = XFS_ERROR(EIO); + error = EIO; xfs_trans_brelse(*trans, bp); break; } diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index b9d9170..5e21b67 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -546,7 +546,7 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) break; } if (i == end) - return XFS_ERROR(ENOATTR); + return ENOATTR; /* * Fix up the attribute fork data, covering the hole @@ -610,9 +610,9 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) continue; if (!xfs_attr_namesp_match(args->flags, sfe->flags)) continue; - return XFS_ERROR(EEXIST); + return EEXIST; } - return XFS_ERROR(ENOATTR); + return ENOATTR; } /* @@ -639,18 +639,18 @@ xfs_attr_shortform_getvalue(xfs_da_args_t *args) continue; if (args->flags & ATTR_KERNOVAL) { args->valuelen = sfe->valuelen; - return XFS_ERROR(EEXIST); + return EEXIST; } if (args->valuelen < sfe->valuelen) { args->valuelen = sfe->valuelen; - return XFS_ERROR(ERANGE); + return ERANGE; } args->valuelen = sfe->valuelen; memcpy(args->value, &sfe->nameval[args->namelen], args->valuelen); - return XFS_ERROR(EEXIST); + return EEXIST; } - return XFS_ERROR(ENOATTR); + return ENOATTR; } /* @@ -1106,7 +1106,7 @@ xfs_attr3_leaf_add( * no good and we should just give up. */ if (!ichdr.holes && sum < entsize) - return XFS_ERROR(ENOSPC); + return ENOSPC; /* * Compact the entries to coalesce free space. @@ -2127,7 +2127,7 @@ xfs_attr3_leaf_lookup_int( } if (probe == ichdr.count || be32_to_cpu(entry->hashval) != hashval) { args->index = probe; - return XFS_ERROR(ENOATTR); + return ENOATTR; } /* @@ -2156,7 +2156,7 @@ xfs_attr3_leaf_lookup_int( if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; args->index = probe; - return XFS_ERROR(EEXIST); + return EEXIST; } else { name_rmt = xfs_attr3_leaf_name_remote(leaf, probe); if (name_rmt->namelen != args->namelen) @@ -2172,11 +2172,11 @@ xfs_attr3_leaf_lookup_int( args->rmtblkcnt = xfs_attr3_rmt_blocks( args->dp->i_mount, args->valuelen); - return XFS_ERROR(EEXIST); + return EEXIST; } } args->index = probe; - return XFS_ERROR(ENOATTR); + return ENOATTR; } /* @@ -2212,7 +2212,7 @@ xfs_attr3_leaf_getvalue( } if (args->valuelen < valuelen) { args->valuelen = valuelen; - return XFS_ERROR(ERANGE); + return ERANGE; } args->valuelen = valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); @@ -2230,7 +2230,7 @@ xfs_attr3_leaf_getvalue( } if (args->valuelen < valuelen) { args->valuelen = valuelen; - return XFS_ERROR(ERANGE); + return ERANGE; } args->valuelen = valuelen; } diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 3e9a65a..e38425a 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -150,7 +150,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) XFS_ERRLEVEL_LOW, context->dp->i_mount, sfe); kmem_free(sbuf); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } sbp->entno = i; @@ -308,7 +308,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) context->dp->i_mount, node); xfs_trans_brelse(NULL, bp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } dp->d_ops->node_hdr_from_disk(&nodehdr, node); @@ -494,11 +494,11 @@ xfs_attr_leaf_list(xfs_attr_list_context_t *context) context->cursor->blkno = 0; error = xfs_attr3_leaf_read(NULL, context->dp, 0, -1, &bp); if (error) - return XFS_ERROR(error); + return error; error = xfs_attr3_leaf_list_int(bp, context); xfs_trans_brelse(NULL, bp); - return XFS_ERROR(error); + return error; } int @@ -614,16 +614,16 @@ xfs_attr_list( * Validate the cursor. */ if (cursor->pad1 || cursor->pad2) - return XFS_ERROR(EINVAL); + return EINVAL; if ((cursor->initted == 0) && (cursor->hashval || cursor->blkno || cursor->offset)) - return XFS_ERROR(EINVAL); + return EINVAL; /* * Check for a properly aligned buffer. */ if (((long)buffer) & (sizeof(int)-1)) - return XFS_ERROR(EFAULT); + return EFAULT; if (flags & ATTR_KERNOVAL) bufsize = 0; diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b6092e..cd72b90 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1034,7 +1034,7 @@ xfs_bmap_add_attrfork_btree( goto error0; if (stat == 0) { xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); - return XFS_ERROR(ENOSPC); + return ENOSPC; } *firstblock = cur->bc_private.b.firstblock; cur->bc_private.b.allocated = 0; @@ -1192,7 +1192,7 @@ xfs_bmap_add_attrfork( break; default: ASSERT(0); - error = XFS_ERROR(EINVAL); + error = EINVAL; goto trans_cancel; } @@ -1399,7 +1399,7 @@ xfs_bmap_read_extents( return 0; error0: xfs_trans_brelse(tp, bp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } @@ -1576,7 +1576,7 @@ xfs_bmap_last_before( if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL) - return XFS_ERROR(EIO); + return EIO; if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { *last_block = 0; return 0; @@ -1691,7 +1691,7 @@ xfs_bmap_last_offset( if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - return XFS_ERROR(EIO); + return EIO; error = xfs_bmap_last_extent(NULL, ip, whichfork, &rec, &is_empty); if (error || is_empty) @@ -3324,7 +3324,7 @@ xfs_bmap_extsize_align( if (orig_off < align_off || orig_end > align_off + align_alen || align_alen - temp < orig_alen) - return XFS_ERROR(EINVAL); + return EINVAL; /* * Try to fix it by moving the start up. */ @@ -3349,7 +3349,7 @@ xfs_bmap_extsize_align( * Result doesn't cover the request, fail it. */ if (orig_off < align_off || orig_end > align_off + align_alen) - return XFS_ERROR(EINVAL); + return EINVAL; } else { ASSERT(orig_off >= align_off); ASSERT(orig_end <= align_off + align_alen); @@ -4020,11 +4020,11 @@ xfs_bmapi_read( XFS_IFORK_FORMAT(ip, whichfork) != 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); + return EFSCORRUPTED; } if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; XFS_STATS_INC(xs_blk_mapr); @@ -4215,11 +4215,11 @@ xfs_bmapi_delay( XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != 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); + return EFSCORRUPTED; } if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; XFS_STATS_INC(xs_blk_mapw); @@ -4509,11 +4509,11 @@ xfs_bmapi_write( XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { XFS_ERROR_REPORT("xfs_bmapi_write", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; ifp = XFS_IFORK_PTR(ip, whichfork); @@ -4930,7 +4930,7 @@ xfs_bmap_del_extent( xfs_bmbt_set_blockcount(ep, got.br_blockcount); flags = 0; - error = XFS_ERROR(ENOSPC); + error = ENOSPC; goto done; } XFS_WANT_CORRUPTED_GOTO(i == 1, done); @@ -5048,11 +5048,11 @@ xfs_bunmapi( XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { XFS_ERROR_REPORT("xfs_bunmapi", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } mp = ip->i_mount; if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(len > 0); @@ -5297,7 +5297,7 @@ xfs_bunmapi( del.br_startoff > got.br_startoff && del.br_startoff + del.br_blockcount < got.br_startoff + got.br_blockcount) { - error = XFS_ERROR(ENOSPC); + error = ENOSPC; goto error0; } error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, @@ -5420,11 +5420,11 @@ xfs_bmap_shift_extents( mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { XFS_ERROR_REPORT("xfs_bmap_shift_extents", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; ASSERT(current_ext != NULL); @@ -5483,14 +5483,14 @@ xfs_bmap_shift_extents( *current_ext - 1), &left); if (startoff < left.br_startoff + left.br_blockcount) - error = XFS_ERROR(EINVAL); + error = EINVAL; } else if (offset_shift_fsb > got.br_startoff) { /* * When first extent is shifted, offset_shift_fsb * should be less than the stating offset of * the first extent. */ - error = XFS_ERROR(EINVAL); + error = EINVAL; } if (error) diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 818d546..116a5da 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -555,7 +555,7 @@ xfs_bmbt_alloc_block( args.minlen = args.maxlen = args.prod = 1; args.wasdel = cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL; if (!args.wasdel && xfs_trans_get_block_res(args.tp) == 0) { - error = XFS_ERROR(ENOSPC); + error = ENOSPC; goto error0; } error = xfs_alloc_vextent(&args); diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 01f6a64..039192b 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -408,7 +408,7 @@ xfs_bmap_count_tree( xfs_trans_brelse(tp, bp); XFS_ERROR_REPORT("xfs_bmap_count_tree(1)", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } xfs_trans_brelse(tp, bp); } else { @@ -475,7 +475,7 @@ xfs_bmap_count_blocks( 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); + return EFSCORRUPTED; } return 0; @@ -567,13 +567,13 @@ xfs_getbmap( if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_aformat != XFS_DINODE_FMT_BTREE && ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL) - return XFS_ERROR(EINVAL); + return EINVAL; } else if (unlikely( ip->i_d.di_aformat != 0 && ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS)) { XFS_ERROR_REPORT("xfs_getbmap", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } prealloced = 0; @@ -582,7 +582,7 @@ xfs_getbmap( if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_format != XFS_DINODE_FMT_BTREE && ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) - return XFS_ERROR(EINVAL); + return EINVAL; if (xfs_get_extsz_hint(ip) || ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC|XFS_DIFLAG_APPEND)){ @@ -602,20 +602,20 @@ xfs_getbmap( bmv->bmv_entries = 0; return 0; } else if (bmv->bmv_length < 0) { - return XFS_ERROR(EINVAL); + return EINVAL; } nex = bmv->bmv_count - 1; if (nex <= 0) - return XFS_ERROR(EINVAL); + return EINVAL; bmvend = bmv->bmv_offset + bmv->bmv_length; if (bmv->bmv_count > ULONG_MAX / sizeof(struct getbmapx)) - return XFS_ERROR(ENOMEM); + return ENOMEM; out = kmem_zalloc_large(bmv->bmv_count * sizeof(struct getbmapx), 0); if (!out) - return XFS_ERROR(ENOMEM); + return ENOMEM; xfs_ilock(ip, XFS_IOLOCK_SHARED); if (whichfork == XFS_DATA_FORK) { @@ -998,14 +998,14 @@ xfs_alloc_file_space( trace_xfs_alloc_file_space(ip); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; error = xfs_qm_dqattach(ip, 0); if (error) return error; if (len <= 0) - return XFS_ERROR(EINVAL); + return EINVAL; rt = XFS_IS_REALTIME_INODE(ip); extsz = xfs_get_extsz_hint(ip); @@ -1108,7 +1108,7 @@ xfs_alloc_file_space( allocated_fsb = imapp->br_blockcount; if (nimaps == 0) { - error = XFS_ERROR(ENOSPC); + error = ENOSPC; break; } @@ -1169,7 +1169,7 @@ xfs_zero_remaining_bytes( mp->m_rtdev_targp : mp->m_ddev_targp, BTOBB(mp->m_sb.sb_blocksize), 0); if (!bp) - return XFS_ERROR(ENOMEM); + return ENOMEM; xfs_buf_unlock(bp); @@ -1201,7 +1201,7 @@ xfs_zero_remaining_bytes( XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); if (XFS_FORCED_SHUTDOWN(mp)) { - error = XFS_ERROR(EIO); + error = EIO; break; } xfs_buf_iorequest(bp); @@ -1219,7 +1219,7 @@ xfs_zero_remaining_bytes( XFS_BUF_WRITE(bp); if (XFS_FORCED_SHUTDOWN(mp)) { - error = XFS_ERROR(EIO); + error = EIO; break; } xfs_buf_iorequest(bp); @@ -1670,7 +1670,7 @@ xfs_swap_extents( tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); if (!tempifp) { - error = XFS_ERROR(ENOMEM); + error = ENOMEM; goto out; } @@ -1685,13 +1685,13 @@ xfs_swap_extents( /* Verify that both files have the same format */ if ((ip->i_d.di_mode & S_IFMT) != (tip->i_d.di_mode & S_IFMT)) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_unlock; } /* Verify both files are either real-time or non-realtime */ if (XFS_IS_REALTIME_INODE(ip) != XFS_IS_REALTIME_INODE(tip)) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_unlock; } @@ -1702,7 +1702,7 @@ xfs_swap_extents( /* Verify O_DIRECT for ftmp */ if (VN_CACHED(VFS_I(tip)) != 0) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_unlock; } @@ -1710,7 +1710,7 @@ xfs_swap_extents( if (sxp->sx_offset != 0 || sxp->sx_length != ip->i_d.di_size || sxp->sx_length != tip->i_d.di_size) { - error = XFS_ERROR(EFAULT); + error = EFAULT; goto out_unlock; } @@ -1737,7 +1737,7 @@ xfs_swap_extents( (sbp->bs_ctime.tv_nsec != VFS_I(ip)->i_ctime.tv_nsec) || (sbp->bs_mtime.tv_sec != VFS_I(ip)->i_mtime.tv_sec) || (sbp->bs_mtime.tv_nsec != VFS_I(ip)->i_mtime.tv_nsec)) { - error = XFS_ERROR(EBUSY); + error = EBUSY; goto out_unlock; } @@ -1748,7 +1748,7 @@ xfs_swap_extents( * until we have switched the extents. */ if (VN_MAPPED(VFS_I(ip))) { - error = XFS_ERROR(EBUSY); + error = EBUSY; goto out_unlock; } diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index e80d59f..1a890e0 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -90,7 +90,7 @@ xfs_btree_check_lblock( if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } return 0; } @@ -138,7 +138,7 @@ xfs_btree_check_sblock( if (bp) trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } return 0; } diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index e0588bd..e8e583f 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1578,7 +1578,7 @@ xfs_da3_node_lookup_int( args->blkno = blk->blkno; } else { ASSERT(0); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (((retval == ENOENT) || (retval == ENOATTR)) && (blk->hashval == args->hashval)) { @@ -1590,7 +1590,7 @@ xfs_da3_node_lookup_int( continue; } else if (blk->magic == XFS_ATTR_LEAF_MAGIC) { /* path_shift() gives ENOENT */ - retval = XFS_ERROR(ENOATTR); + retval = ENOATTR; } } break; @@ -1858,7 +1858,7 @@ xfs_da3_path_shift( } } if (level < 0) { - *result = XFS_ERROR(ENOENT); /* we're out of our tree */ + *result = ENOENT; /* we're out of our tree */ ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); return 0; } @@ -2067,7 +2067,7 @@ xfs_da_grow_inode_int( if (got != count || mapp[0].br_startoff != *bno || mapp[mapi - 1].br_startoff + mapp[mapi - 1].br_blockcount != *bno + count) { - error = XFS_ERROR(ENOSPC); + error = ENOSPC; goto out_free_map; } @@ -2165,7 +2165,7 @@ xfs_da3_swap_lastblock( if (unlikely(lastoff == 0)) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(1)", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } /* * Read the last block in the btree space. @@ -2216,7 +2216,7 @@ xfs_da3_swap_lastblock( sib_info->magic != dead_info->magic)) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(2)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto done; } sib_info->forw = cpu_to_be32(dead_blkno); @@ -2238,7 +2238,7 @@ xfs_da3_swap_lastblock( sib_info->magic != dead_info->magic)) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(3)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto done; } sib_info->back = cpu_to_be32(dead_blkno); @@ -2261,7 +2261,7 @@ xfs_da3_swap_lastblock( if (level >= 0 && level != par_hdr.level + 1) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto done; } level = par_hdr.level; @@ -2274,7 +2274,7 @@ xfs_da3_swap_lastblock( if (entno == par_hdr.count) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(5)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto done; } par_blkno = be32_to_cpu(btree[entno].before); @@ -2301,7 +2301,7 @@ xfs_da3_swap_lastblock( if (unlikely(par_blkno == 0)) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(6)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto done; } error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w); @@ -2312,7 +2312,7 @@ xfs_da3_swap_lastblock( if (par_hdr.level != level) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto done; } btree = dp->d_ops->node_tree_p(par_node); @@ -2508,7 +2508,7 @@ xfs_dabuf_map( } if (!xfs_da_map_covers_blocks(nirecs, irecs, bno, nfsb)) { - error = mappedbno == -2 ? -1 : XFS_ERROR(EFSCORRUPTED); + error = mappedbno == -2 ? -1 : EFSCORRUPTED; if (unlikely(error == EFSCORRUPTED)) { if (xfs_error_level >= XFS_ERRLEVEL_LOW) { int i; @@ -2569,7 +2569,7 @@ xfs_da_get_buf( bp = xfs_trans_get_buf_map(trans, dp->i_mount->m_ddev_targp, mapp, nmap, 0); - error = bp ? bp->b_error : XFS_ERROR(EIO); + error = bp ? bp->b_error : EIO; if (error) { xfs_trans_brelse(trans, bp); goto out_free; @@ -2661,7 +2661,7 @@ xfs_da_read_buf( trace_xfs_da_btree_corrupt(bp, _RET_IP_); XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", XFS_ERRLEVEL_LOW, mp, info); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; xfs_trans_brelse(trans, bp); goto out_free; } diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index fda4625..dd7d3c7 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -166,7 +166,7 @@ xfs_dir_ino_validate( 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); + return EFSCORRUPTED; } return 0; } diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 4f6a38c..cedec22 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -394,7 +394,7 @@ xfs_dir2_block_addname( if (args->op_flags & XFS_DA_OP_JUSTCHECK) { xfs_trans_brelse(tp, bp); if (!dup) - return XFS_ERROR(ENOSPC); + return ENOSPC; return 0; } @@ -404,7 +404,7 @@ xfs_dir2_block_addname( if (!dup) { /* Don't have a space reservation: return no-space. */ if (args->total == 0) - return XFS_ERROR(ENOSPC); + return ENOSPC; /* * Convert to the next larger format. * Then add the new entry in that format. @@ -648,7 +648,7 @@ xfs_dir2_block_lookup( args->filetype = dp->d_ops->data_get_ftype(dep); error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_trans_brelse(args->trans, bp); - return XFS_ERROR(error); + return error; } /* @@ -704,7 +704,7 @@ xfs_dir2_block_lookup_int( if (low > high) { ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); xfs_trans_brelse(tp, bp); - return XFS_ERROR(ENOENT); + return ENOENT; } } /* @@ -752,7 +752,7 @@ xfs_dir2_block_lookup_int( * No match, release the buffer and return ENOENT. */ xfs_trans_brelse(tp, bp); - return XFS_ERROR(ENOENT); + return ENOENT; } /* @@ -1090,7 +1090,7 @@ xfs_dir2_sf_to_block( */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { ASSERT(XFS_FORCED_SHUTDOWN(mp)); - return XFS_ERROR(EIO); + return EIO; } oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index d36e97d..cedaece 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -729,7 +729,7 @@ xfs_dir2_leaf_addname( if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) { xfs_trans_brelse(tp, lbp); - return XFS_ERROR(ENOSPC); + return ENOSPC; } /* * Convert to node form. @@ -753,7 +753,7 @@ xfs_dir2_leaf_addname( */ if (args->op_flags & XFS_DA_OP_JUSTCHECK) { xfs_trans_brelse(tp, lbp); - return use_block == -1 ? XFS_ERROR(ENOSPC) : 0; + return use_block == -1 ? ENOSPC : 0; } /* * If no allocations are allowed, return now before we've @@ -761,7 +761,7 @@ xfs_dir2_leaf_addname( */ if (args->total == 0 && use_block == -1) { xfs_trans_brelse(tp, lbp); - return XFS_ERROR(ENOSPC); + return ENOSPC; } /* * Need to compact the leaf entries, removing stale ones. @@ -1194,7 +1194,7 @@ xfs_dir2_leaf_lookup( error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_trans_brelse(tp, dbp); xfs_trans_brelse(tp, lbp); - return XFS_ERROR(error); + return error; } /* @@ -1327,7 +1327,7 @@ xfs_dir2_leaf_lookup_int( if (dbp) xfs_trans_brelse(tp, dbp); xfs_trans_brelse(tp, lbp); - return XFS_ERROR(ENOENT); + return ENOENT; } /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index cb434d7..db20ecb 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -406,7 +406,7 @@ xfs_dir2_leafn_add( * into other peoples memory */ if (index < 0) - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; /* * If there are already the maximum number of leaf entries in @@ -417,7 +417,7 @@ xfs_dir2_leafn_add( if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) { if (!leafhdr.stale) - return XFS_ERROR(ENOSPC); + return ENOSPC; compact = leafhdr.stale > 1; } else compact = 0; @@ -626,7 +626,7 @@ xfs_dir2_leafn_lookup_for_addname( XFS_ERRLEVEL_LOW, mp); if (curfdb != newfdb) xfs_trans_brelse(tp, curbp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } curfdb = newfdb; if (be16_to_cpu(bests[fi]) >= length) @@ -657,7 +657,7 @@ out: * Return the index, that will be the insertion point. */ *indexp = index; - return XFS_ERROR(ENOENT); + return ENOENT; } /* @@ -783,7 +783,7 @@ xfs_dir2_leafn_lookup_for_entry( curbp->b_ops = &xfs_dir3_data_buf_ops; xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF); if (cmp == XFS_CMP_EXACT) - return XFS_ERROR(EEXIST); + return EEXIST; } } ASSERT(index == leafhdr.count || (args->op_flags & XFS_DA_OP_OKNOENT)); @@ -806,7 +806,7 @@ xfs_dir2_leafn_lookup_for_entry( state->extravalid = 0; } *indexp = index; - return XFS_ERROR(ENOENT); + return ENOENT; } /* @@ -1811,7 +1811,7 @@ xfs_dir2_node_addname_int( * Not allowed to allocate, return failure. */ if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) - return XFS_ERROR(ENOSPC); + return ENOSPC; /* * Allocate and initialize the new data block. @@ -1871,7 +1871,7 @@ xfs_dir2_node_addname_int( } XFS_ERROR_REPORT("xfs_dir2_node_addname_int", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index aead369..808aadd 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -96,7 +96,7 @@ xfs_dir2_sf_getdents( */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { ASSERT(XFS_FORCED_SHUTDOWN(mp)); - return XFS_ERROR(EIO); + return EIO; } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); @@ -679,7 +679,7 @@ xfs_readdir( trace_xfs_readdir(dp); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return XFS_ERROR(EIO); + return EIO; ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_getdents); diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 3725fb1..089bfd1 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -307,7 +307,7 @@ xfs_dir2_sf_addname( */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); + return EIO; } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); @@ -350,7 +350,7 @@ xfs_dir2_sf_addname( * Just checking or no space reservation, it doesn't fit. */ if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) - return XFS_ERROR(ENOSPC); + return ENOSPC; /* * Convert to block form then add the name. */ @@ -743,7 +743,7 @@ xfs_dir2_sf_lookup( */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); + return EIO; } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); @@ -756,7 +756,7 @@ xfs_dir2_sf_lookup( args->inumber = dp->i_ino; args->cmpresult = XFS_CMP_EXACT; args->filetype = XFS_DIR3_FT_DIR; - return XFS_ERROR(EEXIST); + return EEXIST; } /* * Special case for .. @@ -766,7 +766,7 @@ xfs_dir2_sf_lookup( args->inumber = dp->d_ops->sf_get_parent_ino(sfp); args->cmpresult = XFS_CMP_EXACT; args->filetype = XFS_DIR3_FT_DIR; - return XFS_ERROR(EEXIST); + return EEXIST; } /* * Loop over all the entries trying to match ours. @@ -786,7 +786,7 @@ xfs_dir2_sf_lookup( args->inumber = dp->d_ops->sf_get_ino(sfp, sfep); args->filetype = dp->d_ops->sf_get_ftype(sfep); if (cmp == XFS_CMP_EXACT) - return XFS_ERROR(EEXIST); + return EEXIST; ci_sfep = sfep; } } @@ -796,10 +796,10 @@ xfs_dir2_sf_lookup( * If a case-insensitive match was not found, return ENOENT. */ if (!ci_sfep) - return XFS_ERROR(ENOENT); + return ENOENT; /* otherwise process the CI match as required by the caller */ error = xfs_dir_cilookup_result(args, ci_sfep->name, ci_sfep->namelen); - return XFS_ERROR(error); + return error; } /* @@ -829,7 +829,7 @@ xfs_dir2_sf_removename( */ if (oldsize < offsetof(xfs_dir2_sf_hdr_t, parent)) { ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); + return EIO; } ASSERT(dp->i_df.if_bytes == oldsize); ASSERT(dp->i_df.if_u1.if_data != NULL); @@ -852,7 +852,7 @@ xfs_dir2_sf_removename( * Didn't find it. */ if (i == sfp->count) - return XFS_ERROR(ENOENT); + return ENOENT; /* * Calculate sizes. */ @@ -919,7 +919,7 @@ xfs_dir2_sf_replace( */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); + return EIO; } ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); ASSERT(dp->i_df.if_u1.if_data != NULL); @@ -995,7 +995,7 @@ xfs_dir2_sf_replace( if (i8elevated) xfs_dir2_sf_toino4(args); #endif - return XFS_ERROR(ENOENT); + return ENOENT; } } #if XFS_BIG_INUMS diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 4f11ef0..3fee16e 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -166,11 +166,11 @@ xfs_ioc_trim( int error, last_error = 0; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (!blk_queue_discard(q)) - return -XFS_ERROR(EOPNOTSUPP); + return -EOPNOTSUPP; if (copy_from_user(&range, urange, sizeof(range))) - return -XFS_ERROR(EFAULT); + return -EFAULT; /* * Truncating down the len isn't actually quite correct, but using @@ -182,7 +182,7 @@ xfs_ioc_trim( if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks) || range.minlen > XFS_FSB_TO_B(mp, XFS_ALLOC_AG_MAX_USABLE(mp)) || range.len < mp->m_sb.sb_blocksize) - return -XFS_ERROR(EINVAL); + return -EINVAL; start = BTOBB(range.start); end = start + BTOBBT(range.len) - 1; @@ -206,7 +206,7 @@ xfs_ioc_trim( range.len = XFS_FSB_TO_B(mp, blocks_trimmed); if (copy_to_user(urange, &range, sizeof(range))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 53f6610..ff31d31 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -426,7 +426,7 @@ xfs_qm_dqrepair( if (error) { ASSERT(*bpp == NULL); - return XFS_ERROR(error); + return error; } (*bpp)->b_ops = &xfs_dquot_buf_ops; @@ -442,7 +442,7 @@ xfs_qm_dqrepair( if (error) { /* repair failed, we're screwed */ xfs_trans_brelse(tp, *bpp); - return XFS_ERROR(EIO); + return EIO; } } @@ -539,7 +539,7 @@ xfs_qm_dqtobp( if (error) { ASSERT(bp == NULL); - return XFS_ERROR(error); + return error; } } @@ -796,7 +796,7 @@ restart: } else { /* inode stays locked on return */ xfs_qm_dqdestroy(dqp); - return XFS_ERROR(ESRCH); + return ESRCH; } } @@ -1003,7 +1003,7 @@ xfs_qm_dqflush( SHUTDOWN_CORRUPT_INCORE); else spin_unlock(&mp->m_ail->xa_lock); - error = XFS_ERROR(EIO); + error = EIO; goto out_unlock; } @@ -1029,7 +1029,7 @@ xfs_qm_dqflush( xfs_buf_relse(bp); xfs_dqfunlock(dqp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); - return XFS_ERROR(EIO); + return EIO; } /* This is the only portion of data that needs to persist */ @@ -1082,7 +1082,7 @@ xfs_qm_dqflush( out_unlock: xfs_dqfunlock(dqp); - return XFS_ERROR(EIO); + return EIO; } /* diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index edac5b0..14f98c2 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -27,29 +27,6 @@ #ifdef DEBUG -int xfs_etrap[XFS_ERROR_NTRAP] = { - 0, -}; - -int -xfs_error_trap(int e) -{ - int i; - - if (!e) - return 0; - for (i = 0; i < XFS_ERROR_NTRAP; i++) { - if (xfs_etrap[i] == 0) - break; - if (e != xfs_etrap[i]) - continue; - xfs_notice(NULL, "%s: error %d", __func__, e); - BUG(); - break; - } - return e; -} - int xfs_etest[XFS_NUM_INJECT_ERROR]; int64_t xfs_etest_fsid[XFS_NUM_INJECT_ERROR]; char * xfs_etest_fsname[XFS_NUM_INJECT_ERROR]; diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index c1c57d4..a2b5b4c 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -18,15 +18,6 @@ #ifndef __XFS_ERROR_H__ #define __XFS_ERROR_H__ -#ifdef DEBUG -#define XFS_ERROR_NTRAP 10 -extern int xfs_etrap[XFS_ERROR_NTRAP]; -extern int xfs_error_trap(int); -#define XFS_ERROR(e) xfs_error_trap(e) -#else -#define XFS_ERROR(e) (e) -#endif - struct xfs_mount; extern void xfs_error_report(const char *tag, int level, struct xfs_mount *mp, @@ -56,7 +47,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); if (unlikely(!fs_is_ok)) { \ XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_GOTO", \ XFS_ERRLEVEL_LOW, NULL); \ - error = XFS_ERROR(EFSCORRUPTED); \ + error = EFSCORRUPTED; \ goto l; \ } \ } @@ -68,7 +59,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); if (unlikely(!fs_is_ok)) { \ XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_RETURN", \ XFS_ERRLEVEL_LOW, NULL); \ - return XFS_ERROR(EFSCORRUPTED); \ + return EFSCORRUPTED; \ } \ } diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 79e96ce..169e5ba 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -179,7 +179,7 @@ xfs_file_fsync( return error; if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; xfs_iflags_clear(ip, XFS_ITRUNCATED); @@ -265,7 +265,7 @@ xfs_file_aio_read( if ((pos | size) & target->bt_logical_sectormask) { if (pos == i_size_read(inode)) return 0; - return -XFS_ERROR(EINVAL); + return -EINVAL; } } @@ -644,7 +644,7 @@ xfs_file_dio_aio_write( /* DIO must be aligned to device logical sector size */ if ((pos | count) & target->bt_logical_sectormask) - return -XFS_ERROR(EINVAL); + return -EINVAL; /* "unaligned" here means not aligned to a filesystem block */ if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) @@ -1339,7 +1339,7 @@ xfs_seek_hole( int error; if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; lock = xfs_ilock_data_map_shared(ip); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 02fb943..fc03147 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -169,7 +169,7 @@ xfs_growfs_data_private( nb = in->newblocks; pct = in->imaxpct; if (nb < mp->m_sb.sb_dblocks || pct < 0 || pct > 100) - return XFS_ERROR(EINVAL); + return EINVAL; if ((error = xfs_sb_validate_fsb_count(&mp->m_sb, nb))) return error; dpct = pct - mp->m_sb.sb_imax_pct; @@ -192,7 +192,7 @@ xfs_growfs_data_private( nagcount--; nb = (xfs_rfsblock_t)nagcount * mp->m_sb.sb_agblocks; if (nb < mp->m_sb.sb_dblocks) - return XFS_ERROR(EINVAL); + return EINVAL; } new = nb - mp->m_sb.sb_dblocks; oagcount = mp->m_sb.sb_agcount; @@ -545,17 +545,17 @@ xfs_growfs_log_private( nb = in->newblocks; if (nb < XFS_MIN_LOG_BLOCKS || nb < XFS_B_TO_FSB(mp, XFS_MIN_LOG_BYTES)) - return XFS_ERROR(EINVAL); + return EINVAL; if (nb == mp->m_sb.sb_logblocks && in->isint == (mp->m_sb.sb_logstart != 0)) - return XFS_ERROR(EINVAL); + return EINVAL; /* * Moving the log is hard, need new interfaces to sync * the log first, hold off all activity while moving it. * Can have shorter or longer log in the same space, * or transform internal to external log or vice versa. */ - return XFS_ERROR(ENOSYS); + return ENOSYS; } /* @@ -573,9 +573,9 @@ xfs_growfs_data( int error; if (!capable(CAP_SYS_ADMIN)) - return XFS_ERROR(EPERM); + return EPERM; if (!mutex_trylock(&mp->m_growlock)) - return XFS_ERROR(EWOULDBLOCK); + return EWOULDBLOCK; error = xfs_growfs_data_private(mp, in); mutex_unlock(&mp->m_growlock); return error; @@ -589,9 +589,9 @@ xfs_growfs_log( int error; if (!capable(CAP_SYS_ADMIN)) - return XFS_ERROR(EPERM); + return EPERM; if (!mutex_trylock(&mp->m_growlock)) - return XFS_ERROR(EWOULDBLOCK); + return EWOULDBLOCK; error = xfs_growfs_log_private(mp, in); mutex_unlock(&mp->m_growlock); return error; @@ -787,7 +787,7 @@ xfs_fs_goingdown( SHUTDOWN_FORCE_UMOUNT | SHUTDOWN_LOG_IO_ERROR); break; default: - return XFS_ERROR(EINVAL); + return EINVAL; } return 0; diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 8f711db..dc57fbf 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -325,7 +325,7 @@ xfs_ialloc_ag_alloc( newlen = args.mp->m_ialloc_inos; if (args.mp->m_maxicount && args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) - return XFS_ERROR(ENOSPC); + return ENOSPC; args.minlen = args.maxlen = args.mp->m_ialloc_blks; /* * First try to allocate inodes contiguous with the last-allocated @@ -1095,7 +1095,7 @@ out_alloc: return xfs_dialloc_ag(tp, agbp, parent, inop); out_error: xfs_perag_put(pag); - return XFS_ERROR(error); + return error; } /* @@ -1137,7 +1137,7 @@ xfs_difree( xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", __func__, agno, mp->m_sb.sb_agcount); ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } agino = XFS_INO_TO_AGINO(mp, inode); if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { @@ -1145,14 +1145,14 @@ xfs_difree( __func__, (unsigned long long)inode, (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } agbno = XFS_AGINO_TO_AGBNO(mp, agino); if (agbno >= mp->m_sb.sb_agblocks) { xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", __func__, agbno, mp->m_sb.sb_agblocks); ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } /* * Get the allocation group header. @@ -1366,7 +1366,7 @@ xfs_imap( * as they can be invalid without implying corruption. */ if (flags & XFS_IGET_UNTRUSTED) - return XFS_ERROR(EINVAL); + return EINVAL; if (agno >= mp->m_sb.sb_agcount) { xfs_alert(mp, "%s: agno (%d) >= mp->m_sb.sb_agcount (%d)", @@ -1386,7 +1386,7 @@ xfs_imap( } xfs_stack_trace(); #endif /* DEBUG */ - return XFS_ERROR(EINVAL); + return EINVAL; } blks_per_cluster = xfs_icluster_size_fsb(mp); @@ -1459,7 +1459,7 @@ out_map: __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); + return EINVAL; } return 0; } diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 98d3524..11b7932 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -658,7 +658,7 @@ xfs_inode_ag_iterator( break; } } - return XFS_ERROR(last_error); + return last_error; } int @@ -687,7 +687,7 @@ xfs_inode_ag_iterator_tag( break; } } - return XFS_ERROR(last_error); + return last_error; } /* @@ -1132,7 +1132,7 @@ restart: trylock = 0; goto restart; } - return XFS_ERROR(last_error); + return last_error; } int diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5e7a38f..a5a40cc 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -583,7 +583,7 @@ xfs_lookup( trace_xfs_lookup(dp, name); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return XFS_ERROR(EIO); + return EIO; lock_mode = xfs_ilock_data_map_shared(dp); error = xfs_dir_lookup(NULL, dp, name, &inum, ci_name); @@ -923,7 +923,7 @@ xfs_dir_ialloc( } if (!ialloc_context && !ip) { *ipp = NULL; - return XFS_ERROR(ENOSPC); + return ENOSPC; } /* @@ -1164,7 +1164,7 @@ xfs_create( trace_xfs_create(dp, name); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; prid = xfs_get_initial_prid(dp); @@ -1349,7 +1349,7 @@ xfs_create_tmpfile( uint resblks; if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; prid = xfs_get_initial_prid(dp); @@ -1457,7 +1457,7 @@ xfs_link( ASSERT(!S_ISDIR(sip->i_d.di_mode)); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; error = xfs_qm_dqattach(sip, 0); if (error) @@ -1492,7 +1492,7 @@ xfs_link( */ if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && (xfs_get_projid(tdp) != xfs_get_projid(sip)))) { - error = XFS_ERROR(EXDEV); + error = EXDEV; goto error_return; } @@ -2552,7 +2552,7 @@ xfs_remove( trace_xfs_remove(dp, name); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; error = xfs_qm_dqattach(dp, 0); if (error) @@ -2604,11 +2604,11 @@ xfs_remove( if (is_dir) { ASSERT(ip->i_d.di_nlink >= 2); if (ip->i_d.di_nlink != 2) { - error = XFS_ERROR(ENOTEMPTY); + error = ENOTEMPTY; goto out_trans_cancel; } if (!xfs_dir_isempty(ip)) { - error = XFS_ERROR(ENOTEMPTY); + error = ENOTEMPTY; goto out_trans_cancel; } @@ -2814,7 +2814,7 @@ xfs_rename( */ if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) { - error = XFS_ERROR(EXDEV); + error = EXDEV; goto error_return; } @@ -2862,7 +2862,7 @@ xfs_rename( */ if (!(xfs_dir_isempty(target_ip)) || (target_ip->i_d.di_nlink > 2)) { - error = XFS_ERROR(EEXIST); + error = EEXIST; goto error_return; } } @@ -3136,7 +3136,7 @@ cluster_corrupt_out: xfs_iflush_abort(iq, false); kmem_free(ilist); xfs_perag_put(pag); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } /* @@ -3191,7 +3191,7 @@ xfs_iflush( * as we wait for an empty AIL as part of the unmount process. */ if (XFS_FORCED_SHUTDOWN(mp)) { - error = XFS_ERROR(EIO); + error = EIO; goto abort_out; } @@ -3234,7 +3234,7 @@ corrupt_out: xfs_buf_relse(bp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); cluster_corrupt_out: - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; abort_out: /* * Unlocks the flush lock @@ -3428,5 +3428,5 @@ xfs_iflush_int( return 0; corrupt_out: - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index 24e9939..4f7b9ad 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -181,7 +181,7 @@ xfs_imap_to_bp( if (error == EFSCORRUPTED && (iget_flags & XFS_IGET_UNTRUSTED)) - return XFS_ERROR(EINVAL); + return EINVAL; xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.", __func__, error); @@ -390,7 +390,7 @@ xfs_iread( __func__, ip->i_ino); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto out_brelse; } diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 5515f38..7e8a105 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -102,7 +102,7 @@ xfs_iformat_fork( be64_to_cpu(dip->di_nblocks)); XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { @@ -111,7 +111,7 @@ xfs_iformat_fork( dip->di_forkoff); XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && @@ -121,7 +121,7 @@ xfs_iformat_fork( ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } switch (ip->i_d.di_mode & S_IFMT) { @@ -132,7 +132,7 @@ xfs_iformat_fork( if (unlikely(dip->di_format != XFS_DINODE_FMT_DEV)) { XFS_CORRUPTION_ERROR("xfs_iformat(3)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } ip->i_d.di_size = 0; ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip); @@ -153,7 +153,7 @@ xfs_iformat_fork( XFS_CORRUPTION_ERROR("xfs_iformat(4)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } di_size = be64_to_cpu(dip->di_size); @@ -166,7 +166,7 @@ xfs_iformat_fork( XFS_CORRUPTION_ERROR("xfs_iformat(5)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } size = (int)di_size; @@ -181,13 +181,13 @@ xfs_iformat_fork( default: XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } break; default: XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (error) { return error; @@ -211,7 +211,7 @@ xfs_iformat_fork( XFS_CORRUPTION_ERROR("xfs_iformat(8)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); @@ -223,7 +223,7 @@ xfs_iformat_fork( error = xfs_iformat_btree(ip, dip, XFS_ATTR_FORK); break; default: - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; break; } if (error) { @@ -266,7 +266,7 @@ xfs_iformat_local( XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)); XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } ifp = XFS_IFORK_PTR(ip, whichfork); real_size = 0; @@ -322,7 +322,7 @@ xfs_iformat_extents( (unsigned long long) ip->i_ino, nex); XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } ifp->if_real_bytes = 0; @@ -350,7 +350,7 @@ xfs_iformat_extents( XFS_ERROR_REPORT("xfs_iformat_extents(2)", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } } ifp->if_flags |= XFS_IFEXTENTS; @@ -399,7 +399,7 @@ xfs_iformat_btree( (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, mp, dip); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } ifp->if_broot_bytes = size; @@ -436,7 +436,7 @@ xfs_iread_extents( if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } nextents = XFS_IFORK_NEXTENTS(ip, whichfork); ifp = XFS_IFORK_PTR(ip, whichfork); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0b18776..2afe0d1 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -207,7 +207,7 @@ xfs_open_by_handle( struct path path; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; dentry = xfs_handlereq_to_dentry(parfilp, hreq); if (IS_ERR(dentry)) @@ -216,7 +216,7 @@ xfs_open_by_handle( /* Restrict xfs_open_by_handle to directories & regular files. */ if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) { - error = -XFS_ERROR(EPERM); + error = -EPERM; goto out_dput; } @@ -228,18 +228,18 @@ xfs_open_by_handle( fmode = OPEN_FMODE(permflag); if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) && (fmode & FMODE_WRITE) && IS_APPEND(inode)) { - error = -XFS_ERROR(EPERM); + error = -EPERM; goto out_dput; } if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { - error = -XFS_ERROR(EACCES); + error = -EACCES; goto out_dput; } /* Can't write directories. */ if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) { - error = -XFS_ERROR(EISDIR); + error = -EISDIR; goto out_dput; } @@ -282,7 +282,7 @@ xfs_readlink_by_handle( int error; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; dentry = xfs_handlereq_to_dentry(parfilp, hreq); if (IS_ERR(dentry)) @@ -290,18 +290,18 @@ xfs_readlink_by_handle( /* Restrict this handle operation to symlinks only. */ if (!S_ISLNK(dentry->d_inode->i_mode)) { - error = -XFS_ERROR(EINVAL); + error = -EINVAL; goto out_dput; } if (copy_from_user(&olen, hreq->ohandlen, sizeof(__u32))) { - error = -XFS_ERROR(EFAULT); + error = -EFAULT; goto out_dput; } link = kmalloc(MAXPATHLEN+1, GFP_KERNEL); if (!link) { - error = -XFS_ERROR(ENOMEM); + error = -ENOMEM; goto out_dput; } @@ -330,10 +330,10 @@ xfs_set_dmattrs( int error; if (!capable(CAP_SYS_ADMIN)) - return XFS_ERROR(EPERM); + return EPERM; if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; tp = xfs_trans_alloc(mp, XFS_TRANS_SET_DMATTRS); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); @@ -364,9 +364,9 @@ xfs_fssetdm_by_handle( struct dentry *dentry; if (!capable(CAP_MKNOD)) - return -XFS_ERROR(EPERM); + return -EPERM; if (copy_from_user(&dmhreq, arg, sizeof(xfs_fsop_setdm_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(parfilp); if (error) @@ -379,12 +379,12 @@ xfs_fssetdm_by_handle( } if (IS_IMMUTABLE(dentry->d_inode) || IS_APPEND(dentry->d_inode)) { - error = -XFS_ERROR(EPERM); + error = -EPERM; goto out; } if (copy_from_user(&fsd, dmhreq.data, sizeof(fsd))) { - error = -XFS_ERROR(EFAULT); + error = -EFAULT; goto out; } @@ -409,18 +409,18 @@ xfs_attrlist_by_handle( char *kbuf; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (al_hreq.buflen < sizeof(struct attrlist) || al_hreq.buflen > XATTR_LIST_MAX) - return -XFS_ERROR(EINVAL); + return -EINVAL; /* * Reject flags, only allow namespaces. */ if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE)) - return -XFS_ERROR(EINVAL); + return -EINVAL; dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) @@ -524,9 +524,9 @@ xfs_attrmulti_by_handle( unsigned char *attr_name; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (copy_from_user(&am_hreq, arg, sizeof(xfs_fsop_attrmulti_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; /* overflow check */ if (am_hreq.opcount >= INT_MAX / sizeof(xfs_attr_multiop_t)) @@ -592,7 +592,7 @@ xfs_attrmulti_by_handle( } if (copy_to_user(am_hreq.ops, ops, size)) - error = XFS_ERROR(EFAULT); + error = EFAULT; kfree(attr_name); out_kfree_ops: @@ -624,16 +624,16 @@ xfs_ioc_space( */ if (!xfs_sb_version_hasextflgbit(&ip->i_mount->m_sb) && !capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (inode->i_flags & (S_IMMUTABLE|S_APPEND)) - return -XFS_ERROR(EPERM); + return -EPERM; if (!(filp->f_mode & FMODE_WRITE)) - return -XFS_ERROR(EBADF); + return -EBADF; if (!S_ISREG(inode->i_mode)) - return -XFS_ERROR(EINVAL); + return -EINVAL; error = mnt_want_write_file(filp); if (error) @@ -651,7 +651,7 @@ xfs_ioc_space( bf->l_start += XFS_ISIZE(ip); break; default: - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_unlock; } @@ -668,7 +668,7 @@ xfs_ioc_space( case XFS_IOC_UNRESVSP: case XFS_IOC_UNRESVSP64: if (bf->l_len <= 0) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_unlock; } break; @@ -681,7 +681,7 @@ xfs_ioc_space( bf->l_start > mp->m_super->s_maxbytes || bf->l_start + bf->l_len < 0 || bf->l_start + bf->l_len >= mp->m_super->s_maxbytes) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_unlock; } @@ -722,7 +722,7 @@ xfs_ioc_space( break; default: ASSERT(0); - error = XFS_ERROR(EINVAL); + error = EINVAL; } if (error) @@ -780,19 +780,19 @@ xfs_ioc_bulkstat( return -EPERM; if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; if (copy_from_user(&bulkreq, arg, sizeof(xfs_fsop_bulkreq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (copy_from_user(&inlast, bulkreq.lastip, sizeof(__s64))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if ((count = bulkreq.icount) <= 0) - return -XFS_ERROR(EINVAL); + return -EINVAL; if (bulkreq.ubuffer == NULL) - return -XFS_ERROR(EINVAL); + return -EINVAL; if (cmd == XFS_IOC_FSINUMBERS) error = xfs_inumbers(mp, &inlast, &count, @@ -811,10 +811,10 @@ xfs_ioc_bulkstat( if (bulkreq.ocount != NULL) { if (copy_to_user(bulkreq.lastip, &inlast, sizeof(xfs_ino_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (copy_to_user(bulkreq.ocount, &count, sizeof(count))) - return -XFS_ERROR(EFAULT); + return -EFAULT; } return 0; @@ -838,7 +838,7 @@ xfs_ioc_fsgeometry_v1( * xfs_fsop_geom_t that xfs_fs_geometry() fills in. */ if (copy_to_user(arg, &fsgeo, sizeof(xfs_fsop_geom_v1_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -855,7 +855,7 @@ xfs_ioc_fsgeometry( return -error; if (copy_to_user(arg, &fsgeo, sizeof(fsgeo))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1040,16 +1040,16 @@ xfs_ioctl_setattr( trace_xfs_ioctl_setattr(ip); if (mp->m_flags & XFS_MOUNT_RDONLY) - return XFS_ERROR(EROFS); + return EROFS; if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; /* * Disallow 32bit project ids when projid32bit feature is not enabled. */ if ((mask & FSX_PROJID) && (fa->fsx_projid > (__uint16_t)-1) && !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb)) - return XFS_ERROR(EINVAL); + return EINVAL; /* * If disk quotas is on, we make sure that the dquots do exist on disk, @@ -1087,7 +1087,7 @@ xfs_ioctl_setattr( * CAP_FSETID capability is applicable. */ if (!inode_owner_or_capable(VFS_I(ip))) { - code = XFS_ERROR(EPERM); + code = EPERM; goto error_return; } @@ -1098,7 +1098,7 @@ xfs_ioctl_setattr( */ if (mask & FSX_PROJID) { if (current_user_ns() != &init_user_ns) { - code = XFS_ERROR(EINVAL); + code = EINVAL; goto error_return; } @@ -1121,7 +1121,7 @@ xfs_ioctl_setattr( if (ip->i_d.di_nextents && ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize)) { - code = XFS_ERROR(EINVAL); /* EFBIG? */ + code = EINVAL; /* EFBIG? */ goto error_return; } @@ -1140,7 +1140,7 @@ xfs_ioctl_setattr( extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize); if (extsize_fsb > MAXEXTLEN) { - code = XFS_ERROR(EINVAL); + code = EINVAL; goto error_return; } @@ -1152,13 +1152,13 @@ xfs_ioctl_setattr( } else { size = mp->m_sb.sb_blocksize; if (extsize_fsb > mp->m_sb.sb_agblocks / 2) { - code = XFS_ERROR(EINVAL); + code = EINVAL; goto error_return; } } if (fa->fsx_extsize % size) { - code = XFS_ERROR(EINVAL); + code = EINVAL; goto error_return; } } @@ -1172,7 +1172,7 @@ xfs_ioctl_setattr( if ((ip->i_d.di_nextents || ip->i_delayed_blks) && (XFS_IS_REALTIME_INODE(ip)) != (fa->fsx_xflags & XFS_XFLAG_REALTIME)) { - code = XFS_ERROR(EINVAL); /* EFBIG? */ + code = EINVAL; /* EFBIG? */ goto error_return; } @@ -1183,7 +1183,7 @@ xfs_ioctl_setattr( if ((mp->m_sb.sb_rblocks == 0) || (mp->m_sb.sb_rextsize == 0) || (ip->i_d.di_extsize % mp->m_sb.sb_rextsize)) { - code = XFS_ERROR(EINVAL); + code = EINVAL; goto error_return; } } @@ -1197,7 +1197,7 @@ xfs_ioctl_setattr( (fa->fsx_xflags & (XFS_XFLAG_IMMUTABLE | XFS_XFLAG_APPEND))) && !capable(CAP_LINUX_IMMUTABLE)) { - code = XFS_ERROR(EPERM); + code = EPERM; goto error_return; } } @@ -1362,7 +1362,7 @@ xfs_getbmap_format(void **ap, struct getbmapx *bmv, int *full) /* copy only getbmap portion (not getbmapx) */ if (copy_to_user(base, bmv, sizeof(struct getbmap))) - return XFS_ERROR(EFAULT); + return EFAULT; *ap += sizeof(struct getbmap); return 0; @@ -1379,10 +1379,10 @@ xfs_ioc_getbmap( int error; if (copy_from_user(&bmx, arg, sizeof(struct getbmapx))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (bmx.bmv_count < 2) - return -XFS_ERROR(EINVAL); + return -EINVAL; bmx.bmv_iflags = (cmd == XFS_IOC_GETBMAPA ? BMV_IF_ATTRFORK : 0); if (ioflags & IO_INVIS) @@ -1395,7 +1395,7 @@ xfs_ioc_getbmap( /* copy back header - only size of getbmap */ if (copy_to_user(arg, &bmx, sizeof(struct getbmap))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1405,7 +1405,7 @@ xfs_getbmapx_format(void **ap, struct getbmapx *bmv, int *full) struct getbmapx __user *base = *ap; if (copy_to_user(base, bmv, sizeof(struct getbmapx))) - return XFS_ERROR(EFAULT); + return EFAULT; *ap += sizeof(struct getbmapx); return 0; @@ -1420,13 +1420,13 @@ xfs_ioc_getbmapx( int error; if (copy_from_user(&bmx, arg, sizeof(bmx))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (bmx.bmv_count < 2) - return -XFS_ERROR(EINVAL); + return -EINVAL; if (bmx.bmv_iflags & (~BMV_IF_VALID)) - return -XFS_ERROR(EINVAL); + return -EINVAL; error = xfs_getbmap(ip, &bmx, xfs_getbmapx_format, (struct getbmapx *)arg+1); @@ -1435,7 +1435,7 @@ xfs_ioc_getbmapx( /* copy back header */ if (copy_to_user(arg, &bmx, sizeof(struct getbmapx))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1451,33 +1451,33 @@ xfs_ioc_swapext( /* Pull information for the target fd */ f = fdget((int)sxp->sx_fdtarget); if (!f.file) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out; } if (!(f.file->f_mode & FMODE_WRITE) || !(f.file->f_mode & FMODE_READ) || (f.file->f_flags & O_APPEND)) { - error = XFS_ERROR(EBADF); + error = EBADF; goto out_put_file; } tmp = fdget((int)sxp->sx_fdtmp); if (!tmp.file) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_put_file; } if (!(tmp.file->f_mode & FMODE_WRITE) || !(tmp.file->f_mode & FMODE_READ) || (tmp.file->f_flags & O_APPEND)) { - error = XFS_ERROR(EBADF); + error = EBADF; goto out_put_tmp_file; } if (IS_SWAPFILE(file_inode(f.file)) || IS_SWAPFILE(file_inode(tmp.file))) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_put_tmp_file; } @@ -1485,17 +1485,17 @@ xfs_ioc_swapext( tip = XFS_I(file_inode(tmp.file)); if (ip->i_mount != tip->i_mount) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_put_tmp_file; } if (ip->i_ino == tip->i_ino) { - error = XFS_ERROR(EINVAL); + error = EINVAL; goto out_put_tmp_file; } if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { - error = XFS_ERROR(EIO); + error = EIO; goto out_put_tmp_file; } @@ -1548,7 +1548,7 @@ xfs_file_ioctl( xfs_flock64_t bf; if (copy_from_user(&bf, arg, sizeof(bf))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return xfs_ioc_space(ip, inode, filp, ioflags, cmd, &bf); } case XFS_IOC_DIOINFO: { @@ -1561,7 +1561,7 @@ xfs_file_ioctl( da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); if (copy_to_user(arg, &da, sizeof(da))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1594,7 +1594,7 @@ xfs_file_ioctl( struct fsdmidata dmi; if (copy_from_user(&dmi, arg, sizeof(dmi))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) @@ -1619,14 +1619,14 @@ xfs_file_ioctl( xfs_fsop_handlereq_t hreq; if (copy_from_user(&hreq, arg, sizeof(hreq))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return xfs_find_handle(cmd, &hreq); } case XFS_IOC_OPEN_BY_HANDLE: { xfs_fsop_handlereq_t hreq; if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return xfs_open_by_handle(filp, &hreq); } case XFS_IOC_FSSETDM_BY_HANDLE: @@ -1636,7 +1636,7 @@ xfs_file_ioctl( xfs_fsop_handlereq_t hreq; if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return xfs_readlink_by_handle(filp, &hreq); } case XFS_IOC_ATTRLIST_BY_HANDLE: @@ -1649,7 +1649,7 @@ xfs_file_ioctl( struct xfs_swapext sxp; if (copy_from_user(&sxp, arg, sizeof(xfs_swapext_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) return error; @@ -1666,7 +1666,7 @@ xfs_file_ioctl( return -error; if (copy_to_user(arg, &out, sizeof(out))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1678,10 +1678,10 @@ xfs_file_ioctl( return -EPERM; if (mp->m_flags & XFS_MOUNT_RDONLY) - return -XFS_ERROR(EROFS); + return -EROFS; if (copy_from_user(&inout, arg, sizeof(inout))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) @@ -1695,7 +1695,7 @@ xfs_file_ioctl( return -error; if (copy_to_user(arg, &inout, sizeof(inout))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1710,7 +1710,7 @@ xfs_file_ioctl( return -error; if (copy_to_user(arg, &out, sizeof(out))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -1719,7 +1719,7 @@ xfs_file_ioctl( xfs_growfs_data_t in; if (copy_from_user(&in, arg, sizeof(in))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) @@ -1733,7 +1733,7 @@ xfs_file_ioctl( xfs_growfs_log_t in; if (copy_from_user(&in, arg, sizeof(in))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) @@ -1747,7 +1747,7 @@ xfs_file_ioctl( xfs_growfs_rt_t in; if (copy_from_user(&in, arg, sizeof(in))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) @@ -1764,7 +1764,7 @@ xfs_file_ioctl( return -EPERM; if (get_user(in, (__uint32_t __user *)arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = xfs_fs_goingdown(mp, in); return -error; @@ -1777,7 +1777,7 @@ xfs_file_ioctl( return -EPERM; if (copy_from_user(&in, arg, sizeof(in))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = xfs_errortag_add(in.errtag, mp); return -error; @@ -1798,10 +1798,10 @@ xfs_file_ioctl( return -EPERM; if (mp->m_flags & XFS_MOUNT_RDONLY) - return -XFS_ERROR(EROFS); + return -EROFS; if (copy_from_user(&eofb, arg, sizeof(eofb))) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = xfs_fs_eofblocks_from_user(&eofb, &keofb); if (error) diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index a7992f8..8916c13 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -56,7 +56,7 @@ xfs_compat_flock64_copyin( get_user(bf->l_sysid, &arg32->l_sysid) || get_user(bf->l_pid, &arg32->l_pid) || copy_from_user(bf->l_pad, &arg32->l_pad, 4*sizeof(u32))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -73,7 +73,7 @@ xfs_compat_ioc_fsgeometry_v1( return -error; /* The 32-bit variant simply has some padding at the end */ if (copy_to_user(arg32, &fsgeo, sizeof(struct compat_xfs_fsop_geom_v1))) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -84,7 +84,7 @@ xfs_compat_growfs_data_copyin( { if (get_user(in->newblocks, &arg32->newblocks) || get_user(in->imaxpct, &arg32->imaxpct)) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -95,7 +95,7 @@ xfs_compat_growfs_rt_copyin( { if (get_user(in->newblocks, &arg32->newblocks) || get_user(in->extsize, &arg32->extsize)) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -113,7 +113,7 @@ xfs_inumbers_fmt_compat( if (put_user(buffer[i].xi_startino, &p32[i].xi_startino) || put_user(buffer[i].xi_alloccount, &p32[i].xi_alloccount) || put_user(buffer[i].xi_allocmask, &p32[i].xi_allocmask)) - return -XFS_ERROR(EFAULT); + return -EFAULT; } *written = count * sizeof(*p32); return 0; @@ -132,7 +132,7 @@ xfs_ioctl32_bstime_copyin( if (get_user(sec32, &bstime32->tv_sec) || get_user(bstime->tv_nsec, &bstime32->tv_nsec)) - return -XFS_ERROR(EFAULT); + return -EFAULT; bstime->tv_sec = sec32; return 0; } @@ -164,7 +164,7 @@ xfs_ioctl32_bstat_copyin( get_user(bstat->bs_dmevmask, &bstat32->bs_dmevmask) || get_user(bstat->bs_dmstate, &bstat32->bs_dmstate) || get_user(bstat->bs_aextents, &bstat32->bs_aextents)) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -180,7 +180,7 @@ xfs_bstime_store_compat( sec32 = p->tv_sec; if (put_user(sec32, &p32->tv_sec) || put_user(p->tv_nsec, &p32->tv_nsec)) - return -XFS_ERROR(EFAULT); + return -EFAULT; return 0; } @@ -195,7 +195,7 @@ xfs_bulkstat_one_fmt_compat( compat_xfs_bstat_t __user *p32 = ubuffer; if (ubsize < sizeof(*p32)) - return XFS_ERROR(ENOMEM); + return ENOMEM; if (put_user(buffer->bs_ino, &p32->bs_ino) || put_user(buffer->bs_mode, &p32->bs_mode) || @@ -218,7 +218,7 @@ xfs_bulkstat_one_fmt_compat( put_user(buffer->bs_dmevmask, &p32->bs_dmevmask) || put_user(buffer->bs_dmstate, &p32->bs_dmstate) || put_user(buffer->bs_aextents, &p32->bs_aextents)) - return XFS_ERROR(EFAULT); + return EFAULT; if (ubused) *ubused = sizeof(*p32); return 0; @@ -256,30 +256,30 @@ xfs_compat_ioc_bulkstat( /* should be called again (unused here, but used in dmapi) */ if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; if (get_user(addr, &p32->lastip)) - return -XFS_ERROR(EFAULT); + return -EFAULT; bulkreq.lastip = compat_ptr(addr); if (get_user(bulkreq.icount, &p32->icount) || get_user(addr, &p32->ubuffer)) - return -XFS_ERROR(EFAULT); + return -EFAULT; bulkreq.ubuffer = compat_ptr(addr); if (get_user(addr, &p32->ocount)) - return -XFS_ERROR(EFAULT); + return -EFAULT; bulkreq.ocount = compat_ptr(addr); if (copy_from_user(&inlast, bulkreq.lastip, sizeof(__s64))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if ((count = bulkreq.icount) <= 0) - return -XFS_ERROR(EINVAL); + return -EINVAL; if (bulkreq.ubuffer == NULL) - return -XFS_ERROR(EINVAL); + return -EINVAL; if (cmd == XFS_IOC_FSINUMBERS_32) { error = xfs_inumbers(mp, &inlast, &count, @@ -294,17 +294,17 @@ xfs_compat_ioc_bulkstat( xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, &done); } else - error = XFS_ERROR(EINVAL); + error = EINVAL; if (error) return -error; if (bulkreq.ocount != NULL) { if (copy_to_user(bulkreq.lastip, &inlast, sizeof(xfs_ino_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (copy_to_user(bulkreq.ocount, &count, sizeof(count))) - return -XFS_ERROR(EFAULT); + return -EFAULT; } return 0; @@ -318,7 +318,7 @@ xfs_compat_handlereq_copyin( compat_xfs_fsop_handlereq_t hreq32; if (copy_from_user(&hreq32, arg32, sizeof(compat_xfs_fsop_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; hreq->fd = hreq32.fd; hreq->path = compat_ptr(hreq32.path); @@ -352,19 +352,19 @@ xfs_compat_attrlist_by_handle( char *kbuf; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (copy_from_user(&al_hreq, arg, sizeof(compat_xfs_fsop_attrlist_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; if (al_hreq.buflen < sizeof(struct attrlist) || al_hreq.buflen > XATTR_LIST_MAX) - return -XFS_ERROR(EINVAL); + return -EINVAL; /* * Reject flags, only allow namespaces. */ if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE)) - return -XFS_ERROR(EINVAL); + return -EINVAL; dentry = xfs_compat_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) @@ -404,10 +404,10 @@ xfs_compat_attrmulti_by_handle( unsigned char *attr_name; if (!capable(CAP_SYS_ADMIN)) - return -XFS_ERROR(EPERM); + return -EPERM; if (copy_from_user(&am_hreq, arg, sizeof(compat_xfs_fsop_attrmulti_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; /* overflow check */ if (am_hreq.opcount >= INT_MAX / sizeof(compat_xfs_attr_multiop_t)) @@ -474,7 +474,7 @@ xfs_compat_attrmulti_by_handle( } if (copy_to_user(compat_ptr(am_hreq.ops), ops, size)) - error = XFS_ERROR(EFAULT); + error = EFAULT; kfree(attr_name); out_kfree_ops: @@ -495,22 +495,22 @@ xfs_compat_fssetdm_by_handle( struct dentry *dentry; if (!capable(CAP_MKNOD)) - return -XFS_ERROR(EPERM); + return -EPERM; if (copy_from_user(&dmhreq, arg, sizeof(compat_xfs_fsop_setdm_handlereq_t))) - return -XFS_ERROR(EFAULT); + return -EFAULT; dentry = xfs_compat_handlereq_to_dentry(parfilp, &dmhreq.hreq); if (IS_ERR(dentry)) return PTR_ERR(dentry); if (IS_IMMUTABLE(dentry->d_inode) || IS_APPEND(dentry->d_inode)) { - error = -XFS_ERROR(EPERM); + error = -EPERM; goto out; } if (copy_from_user(&fsd, compat_ptr(dmhreq.data), sizeof(fsd))) { - error = -XFS_ERROR(EFAULT); + error = -EFAULT; goto out; } @@ -587,7 +587,7 @@ xfs_file_compat_ioctl( struct xfs_flock64 bf; if (xfs_compat_flock64_copyin(&bf, arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; cmd = _NATIVE_IOC(cmd, struct xfs_flock64); return xfs_ioc_space(ip, inode, filp, ioflags, cmd, &bf); } @@ -597,7 +597,7 @@ xfs_file_compat_ioctl( struct xfs_growfs_data in; if (xfs_compat_growfs_data_copyin(&in, arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) return error; @@ -609,7 +609,7 @@ xfs_file_compat_ioctl( struct xfs_growfs_rt in; if (xfs_compat_growfs_rt_copyin(&in, arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) return error; @@ -632,7 +632,7 @@ xfs_file_compat_ioctl( if (copy_from_user(&sxp, sxu, offsetof(struct xfs_swapext, sx_stat)) || xfs_ioctl32_bstat_copyin(&sxp.sx_stat, &sxu->sx_stat)) - return -XFS_ERROR(EFAULT); + return -EFAULT; error = mnt_want_write_file(filp); if (error) return error; @@ -650,7 +650,7 @@ xfs_file_compat_ioctl( struct xfs_fsop_handlereq hreq; if (xfs_compat_handlereq_copyin(&hreq, arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; cmd = _NATIVE_IOC(cmd, struct xfs_fsop_handlereq); return xfs_find_handle(cmd, &hreq); } @@ -658,14 +658,14 @@ xfs_file_compat_ioctl( struct xfs_fsop_handlereq hreq; if (xfs_compat_handlereq_copyin(&hreq, arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; return xfs_open_by_handle(filp, &hreq); } case XFS_IOC_READLINK_BY_HANDLE_32: { struct xfs_fsop_handlereq hreq; if (xfs_compat_handlereq_copyin(&hreq, arg)) - return -XFS_ERROR(EFAULT); + return -EFAULT; return xfs_readlink_by_handle(filp, &hreq); } case XFS_IOC_ATTRLIST_BY_HANDLE_32: @@ -675,6 +675,6 @@ xfs_file_compat_ioctl( case XFS_IOC_FSSETDM_BY_HANDLE_32: return xfs_compat_fssetdm_by_handle(filp, arg); default: - return -XFS_ERROR(ENOIOCTLCMD); + return -ENOIOCTLCMD; } } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 3b80eba..2bf7d12 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -138,7 +138,7 @@ xfs_iomap_write_direct( error = xfs_qm_dqattach(ip, 0); if (error) - return XFS_ERROR(error); + return error; rt = XFS_IS_REALTIME_INODE(ip); extsz = xfs_get_extsz_hint(ip); @@ -148,7 +148,7 @@ xfs_iomap_write_direct( if ((offset + count) > XFS_ISIZE(ip)) { error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb); if (error) - return XFS_ERROR(error); + return error; } else { if (nmaps && (imap->br_startblock == HOLESTARTBLOCK)) last_fsb = MIN(last_fsb, (xfs_fileoff_t) @@ -188,7 +188,7 @@ xfs_iomap_write_direct( */ if (error) { xfs_trans_cancel(tp, 0); - return XFS_ERROR(error); + return error; } xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -225,7 +225,7 @@ xfs_iomap_write_direct( * Copy any maps to caller's array and return any error. */ if (nimaps == 0) { - error = XFS_ERROR(ENOSPC); + error = ENOSPC; goto out_unlock; } @@ -552,7 +552,7 @@ xfs_iomap_write_delay( */ error = xfs_qm_dqattach_locked(ip, 0); if (error) - return XFS_ERROR(error); + return error; extsz = xfs_get_extsz_hint(ip); offset_fsb = XFS_B_TO_FSBT(mp, offset); @@ -600,7 +600,7 @@ retry: case EDQUOT: break; default: - return XFS_ERROR(error); + return error; } /* @@ -614,7 +614,7 @@ retry: error = 0; goto retry; } - return XFS_ERROR(error ? error : ENOSPC); + return error ? error : ENOSPC; } if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) @@ -663,7 +663,7 @@ xfs_iomap_write_allocate( */ error = xfs_qm_dqattach(ip, 0); if (error) - return XFS_ERROR(error); + return error; offset_fsb = XFS_B_TO_FSBT(mp, offset); count_fsb = imap->br_blockcount; @@ -690,7 +690,7 @@ xfs_iomap_write_allocate( nres, 0); if (error) { xfs_trans_cancel(tp, 0); - return XFS_ERROR(error); + return error; } xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, 0); @@ -794,7 +794,7 @@ trans_cancel: xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); error0: xfs_iunlock(ip, XFS_ILOCK_EXCL); - return XFS_ERROR(error); + return error; } int @@ -854,7 +854,7 @@ xfs_iomap_write_unwritten( resblks, 0); if (error) { xfs_trans_cancel(tp, 0); - return XFS_ERROR(error); + return error; } xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -893,7 +893,7 @@ xfs_iomap_write_unwritten( error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(ip, XFS_ILOCK_EXCL); if (error) - return XFS_ERROR(error); + return error; if (!(imap.br_startblock || XFS_IS_REALTIME_INODE(ip))) return xfs_alert_fsblock_zero(ip, &imap); @@ -916,5 +916,5 @@ error_on_bmapi_transaction: xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT)); xfs_iunlock(ip, XFS_ILOCK_EXCL); - return XFS_ERROR(error); + return error; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 89b07e4..1342884 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -420,7 +420,7 @@ xfs_vn_getattr( trace_xfs_getattr(ip); if (XFS_FORCED_SHUTDOWN(mp)) - return -XFS_ERROR(EIO); + return -EIO; stat->size = XFS_ISIZE(ip); stat->dev = inode->i_sb->s_dev; @@ -525,14 +525,14 @@ xfs_setattr_nonsize( /* If acls are being inherited, we already have this checked */ if (!(flags & XFS_ATTR_NOACL)) { if (mp->m_flags & XFS_MOUNT_RDONLY) - return XFS_ERROR(EROFS); + return EROFS; if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; error = -inode_change_ok(inode, iattr); if (error) - return XFS_ERROR(error); + return error; } ASSERT((mask & ATTR_SIZE) == 0); @@ -682,7 +682,7 @@ xfs_setattr_nonsize( xfs_qm_dqrele(gdqp); if (error) - return XFS_ERROR(error); + return error; /* * XXX(hch): Updating the ACL entries is not atomic vs the i_mode @@ -694,7 +694,7 @@ xfs_setattr_nonsize( if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) { error = -posix_acl_chmod(inode, inode->i_mode); if (error) - return XFS_ERROR(error); + return error; } return 0; @@ -727,14 +727,14 @@ xfs_setattr_size( trace_xfs_setattr(ip); if (mp->m_flags & XFS_MOUNT_RDONLY) - return XFS_ERROR(EROFS); + return EROFS; if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; error = -inode_change_ok(inode, iattr); if (error) - return XFS_ERROR(error); + return error; ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(S_ISREG(ip->i_d.di_mode)); diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f463382..6dc5edd 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -67,11 +67,11 @@ xfs_bulkstat_one_int( *stat = BULKSTAT_RV_NOTHING; if (!buffer || xfs_internal_inum(mp, ino)) - return XFS_ERROR(EINVAL); + return EINVAL; buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); if (!buf) - return XFS_ERROR(ENOMEM); + return ENOMEM; error = xfs_iget(mp, NULL, ino, (XFS_IGET_DONTCACHE | XFS_IGET_UNTRUSTED), @@ -154,9 +154,9 @@ xfs_bulkstat_one_fmt( const xfs_bstat_t *buffer) { if (ubsize < sizeof(*buffer)) - return XFS_ERROR(ENOMEM); + return ENOMEM; if (copy_to_user(ubuffer, buffer, sizeof(*buffer))) - return XFS_ERROR(EFAULT); + return EFAULT; if (ubused) *ubused = sizeof(*buffer); return 0; @@ -551,7 +551,7 @@ xfs_bulkstat_single( return error; if (count == 0 || (xfs_ino_t)*lastinop != ino) return error == EFSCORRUPTED ? - XFS_ERROR(EINVAL) : error; + EINVAL : error; else return 0; } @@ -659,7 +659,7 @@ xfs_inumbers( if (bufidx == bcount) { long written; if (formatter(ubuffer, buffer, bufidx, &written)) { - error = XFS_ERROR(EFAULT); + error = EFAULT; break; } ubuffer += written; @@ -686,7 +686,7 @@ xfs_inumbers( if (bufidx) { long written; if (formatter(ubuffer, buffer, bufidx, &written)) - error = XFS_ERROR(EFAULT); + error = EFAULT; else *count += bufidx; } diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 8497a00..493ac0d 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -283,7 +283,7 @@ xlog_grant_head_wait( return 0; shutdown: list_del_init(&tic->t_queue); - return XFS_ERROR(EIO); + return EIO; } /* @@ -377,7 +377,7 @@ xfs_log_regrant( int error = 0; if (XLOG_FORCED_SHUTDOWN(log)) - return XFS_ERROR(EIO); + return EIO; XFS_STATS_INC(xs_try_logspace); @@ -446,7 +446,7 @@ xfs_log_reserve( ASSERT(client == XFS_TRANSACTION || client == XFS_LOG); if (XLOG_FORCED_SHUTDOWN(log)) - return XFS_ERROR(EIO); + return EIO; XFS_STATS_INC(xs_try_logspace); @@ -454,7 +454,7 @@ xfs_log_reserve( tic = xlog_ticket_alloc(log, unit_bytes, cnt, client, permanent, KM_SLEEP | KM_MAYFAIL); if (!tic) - return XFS_ERROR(ENOMEM); + return ENOMEM; tic->t_trans_type = t_type; *ticp = tic; @@ -2323,7 +2323,7 @@ xlog_write( ophdr = xlog_write_setup_ophdr(log, ptr, ticket, flags); if (!ophdr) - return XFS_ERROR(EIO); + return EIO; xlog_write_adv_cnt(&ptr, &len, &log_offset, sizeof(struct xlog_op_header)); @@ -2822,7 +2822,7 @@ restart: spin_lock(&log->l_icloglock); if (XLOG_FORCED_SHUTDOWN(log)) { spin_unlock(&log->l_icloglock); - return XFS_ERROR(EIO); + return EIO; } iclog = log->l_iclog; @@ -3010,7 +3010,7 @@ xlog_state_release_iclog( int sync = 0; /* do we sync? */ if (iclog->ic_state & XLOG_STATE_IOERROR) - return XFS_ERROR(EIO); + return EIO; ASSERT(atomic_read(&iclog->ic_refcnt) > 0); if (!atomic_dec_and_lock(&iclog->ic_refcnt, &log->l_icloglock)) @@ -3018,7 +3018,7 @@ xlog_state_release_iclog( if (iclog->ic_state & XLOG_STATE_IOERROR) { spin_unlock(&log->l_icloglock); - return XFS_ERROR(EIO); + return EIO; } ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE || iclog->ic_state == XLOG_STATE_WANT_SYNC); @@ -3135,7 +3135,7 @@ _xfs_log_force( iclog = log->l_iclog; if (iclog->ic_state & XLOG_STATE_IOERROR) { spin_unlock(&log->l_icloglock); - return XFS_ERROR(EIO); + return EIO; } /* If the head iclog is not active nor dirty, we just attach @@ -3173,7 +3173,7 @@ _xfs_log_force( spin_unlock(&log->l_icloglock); if (xlog_state_release_iclog(log, iclog)) - return XFS_ERROR(EIO); + return EIO; if (log_flushed) *log_flushed = 1; @@ -3209,7 +3209,7 @@ maybe_sleep: */ if (iclog->ic_state & XLOG_STATE_IOERROR) { spin_unlock(&log->l_icloglock); - return XFS_ERROR(EIO); + return EIO; } XFS_STATS_INC(xs_log_force_sleep); xlog_wait(&iclog->ic_force_wait, &log->l_icloglock); @@ -3219,7 +3219,7 @@ maybe_sleep: * and the memory read should be atomic. */ if (iclog->ic_state & XLOG_STATE_IOERROR) - return XFS_ERROR(EIO); + return EIO; if (log_flushed) *log_flushed = 1; } else { @@ -3287,7 +3287,7 @@ try_again: iclog = log->l_iclog; if (iclog->ic_state & XLOG_STATE_IOERROR) { spin_unlock(&log->l_icloglock); - return XFS_ERROR(EIO); + return EIO; } do { @@ -3338,7 +3338,7 @@ try_again: xlog_state_switch_iclogs(log, iclog, 0); spin_unlock(&log->l_icloglock); if (xlog_state_release_iclog(log, iclog)) - return XFS_ERROR(EIO); + return EIO; if (log_flushed) *log_flushed = 1; spin_lock(&log->l_icloglock); @@ -3353,7 +3353,7 @@ try_again: */ if (iclog->ic_state & XLOG_STATE_IOERROR) { spin_unlock(&log->l_icloglock); - return XFS_ERROR(EIO); + return EIO; } XFS_STATS_INC(xs_log_force_sleep); xlog_wait(&iclog->ic_force_wait, &log->l_icloglock); @@ -3363,7 +3363,7 @@ try_again: * and the memory read should be atomic. */ if (iclog->ic_state & XLOG_STATE_IOERROR) - return XFS_ERROR(EIO); + return EIO; if (log_flushed) *log_flushed = 1; diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 7e54553..b0cc05a 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -615,7 +615,7 @@ out_abort_free_ticket: xfs_log_ticket_put(tic); out_abort: xlog_cil_committed(ctx, XFS_LI_ABORTED); - return XFS_ERROR(EIO); + return EIO; } static void diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ae82df0..1aa5a67 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -194,7 +194,7 @@ xlog_bread_noalign( bp->b_error = 0; if (XFS_FORCED_SHUTDOWN(log->l_mp)) - return XFS_ERROR(EIO); + return EIO; xfs_buf_iorequest(bp); error = xfs_buf_iowait(bp); @@ -330,14 +330,14 @@ xlog_header_check_recover( xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_recover(1)", XFS_ERRLEVEL_HIGH, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) { xfs_warn(mp, "dirty log entry has mismatched uuid - can't recover"); xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_recover(2)", XFS_ERRLEVEL_HIGH, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } return 0; } @@ -364,7 +364,7 @@ xlog_header_check_mount( xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_mount", XFS_ERRLEVEL_HIGH, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } return 0; } @@ -539,7 +539,7 @@ xlog_find_verify_log_record( xfs_warn(log->l_mp, "Log inconsistent (didn't find previous header)"); ASSERT(0); - error = XFS_ERROR(EIO); + error = EIO; goto out; } @@ -820,7 +820,7 @@ validate_head: /* start ptr at last block ptr before head_blk */ if ((error = xlog_find_verify_log_record(log, start_blk, &head_blk, 0)) == -1) { - error = XFS_ERROR(EIO); + error = EIO; goto bp_err; } else if (error) goto bp_err; @@ -838,7 +838,7 @@ validate_head: if ((error = xlog_find_verify_log_record(log, start_blk, &new_blk, (int)head_blk)) == -1) { - error = XFS_ERROR(EIO); + error = EIO; goto bp_err; } else if (error) goto bp_err; @@ -961,7 +961,7 @@ xlog_find_tail( xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__); xlog_put_bp(bp); ASSERT(0); - return XFS_ERROR(EIO); + return EIO; } /* find blk_no of tail of log */ @@ -1141,7 +1141,7 @@ xlog_find_zeroed( */ xfs_warn(log->l_mp, "Log inconsistent or not a log (last==0, first!=1)"); - error = XFS_ERROR(EINVAL); + error = EINVAL; goto bp_err; } @@ -1181,7 +1181,7 @@ xlog_find_zeroed( */ if ((error = xlog_find_verify_log_record(log, start_blk, &last_blk, 0)) == -1) { - error = XFS_ERROR(EIO); + error = EIO; goto bp_err; } else if (error) goto bp_err; @@ -1354,7 +1354,7 @@ xlog_clear_stale_blocks( if (unlikely(head_block < tail_block || head_block >= log->l_logBBsize)) { XFS_ERROR_REPORT("xlog_clear_stale_blocks(1)", XFS_ERRLEVEL_LOW, log->l_mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } tail_distance = tail_block + (log->l_logBBsize - head_block); } else { @@ -1366,7 +1366,7 @@ xlog_clear_stale_blocks( if (unlikely(head_block >= tail_block || head_cycle != (tail_cycle + 1))){ XFS_ERROR_REPORT("xlog_clear_stale_blocks(2)", XFS_ERRLEVEL_LOW, log->l_mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } tail_distance = tail_block - head_block; } @@ -1551,7 +1551,7 @@ xlog_recover_add_to_trans( xfs_warn(log->l_mp, "%s: bad header magic number", __func__); ASSERT(0); - return XFS_ERROR(EIO); + return EIO; } if (len == sizeof(xfs_trans_header_t)) xlog_recover_add_item(&trans->r_itemq); @@ -1581,7 +1581,7 @@ xlog_recover_add_to_trans( in_f->ilf_size); ASSERT(0); kmem_free(ptr); - return XFS_ERROR(EIO); + return EIO; } item->ri_total = in_f->ilf_size; @@ -1702,7 +1702,7 @@ xlog_recover_reorder_trans( */ if (!list_empty(&sort_list)) list_splice_init(&sort_list, &trans->r_itemq); - error = XFS_ERROR(EIO); + error = EIO; goto out; } } @@ -1943,7 +1943,7 @@ xlog_recover_do_inode_buffer( item, bp); XFS_ERROR_REPORT("xlog_recover_do_inode_buf", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp, @@ -2494,7 +2494,7 @@ xlog_recover_buffer_pass2( bp = xfs_buf_read(mp->m_ddev_targp, buf_f->blf_blkno, buf_f->blf_len, buf_flags, NULL); if (!bp) - return XFS_ERROR(ENOMEM); + return ENOMEM; error = bp->b_error; if (error) { xfs_buf_ioerror_alert(bp, "xlog_recover_do..(read#1)"); @@ -2917,7 +2917,7 @@ out_release: error: if (need_free) kmem_free(in_f); - return XFS_ERROR(error); + return error; } /* @@ -2974,12 +2974,12 @@ xlog_recover_dquot_pass2( recddq = item->ri_buf[1].i_addr; if (recddq == NULL) { xfs_alert(log->l_mp, "NULL dquot in %s.", __func__); - return XFS_ERROR(EIO); + return EIO; } if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) { xfs_alert(log->l_mp, "dquot too small (%d) in %s.", item->ri_buf[1].i_len, __func__); - return XFS_ERROR(EIO); + return EIO; } /* @@ -3005,7 +3005,7 @@ xlog_recover_dquot_pass2( error = xfs_dqcheck(mp, recddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, "xlog_recover_dquot_pass2 (log copy)"); if (error) - return XFS_ERROR(EIO); + return EIO; ASSERT(dq_f->qlf_len == 1); error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dq_f->qlf_blkno, @@ -3026,7 +3026,7 @@ xlog_recover_dquot_pass2( "xlog_recover_dquot_pass2"); if (error) { xfs_buf_relse(bp); - return XFS_ERROR(EIO); + return EIO; } /* @@ -3387,7 +3387,7 @@ xlog_recover_commit_pass1( xfs_warn(log->l_mp, "%s: invalid item type (%d)", __func__, ITEM_TYPE(item)); ASSERT(0); - return XFS_ERROR(EIO); + return EIO; } } @@ -3423,7 +3423,7 @@ xlog_recover_commit_pass2( xfs_warn(log->l_mp, "%s: invalid item type (%d)", __func__, ITEM_TYPE(item)); ASSERT(0); - return XFS_ERROR(EIO); + return EIO; } } @@ -3559,7 +3559,7 @@ xlog_recover_process_data( /* check the log format matches our own - else we can't recover */ if (xlog_header_check_recover(log->l_mp, rhead)) - return XFS_ERROR(EIO); + return EIO; while ((dp < lp) && num_logops) { ASSERT(dp + sizeof(xlog_op_header_t) <= lp); @@ -3570,7 +3570,7 @@ xlog_recover_process_data( xfs_warn(log->l_mp, "%s: bad clientid 0x%x", __func__, ohead->oh_clientid); ASSERT(0); - return XFS_ERROR(EIO); + return EIO; } tid = be32_to_cpu(ohead->oh_tid); hash = XLOG_RHASH(tid); @@ -3584,7 +3584,7 @@ xlog_recover_process_data( xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, be32_to_cpu(ohead->oh_len)); WARN_ON(1); - return XFS_ERROR(EIO); + return EIO; } flags = ohead->oh_flags & ~XLOG_END_TRANS; if (flags & XLOG_WAS_CONT_TRANS) @@ -3606,7 +3606,7 @@ xlog_recover_process_data( xfs_warn(log->l_mp, "%s: bad transaction", __func__); ASSERT(0); - error = XFS_ERROR(EIO); + error = EIO; break; case 0: case XLOG_CONTINUE_TRANS: @@ -3617,7 +3617,7 @@ xlog_recover_process_data( xfs_warn(log->l_mp, "%s: bad flag 0x%x", __func__, flags); ASSERT(0); - error = XFS_ERROR(EIO); + error = EIO; break; } if (error) { @@ -3668,7 +3668,7 @@ xlog_recover_process_efi( */ set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); xfs_efi_release(efip, efip->efi_format.efi_nextents); - return XFS_ERROR(EIO); + return EIO; } } @@ -4017,14 +4017,14 @@ xlog_valid_rec_header( if (unlikely(rhead->h_magicno != 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); + return EFSCORRUPTED; } if (unlikely( (!rhead->h_version || (be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) { xfs_warn(log->l_mp, "%s: unrecognised log version (%d).", __func__, be32_to_cpu(rhead->h_version)); - return XFS_ERROR(EIO); + return EIO; } /* LR body must have data or it wouldn't have been written */ @@ -4032,12 +4032,12 @@ xlog_valid_rec_header( if (unlikely( hlen <= 0 || hlen > INT_MAX )) { XFS_ERROR_REPORT("xlog_valid_rec_header(2)", XFS_ERRLEVEL_LOW, log->l_mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (unlikely( blkno > log->l_logBBsize || blkno > INT_MAX )) { XFS_ERROR_REPORT("xlog_valid_rec_header(3)", XFS_ERRLEVEL_LOW, log->l_mp); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } return 0; } @@ -4414,7 +4414,7 @@ xlog_do_recover( if (XFS_FORCED_SHUTDOWN(log->l_mp)) { xfs_buf_relse(bp); - return XFS_ERROR(EIO); + return EIO; } xfs_buf_iorequest(bp); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 993cb19..982e8c7 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -76,7 +76,7 @@ xfs_uuid_mount( if (uuid_is_nil(uuid)) { xfs_warn(mp, "Filesystem has nil UUID - can't mount"); - return XFS_ERROR(EINVAL); + return EINVAL; } mutex_lock(&xfs_uuid_table_mutex); @@ -104,7 +104,7 @@ xfs_uuid_mount( out_duplicate: mutex_unlock(&xfs_uuid_table_mutex); xfs_warn(mp, "Filesystem has duplicate UUID %pU - can't mount", uuid); - return XFS_ERROR(EINVAL); + return EINVAL; } STATIC void @@ -381,7 +381,7 @@ xfs_update_alignment(xfs_mount_t *mp) xfs_warn(mp, "alignment check failed: sunit/swidth vs. blocksize(%d)", sbp->sb_blocksize); - return XFS_ERROR(EINVAL); + return EINVAL; } else { /* * Convert the stripe unit and width to FSBs. @@ -391,14 +391,14 @@ xfs_update_alignment(xfs_mount_t *mp) xfs_warn(mp, "alignment check failed: sunit/swidth vs. agsize(%d)", sbp->sb_agblocks); - return XFS_ERROR(EINVAL); + return EINVAL; } else if (mp->m_dalign) { mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth); } else { xfs_warn(mp, "alignment check failed: sunit(%d) less than bsize(%d)", mp->m_dalign, sbp->sb_blocksize); - return XFS_ERROR(EINVAL); + return EINVAL; } } @@ -418,7 +418,7 @@ xfs_update_alignment(xfs_mount_t *mp) } else { xfs_warn(mp, "cannot change alignment: superblock does not support data alignment"); - return XFS_ERROR(EINVAL); + return EINVAL; } } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN && xfs_sb_version_hasdalign(&mp->m_sb)) { @@ -545,7 +545,7 @@ xfs_check_sizes(xfs_mount_t *mp) d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) { xfs_warn(mp, "filesystem size mismatch detected"); - return XFS_ERROR(EFBIG); + return EFBIG; } bp = xfs_buf_read_uncached(mp->m_ddev_targp, d - XFS_FSS_TO_BB(mp, 1), @@ -560,7 +560,7 @@ xfs_check_sizes(xfs_mount_t *mp) d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) { xfs_warn(mp, "log size mismatch detected"); - return XFS_ERROR(EFBIG); + return EFBIG; } bp = xfs_buf_read_uncached(mp->m_logdev_targp, d - XFS_FSB_TO_BB(mp, 1), @@ -802,7 +802,7 @@ xfs_mountfs( if (!sbp->sb_logblocks) { xfs_warn(mp, "no log defined"); XFS_ERROR_REPORT("xfs_mountfs", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto out_free_perag; } @@ -862,7 +862,7 @@ xfs_mountfs( xfs_iunlock(rip, XFS_ILOCK_EXCL); XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW, mp); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto out_rele_rip; } mp->m_rootip = rip; /* save it */ @@ -1135,7 +1135,7 @@ xfs_mod_incore_sb_unlocked( lcounter += delta; if (lcounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_icount = lcounter; return 0; @@ -1144,7 +1144,7 @@ xfs_mod_incore_sb_unlocked( lcounter += delta; if (lcounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_ifree = lcounter; return 0; @@ -1174,7 +1174,7 @@ xfs_mod_incore_sb_unlocked( * blocks if were allowed to. */ if (!rsvd) - return XFS_ERROR(ENOSPC); + return ENOSPC; lcounter = (long long)mp->m_resblks_avail + delta; if (lcounter >= 0) { @@ -1185,7 +1185,7 @@ xfs_mod_incore_sb_unlocked( "Filesystem \"%s\": reserve blocks depleted! " "Consider increasing reserve pool size.", mp->m_fsname); - return XFS_ERROR(ENOSPC); + return ENOSPC; } mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); @@ -1194,7 +1194,7 @@ xfs_mod_incore_sb_unlocked( lcounter = (long long)mp->m_sb.sb_frextents; lcounter += delta; if (lcounter < 0) { - return XFS_ERROR(ENOSPC); + return ENOSPC; } mp->m_sb.sb_frextents = lcounter; return 0; @@ -1203,7 +1203,7 @@ xfs_mod_incore_sb_unlocked( lcounter += delta; if (lcounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_dblocks = lcounter; return 0; @@ -1212,7 +1212,7 @@ xfs_mod_incore_sb_unlocked( scounter += delta; if (scounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_agcount = scounter; return 0; @@ -1221,7 +1221,7 @@ xfs_mod_incore_sb_unlocked( scounter += delta; if (scounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_imax_pct = scounter; return 0; @@ -1230,7 +1230,7 @@ xfs_mod_incore_sb_unlocked( scounter += delta; if (scounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_rextsize = scounter; return 0; @@ -1239,7 +1239,7 @@ xfs_mod_incore_sb_unlocked( scounter += delta; if (scounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_rbmblocks = scounter; return 0; @@ -1248,7 +1248,7 @@ xfs_mod_incore_sb_unlocked( lcounter += delta; if (lcounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_rblocks = lcounter; return 0; @@ -1257,7 +1257,7 @@ xfs_mod_incore_sb_unlocked( lcounter += delta; if (lcounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_rextents = lcounter; return 0; @@ -1266,13 +1266,13 @@ xfs_mod_incore_sb_unlocked( scounter += delta; if (scounter < 0) { ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_sb.sb_rextslog = scounter; return 0; default: ASSERT(0); - return XFS_ERROR(EINVAL); + return EINVAL; } } diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 273ab51..7bf3b83 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1397,7 +1397,7 @@ xfs_qm_dqusage_adjust( */ if (xfs_is_quota_inode(&mp->m_sb, ino)) { *res = BULKSTAT_RV_NOTHING; - return XFS_ERROR(EINVAL); + return EINVAL; } /* @@ -1664,7 +1664,7 @@ xfs_qm_init_quotainos( error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &uip); if (error) - return XFS_ERROR(error); + return error; } if (XFS_IS_GQUOTA_ON(mp) && mp->m_sb.sb_gquotino != NULLFSINO) { @@ -1734,7 +1734,7 @@ error_rele: IRELE(gip); if (pip) IRELE(pip); - return XFS_ERROR(error); + return error; } STATIC void diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index e9be63a..fa97973 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -117,7 +117,7 @@ xfs_qm_newmount( (uquotaondisk ? " usrquota" : ""), (gquotaondisk ? " grpquota" : ""), (pquotaondisk ? " prjquota" : "")); - return XFS_ERROR(EPERM); + return EPERM; } if (XFS_IS_QUOTA_ON(mp) || quotaondisk) { diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 8b0edbd..8c77225 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -67,7 +67,7 @@ xfs_qm_scall_quotaoff( * errno == EEXIST here. */ if ((mp->m_qflags & flags) == 0) - return XFS_ERROR(EEXIST); + return EEXIST; error = 0; flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD); @@ -283,7 +283,7 @@ xfs_qm_scall_trunc_qfiles( if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) { xfs_debug(mp, "%s: flags=%x m_qflags=%x", __func__, flags, mp->m_qflags); - return XFS_ERROR(EINVAL); + return EINVAL; } if (flags & XFS_DQ_USER) { @@ -327,7 +327,7 @@ xfs_qm_scall_quotaon( if (flags == 0) { xfs_debug(mp, "%s: zero flags, m_qflags=%x", __func__, mp->m_qflags); - return XFS_ERROR(EINVAL); + return EINVAL; } /* No fs can turn on quotas with a delayed effect */ @@ -350,13 +350,13 @@ xfs_qm_scall_quotaon( xfs_debug(mp, "%s: Can't enforce without acct, flags=%x sbflags=%x", __func__, flags, mp->m_sb.sb_qflags); - return XFS_ERROR(EINVAL); + return EINVAL; } /* * If everything's up to-date incore, then don't waste time. */ if ((mp->m_qflags & flags) == flags) - return XFS_ERROR(EEXIST); + return EEXIST; /* * Change sb_qflags on disk but not incore mp->qflags @@ -371,7 +371,7 @@ xfs_qm_scall_quotaon( * There's nothing to change if it's the same. */ if ((qf & flags) == flags && sbflags == 0) - return XFS_ERROR(EEXIST); + return EEXIST; sbflags |= XFS_SB_QFLAGS; if ((error = xfs_qm_write_sb_changes(mp, sbflags))) @@ -389,7 +389,7 @@ xfs_qm_scall_quotaon( return 0; if (! XFS_IS_QUOTA_RUNNING(mp)) - return XFS_ERROR(ESRCH); + return ESRCH; /* * Switch on quota enforcement in core. @@ -849,7 +849,7 @@ xfs_qm_scall_getquota( * our utility programs are concerned. */ if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { - error = XFS_ERROR(ENOENT); + error = ENOENT; goto out_put; } diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index ec5ca65..1a98a78 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -863,7 +863,7 @@ xfs_growfs_rt_alloc( XFS_BMAPI_METADATA, &firstblock, resblks, &map, &nmap, &flist); if (!error && nmap < 1) - error = XFS_ERROR(ENOSPC); + error = ENOSPC; if (error) goto error_cancel; /* @@ -903,7 +903,7 @@ xfs_growfs_rt_alloc( bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, 0); if (bp == NULL) { - error = XFS_ERROR(EIO); + error = EIO; error_cancel: xfs_trans_cancel(tp, cancelflags); goto error; @@ -962,11 +962,11 @@ xfs_growfs_rt( * Initial error checking. */ if (!capable(CAP_SYS_ADMIN)) - return XFS_ERROR(EPERM); + return EPERM; if (mp->m_rtdev_targp == NULL || mp->m_rbmip == NULL || (nrblocks = in->newblocks) <= sbp->sb_rblocks || (sbp->sb_rblocks && (in->extsize != sbp->sb_rextsize))) - return XFS_ERROR(EINVAL); + return EINVAL; if ((error = xfs_sb_validate_fsb_count(sbp, nrblocks))) return error; /* @@ -1001,7 +1001,7 @@ xfs_growfs_rt( * since we'll log basically the whole summary file at once. */ if (nrsumblocks > (mp->m_sb.sb_logblocks >> 1)) - return XFS_ERROR(EINVAL); + return EINVAL; /* * Get the old block counts for bitmap and summary inodes. * These can't change since other growfs callers are locked out. @@ -1247,7 +1247,7 @@ xfs_rtmount_init( if (mp->m_rtdev_targp == NULL) { xfs_warn(mp, "Filesystem has a realtime volume, use rtdev=device option"); - return XFS_ERROR(ENODEV); + return ENODEV; } mp->m_rsumlevels = sbp->sb_rextslog + 1; mp->m_rsumsize = @@ -1263,7 +1263,7 @@ xfs_rtmount_init( xfs_warn(mp, "realtime mount -- %llu != %llu", (unsigned long long) XFS_BB_TO_FSB(mp, d), (unsigned long long) mp->m_sb.sb_rblocks); - return XFS_ERROR(EFBIG); + return EFBIG; } bp = xfs_buf_read_uncached(mp->m_rtdev_targp, d - XFS_FSB_TO_BB(mp, 1), diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index 0c0e41b..fd195ff 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -186,13 +186,13 @@ xfs_mount_validate_sb( */ if (sbp->sb_magicnum != XFS_SB_MAGIC) { xfs_warn(mp, "bad magic number"); - return XFS_ERROR(EWRONGFS); + return EWRONGFS; } if (!xfs_sb_good_version(sbp)) { xfs_warn(mp, "bad version"); - return XFS_ERROR(EWRONGFS); + return EWRONGFS; } /* @@ -224,7 +224,7 @@ xfs_mount_validate_sb( 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); + return EINVAL; } } if (xfs_sb_has_incompat_feature(sbp, @@ -234,7 +234,7 @@ xfs_mount_validate_sb( "Filesystem can not be safely mounted by this kernel.", (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_UNKNOWN)); - return XFS_ERROR(EINVAL); + return EINVAL; } } @@ -242,13 +242,13 @@ xfs_mount_validate_sb( if (sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) { xfs_notice(mp, "Version 5 of Super block has XFS_OQUOTA bits."); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } } else if (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD | XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) { xfs_notice(mp, "Superblock earlier than Version 5 has XFS_[PQ]UOTA_{ENFD|CHKD} bits."); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (unlikely( @@ -256,7 +256,7 @@ xfs_mount_validate_sb( xfs_warn(mp, "filesystem is marked as having an external log; " "specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); + return EINVAL; } if (unlikely( @@ -264,7 +264,7 @@ xfs_mount_validate_sb( xfs_warn(mp, "filesystem is marked as having an internal log; " "do not specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); + return EINVAL; } /* @@ -297,7 +297,7 @@ xfs_mount_validate_sb( sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { xfs_notice(mp, "SB sanity check failed"); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } /* @@ -308,7 +308,7 @@ xfs_mount_validate_sb( "File system with blocksize %d bytes. " "Only pagesize (%ld) or less will currently work.", sbp->sb_blocksize, PAGE_SIZE); - return XFS_ERROR(ENOSYS); + return ENOSYS; } /* @@ -323,19 +323,19 @@ xfs_mount_validate_sb( default: xfs_warn(mp, "inode size of %d bytes not supported", sbp->sb_inodesize); - return XFS_ERROR(ENOSYS); + return ENOSYS; } if (xfs_sb_validate_fsb_count(sbp, sbp->sb_dblocks) || xfs_sb_validate_fsb_count(sbp, sbp->sb_rblocks)) { xfs_warn(mp, "file system too large to be mounted on this system."); - return XFS_ERROR(EFBIG); + return EFBIG; } if (check_inprogress && sbp->sb_inprogress) { xfs_warn(mp, "Offline file system operation in progress!"); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } /* @@ -343,7 +343,7 @@ xfs_mount_validate_sb( */ if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { xfs_warn(mp, "file system using version 1 directory format"); - return XFS_ERROR(ENOSYS); + return ENOSYS; } return 0; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 2053767..527bb0c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -446,7 +446,7 @@ done: mp->m_logbufs > XLOG_MAX_ICLOGS)) { xfs_warn(mp, "invalid logbufs value: %d [not %d-%d]", mp->m_logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS); - return XFS_ERROR(EINVAL); + return EINVAL; } if (mp->m_logbsize != -1 && mp->m_logbsize != 0 && @@ -456,7 +456,7 @@ done: xfs_warn(mp, "invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", mp->m_logbsize); - return XFS_ERROR(EINVAL); + return EINVAL; } if (iosizelog) { @@ -465,7 +465,7 @@ done: xfs_warn(mp, "invalid log iosize: %d [not %d-%d]", iosizelog, XFS_MIN_IO_LOG, XFS_MAX_IO_LOG); - return XFS_ERROR(EINVAL); + return EINVAL; } mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; @@ -1341,14 +1341,14 @@ xfs_finish_flags( mp->m_logbsize < mp->m_sb.sb_logsunit) { xfs_warn(mp, "logbuf size must be greater than or equal to log stripe size"); - return XFS_ERROR(EINVAL); + return EINVAL; } } else { /* Fail a mount if the logbuf is larger than 32K */ if (mp->m_logbsize > XLOG_BIG_RECORD_BSIZE) { xfs_warn(mp, "logbuf size for version 1 logs must be 16K or 32K"); - return XFS_ERROR(EINVAL); + return EINVAL; } } @@ -1360,7 +1360,7 @@ xfs_finish_flags( xfs_warn(mp, "Cannot mount a V5 filesystem as %s. %s is always enabled for V5 filesystems.", MNTOPT_NOATTR2, MNTOPT_ATTR2); - return XFS_ERROR(EINVAL); + return EINVAL; } /* @@ -1377,7 +1377,7 @@ xfs_finish_flags( if ((mp->m_sb.sb_flags & XFS_SBF_READONLY) && !ronly) { xfs_warn(mp, "cannot mount a read-only filesystem as read-write"); - return XFS_ERROR(EROFS); + return EROFS; } if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) && @@ -1385,7 +1385,7 @@ xfs_finish_flags( !xfs_sb_version_has_pquotino(&mp->m_sb)) { xfs_warn(mp, "Super block does not support project and group quota together"); - return XFS_ERROR(EINVAL); + return EINVAL; } return 0; diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 52979aa..0f4f30d 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -75,7 +75,7 @@ xfs_readlink_bmap( bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, &xfs_symlink_buf_ops); if (!bp) - return XFS_ERROR(ENOMEM); + return ENOMEM; error = bp->b_error; if (error) { xfs_buf_ioerror_alert(bp, __func__); @@ -134,7 +134,7 @@ xfs_readlink( trace_xfs_readlink(ip); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; xfs_ilock(ip, XFS_ILOCK_SHARED); @@ -147,7 +147,7 @@ xfs_readlink( __func__, (unsigned long long) ip->i_ino, (long long) pathlen); ASSERT(0); - error = XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; goto out; } @@ -202,14 +202,14 @@ xfs_symlink( trace_xfs_symlink(dp, link_name); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; /* * Check component lengths of the target path name. */ pathlen = strlen(target_path); if (pathlen >= MAXPATHLEN) /* total string too long */ - return XFS_ERROR(ENAMETOOLONG); + return ENAMETOOLONG; udqp = gdqp = NULL; prid = xfs_get_initial_prid(dp); @@ -253,7 +253,7 @@ xfs_symlink( * Check whether the directory allows new symlinks or not. */ if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { - error = XFS_ERROR(EPERM); + error = EPERM; goto error_return; } @@ -561,7 +561,7 @@ xfs_inactive_symlink( trace_xfs_inactive_symlink(ip); if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); + return EIO; xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -579,7 +579,7 @@ xfs_inactive_symlink( __func__, (unsigned long long)ip->i_ino, pathlen); xfs_iunlock(ip, XFS_ILOCK_EXCL); ASSERT(0); - return XFS_ERROR(EFSCORRUPTED); + return EFSCORRUPTED; } if (ip->i_df.if_flags & XFS_IFINLINE) { diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f13452c..b701470 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -190,7 +190,7 @@ xfs_trans_reserve( -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - return XFS_ERROR(ENOSPC); + return ENOSPC; } tp->t_blk_res += blocks; } @@ -241,7 +241,7 @@ xfs_trans_reserve( error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS, -((int64_t)rtextents), rsvd); if (error) { - error = XFS_ERROR(ENOSPC); + error = ENOSPC; goto undo_log; } tp->t_rtx_res += rtextents; @@ -874,7 +874,7 @@ xfs_trans_commit( goto out_unreserve; if (XFS_FORCED_SHUTDOWN(mp)) { - error = XFS_ERROR(EIO); + error = EIO; goto out_unreserve; } @@ -917,7 +917,7 @@ out_unreserve: if (tp->t_ticket) { commit_lsn = xfs_log_done(mp, tp->t_ticket, NULL, log_flags); if (commit_lsn == -1 && !error) - error = XFS_ERROR(EIO); + error = EIO; } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, NULLCOMMITLSN, error ? XFS_TRANS_ABORT : 0); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 73106f2..d35430f 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -267,7 +267,7 @@ xfs_trans_read_buf_map( bp = xfs_buf_read_map(target, map, nmaps, flags, ops); if (!bp) return (flags & XBF_TRYLOCK) ? - EAGAIN : XFS_ERROR(ENOMEM); + EAGAIN : ENOMEM; if (bp->b_error) { error = bp->b_error; @@ -287,7 +287,7 @@ xfs_trans_read_buf_map( if (((xfs_req_num++) % xfs_error_mod) == 0) { xfs_buf_relse(bp); xfs_debug(mp, "Returning error!"); - return XFS_ERROR(EIO); + return EIO; } } } @@ -355,7 +355,7 @@ xfs_trans_read_buf_map( if (XFS_FORCED_SHUTDOWN(mp)) { trace_xfs_trans_read_buf_shut(bp, _RET_IP_); *bpp = NULL; - return XFS_ERROR(EIO); + return EIO; } @@ -372,7 +372,7 @@ xfs_trans_read_buf_map( if (bp == NULL) { *bpp = NULL; return (flags & XBF_TRYLOCK) ? - 0 : XFS_ERROR(ENOMEM); + 0 : ENOMEM; } if (bp->b_error) { error = bp->b_error; @@ -396,7 +396,7 @@ xfs_trans_read_buf_map( SHUTDOWN_META_IO_ERROR); xfs_buf_relse(bp); xfs_debug(mp, "Returning trans error!"); - return XFS_ERROR(EIO); + return EIO; } } } @@ -414,7 +414,7 @@ shutdown_abort: trace_xfs_trans_read_buf_shut(bp, _RET_IP_); xfs_buf_relse(bp); *bpp = NULL; - return XFS_ERROR(EIO); + return EIO; } /* From BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 16 12:51:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C8D17F73 for ; Wed, 16 Apr 2014 12:51:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A471304084 for ; Wed, 16 Apr 2014 10:51:19 -0700 (PDT) X-ASG-Debug-ID: 1397670677-04cb6c2436a5e40001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id KGlriEPoJSKYDWn0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 10:51:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+12706adc9b0f362531ed+3888+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WaTzR-0007CR-KU; Wed, 16 Apr 2014 17:51:17 +0000 Date: Wed, 16 Apr 2014 10:51:17 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140416175117.GA23643@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534EC282.7010905@sandeen.net> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1397670678 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Apr 16, 2014 at 12:48:50PM -0500, Eric Sandeen wrote: > XFS_ERROR was designed long ago to trap return values, > but it's not runtime configurable, it's not consistently used, > and we can do the same thing today with systemtap, using > something like: > > probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } Gives me a version just using ftrace, or at least a kprobes based module that we can merged in the kernel tree and this would be fine for me. Requiring a massive blob of questionable out of tree module code and a compiler is an absolute no-go. NAK for now. From sandeen@sandeen.net Wed Apr 16 12:55:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D79AB7F73 for ; Wed, 16 Apr 2014 12:55:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 950E8AC004 for ; Wed, 16 Apr 2014 10:55:55 -0700 (PDT) X-ASG-Debug-ID: 1397670953-04bdf04552aad60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ANFETHK1DXLCfI7t for ; Wed, 16 Apr 2014 10:55: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9EBFA63C5FD4; Wed, 16 Apr 2014 12:55:53 -0500 (CDT) Message-ID: <534EC42D.1080704@sandeen.net> Date: Wed, 16 Apr 2014 12:55:57 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro In-Reply-To: <20140416175117.GA23643@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397670953 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On 4/16/14, 12:51 PM, Christoph Hellwig wrote: > On Wed, Apr 16, 2014 at 12:48:50PM -0500, Eric Sandeen wrote: >> XFS_ERROR was designed long ago to trap return values, >> but it's not runtime configurable, it's not consistently used, >> and we can do the same thing today with systemtap, using >> something like: >> >> probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } > > Gives me a version just using ftrace, or at least a kprobes based module > that we can merged in the kernel tree and this would be fine for me. > > Requiring a massive blob of questionable out of tree module code and a > compiler is an absolute no-go. Ok, fair point. > NAK for now. Even if we don't have a replacement, I have yet to find anyone who has ever used it... Anyway, I'll look into options besides systemtap. Thanks, -Eric From sandeen@sandeen.net Wed Apr 16 14:11:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 027437F75 for ; Wed, 16 Apr 2014 14:11:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6786FAC001 for ; Wed, 16 Apr 2014 12:11:30 -0700 (PDT) X-ASG-Debug-ID: 1397675489-04cbb06e9bade90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6N2Epz9Qz4BGb508 for ; Wed, 16 Apr 2014 12:11: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 41A1863C5FD4; Wed, 16 Apr 2014 14:11:29 -0500 (CDT) Message-ID: <534ED5E4.60903@sandeen.net> Date: Wed, 16 Apr 2014 14:11:32 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro In-Reply-To: <534EC42D.1080704@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397675489 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On 4/16/14, 12:55 PM, Eric Sandeen wrote: > On 4/16/14, 12:51 PM, Christoph Hellwig wrote: >> On Wed, Apr 16, 2014 at 12:48:50PM -0500, Eric Sandeen wrote: >>> XFS_ERROR was designed long ago to trap return values, >>> but it's not runtime configurable, it's not consistently used, >>> and we can do the same thing today with systemtap, using >>> something like: >>> >>> probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } >> >> Gives me a version just using ftrace, or at least a kprobes based module >> that we can merged in the kernel tree and this would be fine for me. >> >> Requiring a massive blob of questionable out of tree module code and a >> compiler is an absolute no-go. > > Ok, fair point. > >> NAK for now. > > Even if we don't have a replacement, I have yet to find anyone who has > ever used it... > > Anyway, I'll look into options besides systemtap. Here's the "best" I've come up with so far... # for FUNCTION in `grep "t xfs_" /proc/kallsyms | awk '{print $3}'`; do echo "r:ret_$FUNCTION $FUNCTION \$retval" >> /sys/kernel/debug/tracing/kprobe_events; done # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 1 > $ENABLE; done run a test that fails: # dd if=/dev/zero of=newfile bs=513 oflag=direct dd: writing `newfile': Invalid argument # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 0 > $ENABLE; done # cat /sys/kernel/debug/tracing/trace <...>-63791 [000] d... 705435.568913: ret_xfs_vn_mknod: (xfs_vn_create+0x13/0x20 [xfs] <- xfs_vn_mknod) arg1=0 <...>-63791 [000] d... 705435.568913: ret_xfs_vn_create: (vfs_create+0xdb/0x100 <- xfs_vn_create) arg1=0 <...>-63791 [000] d... 705435.568918: ret_xfs_file_open: (do_dentry_open+0x24e/0x2e0 <- xfs_file_open) arg1=0 <...>-63791 [000] d... 705435.568934: ret_xfs_file_dio_aio_write: (xfs_file_aio_write+0x147/0x150 [xfs] <- xfs_file_dio_aio_write) arg1=ffffffffffffffea Hey look, it's "-22" in hex! ;) so it's possible, but bleah. From tinguely@sgi.com Wed Apr 16 15:59:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1749B7F62 for ; Wed, 16 Apr 2014 15:59:56 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB296304089; Wed, 16 Apr 2014 13:59:52 -0700 (PDT) Message-ID: <534EEF47.4000706@sgi.com> Date: Wed, 16 Apr 2014 15:59:51 -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: Paul Gortmaker CC: Dave Chinner , "linux-next@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: new 64 bit math link fail in xfs in linux-next today References: <534EAB41.60901@windriver.com> In-Reply-To: <534EAB41.60901@windriver.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/16/14 11:09, Paul Gortmaker wrote: > Hi Dave, > > Not sure if this has been reported yet, but this new failure showed > up in the xtensa link of today's linux-next builds. > > http://kisskb.ellerman.id.au/kisskb/buildresult/10938384/ > > Paul. > Try this works on i386. sorry if my mailer wraps the line: The roundup in commit 68c1fb5d should be a roundup_64() because it is desired to round a 64 bit type by an integer and that will result in a 64 bit value. On 32 bit machines using roundup() in this case will result in the error: ERROR: "__divdi3" [fs/xfs/xfs.ko] undefined! Signed-off-by: Mark Tinguely --- fs/xfs/xfs_aops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/fs/xfs/xfs_aops.c =================================================================== --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1365,7 +1365,7 @@ __xfs_get_blocks( if (offset < i_size_read(inode) && offset + mapping_size >= i_size_read(inode)) { /* limit mapping to block that spans EOF */ - mapping_size = roundup(i_size_read(inode) - offset, + mapping_size = roundup_64(i_size_read(inode) - offset, 1 << inode->i_blkbits); } if (mapping_size > LONG_MAX) From recrutement-import-export@yahoo.fr Wed Apr 16 16:29:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B9EBF7F6D for ; Wed, 16 Apr 2014 16:29:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85A5A30405F for ; Wed, 16 Apr 2014 14:29:42 -0700 (PDT) X-ASG-Debug-ID: 1397683779-04bdf04555bf620001-NocioJ Received: from ox10.clicboutic.com (ox10.clicboutic.com [95.131.138.193]) by cuda.sgi.com with ESMTP id UVrgNFcZPOBsnp7R (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 14:29:40 -0700 (PDT) X-Barracuda-Envelope-From: recrutement-import-export@yahoo.fr X-Barracuda-Apparent-Source-IP: 95.131.138.193 Received: from ox10.clicboutic.com (unknown [127.0.0.1]) by ox10.clicboutic.com (Postfix) with ESMTP id 57AA1CE187CF; Wed, 16 Apr 2014 23:29:38 +0200 (CEST) Received: from webmail.custodio-shop.com (ox10.clicboutic.com [95.131.138.193]) by ox10.clicboutic.com (Postfix) with ESMTPA; Wed, 16 Apr 2014 23:29:38 +0200 (CEST) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=_a06fadade2d5885ac8971e1a0e6c60b5" Date: Wed, 16 Apr 2014 23:29:38 +0200 From: Import/Export Recrutement To: undisclosed-recipients:; Subject: Coordinateur / Coordinatrice transit -import/export Reply-To: intersource-recrutementt@outlook.fr X-ASG-Orig-Subj: Coordinateur / Coordinatrice transit -import/export Message-ID: <04a8d2f79bcf6551e9e67080ab956b6f@mail.custodio-shop.com> X-Sender: recrutement-import-export@yahoo.fr User-Agent: RoundCube Webmail/0.3-beta X-Barracuda-Connect: ox10.clicboutic.com[95.131.138.193] X-Barracuda-Start-Time: 1397683780 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --=_a06fadade2d5885ac8971e1a0e6c60b5 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Vous êtes sérieux et motivé. vous recherchez un job rémunérateur, à domicile. Pour cela, il est nécessaire de disposer d'un ordinateur avec connexion internet et une imprimante. il n'est pas demandé d'avoir des compétences particulières en informatique.Un responsable vous aidera tout au long de la première semaine de travail.Contact : intersource-recrutementt@outlook.fr --=_a06fadade2d5885ac8971e1a0e6c60b5 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

 

Vous êtes = sérieux et motivé. vous recherchez un job rémuné= ;rateur, à domicile. Pour cela, il est nécessaire de dis= poser d'un ordinateur avec connexion internet et une imprimante. il n'= est pas demandé d'avoir des compétences particulières = en informatique.Un responsable vous aidera tout au long de la premiè= re semaine de travail.Contact : inte= rsource-recrutementt@outlook.fr

--=_a06fadade2d5885ac8971e1a0e6c60b5-- From sandeen@redhat.com Wed Apr 16 16:37:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B8FA87F69 for ; Wed, 16 Apr 2014 16:37:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 49D5FAC002 for ; Wed, 16 Apr 2014 14:37:31 -0700 (PDT) X-ASG-Debug-ID: 1397684249-04cb6c2438b9a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DtnKBHQRNw2CnOtF for ; Wed, 16 Apr 2014 14:37:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3GLbT5G031327 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 16 Apr 2014 17:37:29 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3GLbSmi002759 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 17:37:29 -0400 Message-ID: <534EF81D.20205@redhat.com> Date: Wed, 16 Apr 2014 16:37:33 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: log running test to dmesg X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: log running test to dmesg Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397684250 X-Barracuda-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 already log the running test to system logs via "logger" but viro pointed out that we can use /dev/kmsg to insert it into dmesg as well. When looking at the serial console that could be pretty useful. Thanks to viro for the test -w suggestion too. Signed-off-by: Eric Sandeen --- diff --git a/check b/check index 268417c..09b2320 100755 --- a/check +++ b/check @@ -457,6 +457,7 @@ do $timestamp && echo -n " ["`date "+%T"`"]" [ ! -x $seq ] && chmod u+x $seq # ensure we can run it $LOGGER_PROG "run xfstest $seqnum" + test -w /dev/kmsg && echo "run xfstest $seqnum" > /dev/kmsg ./$seq >$tmp.rawout 2>&1 sts=$? $timestamp && _timestamp From Paul.Gortmaker@windriver.com Wed Apr 16 16:45:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B64E7F5A for ; Wed, 16 Apr 2014 16:45:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16EB98F8033 for ; Wed, 16 Apr 2014 14:45:21 -0700 (PDT) X-ASG-Debug-ID: 1397684719-04cb6c2438ba2e0001-NocioJ Received: from mail1.windriver.com (mail1.windriver.com [147.11.146.13]) by cuda.sgi.com with ESMTP id euBuxFaVgQdI1FT5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 16 Apr 2014 14:45:19 -0700 (PDT) X-Barracuda-Envelope-From: Paul.Gortmaker@windriver.com X-Barracuda-Apparent-Source-IP: 147.11.146.13 Received: from ALA-HCB.corp.ad.wrs.com (ala-hcb.corp.ad.wrs.com [147.11.189.41]) by mail1.windriver.com (8.14.5/8.14.5) with ESMTP id s3GLjBNu014054 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL); Wed, 16 Apr 2014 14:45:11 -0700 (PDT) Received: from [128.224.56.57] (128.224.56.57) by ALA-HCB.corp.ad.wrs.com (147.11.189.41) with Microsoft SMTP Server id 14.3.169.1; Wed, 16 Apr 2014 14:45:10 -0700 Message-ID: <534EF9F3.7080805@windriver.com> Date: Wed, 16 Apr 2014 17:45:23 -0400 From: Paul Gortmaker User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely CC: Dave Chinner , "linux-next@vger.kernel.org" , Subject: Re: new 64 bit math link fail in xfs in linux-next today References: <534EAB41.60901@windriver.com> <534EEF47.4000706@sgi.com> X-ASG-Orig-Subj: Re: new 64 bit math link fail in xfs in linux-next today In-Reply-To: <534EEF47.4000706@sgi.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [128.224.56.57] X-Barracuda-Connect: mail1.windriver.com[147.11.146.13] X-Barracuda-Start-Time: 1397684719 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 14-04-16 04:59 PM, Mark Tinguely wrote: > On 04/16/14 11:09, Paul Gortmaker wrote: >> Hi Dave, >> >> Not sure if this has been reported yet, but this new failure showed >> up in the xtensa link of today's linux-next builds. >> >> http://kisskb.ellerman.id.au/kisskb/buildresult/10938384/ >> >> Paul. >> > > Try this works on i386. sorry if my mailer wraps the line: Yep, also works for xtensa too; feel free to add a reported-by and/or tested-by from me if you want. Thanks, Paul. -- > > The roundup in commit 68c1fb5d should be a roundup_64() > because it is desired to round a 64 bit type by an integer > and that will result in a 64 bit value. On 32 bit machines > using roundup() in this case will result in the error: > > ERROR: "__divdi3" [fs/xfs/xfs.ko] undefined! > > Signed-off-by: Mark Tinguely > --- > fs/xfs/xfs_aops.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/fs/xfs/xfs_aops.c > =================================================================== > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1365,7 +1365,7 @@ __xfs_get_blocks( > if (offset < i_size_read(inode) && > offset + mapping_size >= i_size_read(inode)) { > /* limit mapping to block that spans EOF */ > - mapping_size = roundup(i_size_read(inode) - offset, > + mapping_size = roundup_64(i_size_read(inode) - offset, > 1 << inode->i_blkbits); > } > if (mapping_size > LONG_MAX) > From tinguely@eagdhcp-232-178.americas.sgi.com Wed Apr 16 16:55:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 91BF47F5A for ; Wed, 16 Apr 2014 16:55:17 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6BCD8304053; Wed, 16 Apr 2014 14:55:17 -0700 (PDT) Received: from eagdhcp-232-178.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s3GLtGir003323; Wed, 16 Apr 2014 16:55:16 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-178.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5/Submit) id s3GLtGh1003322; Wed, 16 Apr 2014 16:55:16 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140416215223.512644029@sgi.com> User-Agent: quilt/0.51-1 Date: Wed, 16 Apr 2014 16:51:56 -0500 From: Mark Tinguely To: XFS Filesystem Cc: Paul Gortmaker Subject: [PATCH] xfs: fix 32bit __divdi3 undefined References: <534EAB41.60901@windriver.com> Content-Disposition: inline; filename=xfs-fix-32bit-__divdi3-undefined.patch The roundup in commit 68c1fb5d should be a roundup_64() because it is desired to round a 64 bit type by an integer and that will result in a 64 bit value. On 32 bit machines using roundup() in this case will result in the error: ERROR: "__divdi3" [fs/xfs/xfs.ko] undefined! Reported-by: Paul Gortmaker Tested-by: Paul Gortmaker Signed-off-by: Mark Tinguely --- fs/xfs/xfs_aops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/fs/xfs/xfs_aops.c =================================================================== --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1365,7 +1365,7 @@ __xfs_get_blocks( if (offset < i_size_read(inode) && offset + mapping_size >= i_size_read(inode)) { /* limit mapping to block that spans EOF */ - mapping_size = roundup(i_size_read(inode) - offset, + mapping_size = roundup_64(i_size_read(inode) - offset, 1 << inode->i_blkbits); } if (mapping_size > LONG_MAX) From sandeen@sandeen.net Wed Apr 16 16:57:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E26E57F60 for ; Wed, 16 Apr 2014 16:57:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C980A8F8066 for ; Wed, 16 Apr 2014 14:57:18 -0700 (PDT) X-ASG-Debug-ID: 1397685437-04cbb06e9cbb8e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id CydyzjKF63tco3oX for ; Wed, 16 Apr 2014 14:57:17 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1943063C5FD4; Wed, 16 Apr 2014 16:57:17 -0500 (CDT) Message-ID: <534EFCC1.1080008@sandeen.net> Date: Wed, 16 Apr 2014 16:57:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely , XFS Filesystem CC: Paul Gortmaker Subject: Re: [PATCH] xfs: fix 32bit __divdi3 undefined References: <534EAB41.60901@windriver.com> <20140416215223.512644029@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix 32bit __divdi3 undefined In-Reply-To: <20140416215223.512644029@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397685437 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/16/14, 4:51 PM, Mark Tinguely wrote: > The roundup in commit 68c1fb5d should be a roundup_64() > because it is desired to round a 64 bit type by an integer > and that will result in a 64 bit value. On 32 bit machines > using roundup() in this case will result in the error: > > ERROR: "__divdi3" [fs/xfs/xfs.ko] undefined! > > Reported-by: Paul Gortmaker > Tested-by: Paul Gortmaker > Signed-off-by: Mark Tinguely Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_aops.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/fs/xfs/xfs_aops.c > =================================================================== > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1365,7 +1365,7 @@ __xfs_get_blocks( > if (offset < i_size_read(inode) && > offset + mapping_size >= i_size_read(inode)) { > /* limit mapping to block that spans EOF */ > - mapping_size = roundup(i_size_read(inode) - offset, > + mapping_size = roundup_64(i_size_read(inode) - offset, > 1 << inode->i_blkbits); > } > if (mapping_size > LONG_MAX) > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Wed Apr 16 16:58:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 33DB57F60 for ; Wed, 16 Apr 2014 16:58:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9863AC004 for ; Wed, 16 Apr 2014 14:58:08 -0700 (PDT) X-ASG-Debug-ID: 1397685485-04cbb06e9abb990001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 6DGWjG7lMQ4bn83z for ; Wed, 16 Apr 2014 14:58: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: Ao5fAID8TlN5LEcvPGdsb2JhbABZgwY7gxinMwaTW4UPUYElFwMBAQEBODWCJQEBAQQnExwjEAgDGAklDwUlAwcaE4d7DsoaFo11VweEOASYZYE4lFUrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Apr 2014 07:27:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaXpl-0000vy-Mx; Thu, 17 Apr 2014 07:57:33 +1000 Date: Thu, 17 Apr 2014 07:57:33 +1000 From: Dave Chinner To: Paul Gortmaker Cc: xfs@oss.sgi.com, "linux-next@vger.kernel.org" Subject: Re: new 64 bit math link fail in xfs in linux-next today Message-ID: <20140416215733.GM15995@dastard> X-ASG-Orig-Subj: Re: new 64 bit math link fail in xfs in linux-next today References: <534EAB41.60901@windriver.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534EAB41.60901@windriver.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: 1397685485 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 12:09:37PM -0400, Paul Gortmaker wrote: > Hi Dave, > > Not sure if this has been reported yet, but this new failure showed > up in the xtensa link of today's linux-next builds. > > http://kisskb.ellerman.id.au/kisskb/buildresult/10938384/ fs/built-in.o: In function `__xfs_get_blocks': /home/dave/src/build/x86-64/xfsdev/fs/xfs/xfs_aops.c:1368: undefined reference to `__divdi3' Fmeh. The hunk that throws the error: @@ -1354,6 +1362,12 @@ __xfs_get_blocks( ASSERT(mapping_size > 0); if (mapping_size > size) mapping_size = size; + if (offset < i_size_read(inode) && + offset + mapping_size >= i_size_read(inode)) { + /* limit mapping to block that spans EOF */ + mapping_size = roundup(i_size_read(inode) - offset, + 1 << inode->i_blkbits); + } if (mapping_size > LONG_MAX) mapping_size = LONG_MAX; You'd think a generic function like roundup() would handle that sort of 64/32 bit type problem, yes? But it doesn't, despite what the comment implies: /* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */ #define roundup(x, y) ( \ { \ const typeof(y) __y = y; \ (((x) + (__y - 1)) / __y) * __y; \ } \ ) It doesn't even have type checking that might warn you of impending problems... /me looks around in the XFS code for a bit ... and finds roundup_64() in fs/xfs/xfs_linux.h. That uses do_div() to avoid this problem. And it's a static inline function, so it has type checking, too. And so this hunk fixes the problem: @@ -1365,7 +1365,7 @@ __xfs_get_blocks( if (offset < i_size_read(inode) && offset + mapping_size >= i_size_read(inode)) { /* limit mapping to block that spans EOF */ - mapping_size = roundup(i_size_read(inode) - offset, + mapping_size = roundup_64(i_size_read(inode) - offset, 1 << inode->i_blkbits); } if (mapping_size > LONG_MAX) Can you test it, please, and I'll push out an updated branch hopefully in time for today's linux-next build.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 17:08:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BF5B7F58 for ; Wed, 16 Apr 2014 17:08:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EF39DAC002 for ; Wed, 16 Apr 2014 15:08:29 -0700 (PDT) X-ASG-Debug-ID: 1397686101-04bdf04553c2280001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ifbLXK2rbAEcYBAx for ; Wed, 16 Apr 2014 15:08:24 -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: AjR7ABH/TlN5LEcvPGdsb2JhbABZgwaDU4UKoi+TW4VggSQXAwEBAQE4NYIlAQEBBDocFQ4QCAMYCSUPBSUDBxoTh3vKDxcWjkwHhDgEmGWKaYskKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Apr 2014 07:38:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaY00-0000yE-1a; Thu, 17 Apr 2014 08:08:08 +1000 Date: Thu, 17 Apr 2014 08:08:08 +1000 From: Dave Chinner To: Eric Sandeen Cc: Christoph Hellwig , xfs-oss , Steven Rostedt Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140416220807.GN15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> <534ED5E4.60903@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534ED5E4.60903@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1397686103 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e [ cc the tracing expert ] On Wed, Apr 16, 2014 at 02:11:32PM -0500, Eric Sandeen wrote: > On 4/16/14, 12:55 PM, Eric Sandeen wrote: > > On 4/16/14, 12:51 PM, Christoph Hellwig wrote: > >> On Wed, Apr 16, 2014 at 12:48:50PM -0500, Eric Sandeen wrote: > >>> XFS_ERROR was designed long ago to trap return values, > >>> but it's not runtime configurable, it's not consistently used, > >>> and we can do the same thing today with systemtap, using > >>> something like: > >>> > >>> probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } > >> > >> Gives me a version just using ftrace, or at least a kprobes based module > >> that we can merged in the kernel tree and this would be fine for me. > >> > >> Requiring a massive blob of questionable out of tree module code and a > >> compiler is an absolute no-go. > > > > Ok, fair point. > > > >> NAK for now. > > > > Even if we don't have a replacement, I have yet to find anyone who has > > ever used it... > > > > Anyway, I'll look into options besides systemtap. > > Here's the "best" I've come up with so far... > > # for FUNCTION in `grep "t xfs_" /proc/kallsyms | awk '{print $3}'`; do echo "r:ret_$FUNCTION $FUNCTION \$retval" >> /sys/kernel/debug/tracing/kprobe_events; done > > # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 1 > $ENABLE; done > > run a test that fails: > > # dd if=/dev/zero of=newfile bs=513 oflag=direct > dd: writing `newfile': Invalid argument > > # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 0 > $ENABLE; done > > # cat /sys/kernel/debug/tracing/trace > > <...>-63791 [000] d... 705435.568913: ret_xfs_vn_mknod: (xfs_vn_create+0x13/0x20 [xfs] <- xfs_vn_mknod) arg1=0 > <...>-63791 [000] d... 705435.568913: ret_xfs_vn_create: (vfs_create+0xdb/0x100 <- xfs_vn_create) arg1=0 > <...>-63791 [000] d... 705435.568918: ret_xfs_file_open: (do_dentry_open+0x24e/0x2e0 <- xfs_file_open) arg1=0 > <...>-63791 [000] d... 705435.568934: ret_xfs_file_dio_aio_write: (xfs_file_aio_write+0x147/0x150 [xfs] <- xfs_file_dio_aio_write) arg1=ffffffffffffffea > > Hey look, it's "-22" in hex! ;) > > so it's possible, but bleah. Steve, we want to be able to trap specific return codes from functions. Say, for example, the first function that returns EINVAL/-EINVAL in XFS under a given workload. What's the most efficient way to do that with ftrace? And can that be set up as a trigger so we can use it to dump a snapshot of the last N events into the trace buffer or do other interesting things with that event? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 17:10:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C50937F5A for ; Wed, 16 Apr 2014 17:10:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD23830408C for ; Wed, 16 Apr 2014 15:10:04 -0700 (PDT) X-ASG-Debug-ID: 1397686201-04cbb06e9bbc790001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id viRamAyG04Czo0OQ for ; Wed, 16 Apr 2014 15:10:02 -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: AjR7ABH/TlN5LEcvPGdsb2JhbABZgwaDU4UKoi+TW4VggSQXAwEBAQE4NYIlAQEBBCcTHCMQCAMYCSUPBSUDBxoTh3vKDxcWjWgNVweEOASYZYppiyQrgSwBHw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Apr 2014 07:40:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaY1o-0000yT-GH; Thu, 17 Apr 2014 08:10:00 +1000 Date: Thu, 17 Apr 2014 08:10:00 +1000 From: Dave Chinner To: Mark Tinguely Cc: XFS Filesystem , Paul Gortmaker Subject: Re: [PATCH] xfs: fix 32bit __divdi3 undefined Message-ID: <20140416221000.GO15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix 32bit __divdi3 undefined References: <534EAB41.60901@windriver.com> <20140416215223.512644029@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416215223.512644029@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: 1397686201 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 04:51:56PM -0500, Mark Tinguely wrote: > The roundup in commit 68c1fb5d should be a roundup_64() > because it is desired to round a 64 bit type by an integer > and that will result in a 64 bit value. On 32 bit machines > using roundup() in this case will result in the error: > > ERROR: "__divdi3" [fs/xfs/xfs.ko] undefined! > > Reported-by: Paul Gortmaker > Tested-by: Paul Gortmaker > Signed-off-by: Mark Tinguely > --- > fs/xfs/xfs_aops.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/fs/xfs/xfs_aops.c > =================================================================== > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1365,7 +1365,7 @@ __xfs_get_blocks( > if (offset < i_size_read(inode) && > offset + mapping_size >= i_size_read(inode)) { > /* limit mapping to block that spans EOF */ > - mapping_size = roundup(i_size_read(inode) - offset, > + mapping_size = roundup_64(i_size_read(inode) - offset, > 1 << inode->i_blkbits); > } > if (mapping_size > LONG_MAX) I'm not going to apply this as a patch - I'm going to rebase the branch with the fix in the original patch so we don't have a bisect breakage in the branch. Don't worry, I'll add the fact you fixed the bug into the commit message... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 17:29:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D97FE7F54 for ; Wed, 16 Apr 2014 17:29:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A5E978F8039 for ; Wed, 16 Apr 2014 15:29:01 -0700 (PDT) X-ASG-Debug-ID: 1397687339-04bdf04553c36d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id K16Y7yW3PhCkF4XC for ; Wed, 16 Apr 2014 15:28: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: AjR7AI8DT1N5LEcvPGdsb2JhbABZgwaDU4UKoi+TW4VggSQXAwEBAQE4NYIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3vKDRcWjkwHhDgEmGWKaYskKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Apr 2014 07:58:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaYJf-00010s-MD; Thu, 17 Apr 2014 08:28:27 +1000 Date: Thu, 17 Apr 2014 08:28:27 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140416222827.GP15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416175117.GA23643@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1397687339 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4984 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Apr 16, 2014 at 10:51:17AM -0700, Christoph Hellwig wrote: > On Wed, Apr 16, 2014 at 12:48:50PM -0500, Eric Sandeen wrote: > > XFS_ERROR was designed long ago to trap return values, > > but it's not runtime configurable, it's not consistently used, > > and we can do the same thing today with systemtap, using > > something like: > > > > probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } > > Gives me a version just using ftrace, or at least a kprobes based module > that we can merged in the kernel tree and this would be fine for me. > > Requiring a massive blob of questionable out of tree module code and a > compiler is an absolute no-go. > > NAK for now. I think regardless of the systemtap/ftrace replacement, nobody uses this at the moment, and it's not been used for a long time. It's a compile time configurable, debug only error trap that is far less useful than adding printk() or tracepoints at the appropriate points. If you've got to recompile the kernel to use it, then you may as well add meaningful debug rather than hope an error trap that panics the kernel tells you what you need. i.e. the error trap code as it stands is only useful for those running kernel debuggers, and very few developers actually do that these days. And, FWIW, it only allows detection of then initial error instance - too bad if you want the second or third occurrence of the error. IOWs, I can't see how this is at all useful anymore.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Wed Apr 16 17:30:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A313B7F67 for ; Wed, 16 Apr 2014 17:30:49 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 675128F8065; Wed, 16 Apr 2014 15:30:49 -0700 (PDT) Message-ID: <534F0498.4010902@sgi.com> Date: Wed, 16 Apr 2014 17:30:48 -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 Filesystem , Paul Gortmaker Subject: Re: [PATCH] xfs: fix 32bit __divdi3 undefined References: <534EAB41.60901@windriver.com> <20140416215223.512644029@sgi.com> <20140416221000.GO15995@dastard> In-Reply-To: <20140416221000.GO15995@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/16/14 17:10, Dave Chinner wrote: > On Wed, Apr 16, 2014 at 04:51:56PM -0500, Mark Tinguely wrote: >> The roundup in commit 68c1fb5d should be a roundup_64() >> because it is desired to round a 64 bit type by an integer >> and that will result in a 64 bit value. On 32 bit machines >> using roundup() in this case will result in the error: >> >> ERROR: "__divdi3" [fs/xfs/xfs.ko] undefined! >> >> Reported-by: Paul Gortmaker >> Tested-by: Paul Gortmaker >> Signed-off-by: Mark Tinguely >> --- >> fs/xfs/xfs_aops.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> Index: b/fs/xfs/xfs_aops.c >> =================================================================== >> --- a/fs/xfs/xfs_aops.c >> +++ b/fs/xfs/xfs_aops.c >> @@ -1365,7 +1365,7 @@ __xfs_get_blocks( >> if (offset< i_size_read(inode)&& >> offset + mapping_size>= i_size_read(inode)) { >> /* limit mapping to block that spans EOF */ >> - mapping_size = roundup(i_size_read(inode) - offset, >> + mapping_size = roundup_64(i_size_read(inode) - offset, >> 1<< inode->i_blkbits); >> } >> if (mapping_size> LONG_MAX) > > I'm not going to apply this as a patch - I'm going to rebase the > branch with the fix in the original patch so we don't have a bisect > breakage in the branch. Don't worry, I'll add the fact you fixed the > bug into the commit message... > > Cheers, > > Dave. Makes sense. --Mark. From namjae.jeon@samsung.com Wed Apr 16 17:35:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 25EF87F58 for ; Wed, 16 Apr 2014 17:35:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F0A28F8039 for ; Wed, 16 Apr 2014 15:35:39 -0700 (PDT) X-ASG-Debug-ID: 1397687736-04cbb06e9dbe1c0001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id hAFDjl2Y9RHVhBSS (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 16 Apr 2014 15:35:38 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N4500FJGARC3J40@mailout2.samsung.com> for xfs@oss.sgi.com; Thu, 17 Apr 2014 07:35:36 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 44.5C.09028.8B50F435; Thu, 17 Apr 2014 07:35:36 +0900 (KST) X-AuditID: cbfee68e-b7f566d000002344-07-534f05b8b062 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 91.EE.28157.7B50F435; Thu, 17 Apr 2014 07:35:36 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N45006HIARBXA10@mmp2.samsung.com>; Thu, 17 Apr 2014 07:35:35 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: [PATCH] xfstests: fsstress: remove duplicate COLLAPSE_RANGE flags Date: Thu, 17 Apr 2014 07:35:35 +0900 X-ASG-Orig-Subj: [PATCH] xfstests: fsstress: remove duplicate COLLAPSE_RANGE flags Message-id: <002c01cf59c4$2f4273e0$8dc75ba0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9Zw9HgBLaKGnCoR/qPhaf4ddfswA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrFIsWRmVeSWpSXmKPExsWyRsSkSHcHq3+wwb9b3BZbjt1jtNiz9ySL xaK+W4wOzB6nFkl4rL6wldHj8ya5AOYoLpuU1JzMstQifbsEroye3RfYCvpYK7b1zGdpYFzJ 0sXIySEhYCKx5Ws/E4QtJnHh3nq2LkYuDiGBpYwSxzt3M8IUTe86wAqRmM4o8fn5InYI5y+j xIP/m4DaOTjYBLQl/mwRBWkQEdCQmLb3CDOIzSxgJLHtzCawQcICXhJP9j9mA7FZBFQlbv09 BVbDK2ApsaDzHhOELSjxY/I9FoheLYn1O48zQdjyEpvXvGWGOEhBYsfZ14wga0UE9CQuf4iE KBGR2PfiHSPIaRICy9glvszdywKxS0Di2+RDLCD1EgKyEpsOQI2RlDi44gbLBEaxWUg2z0Ky eRaSzbOQrFjAyLKKUTS1ILmgOCm9yEivODG3uDQvXS85P3cTIzCeTv971reD8eYB60OMyUDr JzJLiSbnA+MxryTe0NjMyMLUxNTYyNzSjDRhJXHeRQ+TgoQE0hNLUrNTUwtSi+KLSnNSiw8x MnFwSjUw5t8z9tsU8rBjWf+H/SHvBb9HTlbNmBK798lE06/pV3ZMXcvWwvRY3KBwwqaVm31i p4v/S9faKOFsytYrJ7P13truMKmbC5Ty78ds434kuCuqePOku1yfX02yFm2aWvdDbbVIQYxQ 9EkX3+WvrjqXunXofXSMeLwo0LBR8Kx63Jd3r49NXvtUVImlOCPRUIu5qDgRADXrVXi9AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpnleLIzCtJLcpLzFFi42I5/e+xoO4OVv9ggwnnmS22HLvHaLFn70kW i0V9txgdmD1OLZLwWH1hK6PH501yAcxRDYw2GamJKalFCql5yfkpmXnptkrewfHO8aZmBoa6 hpYW5koKeYm5qbZKLj4Bum6ZOUCLlBTKEnNKgUIBicXFSvp2mCaEhrjpWsA0Ruj6hgTB9RgZ oIGENYwZPbsvsBX0sVZs65nP0sC4kqWLkZNDQsBEYnrXAVYIW0ziwr31bF2MXBxCAtMZJT4/ X8QO4fxllHjwfxNTFyMHB5uAtsSfLaIgDSICGhLT9h5hBrGZBYwktp3ZxAhiCwt4STzZ/5gN xGYRUJW49fcUWA2vgKXEgs57TBC2oMSPyfdYIHq1JNbvPM4EYctLbF7zlhniIAWJHWdfM4Ks FRHQk7j8IRKiRERi34t3jBMYBWYhmTQLyaRZSCbNQtKygJFlFaNoakFyQXFSeq6RXnFibnFp Xrpecn7uJkZwtD6T3sG4qsHiEKMAB6MSDy/nb79gIdbEsuLK3EOMEhzMSiK8mWeBQrwpiZVV qUX58UWlOanFhxiTgR6dyCwlmpwPTCR5JfGGxiZmRpZG5oYWRsbmpAkrifMebLUOFBJITyxJ zU5NLUgtgtnCxMEp1cAonXrrsqX9nBOSGgtieV8emmn9yWmO24rl3HVnZBWevqz1v7+CpeaC fvi1Gck29es1VELatuukPZ/z493X9d2106bWfji5NTD0hFFNChNH0cvCS3LpJZrC6TN+qLQv 22GuEL1Le8ONr5ei78xbuOenUOoSu4SLWbPU4iQXvI451GS1oyFvj1CZEktxRqKhFnNRcSIA uqG75RoDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1397687738 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: Namjae Jeon Remove duplicate COLLAPSE_RANGE flags Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- ltp/fsstress.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 1eec11a..29fc250 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -2176,7 +2176,6 @@ struct print_flags falloc_flags [] = { { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, - { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { -1, NULL} }; From david@fromorbit.com Wed Apr 16 18:09:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D20477F54 for ; Wed, 16 Apr 2014 18:09:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6DA05AC003 for ; Wed, 16 Apr 2014 16:09:07 -0700 (PDT) X-ASG-Debug-ID: 1397689744-04cbb06e9bc0300001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id jdkfzuogJjKxeJM5 for ; Wed, 16 Apr 2014 16:09:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmB+ABoNT1N5LEcvPGdsb2JhbABZgwaDVYUKoi+TW4VggSAXAwEBAQE4NYIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3vKCBcWjkwHgySBFASYZZYNKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 17 Apr 2014 08:33:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaYrL-00016Z-CH; Thu, 17 Apr 2014 09:03:15 +1000 Date: Thu, 17 Apr 2014 09:03:15 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Miklos Szeredi , Miklos Szeredi , xfs@oss.sgi.com Subject: Re: [PATCH 2/4] renameat2 syscall: check plain rename Message-ID: <20140416230315.GF31578@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] renameat2 syscall: check plain rename References: <1397231517-4641-1-git-send-email-miklos@szeredi.hu> <1397231517-4641-2-git-send-email-miklos@szeredi.hu> <20140414023020.GJ27694@dastard> <20140416141825.GA32449@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416141825.GA32449@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1397689744 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4985 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 07:18:25AM -0700, Christoph Hellwig wrote: > On Mon, Apr 14, 2014 at 12:30:20PM +1000, Dave Chinner wrote: > > IOWs, XFS is returning EEXIST rather than ENOTEMPTY for several of > > these rename tests. The rename man page says this about the errors: > > > > ENOTEMPTY or EEXIST > > newpath is a nonempty directory, that is, contains > > entries other than "." and "..". > > > > Which implies that both errors are valid and so the test should pass > > in either case. Can you send a patch to handle these > > different-but-valid error returns? > > I would much prefer if all Linux filesystems behaved uniformly here. > > While EEXIST sounds much more logical to me in this case I suspect most > other filesystems have copy & pasted from ext2, and we should switch to > ENOTEMPTY as well. Send patches, please. But from an xfstests perspective, we still have to support kernels and filesystems that return EEXIST for this function, as it is valid for them to do so.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 18:14:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E3877F54 for ; Wed, 16 Apr 2014 18:14:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 054DF304053 for ; Wed, 16 Apr 2014 16:14:24 -0700 (PDT) X-ASG-Debug-ID: 1397690058-04cb6c2439bfc70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BQpaYjyAqSucjA1z for ; Wed, 16 Apr 2014 16:14:19 -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: AtFpAAgOT1N5LEcvPGdsb2JhbABZgwY7gxqnOZNbhWCBIBcDAQEBATg1giUBAQEDATocIwULCAMYCSUPBSUDBxoTh3QHDsl3EwQWjkwHhDgEmGWUPIFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 08:43:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaZ1J-00018O-Mc; Thu, 17 Apr 2014 09:13:33 +1000 Date: Thu, 17 Apr 2014 09:13:33 +1000 From: Dave Chinner To: Filipe David Manana Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , Josef Bacik Subject: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents Message-ID: <20140416231333.GQ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> <20140416002349.GV15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1397690059 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4985 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 03:39:18PM +0100, Filipe David Manana wrote: > On Wed, Apr 16, 2014 at 1:23 AM, Dave Chinner wrote: > > On Tue, Apr 15, 2014 at 05:43:21PM +0100, Filipe David Borba Manana wrote: > >> This test verifies that after an incremental btrfs send the replicated file has > >> the same exact hole and data structure as in the origin filesystem. This didn't > >> use to be the case before the send stream version 2 - holes were sent as write > >> operations of 0 valued bytes instead of punching holes with the fallocate system > >> call, and pre-allocated extents were sent as well as write operations of 0 valued > >> bytes instead of intructions for the receiver to use the fallocate system call. > >> Also checks that prealloc extents that lie beyond the file's size are replicated > >> by an incremental send. > > > > Can you wrap commit messages at 68 columns? > > > > .... > >> +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch > >> +# List all hole and data segments. > >> +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo > >> +# List all extents, we're interested here in prealloc extents that lie beyond > >> +# the file's size. > >> +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch > > > > That dumps raw block numbers into the golden output. _filter_fiemap > > is probably needed here. > > Hum, just tried it and uploaded a v2. > However I'm now noticing it doesn't do everything I had in mind. > _filter_fiemap is not showing the extents falloc -k created, only a > collapsed range of holes. > > So my intention is to verify not just holes, but also the extents > created by 'falloc -k'. The following filter I just made locally gives > me that: > > _filter_all_fiemap() > { > awk --posix ' > $3 ~ /hole/ { > print $1, $2, $3; > next; > } > $3 ~ /[[:xdigit:]]*..[[:xdigit:]]/ { > print $1, $2, "extent"; > next; > }' > } Which is effectively _filter_hole_fiemap(), except it coalesces adjacent extents into a single range. I'd suggest moving the _filter_* functions from common/punch to common/filter, and using _filter_hole_fiemap() as there's no guarantee that you'll get individual extents for each falloc -k range - they coul dbe allocated contiguously, and hence the number of extents reported can change from run to run. That's the reason why the filters coalesce adjacent file offsets of the same type - we care whether the range of the file contains the correct extent type, not how fragmented the range is.... > (nicely printed/indented at > https://friendpaste.com/1JtG5bts2Sz0LWhUutCpzE, as e-mail is not good > for code pasting) Pasting code works fine for me ;) > Which gives me: > > 0: [0..191]: extent > 1: [192..199]: extent > 2: [200..231]: extent > 3: [232..239]: extent > 4: [240..287]: extent > 5: [288..295]: extent > 6: [296..487]: extent > 7: [488..495]: extent > 8: [496..519]: hole > 9: [520..527]: extent > 10: [528..583]: extent > 11: [584..591]: extent > 12: [592..2543]: extent > 13: [2544..17575]: hole > 14: [17576..21487]: extent Also, you're trimming of the block count, so you can drop the "-l" option to the fiemap command.... > Versus only (from _filter_fiemap): > > 0: [496..17575]: hole Maybe the "-l" option is confusing the filter, it should be giving: 0: [0..495]: data 1: [496..519]: hole 2: [520..2543]: data 3: [2544..17575]: hole 4: [17576..21487]: data Though if there are unwritten extents, it will say "unwritten" rather than "data". _filter_hole_fiemap should give: 0: [0..495]: extent 1: [496..519]: hole 2: [520..2543]: extent 3: [2544..17575]: hole 4: [17576..21487]: extent Which tells you that everything you asked for was allocated... Cheers, Dave. -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 18:25:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 717EE7F54 for ; Wed, 16 Apr 2014 18:25:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E46D0AC001 for ; Wed, 16 Apr 2014 16:25:23 -0700 (PDT) X-ASG-Debug-ID: 1397690721-04cb6c2439c0a60001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id BPzB8FRu2FsUJJ9t (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 16:25:22 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8BC4AACDB; Wed, 16 Apr 2014 23:25:20 +0000 (UTC) Date: Thu, 17 Apr 2014 09:25:04 +1000 From: NeilBrown To: Jeff Layton Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, netdev@vger.kernel.org Subject: Re: [PATCH 05/19] SUNRPC: track whether a request is coming from a loop-back interface. Message-ID: <20140417092504.57a49f9d@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 05/19] SUNRPC: track whether a request is coming from a loop-back interface. In-Reply-To: <20140416104702.264cde48@tlielax.poochiereds.net> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.14822.stgit@notabene.brown> <20140416104702.264cde48@tlielax.poochiereds.net> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/CcwxN46Oguly3bCuijnuqE3"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397690721 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/CcwxN46Oguly3bCuijnuqE3 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 10:47:02 -0400 Jeff Layton wrote: > On Wed, 16 Apr 2014 14:03:36 +1000 > NeilBrown wrote: >=20 > > If an incoming NFS request is coming from the local host, then > > nfsd will need to perform some special handling. So detect that > > possibility and make the source visible in rq_local. > >=20 > > Signed-off-by: NeilBrown > > --- > > include/linux/sunrpc/svc.h | 1 + > > include/linux/sunrpc/svc_xprt.h | 1 + > > net/sunrpc/svcsock.c | 10 ++++++++++ > > 3 files changed, 12 insertions(+) > >=20 > > diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h > > index 04e763221246..a0dbbd1e00e9 100644 > > --- a/include/linux/sunrpc/svc.h > > +++ b/include/linux/sunrpc/svc.h > > @@ -254,6 +254,7 @@ struct svc_rqst { > > u32 rq_prot; /* IP protocol */ > > unsigned short > > rq_secure : 1; /* secure port */ > > + unsigned short rq_local : 1; /* local request */ > > =20 > > void * rq_argp; /* decoded arguments */ > > void * rq_resp; /* xdr'd results */ > > diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc= _xprt.h > > index b05963f09ebf..b99bdfb0fcf9 100644 > > --- a/include/linux/sunrpc/svc_xprt.h > > +++ b/include/linux/sunrpc/svc_xprt.h > > @@ -63,6 +63,7 @@ struct svc_xprt { > > #define XPT_DETACHED 10 /* detached from tempsocks list */ > > #define XPT_LISTENER 11 /* listening endpoint */ > > #define XPT_CACHE_AUTH 12 /* cache auth info */ > > +#define XPT_LOCAL 13 /* connection from loopback interface */ > > =20 > > struct svc_serv *xpt_server; /* service for transport */ > > atomic_t xpt_reserved; /* space on outq that is rsvd */ > > diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c > > index b6e59f0a9475..193115fe968c 100644 > > --- a/net/sunrpc/svcsock.c > > +++ b/net/sunrpc/svcsock.c > > @@ -811,6 +811,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_x= prt *xprt) > > struct socket *newsock; > > struct svc_sock *newsvsk; > > int err, slen; > > + struct dst_entry *dst; > > RPC_IFDEBUG(char buf[RPC_MAX_ADDRBUFLEN]); > > =20 > > dprintk("svc: tcp_accept %p sock %p\n", svsk, sock); > > @@ -867,6 +868,14 @@ static struct svc_xprt *svc_tcp_accept(struct svc_= xprt *xprt) > > } > > svc_xprt_set_local(&newsvsk->sk_xprt, sin, slen); > > =20 > > + clear_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); > > + rcu_read_lock(); > > + dst =3D rcu_dereference(newsock->sk->sk_dst_cache); > > + if (dst && dst->dev && > > + (dst->dev->features & NETIF_F_LOOPBACK)) > > + set_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); > > + rcu_read_unlock(); > > + >=20 > In the use-case you describe, the client is unlikely to have mounted > "localhost", but is more likely to be mounting a floating address in > the cluster. >=20 > Will this flag end up being set in such a situation? It looks like > NETIF_F_LOOPBACK isn't set on all adapters -- mostly on "lo" and a few > others that support MAC-LOOPBACK. I was hoping someone on net-dev would have commented if it didn't work - I probably should have explicitly asked. My testing certainly suggests that this works if I use any local address to perform the mount, not just 127.0.0.1. I don't know enough about routing and neighbours and the dst cache to be certain but my shallow understanding was always that traffic to any local address was pseudo-routed through the lo interface and would never get anywhere near e.g. the eth0 interface. Can any network people confirm? Thanks, NeilBrown >=20 >=20 > > if (serv->sv_stats) > > serv->sv_stats->nettcpconn++; > > =20 > > @@ -1112,6 +1121,7 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqst= p) > > =20 > > rqstp->rq_xprt_ctxt =3D NULL; > > rqstp->rq_prot =3D IPPROTO_TCP; > > + rqstp->rq_local =3D !!test_bit(XPT_LOCAL, &svsk->sk_xprt.xpt_fl= ags); > > =20 > > p =3D (__be32 *)rqstp->rq_arg.head[0].iov_base; > > calldir =3D p[1]; > >=20 > >=20 > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html >=20 >=20 --Sig_/CcwxN46Oguly3bCuijnuqE3 Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU08RVznsnt1WYoG5AQIqlxAAqLL4IuhcC8p8k8jWdErxWKT7tbRpFrbD Wuek/KQQWWceJyhB6Px0x6PqyZcQki523xOvzVPDhwH1ox0i1B+N6gBB9yNbjejF 9SB+2M5iIWaTLmlJ4ikbTRqnymOabVxrq/wp8E32bB+x88s8KPg7/XUUeEDWmf2D a/ls9dlVObBQXEHkaNor8p9VDG/4amI+Wrc/n4wcDHoUu1mgUd9fcEjuy15OHd58 jgni/EmCgDaAlVE/+rhgFeLuHzLcfgPB4Sr3oK7mCQR2YDJR7nKsfLIe6uJSvIOS ZmcPo7SdRaQRn1YFt8fFRWxEeoJVayH5NmKqcqgoja7Bo5Tt+XDQ+F7XGQCvAkyX 0LzyMrm5o3qEky6HcsfpY/6bygcN7O+yuopeEUqIdvkZ4TupRs7WrabeJkAID238 c1trKdNVPVL5IvJijDv76BquDKTWNvLCpDV0wMWvavgy+KOEp94798xYMYm6cRaM ttgqxcmCfhIZK5HbKSMO6ynqpln9HOioePR5FdhINRLw7Z1fP/2sgizDGKOeImea nlmMdxJgYxSkGpmYOwmAJuL36Fl6jivQpZdq6EvdtJ0fxeO17CIS2ImU0tiPtH1e cfb71+ISEIP0Y4GlV7D9dlqTXbw0wrno/84BJLjCTfUtPSzrA0KcqAOg6t+DbfHI HB1epNHm5L8= =3z3m -----END PGP SIGNATURE----- --Sig_/CcwxN46Oguly3bCuijnuqE3-- From stan@hardwarefreak.com Wed Apr 16 18:31:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 880617F58 for ; Wed, 16 Apr 2014 18:31:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 422BB304082 for ; Wed, 16 Apr 2014 16:31:04 -0700 (PDT) X-ASG-Debug-ID: 1397691062-04bdf04555c7150001-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 6MVbF3NnHH6TPrwc for ; Wed, 16 Apr 2014 16:31:02 -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 F31036C0F1; Wed, 16 Apr 2014 18:31:01 -0500 (CDT) Message-ID: <534F12B6.9010101@hardwarefreak.com> Date: Wed, 16 Apr 2014 18:31:02 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Johannes Truschnigg , Dave Chinner CC: xfs@oss.sgi.com, NeilBrown Subject: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md References: <534D24AB.1050605@geizhals.at> <20140415213408.GL15995@dastard> <534E3D98.3000600@geizhals.at> X-ASG-Orig-Subj: Re: Seeking XFS tuning advice for PostgreSQL on SATA SSDs/Linux-md In-Reply-To: <534E3D98.3000600@geizhals.at> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1397691062 X-Barracuda-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/16/2014 3:21 AM, Johannes Truschnigg wrote: > On 04/15/2014 11:34 PM, Dave Chinner wrote: ... >>> After digging through linux-raid archives, I think the most sensible >>> approach are two-disk pairs in RAID1 that are concatenated via >>> either LVM2 or md (leaning towards the latter, since I'd expect that >>> to have a tad less overhead), >> >> I'd stripe them (i.e. RAID10), not concantenate them so as to load >> both RAID1 legs evenly. > > Afaik, the problem with md is that each array (I'm pretty convinced that > also holds true for RAID10, but I'm not 100% sure) only has one > associated kernel thread for writes, which should make that kind of Neil will surely correct me if I missed any relatively recent patches may have changed these. Single write thread personalities (ones people actually use): RAID 1, 10, 5, 6 Unbound personalities: RAID 0, linear > setup worse, at least in theory and in terms of achiveable parallelism, > than the setup I described. I'd be very happy to see a comparison > between the two setups for high-IOPS devices, but I haven't yet found > one anywhere. I can't provide such a head-to-head comparison but I can provide some insight. With a plain HBA, 6 SSDs, and md you should test RAID50 for this workload, an md RAID0 over two 3 drive RAID5 arrays. Your dual socket 6 core Sandy Bridge 15MB L3 parts are 2GHz, boost clock 2.5GHz. I've been doing tuning for a colleague with a single socket 4 core Ivy Bridge 8MB L3 part at 3.3GHz, boost clock 3.7GHz, Intel board w/C202 ASIC, 8GB two channel DDR3, 9211-8i PCIe 2.0 x8 HBA (LSISAS 2008 ASIC), and currently 7, previously 5, Intel 520 series 480GB consumer SSDs, no over provisioning. These use the SandForce 2281 controller which relies on compression for peak performance. The array is md RAID5, metadata 1.2, 64KB chunk, stripe_cache_size 4096, reshaped from 5 to 7 drives recently. The system is an iSCSI target server, poor man's SAN, and has no filesystems for the most part. The md device is carved into multiple LVs which are exported as LUNs, w/one 50GB LV reserved for testing/benchmarking. With the single RAID5 write thread we're achieving 318k parallel FIO 4KB random read IOPS, 45k per drive as all 7 drives are in play for reads as there is no parity block skipping as with rust. We see a shade over 59k 4KB random write IOPS, ~10k IOPS per drive, using parallel submission, zero_buffers for compressibility, libaio, etc. The apparently low 59k figure appears entirely due to GC, as you can see the latency start small and ramp up quickly two paragraphs below. 10k per drive is in line with Intel's lowest number for the 520s 480GB model of 9.5k IOPS, but theirs is for incompressible data. Given Dave's 4-6k for the 840 EVO I'd say this is probably representative of hi-po consumer SSDs with no over provisioning being saturated and not being TRIM'd. Cpu core burn during the write test averaged ~50% with peak of ~58%, 15 %us and 35 %sy, with the 15% being IO submission, 35% the RAID5 thread, w/average 40-50 %wa. > Starting 32 threads > > read: (groupid=0, jobs=16): err= 0: pid=36459 > read : io=74697MB, bw=1244.1MB/s, iops=318691 , runt= 60003msec > slat (usec): min=0 , max=999873 , avg= 5.90, stdev=529.35 > clat (usec): min=0 , max=1002.4K, avg=795.43, stdev=5201.15 > lat (usec): min=0 , max=1002.4K, avg=801.56, stdev=5233.38 > clat percentiles (usec): > | 1.00th=[ 0], 5.00th=[ 213], 10.00th=[ 286], 20.00th=[ 366], > | 30.00th=[ 438], 40.00th=[ 516], 50.00th=[ 604], 60.00th=[ 708], > | 70.00th=[ 860], 80.00th=[ 1096], 90.00th=[ 1544], 95.00th=[ 1928], > | 99.00th=[ 2608], 99.50th=[ 2800], 99.90th=[ 3536], 99.95th=[ 4128], > | 99.99th=[15424] > bw (KB/s) : min=22158, max=245376, per=6.39%, avg=81462.59, stdev=22339.85 > lat (usec) : 2=3.34%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.01% > lat (usec) : 100=0.01%, 250=3.67%, 500=31.43%, 750=24.55%, 1000=13.33% > lat (msec) : 2=19.37%, 4=4.25%, 10=0.04%, 20=0.01%, 50=0.01% > lat (msec) : 100=0.01%, 250=0.01%, 1000=0.01%, 2000=0.01% > cpu : usr=30.27%, sys=236.67%, ctx=239859018, majf=0, minf=64588 > IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0% > submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% > complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0% > issued : total=r=19122474/w=0/d=0, short=r=0/w=0/d=0 > write: (groupid=1, jobs=16): err= 0: pid=38376 > write: io=13885MB, bw=236914KB/s, iops=59228 , runt= 60016msec > slat (usec): min=2 , max=25554K, avg=25.74, stdev=17219.99 > clat (usec): min=122 , max=43459K, avg=4294.06, stdev=100111.47 > lat (usec): min=129 , max=43459K, avg=4319.92, stdev=101581.66 > clat percentiles (usec): > | 1.00th=[ 482], 5.00th=[ 628], 10.00th=[ 748], 20.00th=[ 996], > | 30.00th=[ 1320], 40.00th=[ 1784], 50.00th=[ 2352], 60.00th=[ 3056], > | 70.00th=[ 4192], 80.00th=[ 5920], 90.00th=[ 8384], 95.00th=[10816], > | 99.00th=[17536], 99.50th=[20096], 99.90th=[57088], 99.95th=[67072], > | 99.99th=[123392] > bw (KB/s) : min= 98, max=25256, per=6.74%, avg=15959.71, stdev=2969.06 > lat (usec) : 250=0.01%, 500=1.25%, 750=8.72%, 1000=10.13% > lat (msec) : 2=23.87%, 4=24.78%, 10=24.87%, 20=5.85%, 50=0.39% > lat (msec) : 100=0.11%, 250=0.01%, 750=0.01%, 2000=0.01%, >=2000=0.01% > cpu : usr=5.47%, sys=39.74%, ctx=54762279, majf=0, minf=62375 > IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0% > submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% > complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0% > issued : total=r=0/w=3554662/d=0, short=r=0/w=0/d=0 If a 3.3GHz Ivy Bridge core w/8MB shared L3 can do ~60k random write IOPS, 70k w/parity with one md RAID5 thread and 64KB chunk, at ~50% core utilization, it seems reasonable it could do ~120/140k IOPs w/wo parity at 100% core utilization. A 2GHz Sandy Bridge core has 61% of the clock, and with almost double the L3 should have ~66% of the performance. ((0.66*140k)/3= 30.8k IOPS per drive)*2 drives)= ~61k RAID5 4KB IOPS Thus, two 3 drive md RAID5 arrays nested in an md RAID0 stripe and optimally configured (see below) should yield up to ~122k or more random 4KB IOPS, SSD limited. With 3x mirrors and your 830s you get ~35k per spindle, ~105k IOPS aggregate with 3 write threads using maybe 5-10% each of 3 cores. You get redundancy against SSD controller/power circuit, board failure, but not against flash wear failure as each mirror sees 100% of the redundant byte writes. Given you have 12 cores (disable HT as it will decrease md performance), 10 of them likely perennially idle, the better solution may be RAID50. Doing this... 1. Tweak IRQ affinity to keep interrupts off the md thread cores 2. Pin RAID5 threads to cores on different NUMA nodes, different L3 domains, so each has 15MB of L3 available, core 5 on each socket is good as the process scheduler will hit them last 3. Use 16KB RAID5 chunk, 32KB RAID0 chunk yielding 64KB outer stripe 4. Set stripe_cache_size to 4096 Should get gain you this... 1. +~17k IOPS over 3x mirrors 2. +1 drive capacity or +85GB/drive over provisioning 3. ~33% lower flash wear and bandwidth For the cost of two fully utilized cores at peak IOPS. You have primarily a DB replication workload and the master's workload in a failover situation. In both cases your write IO will be to one or more journals and one or more DB files, and some indexes. Very few files will be created and the existing files will be modified in place via mmap or simply appended in the case of the journals. So this workload has little if any allocation. Is this correct? If so you'd want a small stripe width and chunk size to get relatively decent IO distribution across the nested RAID5 arrays. Matching chunk size to the erase block size as some recommend is irrelevant here because all your random IOs are a tiny fraction of the erase block size. The elevator (assuming noop) will merge some IOs as well as the the SSD itself, so you won't get erase block rewrites for each 4KB IO. md will be unable to write full stripes, so using a big chunk/stripe is pretty useless here and just adds read overhead. If you mkfs.xfs this md RAID0 device using the defaults it will align to su=32KB sw=2 and create 16 AGs, unless the default has changed. Regardless, XFS alignment to RAID geometry should be largely irrelevant for a transactional DB workload that performs very few allocations but mostly mmap'd modify-in-place and append operations to a small set of files. >> [...] >>> I've experimented with mkfs.xfs (on top of LVM only; I don't know if >>> it takes into account lower block layers and seen that it supposedly >>> chooses to default to an agcount of 4, which seems insufficient >>> given the max. bandwidth our setup should be able to provide. >> >> The number of AGs has no bearing on acheivable bandwidth... with striped storage. With concat setups it can make a big difference. Concat is out of scope for this discussion, but it will be covered in detail in the documentation I'm currently working on with much expert input from Dave. >> The number >> of AGs affects allocation concurrency. Hence if you have 24 CPU >> cores, I'd expect that you want 32 AGs. Normally with a RAID array >> this will be the default, You mean just striped md/dm arrays right? AFAIK we can't yet poll hardware RAIDs for geometry as no standard exists. Also, was the default agcount for striped md/dm arrays changed from the static 16 to 32, or was some intelligence added? I admit I don't keep up with all the patches, but if this was in the subject I'd think it would have caught my eye. This info would be meaningful and useful to me whereas most patches are over my head. :( >> but it seems that RAID1 is not triggering >> the "optimise for allocation concurrency" heuristics in mkfs.... I thought XFS only do this for md/dm arrays with stripe geometry. Using a nested stripe it should kick in though. > Thanks, that is a very useful heads-up! What's the formula used to get > to 32 AGs for 24 CPUs - just (num_cpus * 4/3), Note Dave says "allocation concurrency", and what I stated up above about typical database workloads not doing much allocation. If yours is typical then more AGs won't yield any additional performance. > and is there a simple > explanation for why this is an ideal starting point? And is that an > advisable rule of thumb for xfs in general? More AGs can be useful if you have parallel allocation to at least one directory in each AG. However with striping this doesn't provide a lot of extra bang for the buck. With concatenated storage and proper file/dir/AG layout it can provide large parallel scalability of IOPS and/or throughput depending on the hardware, for both files and metadta. Wait a few months for me to finish the docs. Explaining AG optimization requires too much text for an email exchange. Dave and I have done it before, somewhat piecemeal, and that's in the archives. For your workload and SSDs AGs make zero difference. >>> Apart from that, is there any kind of advice you can share for >>> tuning xfs to run postgres (9.0 initially, but we're planning to >>> upgrade to 9.3 or later eventually) on in 2014, especially >>> performance-wise? >> >> Apart from the AG count and perhaps tuning the sunit/swidth to match >> the RAID0 part of the equation, I wouldn't touch a thing unless you >> know that there's a problem that needs fixing and you know exactly >> what knob will fix the problem you have... Nothing more than has already been stated. > OK, I'll read up on stripe width impact and will (hopefully) have enough > time to test a number of configs that should make sense. Again, chunk/stripe won't matter much for a typical transactional DB if using few files and no allocation. Hope my added input is useful, valuable, and that Dave knows I was appending some of his remarks for clarity, not attempting to correct them. :) Cheers, Stan From david@fromorbit.com Wed Apr 16 18:40:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0066F7F58 for ; Wed, 16 Apr 2014 18:40:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7CD9BAC001 for ; Wed, 16 Apr 2014 16:40:38 -0700 (PDT) X-ASG-Debug-ID: 1397691635-04cb6c2439c1a90001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 2yztsMiW4nRSHSrE for ; Wed, 16 Apr 2014 16:40:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al5+ACAUT1N5LEcvPGdsb2JhbABZgwaDVYUKoi+TW4VggSAXAwEBAQE4NYIlAQEBBDocIxAIAxgJJQ8FJQMHGhOHe8oMFxaOTAeEOASYZZYNKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 09:10:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaZRL-0001Cm-CM; Thu, 17 Apr 2014 09:40:27 +1000 Date: Thu, 17 Apr 2014 09:40:27 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: log running test to dmesg Message-ID: <20140416234027.GR15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: log running test to dmesg References: <534EF81D.20205@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534EF81D.20205@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: 1397691635 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 04:37:33PM -0500, Eric Sandeen wrote: > We already log the running test to system logs via "logger" > but viro pointed out that we can use /dev/kmsg to insert it > into dmesg as well. When looking at the serial console that > could be pretty useful. > > Thanks to viro for the test -w suggestion too. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/check b/check > index 268417c..09b2320 100755 > --- a/check > +++ b/check > @@ -457,6 +457,7 @@ do > $timestamp && echo -n " ["`date "+%T"`"]" > [ ! -x $seq ] && chmod u+x $seq # ensure we can run it > $LOGGER_PROG "run xfstest $seqnum" > + test -w /dev/kmsg && echo "run xfstest $seqnum" > /dev/kmsg > ./$seq >$tmp.rawout 2>&1 > sts=$? > $timestamp && _timestamp Might it be worthwhile adding a "_log" function that can take an arbitrary string so in future it is easy to add new log messages? Cheers, Dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Wed Apr 16 18:44:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 69B7A7F58; Wed, 16 Apr 2014 18:44:20 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-fixes-for-3.15-rc2, updated. xfs-for-linus-3.15-rc1-14836-g330033d X-Git-Refname: refs/heads/xfs-fixes-for-3.15-rc2 X-Git-Reftype: branch X-Git-Oldrev: b90159297f95491c348354344e52a4b3da440234 X-Git-Newrev: 330033d697ed8d296fa52b5303db9d802ad901cc Message-Id: <20140416234420.69B7A7F58@oss.sgi.com> Date: Wed, 16 Apr 2014 18:44:19 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-fixes-for-3.15-rc2 has been updated discards b90159297f95491c348354344e52a4b3da440234 (commit) discards 341fcf35d5c111e27c4ef5c2e179a463ff2fc1b5 (commit) discards b7f6608b9de371c79498cd3db4b5346718430a0c (commit) discards d7cc0f34d9b8bdba7f426463ce1dc50a69bcac63 (commit) discards 5425a32d36703bf4099d597bb4eea5581efc2660 (commit) discards 68c1fb5d82c8206e78895169810298f181b9183a (commit) 330033d xfs: fix tmpfile/selinux deadlock and initialize security 8d6c121 xfs: fix buffer use after free on IO error 07d5035 xfs: wrong error sign conversion during failed DIO writes 9c23ecc xfs: unmount does not wait for shutdown during unmount d39a2ce xfs: collapse range is delalloc challenged 0e1f789 xfs: don't map ranges that span EOF for direct IO from b90159297f95491c348354344e52a4b3da440234 (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 330033d697ed8d296fa52b5303db9d802ad901cc Author: Brian Foster Date: Thu Apr 17 08:15:30 2014 +1000 xfs: fix tmpfile/selinux deadlock and initialize security xfstests generic/004 reproduces an ilock deadlock using the tmpfile interface when selinux is enabled. This occurs because xfs_create_tmpfile() takes the ilock and then calls d_tmpfile(). The latter eventually calls into xfs_xattr_get() which attempts to get the lock again. E.g.: xfs_io D ffffffff81c134c0 4096 3561 3560 0x00000080 ffff8801176a1a68 0000000000000046 ffff8800b401b540 ffff8801176a1fd8 00000000001d5800 00000000001d5800 ffff8800b401b540 ffff8800b401b540 ffff8800b73a6bd0 fffffffeffffffff ffff8800b73a6bd8 ffff8800b5ddb480 Call Trace: [] schedule+0x29/0x70 [] rwsem_down_read_failed+0xc5/0x120 [] ? xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] call_rwsem_down_read_failed+0x14/0x30 [] ? down_read_nested+0x89/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] xfs_attr_get+0x90/0xe0 [xfs] [] xfs_xattr_get+0x37/0x50 [xfs] [] generic_getxattr+0x4f/0x70 [] inode_doinit_with_dentry+0x1ae/0x650 [] selinux_d_instantiate+0x1c/0x20 [] security_d_instantiate+0x1b/0x30 [] d_instantiate+0x50/0x70 [] d_tmpfile+0xb5/0xc0 [] xfs_create_tmpfile+0x362/0x410 [xfs] [] xfs_vn_tmpfile+0x18/0x20 [xfs] [] path_openat+0x228/0x6a0 [] ? sched_clock+0x9/0x10 [] ? kvm_clock_read+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_filp_open+0x3a/0x90 [] ? _raw_spin_unlock+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_sys_open+0x12e/0x210 [] SyS_open+0x1e/0x20 [] system_call_fastpath+0x16/0x1b xfs_vn_tmpfile() also fails to initialize security on the newly created inode. Pull the d_tmpfile() call up into xfs_vn_tmpfile() after the transaction has been committed and the inode unlocked. Also, initialize security on the inode based on the parent directory provided via the tmpfile call. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 8d6c121018bf60d631c05a4a2efc468a392b97bb Author: Eric Sandeen Date: Thu Apr 17 08:15:28 2014 +1000 xfs: fix buffer use after free on IO error When testing exhaustion of dm snapshots, the following appeared with CONFIG_DEBUG_OBJECTS_FREE enabled: ODEBUG: free active (active state 0) object type: work_struct hint: xfs_buf_iodone_work+0x0/0x1d0 [xfs] indicating that we'd freed a buffer which still had a pending reference, down this path: [ 190.867975] [] debug_check_no_obj_freed+0x22b/0x270 [ 190.880820] [] kmem_cache_free+0xd0/0x370 [ 190.892615] [] xfs_buf_free+0xe4/0x210 [xfs] [ 190.905629] [] xfs_buf_rele+0xe7/0x270 [xfs] [ 190.911770] [] xfs_trans_read_buf_map+0x7b6/0xac0 [xfs] At issue is the fact that if IO fails in xfs_buf_iorequest, we'll queue completion unconditionally, and then call xfs_buf_rele; but if IO failed, there are no IOs remaining, and xfs_buf_rele will free the bp while work is still queued. Fix this by not scheduling completion if the buffer has an error on it; run it immediately. The rest is only comment changes. Thanks to dchinner for spotting the root cause. Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 07d5035a289f8bebe0ea86c293b2d5412478c481 Author: Dave Chinner Date: Thu Apr 17 08:15:27 2014 +1000 xfs: wrong error sign conversion during failed DIO writes We negate the error value being returned from a generic function incorrectly. The code path that it is running in returned negative errors, so there is no need to negate it to get the correct error signs here. This was uncovered by generic/019. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 9c23eccc1e746f64b18fab070a37189b4422e44a Author: Dave Chinner Date: Thu Apr 17 08:15:26 2014 +1000 xfs: unmount does not wait for shutdown during unmount And interesting situation can occur if a log IO error occurs during the unmount of a filesystem. The cases reported have the same signature - the update of the superblock counters fails due to a log write IO error: XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 XFS (dm-16): Log I/O Error Detected. Shutting down filesystem XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. XFS (dm-16): xfs_log_force: error 5 returned. XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) It can be seen that the last line of output contains a corrupt device name - this is because the log and xfs_mount structures have already been freed by the time this message is printed. A kernel oops closely follows. The issue is that the shutdown is occurring in a separate IO completion thread to the unmount. Once the shutdown processing has started and all the iclogs are marked with XLOG_STATE_IOERROR, the log shutdown code wakes anyone waiting on a log force so they can process the shutdown error. This wakes up the unmount code that is doing a synchronous transaction to update the superblock counters. The unmount path now sees all the iclogs are marked with XLOG_STATE_IOERROR and so never waits on them again, knowing that if it does, there will not be a wakeup trigger for it and we will hang the unmount if we do. Hence the unmount runs through all the remaining code and frees all the filesystem structures while the xlog_iodone() is still processing the shutdown. When the log shutdown processing completes, xfs_do_force_shutdown() emits the "Please umount the filesystem and rectify the problem(s)" message, and xlog_iodone() then aborts all the objects attached to the iclog. An iclog that has already been freed.... The real issue here is that there is no serialisation point between the log IO and the unmount. We have serialisations points for log writes, log forces, reservations, etc, but we don't actually have any code that wakes for log IO to fully complete. We do that for all other types of object, so why not iclogbufs? Well, it turns out that we can easily do this. We've got xfs_buf handles, and that's what everyone else uses for IO serialisation. i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only release the lock in xlog_iodone() when we are finished with the buffer. That way before we tear down the iclog, we can lock and unlock the buffer to ensure IO completion has finished completely before we tear it down. Signed-off-by: Dave Chinner Tested-by: Mike Snitzer Tested-by: Bob Mastors Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit d39a2ced0fa0172faa46df0866fc22419b876e2a Author: Dave Chinner Date: Thu Apr 17 08:15:25 2014 +1000 xfs: collapse range is delalloc challenged FSX has been detecting data corruption after to collapse range calls. The key observation is that the offset of the last extent in the file was not being shifted, and hence when the file size was adjusted it was truncating away data because the extents handled been correctly shifted. Tracing indicated that before the collapse, the extent list looked like: .... ino 0x5788 state idx 6 offset 26 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 39 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 and after the shift of 2 blocks: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 Note that the last extent did not change offset. After the changing of the file size: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 30 flag 0 You can see that the last extent had it's length truncated, indicating that we've lost data. The reason for this is that the xfs_bmap_shift_extents() loop uses XFS_IFORK_NEXTENTS() to determine how many extents are in the inode. This, unfortunately, doesn't take into account delayed allocation extents - it's a count of physically allocated extents - and hence when the file being collapsed has a delalloc extent like this one does prior to the range being collapsed: .... ino 0x5788 state idx 4 offset 11 block 4503599627239429 count 1 flag 0 .... it gets the count wrong and terminates the shift loop early. Fix it by using the in-memory extent array size that includes delayed allocation extents to determine the number of extents on the inode. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 0e1f789d0dc38db79dfc4ddfd9cf541a8c198b7a Author: Dave Chinner Date: Thu Apr 17 08:15:19 2014 +1000 xfs: don't map ranges that span EOF for direct IO Al Viro tracked down the problem that has caused generic/263 to fail on XFS since the test was introduced. If is caused by xfs_get_blocks() mapping a single extent that spans EOF without marking it as buffer-new() so that the direct IO code does not zero the tail of the block at the new EOF. This is a long standing bug that has been around for many, many years. Because xfs_get_blocks() starts the map before EOF, it can't set buffer_new(), because that causes he direct IO code to also zero unaligned sectors at the head of the IO. This would overwrite valid data with zeros, and hence we cannot validly return a single extent that spans EOF to direct IO. Fix this by detecting a mapping that spans EOF and truncate it down to EOF. This results in the the direct IO code doing the right thing for unaligned data blocks before EOF, and then returning to get another mapping for the region beyond EOF which XFS treats correctly by setting buffer_new() on it. This makes direct Io behave correctly w.r.t. tail block zeroing beyond EOF, and fsx is happy about that. Again, thanks to Al Viro for finding what I couldn't. [ dchinner: Fix for __divdi3 build error: Reported-by: Paul Gortmaker Tested-by: Paul Gortmaker Signed-off-by: Mark Tinguely Reviewed-by: Eric Sandeen ] Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From rostedt@goodmis.org Wed Apr 16 18:44:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 890E27F55 for ; Wed, 16 Apr 2014 18:44:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04E44AC002 for ; Wed, 16 Apr 2014 16:44:47 -0700 (PDT) X-ASG-Debug-ID: 1397691885-04cbb06e9cc2760001-NocioJ Received: from cdptpa-oedge-vip.email.rr.com (cdptpa-outbound-snat.email.rr.com [107.14.166.232]) by cuda.sgi.com with ESMTP id VWYxpqJt2YhJtyv1 for ; Wed, 16 Apr 2014 16:44:46 -0700 (PDT) X-Barracuda-Envelope-From: rostedt@goodmis.org X-Barracuda-Apparent-Source-IP: 107.14.166.232 Received: from [67.246.153.56] ([67.246.153.56:52414] helo=gandalf.local.home) by cdptpa-oedge02 (envelope-from ) (ecelerity 3.5.0.35861 r(Momo-dev:tip)) with ESMTP id 73/F2-30401-DE51F435; Wed, 16 Apr 2014 23:44:45 +0000 Date: Wed, 16 Apr 2014 19:44:44 -0400 From: Steven Rostedt To: Dave Chinner Cc: Eric Sandeen , Christoph Hellwig , xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140416194444.50176f0f@gandalf.local.home> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro In-Reply-To: <20140416220807.GN15995@dastard> References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> <534ED5E4.60903@sandeen.net> <20140416220807.GN15995@dastard> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-RR-Connecting-IP: 107.14.168.130:25 X-Cloudmark-Score: 0 X-Barracuda-Connect: cdptpa-outbound-snat.email.rr.com[107.14.166.232] X-Barracuda-Start-Time: 1397691886 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, 17 Apr 2014 08:08:08 +1000 Dave Chinner wrote: > > Here's the "best" I've come up with so far... > > > > # for FUNCTION in `grep "t xfs_" /proc/kallsyms | awk '{print $3}'`; do echo "r:ret_$FUNCTION $FUNCTION \$retval" >> /sys/kernel/debug/tracing/kprobe_events; done BTW, it's usually better to do: grep 't xfs_' /proc/kallsyms | awk '{print $3}' ; while read FUNCTION; do .... > > > > # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 1 > $ENABLE; done > > > > run a test that fails: > > > > # dd if=/dev/zero of=newfile bs=513 oflag=direct > > dd: writing `newfile': Invalid argument > > > > # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 0 > $ENABLE; done > > > > # cat /sys/kernel/debug/tracing/trace > > > > <...>-63791 [000] d... 705435.568913: ret_xfs_vn_mknod: (xfs_vn_create+0x13/0x20 [xfs] <- xfs_vn_mknod) arg1=0 > > <...>-63791 [000] d... 705435.568913: ret_xfs_vn_create: (vfs_create+0xdb/0x100 <- xfs_vn_create) arg1=0 > > <...>-63791 [000] d... 705435.568918: ret_xfs_file_open: (do_dentry_open+0x24e/0x2e0 <- xfs_file_open) arg1=0 > > <...>-63791 [000] d... 705435.568934: ret_xfs_file_dio_aio_write: (xfs_file_aio_write+0x147/0x150 [xfs] <- xfs_file_dio_aio_write) arg1=ffffffffffffffea > > > > Hey look, it's "-22" in hex! ;) > > > > so it's possible, but bleah. > > Steve, we want to be able to trap specific return codes from > functions. Say, for example, the first function that returns > EINVAL/-EINVAL in XFS under a given workload. > > What's the most efficient way to do that with ftrace? > > And can that be set up as a trigger so we can use it to dump a > snapshot of the last N events into the trace buffer or do other > interesting things with that event? Well, after you do the above, you could also do a while loop to all those events and update the filter: echo 'arg1 > 0xffffffffffffff00' > /debug/tracing/events/kprobes/filter Which would trace only those functions that had an error code (assuming the error code is less than 256). You could also use the trigger files: echo 'traceoff if arg1 > 0xffffffffffffff00' > /debug/tracing/events/kprobes/*/trigger The above wont actually work as is, you would need to do another while loop of trigger files and set them each individually. -- Steve From dgc@oss.sgi.com Wed Apr 16 18:45:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id F30947F58; Wed, 16 Apr 2014 18:45:02 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc1-14836-g330033d X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: b90159297f95491c348354344e52a4b3da440234 X-Git-Newrev: 330033d697ed8d296fa52b5303db9d802ad901cc Message-Id: <20140416234502.F30947F58@oss.sgi.com> Date: Wed, 16 Apr 2014 18:45:02 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated discards b90159297f95491c348354344e52a4b3da440234 (commit) discards 341fcf35d5c111e27c4ef5c2e179a463ff2fc1b5 (commit) discards b7f6608b9de371c79498cd3db4b5346718430a0c (commit) discards d7cc0f34d9b8bdba7f426463ce1dc50a69bcac63 (commit) discards 5425a32d36703bf4099d597bb4eea5581efc2660 (commit) discards 68c1fb5d82c8206e78895169810298f181b9183a (commit) 330033d xfs: fix tmpfile/selinux deadlock and initialize security 8d6c121 xfs: fix buffer use after free on IO error 07d5035 xfs: wrong error sign conversion during failed DIO writes 9c23ecc xfs: unmount does not wait for shutdown during unmount d39a2ce xfs: collapse range is delalloc challenged 0e1f789 xfs: don't map ranges that span EOF for direct IO from b90159297f95491c348354344e52a4b3da440234 (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 330033d697ed8d296fa52b5303db9d802ad901cc Author: Brian Foster Date: Thu Apr 17 08:15:30 2014 +1000 xfs: fix tmpfile/selinux deadlock and initialize security xfstests generic/004 reproduces an ilock deadlock using the tmpfile interface when selinux is enabled. This occurs because xfs_create_tmpfile() takes the ilock and then calls d_tmpfile(). The latter eventually calls into xfs_xattr_get() which attempts to get the lock again. E.g.: xfs_io D ffffffff81c134c0 4096 3561 3560 0x00000080 ffff8801176a1a68 0000000000000046 ffff8800b401b540 ffff8801176a1fd8 00000000001d5800 00000000001d5800 ffff8800b401b540 ffff8800b401b540 ffff8800b73a6bd0 fffffffeffffffff ffff8800b73a6bd8 ffff8800b5ddb480 Call Trace: [] schedule+0x29/0x70 [] rwsem_down_read_failed+0xc5/0x120 [] ? xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] call_rwsem_down_read_failed+0x14/0x30 [] ? down_read_nested+0x89/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_attr_map_shared+0x1f/0x50 [xfs] [] xfs_attr_get+0x90/0xe0 [xfs] [] xfs_xattr_get+0x37/0x50 [xfs] [] generic_getxattr+0x4f/0x70 [] inode_doinit_with_dentry+0x1ae/0x650 [] selinux_d_instantiate+0x1c/0x20 [] security_d_instantiate+0x1b/0x30 [] d_instantiate+0x50/0x70 [] d_tmpfile+0xb5/0xc0 [] xfs_create_tmpfile+0x362/0x410 [xfs] [] xfs_vn_tmpfile+0x18/0x20 [xfs] [] path_openat+0x228/0x6a0 [] ? sched_clock+0x9/0x10 [] ? kvm_clock_read+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_filp_open+0x3a/0x90 [] ? _raw_spin_unlock+0x27/0x40 [] ? __alloc_fd+0xaf/0x1f0 [] do_sys_open+0x12e/0x210 [] SyS_open+0x1e/0x20 [] system_call_fastpath+0x16/0x1b xfs_vn_tmpfile() also fails to initialize security on the newly created inode. Pull the d_tmpfile() call up into xfs_vn_tmpfile() after the transaction has been committed and the inode unlocked. Also, initialize security on the inode based on the parent directory provided via the tmpfile call. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 8d6c121018bf60d631c05a4a2efc468a392b97bb Author: Eric Sandeen Date: Thu Apr 17 08:15:28 2014 +1000 xfs: fix buffer use after free on IO error When testing exhaustion of dm snapshots, the following appeared with CONFIG_DEBUG_OBJECTS_FREE enabled: ODEBUG: free active (active state 0) object type: work_struct hint: xfs_buf_iodone_work+0x0/0x1d0 [xfs] indicating that we'd freed a buffer which still had a pending reference, down this path: [ 190.867975] [] debug_check_no_obj_freed+0x22b/0x270 [ 190.880820] [] kmem_cache_free+0xd0/0x370 [ 190.892615] [] xfs_buf_free+0xe4/0x210 [xfs] [ 190.905629] [] xfs_buf_rele+0xe7/0x270 [xfs] [ 190.911770] [] xfs_trans_read_buf_map+0x7b6/0xac0 [xfs] At issue is the fact that if IO fails in xfs_buf_iorequest, we'll queue completion unconditionally, and then call xfs_buf_rele; but if IO failed, there are no IOs remaining, and xfs_buf_rele will free the bp while work is still queued. Fix this by not scheduling completion if the buffer has an error on it; run it immediately. The rest is only comment changes. Thanks to dchinner for spotting the root cause. Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 07d5035a289f8bebe0ea86c293b2d5412478c481 Author: Dave Chinner Date: Thu Apr 17 08:15:27 2014 +1000 xfs: wrong error sign conversion during failed DIO writes We negate the error value being returned from a generic function incorrectly. The code path that it is running in returned negative errors, so there is no need to negate it to get the correct error signs here. This was uncovered by generic/019. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 9c23eccc1e746f64b18fab070a37189b4422e44a Author: Dave Chinner Date: Thu Apr 17 08:15:26 2014 +1000 xfs: unmount does not wait for shutdown during unmount And interesting situation can occur if a log IO error occurs during the unmount of a filesystem. The cases reported have the same signature - the update of the superblock counters fails due to a log write IO error: XFS (dm-16): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa08a44a1 XFS (dm-16): Log I/O Error Detected. Shutting down filesystem XFS (dm-16): Unable to update superblock counters. Freespace may not be correct on next mount. XFS (dm-16): xfs_log_force: error 5 returned. XFS (¿-¿¿¿): Please umount the filesystem and rectify the problem(s) It can be seen that the last line of output contains a corrupt device name - this is because the log and xfs_mount structures have already been freed by the time this message is printed. A kernel oops closely follows. The issue is that the shutdown is occurring in a separate IO completion thread to the unmount. Once the shutdown processing has started and all the iclogs are marked with XLOG_STATE_IOERROR, the log shutdown code wakes anyone waiting on a log force so they can process the shutdown error. This wakes up the unmount code that is doing a synchronous transaction to update the superblock counters. The unmount path now sees all the iclogs are marked with XLOG_STATE_IOERROR and so never waits on them again, knowing that if it does, there will not be a wakeup trigger for it and we will hang the unmount if we do. Hence the unmount runs through all the remaining code and frees all the filesystem structures while the xlog_iodone() is still processing the shutdown. When the log shutdown processing completes, xfs_do_force_shutdown() emits the "Please umount the filesystem and rectify the problem(s)" message, and xlog_iodone() then aborts all the objects attached to the iclog. An iclog that has already been freed.... The real issue here is that there is no serialisation point between the log IO and the unmount. We have serialisations points for log writes, log forces, reservations, etc, but we don't actually have any code that wakes for log IO to fully complete. We do that for all other types of object, so why not iclogbufs? Well, it turns out that we can easily do this. We've got xfs_buf handles, and that's what everyone else uses for IO serialisation. i.e. bp->b_sema. So, lets hold iclogbufs locked over IO, and only release the lock in xlog_iodone() when we are finished with the buffer. That way before we tear down the iclog, we can lock and unlock the buffer to ensure IO completion has finished completely before we tear it down. Signed-off-by: Dave Chinner Tested-by: Mike Snitzer Tested-by: Bob Mastors Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit d39a2ced0fa0172faa46df0866fc22419b876e2a Author: Dave Chinner Date: Thu Apr 17 08:15:25 2014 +1000 xfs: collapse range is delalloc challenged FSX has been detecting data corruption after to collapse range calls. The key observation is that the offset of the last extent in the file was not being shifted, and hence when the file size was adjusted it was truncating away data because the extents handled been correctly shifted. Tracing indicated that before the collapse, the extent list looked like: .... ino 0x5788 state idx 6 offset 26 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 39 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 and after the shift of 2 blocks: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 32 flag 0 Note that the last extent did not change offset. After the changing of the file size: ino 0x5788 state idx 6 offset 24 block 195904 count 10 flag 0 ino 0x5788 state idx 7 offset 37 block 195917 count 35 flag 0 ino 0x5788 state idx 8 offset 86 block 195964 count 30 flag 0 You can see that the last extent had it's length truncated, indicating that we've lost data. The reason for this is that the xfs_bmap_shift_extents() loop uses XFS_IFORK_NEXTENTS() to determine how many extents are in the inode. This, unfortunately, doesn't take into account delayed allocation extents - it's a count of physically allocated extents - and hence when the file being collapsed has a delalloc extent like this one does prior to the range being collapsed: .... ino 0x5788 state idx 4 offset 11 block 4503599627239429 count 1 flag 0 .... it gets the count wrong and terminates the shift loop early. Fix it by using the in-memory extent array size that includes delayed allocation extents to determine the number of extents on the inode. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 0e1f789d0dc38db79dfc4ddfd9cf541a8c198b7a Author: Dave Chinner Date: Thu Apr 17 08:15:19 2014 +1000 xfs: don't map ranges that span EOF for direct IO Al Viro tracked down the problem that has caused generic/263 to fail on XFS since the test was introduced. If is caused by xfs_get_blocks() mapping a single extent that spans EOF without marking it as buffer-new() so that the direct IO code does not zero the tail of the block at the new EOF. This is a long standing bug that has been around for many, many years. Because xfs_get_blocks() starts the map before EOF, it can't set buffer_new(), because that causes he direct IO code to also zero unaligned sectors at the head of the IO. This would overwrite valid data with zeros, and hence we cannot validly return a single extent that spans EOF to direct IO. Fix this by detecting a mapping that spans EOF and truncate it down to EOF. This results in the the direct IO code doing the right thing for unaligned data blocks before EOF, and then returning to get another mapping for the region beyond EOF which XFS treats correctly by setting buffer_new() on it. This makes direct Io behave correctly w.r.t. tail block zeroing beyond EOF, and fsx is happy about that. Again, thanks to Al Viro for finding what I couldn't. [ dchinner: Fix for __divdi3 build error: Reported-by: Paul Gortmaker Tested-by: Paul Gortmaker Signed-off-by: Mark Tinguely Reviewed-by: Eric Sandeen ] Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From neilb@suse.de Wed Apr 16 19:21:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A327C7F4E for ; Wed, 16 Apr 2014 19:21:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86BCB30408D for ; Wed, 16 Apr 2014 17:20:59 -0700 (PDT) X-ASG-Debug-ID: 1397694057-04cb6c2437c4000001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id E0QIU2WHS8s3L8Ql (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 17:20:58 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 41239ACDB; Thu, 17 Apr 2014 00:20:57 +0000 (UTC) Date: Thu, 17 Apr 2014 10:20:48 +1000 From: NeilBrown To: Jeff Layton Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Peter Zijlstra , Ingo Molnar , Ming Lei , netdev@vger.kernel.org Subject: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts Message-ID: <20140417102048.2fc8275c@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts In-Reply-To: <20140416104207.75b044e8@tlielax.poochiereds.net> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416104207.75b044e8@tlielax.poochiereds.net> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/ZiKmG43mXH3JoeDwPbs7CZV"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397694057 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/ZiKmG43mXH3JoeDwPbs7CZV Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 10:42:07 -0400 Jeff Layton wrote: > On Wed, 16 Apr 2014 14:03:35 +1000 > NeilBrown wrote: >=20 > > Comments, criticisms, etc most welcome. > >=20 > > Thanks, > > NeilBrown > >=20 >=20 > I've only given this a once-over, but the basic concept seems a bit > flawed. IIUC, the basic idea is to disallow allocations done in knfsd > threads context from doing fs-based reclaim. >=20 > This seems very heavy-handed, and like it could cause problems on a > busy NFS server. Those sorts of servers are likely to have a lot of > data in pagecache and thus we generally want to allow them to do do > writeback when memory is tight. >=20 > It's generally acceptable for knfsd to recurse into local filesystem > code for writeback. What you want to avoid in this situation is reclaim > on NFS filesystems that happen to be from knfsd on the same box. >=20 > If you really want to fix this, what may make more sense is trying to > plumb that information down more granularly. Maybe GFP_NONETFS and/or > PF_NETFSTRANS flags? Hi Jeff, a few clarifications first: 1/ These changes probably won't affect a "busy NFS server" at all. The PF_FSTRANS flag only get set in nfsd when it sees a request from the lo= cal host. Most busy NFS servers would never see that, and so would never s= et PF_FSTRANS. 2/ Setting PF_FSTRANS does not affect where writeback is done. Direct reclaim hasn't performed filesystem writeback since 3.2, it is all done by kswapd (I think direct reclaim still writes to swap sometimes). The main effects of setting PF_FSTRANS (as modified by this page set) are: - when reclaim calls ->releasepage __GFP_FS is not set in the gfp_t = arg - various caches like dcache, icache etc are not shrunk from direct reclaim There are other effects, but I'm less clear on exactly what they mean. A flag specific to network filesystems might make sense, but I don't think = it would solve all the deadlocks. A good example is the deadlock with the flush-* threads. flush-* will lock a page, and then call ->writepage. If ->writepage allocates memory it can enter reclaim, call ->releasepage on NFS, and block waiting for a COMMIT to complete. The COMMIT might already be running, performing fsync on that same file that flush-* is flushing. It locks each page in turn. When it gets to the page that flush-* has locked, it will deadlock. xfs_vm_writepage does allocate memory with __GFP_FS set xfs_vm_writepage -> xfs_setfilesize_trans_alloc -> xfs_trans_alloc -> _xfs_trans_allo and I have had this deadlock happen. To avoid this we need flush-* to ensu= re that no memory allocation blocks on NFS. We could set a PF_NETFSTRANS ther= e, but as that code really has nothing to do with networks it would seem an odd place to put a network-fs-specific flag. In general, if nfsd is allowed to block on local filesystem, and local filesystem is allowed to block on NFS, then a deadlock can happen. We would need a clear hierarchy __GFP_NETFS > __GFP_FS > __GFP_IO for it to work. I'm not sure the extra level really helps a lot and it wou= ld be a lot of churn. Thanks, NeilBrown --Sig_/ZiKmG43mXH3JoeDwPbs7CZV Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU08eYDnsnt1WYoG5AQI3mQ//b09b32kYZg134oqC28wk4GuKXD4068sE Vcj1k1jm+zz0nHfY1XbLA2PYmLGeNc1bUSGwtOwVwNvbI1xrae4Da2J6sfQ600nO 8ozsbNXA32Bwp9h4LySPfpvJFatGmW5Kad/88qFc0a9vxXFFjIlm2hmhCuIopTCt PnwHRuTudFWi+Uu2JeqvmNRzcCTt0udNsc7xXlEwk5IXlYj/Qj7WVat40NjQd84E We+y6vTsMkHd2G/yoGdBNTQQedOgrAwyiGudq3VHPUpXgbkpnrnU0tikA2dssL10 XlY37WlZeuqS7NKCAhLJbrJijHI8Js+cUbAhb/zNGW3llCFddYXBjWzWHT07/ISv A8+vuItTa0f/PsI8VkXbJ5P1QMmMtkgsbE+UOJ573v3v9Z2CKemZVrUBmCuOX/x7 iY8eSdU0SsBWTu6OO6TS4BvIu5yvX4PYdt3MvjF1LspLv6ggZ93LUr1+KV0TyUs2 ugbsf9Mq7vrnDdYR3z4Xb38xnAwz+5OmDgaDHTaA67VMYA2Y5K9IoVxMwTdEwGQ5 WOy/KviX2JBbOKLmwcQeZgiTaEpr4CRY6rDA6fIqORBysrGqkujiY1e2OkX8sd30 yo+WHWp7DIeWiJXEUTaRXewa8CgcUY3CXATuj+bsilLTVOhxT28rK5FwtAq6y00N Go80SPlCYvY= =Ornx -----END PGP SIGNATURE----- --Sig_/ZiKmG43mXH3JoeDwPbs7CZV-- From fdmanana@gmail.com Wed Apr 16 19:23:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E2DC7F58 for ; Wed, 16 Apr 2014 19:23:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2592D8F8049 for ; Wed, 16 Apr 2014 17:23:14 -0700 (PDT) X-ASG-Debug-ID: 1397694191-04cb6c2437c4200001-NocioJ Received: from mail-la0-f53.google.com (mail-la0-f53.google.com [209.85.215.53]) by cuda.sgi.com with ESMTP id 9VQstFwPEN3j7h9K (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 17:23:12 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.53] Received: by mail-la0-f53.google.com with SMTP id b8so8812935lan.12 for ; Wed, 16 Apr 2014 17:23:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=EX96t/vbVJfXIFUjtpalVz0oNWRnh9sNaVs1snFnt0w=; b=L0f8Y6yO6W5+VqNJcGFbWQElLg3iQZNGPWMgmU8pgXPnmgTDUwrpTNBhLGbVEGFg/X L++8PKAw4gWPiJoxqdFisVF3mhdpYwLv+pnqm+yUwTGtfgMDgFcCyNzivYNNOyiNeAsG NRzrdzmuFTJwJI+k8HpgBAY1LlLdLc5Bn+jT8jZQ0JM474L4DVTcxKWVtrN8jX3ZYLc0 mgOs7FG9GXGSEsO00TtjbIylROJLRPUu9a6/V6g3GoskvaSBgDc4IFpFLpKHKqhBa6Gf 9yDnPnbWC+omGRVjcpEZh9Fsc5KDY/aeTuPdR9y03mXZnoyTu2MKm01HH1zQdS6dSFtV a8sg== MIME-Version: 1.0 X-Received: by 10.152.42.230 with SMTP id r6mr7294076lal.32.1397694190563; Wed, 16 Apr 2014 17:23:10 -0700 (PDT) Received: by 10.112.164.231 with HTTP; Wed, 16 Apr 2014 17:23:10 -0700 (PDT) Reply-To: fdmanana@gmail.com In-Reply-To: <20140416231333.GQ15995@dastard> References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> <20140416002349.GV15995@dastard> <20140416231333.GQ15995@dastard> Date: Thu, 17 Apr 2014 01:23:10 +0100 Message-ID: Subject: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents From: Filipe David Manana X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs, test send's ability to punch holes and prealloc extents To: Dave Chinner Cc: "xfs@oss.sgi.com" , "linux-btrfs@vger.kernel.org" , Josef Bacik Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-la0-f53.google.com[209.85.215.53] X-Barracuda-Start-Time: 1397694191 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4987 Rule breakdown below pts rule name 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 17, 2014 at 12:13 AM, Dave Chinner wrote: > On Wed, Apr 16, 2014 at 03:39:18PM +0100, Filipe David Manana wrote: >> On Wed, Apr 16, 2014 at 1:23 AM, Dave Chinner wrote: >> > On Tue, Apr 15, 2014 at 05:43:21PM +0100, Filipe David Borba Manana wrote: >> >> This test verifies that after an incremental btrfs send the replicated file has >> >> the same exact hole and data structure as in the origin filesystem. This didn't >> >> use to be the case before the send stream version 2 - holes were sent as write >> >> operations of 0 valued bytes instead of punching holes with the fallocate system >> >> call, and pre-allocated extents were sent as well as write operations of 0 valued >> >> bytes instead of intructions for the receiver to use the fallocate system call. >> >> Also checks that prealloc extents that lie beyond the file's size are replicated >> >> by an incremental send. >> > >> > Can you wrap commit messages at 68 columns? >> > >> > .... >> >> +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch >> >> +# List all hole and data segments. >> >> +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo >> >> +# List all extents, we're interested here in prealloc extents that lie beyond >> >> +# the file's size. >> >> +$XFS_IO_PROG -r -c "fiemap -l" $SCRATCH_MNT/mysnap2/foo | _filter_scratch >> > >> > That dumps raw block numbers into the golden output. _filter_fiemap >> > is probably needed here. >> >> Hum, just tried it and uploaded a v2. >> However I'm now noticing it doesn't do everything I had in mind. >> _filter_fiemap is not showing the extents falloc -k created, only a >> collapsed range of holes. >> >> So my intention is to verify not just holes, but also the extents >> created by 'falloc -k'. The following filter I just made locally gives >> me that: >> >> _filter_all_fiemap() >> { >> awk --posix ' >> $3 ~ /hole/ { >> print $1, $2, $3; >> next; >> } >> $3 ~ /[[:xdigit:]]*..[[:xdigit:]]/ { >> print $1, $2, "extent"; >> next; >> }' >> } > > Which is effectively _filter_hole_fiemap(), except it coalesces > adjacent extents into a single range. > > I'd suggest moving the _filter_* functions from common/punch to > common/filter, and using _filter_hole_fiemap() as there's no > guarantee that you'll get individual extents for each falloc -k > range - they coul dbe allocated contiguously, and hence the number > of extents reported can change from run to run. That's the reason > why the filters coalesce adjacent file offsets of the same type - we > care whether the range of the file contains the correct extent type, > not how fragmented the range is.... Right. Thanks for pointing it out Dave. > >> (nicely printed/indented at >> https://friendpaste.com/1JtG5bts2Sz0LWhUutCpzE, as e-mail is not good >> for code pasting) > > Pasting code works fine for me ;) > >> Which gives me: >> >> 0: [0..191]: extent >> 1: [192..199]: extent >> 2: [200..231]: extent >> 3: [232..239]: extent >> 4: [240..287]: extent >> 5: [288..295]: extent >> 6: [296..487]: extent >> 7: [488..495]: extent >> 8: [496..519]: hole >> 9: [520..527]: extent >> 10: [528..583]: extent >> 11: [584..591]: extent >> 12: [592..2543]: extent >> 13: [2544..17575]: hole >> 14: [17576..21487]: extent > > Also, you're trimming of the block count, so you can drop the "-l" > option to the fiemap command.... > >> Versus only (from _filter_fiemap): >> >> 0: [496..17575]: hole > > Maybe the "-l" option is confusing the filter, it should be giving: > > 0: [0..495]: data > 1: [496..519]: hole > 2: [520..2543]: data > 3: [2544..17575]: hole > 4: [17576..21487]: data > > Though if there are unwritten extents, it will say "unwritten" > rather than "data". _filter_hole_fiemap should give: > > 0: [0..495]: extent > 1: [496..519]: hole > 2: [520..2543]: extent > 3: [2544..17575]: hole > 4: [17576..21487]: extent > > Which tells you that everything you asked for was allocated... Ok, figured out my mistake. _filter_fiemap works just fine, it gives me all the information I wanted (as in your last example) as long as I pass the -v option (and not -l, or no options at all). Thank you very much Dave :) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." From fdmanana@gmail.com Wed Apr 16 19:23:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1107D7F58 for ; Wed, 16 Apr 2014 19:23:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DBCF48F8037 for ; Wed, 16 Apr 2014 17:23:48 -0700 (PDT) X-ASG-Debug-ID: 1397694226-04cb6c2436c4290001-NocioJ Received: from mail-we0-f172.google.com (mail-we0-f172.google.com [74.125.82.172]) by cuda.sgi.com with ESMTP id 5jsCPV3eFQpYrqEt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 16 Apr 2014 17:23:47 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.172 Received: by mail-we0-f172.google.com with SMTP id t61so11644034wes.3 for ; Wed, 16 Apr 2014 17:23:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=A+nUn/9RpgNPnV3C9JQ2sCWSlxYUPQPIRLZM0vvMZv8=; b=DGQawprwVltT3OQhURWI59fxxXtCapqhbVpYQ7ylH/WYIjSltoJhEsra7e/F/wf/HM ualZ09fcy9ntQWHHgEdEON2mzP2ILsMG0JfPJGkVPL79uiXJOlIZ9kKLbHtRCurtV9iZ /OATmCSyV5Uh2o/jLMF7VSHpoqOKdcAFKUnVjdNL3WWUC1d0N9Iv7n32j6XBxH573WAp mpiYbEVVU2AZzCkfhz4pHDC8xwmi/N5wLXiRUGFj69CT1ENXAhPh5zOZuQ3sjy51ONLC UdSABhw7LX8sooqoJ91Ku3lPkbb7ar9Dq/QbeKgcM5smIwuJQ2JoaTXrT/s1k0BPAALS Qc8w== X-Received: by 10.180.100.129 with SMTP id ey1mr21577086wib.60.1397694226408; Wed, 16 Apr 2014 17:23:46 -0700 (PDT) Received: from debian-vm3.lan (bl10-198-83.dsl.telepac.pt. [85.243.198.83]) by mx.google.com with ESMTPSA id d6sm1466709wiz.4.2014.04.16.17.23.45 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 16 Apr 2014 17:23:45 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v3] xfstests: btrfs, test send's ability to punch holes and prealloc extents Date: Thu, 17 Apr 2014 02:23:33 +0100 X-ASG-Orig-Subj: [PATCH v3] xfstests: btrfs, test send's ability to punch holes and prealloc extents Message-Id: <1397697813-23641-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-we0-f172.google.com[74.125.82.172] X-Barracuda-Start-Time: 1397694227 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4987 Rule breakdown below pts rule name 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 verifies that after an incremental btrfs send the replicated file has the same exact hole and data structure as in the origin filesystem. This didn't use to be the case before the send stream version 2 - holes were sent as write operations of 0 valued bytes instead of punching holes with the fallocate system call, and pre-allocated extents were sent as well as write operations of 0 valued bytes instead of intructions for the receiver to use the fallocate system call. It also checks that prealloc extents that lie beyond the file's size are replicated by an incremental send. Signed-off-by: Filipe David Borba Manana --- V2: Addressed Dave's comments, and updated btrfs send invocation, by specifying the new command line option (-a) that enables use of fallocate - added function _require_btrfs_send_fallocate_flag() to skip the test when an old version of btrfs-progs is found. V3: Corrected use of fiemap with _filter_fiemap. Was passing -l instead of -v to fiemap, which resulted in output consisting only of a single line related to a hole instead of all holes and data extents (and I wanted to verify the falloc -k extents were preserved after the btrfs send). common/rc | 9 ++++ tests/btrfs/047 | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/047.out | 35 +++++++++++++++ tests/btrfs/group | 1 + 4 files changed, 166 insertions(+) create mode 100755 tests/btrfs/047 create mode 100644 tests/btrfs/047.out diff --git a/common/rc b/common/rc index acf419b..e94e51c 100644 --- a/common/rc +++ b/common/rc @@ -2262,6 +2262,15 @@ _run_btrfs_util_prog() run_check $BTRFS_UTIL_PROG $* } +_require_btrfs_send_fallocate_flag() +{ + $BTRFS_UTIL_PROG send 2>&1 | \ + grep '^[ \t]*\-a[ \t]\+.* fallocate ' > /dev/null 2>&1 + if [ $? -ne 0 ]; then + _notrun "Missing btrfs-progs send -a command line option, skipped this test" + fi +} + init_rc() { if [ "$iam" == new ] diff --git a/tests/btrfs/047 b/tests/btrfs/047 new file mode 100755 index 0000000..e39b019 --- /dev/null +++ b/tests/btrfs/047 @@ -0,0 +1,121 @@ +#! /bin/bash +# FS QA Test No. btrfs/047 +# +# Verify that after an incremental btrfs send the replicated file has +# the same exact hole and data structure as in the origin filesystem. +# This didn't use to be the case before the send stream version 2 - +# holes were sent as write operations of 0 valued bytes instead of punching +# holes with the fallocate system call, and pre-allocated extents were sent +# as well as write operations of 0 valued bytes instead of intructions for +# the receiver to use the fallocate system call. Also check that prealloc +# extents that lie beyond the file's size are replicated by an incremental +# send. +# +# More specifically, this structure preserving guarantee was added by the +# following linux kernel commits: +# +# Btrfs: send, use fallocate command to punch holes +# Btrfs: send, use fallocate command to allocate extents +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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" + +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_require_xfs_io_fiemap +_require_btrfs_send_fallocate_flag +_need_to_be_root + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +$XFS_IO_PROG -f -c "pwrite -S 0x01 -b 300000 0 300000" $SCRATCH_MNT/foo \ + | _filter_xfs_io + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +$XFS_IO_PROG -c "fpunch 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "pwrite -S 0xff -b 1000 120000 1000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "fpunch 250000 20000" $SCRATCH_MNT/foo + +$XFS_IO_PROG -c "falloc -k 300000 1000000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc -k 9000000 2000000" $SCRATCH_MNT/foo + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send -a $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap +_run_btrfs_util_prog send -a -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -v" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap + +_scratch_unmount +_check_scratch_fs + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -v" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/047.out b/tests/btrfs/047.out new file mode 100644 index 0000000..be39edc --- /dev/null +++ b/tests/btrfs/047.out @@ -0,0 +1,35 @@ +QA output created by 047 +wrote 300000/300000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1000/1000 bytes at offset 120000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +0: [0..495]: data +1: [496..519]: hole +2: [520..2543]: data +3: [2544..17575]: hole +4: [17576..21487]: data +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +0: [0..495]: data +1: [496..519]: hole +2: [520..2543]: data +3: [2544..17575]: hole +4: [17576..21487]: data diff --git a/tests/btrfs/group b/tests/btrfs/group index 3a6d34e..d4e3fc1 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -49,3 +49,4 @@ 044 auto quick 045 auto quick 046 auto quick +047 auto quick -- 1.9.1 From david@fromorbit.com Wed Apr 16 19:40:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3C627F56 for ; Wed, 16 Apr 2014 19:40:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5CFD630408C for ; Wed, 16 Apr 2014 17:40:06 -0700 (PDT) X-ASG-Debug-ID: 1397695200-04bdf04553cacd0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id wFnE8lDIjvjC1m1z for ; Wed, 16 Apr 2014 17:40:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmB+ADkiT1N5LEcvPGdsb2JhbABZgwaDVYUKoieTW4VggSAXAwEBAQE4NYIlAQEBBDIBIyMQCAMYCSUPBSUDBxoTh3vKJRcWiSeFJQeEOASYZYppiyQr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 10:09:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaaMu-0001Lr-PV; Thu, 17 Apr 2014 10:39:56 +1000 Date: Thu, 17 Apr 2014 10:39:56 +1000 From: Dave Chinner To: Steven Rostedt Cc: Eric Sandeen , Christoph Hellwig , xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140417003956.GS15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> <534ED5E4.60903@sandeen.net> <20140416220807.GN15995@dastard> <20140416194444.50176f0f@gandalf.local.home> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140416194444.50176f0f@gandalf.local.home> 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: 1397695200 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 07:44:44PM -0400, Steven Rostedt wrote: > On Thu, 17 Apr 2014 08:08:08 +1000 > Dave Chinner wrote: > > > > > Here's the "best" I've come up with so far... > > > > > > # for FUNCTION in `grep "t xfs_" /proc/kallsyms | awk '{print $3}'`; do echo "r:ret_$FUNCTION $FUNCTION \$retval" >> /sys/kernel/debug/tracing/kprobe_events; done > > BTW, it's usually better to do: > > grep 't xfs_' /proc/kallsyms | awk '{print $3}' ; while read FUNCTION; do .... grep -i 't xfs' ..... > > > # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 1 > $ENABLE; done > > > > > > run a test that fails: > > > > > > # dd if=/dev/zero of=newfile bs=513 oflag=direct > > > dd: writing `newfile': Invalid argument > > > > > > # for ENABLE in /sys/kernel/debug/tracing/events/kprobes/ret_xfs_*/enable; do echo 0 > $ENABLE; done > > > > > > # cat /sys/kernel/debug/tracing/trace > > > > > > <...>-63791 [000] d... 705435.568913: ret_xfs_vn_mknod: (xfs_vn_create+0x13/0x20 [xfs] <- xfs_vn_mknod) arg1=0 > > > <...>-63791 [000] d... 705435.568913: ret_xfs_vn_create: (vfs_create+0xdb/0x100 <- xfs_vn_create) arg1=0 > > > <...>-63791 [000] d... 705435.568918: ret_xfs_file_open: (do_dentry_open+0x24e/0x2e0 <- xfs_file_open) arg1=0 > > > <...>-63791 [000] d... 705435.568934: ret_xfs_file_dio_aio_write: (xfs_file_aio_write+0x147/0x150 [xfs] <- xfs_file_dio_aio_write) arg1=ffffffffffffffea > > > > > > Hey look, it's "-22" in hex! ;) > > > > > > so it's possible, but bleah. > > > > Steve, we want to be able to trap specific return codes from > > functions. Say, for example, the first function that returns > > EINVAL/-EINVAL in XFS under a given workload. > > > > What's the most efficient way to do that with ftrace? > > > > And can that be set up as a trigger so we can use it to dump a > > snapshot of the last N events into the trace buffer or do other > > interesting things with that event? > > Well, after you do the above, you could also do a while loop to all > those events and update the filter: > > echo 'arg1 > 0xffffffffffffff00' > /debug/tracing/events/kprobes/filter > > Which would trace only those functions that had an error code (assuming > the error code is less than 256). You could also use the trigger files: > > echo 'traceoff if arg1 > 0xffffffffffffff00' > /debug/tracing/events/kprobes/*/trigger > > The above wont actually work as is, you would need to do another while > loop of trigger files and set them each individually. so, basically a script that does: #!/bin/bash TRACEDIR=/sys/kernel/debug/tracing grep -i 't xfs_' /proc/kallsyms | awk '{print $3}' ; while read F; do echo "r:ret_$F $F \$retval" >> $TRACEDIR/kprobe_events done for E in $TRACEDIR/events/kprobes/ret_xfs_*/enable; do echo 1 > $E done; echo 'arg1 > 0xffffffffffffff00' > $TRACEDIR/events/kprobes/filter for T in $TRACEDIR/events/kprobes/ret_xfs_*/trigger; do echo 'traceoff if arg1 > 0xffffffffffffff00' > $T done And that gives: # dd if=/dev/zero of=/mnt/scratch/newfile bs=513 oflag=direct dd: error writing ¿/mnt/scratch/newfile¿: Invalid argument 1+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000259882 s, 0.0 kB/s root@test4:~# cat /sys/kernel/debug/tracing/trace # tracer: nop # # entries-in-buffer/entries-written: 1/1 #P:16 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | <...>-8073 [006] d... 145740.460546: ret_xfs_file_dio_aio_write: (xfs_file_aio_write+0x170/0x180 <- xfs_file_dio_aio_write) arg1=0xffffffffffffffea Which is precisely the detection that XFS_ERROR would have given us. Ok, so I guess we can now add whatever need need to that trigger... Basically, pass in teh XFs function names you want to trace, the sets up teh events, whatever trigger beahviour you want, and we're off to the races... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 19:50:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC9327F53 for ; Wed, 16 Apr 2014 19:50:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95FE98F804B for ; Wed, 16 Apr 2014 17:50:16 -0700 (PDT) X-ASG-Debug-ID: 1397695813-04bdf04553cb5e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id I0HnW0BRfR88YdwZ for ; Wed, 16 Apr 2014 17:50: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: AmB+AJIkT1N5LEcvPGdsb2JhbABZgwaDVYUKoiaTW4VggSAXAwEBAQE4NYIlAQEBBDIBIyMQCAMYCSUPBSUDBxoTh3vKIRcWjkwHhDgEmGWKaYskKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 10:19:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WaaVv-0001N8-Ca; Thu, 17 Apr 2014 10:49:15 +1000 Date: Thu, 17 Apr 2014 10:49:15 +1000 From: Dave Chinner To: Steven Rostedt Cc: Christoph Hellwig , Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140417004915.GT15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> <534ED5E4.60903@sandeen.net> <20140416220807.GN15995@dastard> <20140416194444.50176f0f@gandalf.local.home> <20140417003956.GS15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140417003956.GS15995@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: 1397695813 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4988 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 17, 2014 at 10:39:56AM +1000, Dave Chinner wrote: > On Wed, Apr 16, 2014 at 07:44:44PM -0400, Steven Rostedt wrote: > > On Thu, 17 Apr 2014 08:08:08 +1000 > > Dave Chinner wrote: > > > Steve, we want to be able to trap specific return codes from > > > functions. Say, for example, the first function that returns > > > EINVAL/-EINVAL in XFS under a given workload. > > > > > > What's the most efficient way to do that with ftrace? > > > > > > And can that be set up as a trigger so we can use it to dump a > > > snapshot of the last N events into the trace buffer or do other > > > interesting things with that event? > > > > Well, after you do the above, you could also do a while loop to all > > those events and update the filter: > > > > echo 'arg1 > 0xffffffffffffff00' > /debug/tracing/events/kprobes/filter > > > > Which would trace only those functions that had an error code (assuming > > the error code is less than 256). You could also use the trigger files: > > > > echo 'traceoff if arg1 > 0xffffffffffffff00' > /debug/tracing/events/kprobes/*/trigger > > > > The above wont actually work as is, you would need to do another while > > loop of trigger files and set them each individually. > > so, basically a script that does: > > #!/bin/bash > > TRACEDIR=/sys/kernel/debug/tracing > > grep -i 't xfs_' /proc/kallsyms | awk '{print $3}' ; while read F; do > echo "r:ret_$F $F \$retval" >> $TRACEDIR/kprobe_events > done > > for E in $TRACEDIR/events/kprobes/ret_xfs_*/enable; do > echo 1 > $E > done; > > echo 'arg1 > 0xffffffffffffff00' > $TRACEDIR/events/kprobes/filter > > for T in $TRACEDIR/events/kprobes/ret_xfs_*/trigger; do > echo 'traceoff if arg1 > 0xffffffffffffff00' > $T > done > > And that gives: > > # dd if=/dev/zero of=/mnt/scratch/newfile bs=513 oflag=direct > dd: error writing ¿/mnt/scratch/newfile¿: Invalid argument > 1+0 records in > 0+0 records out > 0 bytes (0 B) copied, 0.000259882 s, 0.0 kB/s > root@test4:~# cat /sys/kernel/debug/tracing/trace > # tracer: nop > # > # entries-in-buffer/entries-written: 1/1 #P:16 > # > # _-----=> irqs-off > # / _----=> need-resched > # | / _---=> hardirq/softirq > # || / _--=> preempt-depth > # ||| / delay > # TASK-PID CPU# |||| TIMESTAMP FUNCTION > # | | | |||| | | > <...>-8073 [006] d... 145740.460546: ret_xfs_file_dio_aio_write: (xfs_file_aio_write+0x170/0x180 <- xfs_file_dio_aio_write) arg1=0xffffffffffffffea > > Which is precisely the detection that XFS_ERROR would have given us. > Ok, so I guess we can now add whatever need need to that trigger... > > Basically, pass in teh XFs function names you want to trace, the > sets up teh events, whatever trigger beahviour you want, and > we're off to the races... FWIW, this strikes me as something that would be useful for trace-cmd to be able to control, creating the kprobes dynamically based on the function name specification given on the command line similar to how we specify the events we want it to trace.. I'm sure there's more people that just us that want to know what function a specific error first comes from and how it propagates back up through the code.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From neilb@suse.de Wed Apr 16 19:51:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E9157F53 for ; Wed, 16 Apr 2014 19: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 B7721304089 for ; Wed, 16 Apr 2014 17:51:16 -0700 (PDT) X-ASG-Debug-ID: 1397695873-04bdf04552cb6c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 6KUvAfAAHhUv2CUz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 17:51:14 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 7D666ACDB; Thu, 17 Apr 2014 00:51:13 +0000 (UTC) Date: Thu, 17 Apr 2014 10:51:05 +1000 From: NeilBrown To: Dave Chinner Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Message-ID: <20140417105105.7772d09d@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. In-Reply-To: <20140416090051.GK15995@dastard> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.61837.stgit@notabene.brown> <20140416062520.GG15995@dastard> <20140416164941.37587da6@notabene.brown> <20140416090051.GK15995@dastard> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/IOui8nzd.ykBR2y_BhCeNCV"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397695874 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4988 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/IOui8nzd.ykBR2y_BhCeNCV Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 19:00:51 +1000 Dave Chinner wrote: > On Wed, Apr 16, 2014 at 04:49:41PM +1000, NeilBrown wrote: > > On Wed, 16 Apr 2014 16:25:20 +1000 Dave Chinner w= rote: > >=20 > > > On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > > > > __d_alloc can be called with i_mutex held, so it is safer to > > > > use GFP_NOFS. > > > >=20 > > > > lockdep reports this can deadlock when loop-back NFS is in use, > > > > as nfsd may be required to write out for reclaim, and nfsd certainly > > > > takes i_mutex. > > >=20 > > > But not the same i_mutex as is currently held. To me, this seems > > > like a false positive? If you are holding the i_mutex on an inode, > > > then you have a reference to the inode and hence memory reclaim > > > won't ever take the i_mutex on that inode. > > >=20 > > > FWIW, this sort of false positive was a long stabding problem for > > > XFS - we managed to get rid of most of the false positives like this > > > by ensuring that only the ilock is taken within memory reclaim and > > > memory reclaim can't be entered while we hold the ilock. > > >=20 > > > You can't do that with the i_mutex, though.... > > >=20 > > > Cheers, > > >=20 > > > Dave. > >=20 > > I'm not sure this is a false positive. > > You can call __d_alloc when creating a file and so are holding i_mutex = on the > > directory. > > nfsd might also want to access that directory. > >=20 > > If there was only 1 nfsd thread, it would need to get i_mutex and do it= 's > > thing before replying to that request and so before it could handle the > > COMMIT which __d_alloc is waiting for. >=20 > That seems wrong - the NFS client in __d_alloc holds a mutex on a > NFS client directory inode. The NFS server can't access that > specific mutex - it's on the other side of the "network". The NFS > server accesses mutexs from local filesystems, so __d_alloc would > have to be blocked on a local filesystem inode i_mutex for the nfsd > to get hung up behind it... I'm not thinking of mutexes on the NFS inodes but the local filesystem inod= es exactly as you describe below. >=20 > However, my confusion comes from the fact that we do GFP_KERNEL > memory allocation with the i_mutex held all over the place. Do we? Should we? Isn't the whole point of GFP_NOFS to use it when holding any filesystem lock? > If the > problem is: >=20 > local fs access -> i_mutex > ..... > nfsd -> i_mutex (blocked) > ..... > local fs access -> kmalloc(GFP_KERNEL) > -> direct reclaim > -> nfs_release_page > -> > >=20 > then why is it just __d_alloc that needs this fix? Either this is a > problem *everywhere* or it's not a problem at all. I think it is a problem everywhere that it is a problem :-) If you are holding an FS lock, then you should be using GFP_NOFS. Currently a given filesystem can get away with sometimes using GFP_KERNEL because that particular lock never causes contention during reclaim for that particular filesystem. Adding loop-back NFS into the mix broadens the number of locks which can cause a problem as it creates interdependencies between different filesyste= ms. >=20 > If it's a problem everywhere it means that we simply can't allow > reclaim from localhost NFS mounts to run from contexts that could > block an NFSD. i.e. you cannot run NFS client memory reclaim from > filesystems that are NFS server exported filesystems..... Well.. you cannot allow NFS client memory reclaim *while holding locks in* filesystems that are NFS exported. I think this is most effectively generalised to: you cannot allow FS memory reclaim while holding locks in filesystems whi= ch can be NFS exported which I think is largely the case already - and lockdep can help us find those places where we currently do allow FS reclaim while holding an FS loc= k. Thanks, NeilBrown --Sig_/IOui8nzd.ykBR2y_BhCeNCV Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU08leTnsnt1WYoG5AQJQzA/8Cvoi/4unSULSSR/yD8Bso7yrf/66DY4Y 5BknlIQnXLLRnQKRYFbTeMA/Vku/rPyQeWPbX22ealsi2+p7uStAhaqSnAJPPPj/ e+nfkJilCswjWqbuvcwU3oPHGxOA234vHiueT1uIvGyylFUuXvOtL1vPgtaFjlPs KUYjS36XSD17u/UfTEm8jcTyV1z/QdEbu+jhGGB8/wNGqA9mQDar7ykdcUI37iPf 4YJtGQuzU2NvX+JMVMZtbkRZBn4LPP983oo+2+JSFNDeIDeBlVxOfzErJ1QKLpNq CJYC86j+baIkf92M1mpOFEanXgIlvitHofxSCcJ29k0YQDhLZUF0DPrQhdKtSnoK kVcF5pnUwLbcu7jHkHT/8Uip1CijkpqSg920ZhYJAnMseLWM+er2gQIUXkXRzWJd 062RpdhKK5/m0MTbXZJ8crAycFQFLep1vG++jrbYQ0VAQ7TzCF4+iREBxmLiH1sd Oh3l4DdIcDqXchSocKyDAiFA+O8CHCKoBPTyA3YKCNBtmmyIouWjylLOeGMiD4AD yuCks0tlZdtfvZMaqV43yxEkNUsLybnxf3StilD0zJFkQZtWAq43efcIt2XOeiR/ R9BUs3QNOao2ockixg+9T1LV1l1G9RNvcSkrF+j6x0/9uINhcfffqrusqBK5V7FW 4Oc/mEI+igY= =2sPU -----END PGP SIGNATURE----- --Sig_/IOui8nzd.ykBR2y_BhCeNCV-- From neilb@suse.de Wed Apr 16 20:04:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C8A507F56 for ; Wed, 16 Apr 2014 20:04:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42FB5AC003 for ; Wed, 16 Apr 2014 18:04:01 -0700 (PDT) X-ASG-Debug-ID: 1397696639-04cb6c2436c66b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id p2vAxBhmMCNWDlpR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 18:03:59 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E633FACFB; Thu, 17 Apr 2014 01:03:58 +0000 (UTC) Date: Thu, 17 Apr 2014 11:03:50 +1000 From: NeilBrown To: NeilBrown Cc: Dave Chinner , linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ming Lei , xfs@oss.sgi.com Subject: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. Message-ID: <20140417110350.0470feba@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. In-Reply-To: <20140416161726.51b506e2@notabene.brown> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.58240.stgit@notabene.brown> <20140416053756.GC15995@dastard> <20140416161726.51b506e2@notabene.brown> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/adF=M005=1pA2q4e/57yzVC"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397696639 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4988 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address --Sig_/adF=M005=1pA2q4e/57yzVC Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 16:17:26 +1000 NeilBrown wrote: > On Wed, 16 Apr 2014 15:37:56 +1000 Dave Chinner wro= te: >=20 > > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > > - /* > > > - * Given that we do not allow direct reclaim to call us, we should > > > - * never be called while in a filesystem transaction. > > > - */ > > > - if (WARN_ON(current->flags & PF_FSTRANS)) > > > - goto redirty; > >=20 > > We still need to ensure this rule isn't broken. If it is, the > > filesystem will silently deadlock in delayed allocation rather than > > gracefully handle the problem with a warning.... >=20 > Hmm... that might be tricky. The 'new' PF_FSTRANS can definitely be set = when > xfs_vm_writepage is called and we really want the write to happen. > I don't suppose there is any other way to detect if a transaction is > happening? I've been thinking about this some more.... That code is in xfs_vm_writepage which is only called as ->writepage. xfs never calls that directly so it could only possibly be called during reclaim? We know that doesn't happen, but if it does then PF_MEMALLOC would be set, but PF_KSWAPD would not... and you already have a test for that. How about every time we set PF_FSTRANS, we store the corresponding xfs_trans_t in current->journal_info, and clear that field when PF_FSTRANS = is cleared. Then xfs_vm_writepage can test for current->journal_info being clear. That is the field that several other filesystems use to keep track of the 'current' transaction. ?? I don't know what xfs_trans_t we would use in xfs_bmapi_allocate_worker, but I suspect you do :-) Thanks, NeilBrown --Sig_/adF=M005=1pA2q4e/57yzVC Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU08odjnsnt1WYoG5AQKlChAAtwOt5vnmgGZoKPVxl0nE3BD+JkYt5gYE xPlrWpCzoazarfKoC66zfad9ldRYo6FjPlvoiKgO+hdQedc3C47rWrmuahe1S4Wl 0Ernd5J8XmInWsL1pobaEQf8b9XnzZ0Bs4GfEnE0WuABblVF1T6hN8eBVqVev+gK uwT0QOmFxsoxaTvlS4Y9sKEJ98+k9zfg4rvYptEUCUkDwz6IoqqbtCzmsA6WhCUu p9ZzFa9CCPIvA8zoWFS6mOHgC8YWubWPfpbWg7TT4PnAtq597NhyV1k2LbS7aErR r7X3jr9hqpV+nz25Nqe4oNo+VCcDI5PypNr8uUdXpAWdRrexeRXCLyye21TFtKnS WY7VLyLFGyZD3G2t1rT23MN0BepEOErZNanTUoMJgxsbbQGoKKbnaJeWiQLzSH6F pgfRYuUAgYCnlrYKLxKVOSfjtfQVzBc9BzHRyWD1SdAmnbxxdCq2n9wyMCwx7yf8 pYqru1nk67lPV8gvNgkpes0G3Ooxf6E0cu74DeUPsTrC16gK1iE/qs2LTmuAmT7f M1//LfAwyxLXaZ64ZQNObcG5J3gsqALtT3eiBUsAK2D8D80m5pR1LmSHgXy8qVs5 I1FN9OvpV6toEw5iAX9bwagB2zzTiJvTS2qHHMeJ2AqQriN5jMrpeud4QasyBxCr KjIpmijtXwI= =OIdO -----END PGP SIGNATURE----- --Sig_/adF=M005=1pA2q4e/57yzVC-- From david@fromorbit.com Wed Apr 16 20:27:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 61A437F3F for ; Wed, 16 Apr 2014 20:27:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3FBEAC001 for ; Wed, 16 Apr 2014 18:27:44 -0700 (PDT) X-ASG-Debug-ID: 1397698062-04bdf04552cd550001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id r1Bm1MFHDn4eVqaD for ; Wed, 16 Apr 2014 18:27: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: AmV+AMksT1N5LEcvPGdsb2JhbABRCIMGg1WFCqIok1uFYIEhFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTG4dZB8ogFxaNdlYHhDgBA5hllg0r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 10:57:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wab75-0001Re-Vx; Thu, 17 Apr 2014 11:27:40 +1000 Date: Thu, 17 Apr 2014 11:27:39 +1000 From: Dave Chinner To: NeilBrown Cc: Jeff Layton , linux-nfs@vger.kernel.org, Peter Zijlstra , netdev@vger.kernel.org, Ming Lei , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, Ingo Molnar Subject: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts Message-ID: <20140417012739.GU15995@dastard> X-ASG-Orig-Subj: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416104207.75b044e8@tlielax.poochiereds.net> <20140417102048.2fc8275c@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140417102048.2fc8275c@notabene.brown> 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: 1397698062 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4989 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 17, 2014 at 10:20:48AM +1000, NeilBrown wrote: > A good example is the deadlock with the flush-* threads. > flush-* will lock a page, and then call ->writepage. If ->writepage > allocates memory it can enter reclaim, call ->releasepage on NFS, and block > waiting for a COMMIT to complete. > The COMMIT might already be running, performing fsync on that same file that > flush-* is flushing. It locks each page in turn. When it gets to the page > that flush-* has locked, it will deadlock. It's nfs_release_page() again.... > In general, if nfsd is allowed to block on local filesystem, and local > filesystem is allowed to block on NFS, then a deadlock can happen. > We would need a clear hierarchy > > __GFP_NETFS > __GFP_FS > __GFP_IO > > for it to work. I'm not sure the extra level really helps a lot and it would > be a lot of churn. I think you are looking at this the wrong way - it's not the other filesystems that have to avoid memory reclaim recursion, it's the NFS client mount that is on loopback that needs to avoid recursion. IMO, the fix should be that the NFS client cannot block on messages sent to the NFSD on the same host during memory reclaim. That is, nfs_release_page() cannot send commit messages to the server if the server is on localhost. Instead, it just tells memory reclaim that it can't reclaim that page. If nfs_release_page() no longer blocks in memory reclaim, and all these nfsd-gets-blocked-in-GFP_KERNEL-memory-allocation recursion problems go away. Do the same for all the other memory reclaim operations in the NFS client, and you've got a solution that should work without needing to walk all over the rest of the kernel.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Apr 16 20:43:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 58B0C7F3F for ; Wed, 16 Apr 2014 20:43:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D474BAC001 for ; Wed, 16 Apr 2014 18:43:25 -0700 (PDT) X-ASG-Debug-ID: 1397699001-04cb6c2438c86f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id JrD4gGbxTOe3eiCB for ; Wed, 16 Apr 2014 18:43:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1377463C5FD4; Wed, 16 Apr 2014 20:43:21 -0500 (CDT) Message-ID: <534F31BD.7010402@sandeen.net> Date: Wed, 16 Apr 2014 20:43:25 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfstests: log running test to dmesg References: <534EF81D.20205@redhat.com> <20140416234027.GR15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: log running test to dmesg In-Reply-To: <20140416234027.GR15995@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1397699001 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4989 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/16/14, 6:40 PM, Dave Chinner wrote: > On Wed, Apr 16, 2014 at 04:37:33PM -0500, Eric Sandeen wrote: >> We already log the running test to system logs via "logger" >> but viro pointed out that we can use /dev/kmsg to insert it >> into dmesg as well. When looking at the serial console that >> could be pretty useful. >> >> Thanks to viro for the test -w suggestion too. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/check b/check >> index 268417c..09b2320 100755 >> --- a/check >> +++ b/check >> @@ -457,6 +457,7 @@ do >> $timestamp && echo -n " ["`date "+%T"`"]" >> [ ! -x $seq ] && chmod u+x $seq # ensure we can run it >> $LOGGER_PROG "run xfstest $seqnum" >> + test -w /dev/kmsg && echo "run xfstest $seqnum" > /dev/kmsg >> ./$seq >$tmp.rawout 2>&1 >> sts=$? >> $timestamp && _timestamp > > Might it be worthwhile adding a "_log" function that can take an > arbitrary string so in future it is easy to add new log messages? *shrug* I guess... nobody logs anything but here, today... -Eric > Cheers, > > Dave. > From neilb@suse.de Wed Apr 16 20:50:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 96F3C7F55 for ; Wed, 16 Apr 2014 20:50:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67EFC30408F for ; Wed, 16 Apr 2014 18:50:33 -0700 (PDT) X-ASG-Debug-ID: 1397699428-04cb6c2436c8e50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id FiBkBKUQddEmxqhH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 18:50:29 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A0181ACFB; Thu, 17 Apr 2014 01:50:28 +0000 (UTC) Date: Thu, 17 Apr 2014 11:50:18 +1000 From: NeilBrown To: Dave Chinner Cc: Jeff Layton , linux-nfs@vger.kernel.org, Peter Zijlstra , netdev@vger.kernel.org, Ming Lei , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, Ingo Molnar Subject: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts Message-ID: <20140417115018.460345d0@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts In-Reply-To: <20140417012739.GU15995@dastard> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416104207.75b044e8@tlielax.poochiereds.net> <20140417102048.2fc8275c@notabene.brown> <20140417012739.GU15995@dastard> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/aR.nJzAOWD3tAtDyjyGs6Ar"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397699429 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4989 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/aR.nJzAOWD3tAtDyjyGs6Ar Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Thu, 17 Apr 2014 11:27:39 +1000 Dave Chinner wrote: > On Thu, Apr 17, 2014 at 10:20:48AM +1000, NeilBrown wrote: > > A good example is the deadlock with the flush-* threads. > > flush-* will lock a page, and then call ->writepage. If ->writepage > > allocates memory it can enter reclaim, call ->releasepage on NFS, and b= lock > > waiting for a COMMIT to complete. > > The COMMIT might already be running, performing fsync on that same file= that > > flush-* is flushing. It locks each page in turn. When it gets to the= page > > that flush-* has locked, it will deadlock. >=20 > It's nfs_release_page() again.... >=20 > > In general, if nfsd is allowed to block on local filesystem, and local > > filesystem is allowed to block on NFS, then a deadlock can happen. > > We would need a clear hierarchy > >=20 > > __GFP_NETFS > __GFP_FS > __GFP_IO > >=20 > > for it to work. I'm not sure the extra level really helps a lot and it= would > > be a lot of churn. >=20 > I think you are looking at this the wrong way - it's not the other > filesystems that have to avoid memory reclaim recursion, it's the > NFS client mount that is on loopback that needs to avoid recursion. >=20 > IMO, the fix should be that the NFS client cannot block on messages sent = to the NFSD > on the same host during memory reclaim. That is, nfs_release_page() > cannot send commit messages to the server if the server is on > localhost. Instead, it just tells memory reclaim that it can't > reclaim that page. >=20 > If nfs_release_page() no longer blocks in memory reclaim, and all > these nfsd-gets-blocked-in-GFP_KERNEL-memory-allocation recursion > problems go away. Do the same for all the other memory reclaim > operations in the NFS client, and you've got a solution that should > work without needing to walk all over the rest of the kernel.... Maybe. It is nfs_release_page() today. I wonder if it could be other things another day. I want to be sure I have a solution that really makes sense. However ... the thing that nfs_release_page is doing it sending a COMMIT to tell the server to flush to stable storage. It does that so that if the server crashes, then the client can re-send. Of course when it is a loop-back mount the client is the server so the COMM= IT is completely pointless. If the client notices that it is sending a COMMIT to itself, it can simply assume a positive reply. You are right, that would make the patch set a lot less intrusive. I'll gi= ve it some serious thought - thanks. NeilBrown --Sig_/aR.nJzAOWD3tAtDyjyGs6Ar Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU08zWjnsnt1WYoG5AQKfQw//WIl8Mf1G0vzy816TBvi7fx3VCp6SUV7s jQeCJSD0IPRzCFmxH1ZJFzy3jIK8J3dbT8cSGjxXYegOq+kyyVjbHXOG2msC1riY ytOGUQnOS8MHscbcAOR7r61t/1t7FZiSJ51Th7pykepQmbm9QNEna+U0wzna3poK NNRDrs1J0eySpLTydegKoyg4w6KP6MLXqlYQm1FigvkreDEZ9mvBW7NrGycwDQF8 NZgq8+dGCL3MAq+uZ7WMqAoCZwZUrusVZBc3zvXYWepSMFSW1FOmQP971QZ9DgI2 KzarhdGOSFTbVHLhZafYV0X2k/hATVoIJpXh3Kl2ak0qdnuuUPJ/s64zxvQ3N4wo 3zBU0/TvcEVs6toQfcT/Zi91rCIvVvl8BOssIosbwknfLyi/JEYtnDJ+MxWBlg1G xlaEF1pDaQYEix5Ocg1qyU7oroFv98+pZ4BZeDI7Y/A6gasVvR3NKBOFcadozYuo FBTuYO6ZTSVPZ1+ASqykb5hh3GGKO5oM4x7xX0dQRSADk4qo4FLfv6ONKK2OfjQo r6FBlpw9OU6su26F4XzDkFLPb3xUDgfY7gMG6vIZYmCS7JGOvTg2rpk6inZxzATb 40mX+gFDXs5oE9XGaqz2Fl7Lw/BNluPNDEpkmWJX42+7cdClnc2XPSJyvpFx7nLH lfrN+yaHFBM= =c/XS -----END PGP SIGNATURE----- --Sig_/aR.nJzAOWD3tAtDyjyGs6Ar-- From neilb@suse.de Wed Apr 16 21:38:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CDD87F53 for ; Wed, 16 Apr 2014 21:38:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 40EA08F8039 for ; Wed, 16 Apr 2014 19:38:49 -0700 (PDT) X-ASG-Debug-ID: 1397702326-04bdf04552d1040001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id zXvD964HAS6v2ywe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 16 Apr 2014 19:38:47 -0700 (PDT) X-Barracuda-Envelope-From: neilb@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1632FACFB; Thu, 17 Apr 2014 02:38:45 +0000 (UTC) Date: Thu, 17 Apr 2014 12:38:37 +1000 From: NeilBrown To: David Miller Cc: eric.dumazet@gmail.com, linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, netdev@vger.kernel.org Subject: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock Message-ID: <20140417123837.5987e5e9@notabene.brown> X-ASG-Orig-Subj: Re: [PATCH 10/19] NET: set PF_FSTRANS while holding sk_lock In-Reply-To: <20140416.090002.2186526865564557549.davem@davemloft.net> References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.96000.stgit@notabene.brown> <1397625226.4222.113.camel@edumazet-glaptop2.roam.corp.google.com> <20140416.090002.2186526865564557549.davem@davemloft.net> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/SSVtvNA+Qn7U/.GV8.0daYz"; protocol="application/pgp-signature" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1397702327 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4990 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/SSVtvNA+Qn7U/.GV8.0daYz Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Wed, 16 Apr 2014 09:00:02 -0400 (EDT) David Miller wrote: > From: Eric Dumazet > Date: Tue, 15 Apr 2014 22:13:46 -0700 >=20 > > For applications handling millions of sockets, this makes a difference. >=20 > Indeed, this really is not acceptable. As you say... I've just discovered that I can get rid of the lockdep message (and hence presumably the deadlock risk) with a well placed: newsock->sk->sk_allocation =3D GFP_NOFS; which surprised me as it seemed to be an explicit GFP_KERNEL allocation that was mentioned in the lockdep trace. Obviously these traces require quite some sophistication to understand. So - thanks for the feedback, patch can be ignored. Thanks, NeilBrown --Sig_/SSVtvNA+Qn7U/.GV8.0daYz Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIVAwUBU08+rTnsnt1WYoG5AQLRZhAAw2OqHGStjcH4tCI4w3eDMVb87MK1AVtQ U3pUF/WbzPSl0yhxDaa3vIg6L2ogkASESK6Oiiu8PZbG3TunCNwq63XXTKvE6EIY nABc2yOb9u/cixXtIuMC9E8ydnZa/dEkIyFY9oMXBjuOwb3L/ugKFm0upzBUVokw VtyZs8rl9s9IwgvuErpFbDR3ZxEk0VaMdREFwGCpkUD6DjknMTpGdaUelPxe+DEd Ffy6B7fjrkdG/8B4vYZKlW2c5on1lLqc+hgY24LrLUpLxHwu4HCuIrAuhzILDex/ X5hZbQQhj2reLB8rsqJWOjmKn19/y8EbapUwa6BUMkSVHDCf0voCUjkHI8dOYcvM TnrmEzJS3Ym/x5rbenUCr2hEOEbZ80UEcMbdbrVm3rhPoMDtSifdtU2LEKro8oCk GPoOR3fYSLyxXNGQTlGiG3vSuSAIxF8tznBLnuCPIAPXK8LtXIn3oIOxNsN1J/LK TxZJsdA+I9YmV5uIn7cJarNYKdXvhR6x0YPoxUFzQZkngChosN3ZkGOHQeG2moyA JewuEtWT5Z1n1as19big3XukdBNnhJ/B11DpyI3TlfhIYN0mROFEAQkvXuOYYO+o CqkHfQp765IaTt0WOiVFu9bibhdxWwt1jwfasn1TE9LtvVlwlUlbPVL/8NrMXnOa Nkz7UZ1IxWU= =WfY/ -----END PGP SIGNATURE----- --Sig_/SSVtvNA+Qn7U/.GV8.0daYz-- From eguan@redhat.com Wed Apr 16 23:17:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 262077F56 for ; Wed, 16 Apr 2014 23:17:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AEC62AC001 for ; Wed, 16 Apr 2014 21:17:02 -0700 (PDT) X-ASG-Debug-ID: 1397708221-04bdf04555d6ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yyaJGqOM98eczHBA for ; Wed, 16 Apr 2014 21:17:01 -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 s3H4H0eH023843 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 17 Apr 2014 00:17:00 -0400 Received: from localhost (vpn1-114-88.nay.redhat.com [10.66.114.88]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3H4Gwbl020855; Thu, 17 Apr 2014 00:16:59 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 1/3] common: set _fs_has_crcs=0 as default in _filter_mkfs() Date: Thu, 17 Apr 2014 12:16:52 +0800 X-ASG-Orig-Subj: [PATCH 1/3] common: set _fs_has_crcs=0 as default in _filter_mkfs() Message-Id: <1397708214-8197-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: 1397708221 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfsprogs without crc support won't print crc=0/crc=1, so _filter_mkfs() leaves _fs_has_crcs variable unset, and xfs/033 fails because of that. xfs/033 4s ... - output mismatch (see /root/xfstests/results//xfs/033.out.bad) --- tests/xfs/033.out 2014-04-16 22:31:49.818350450 -0400 +++ /root/xfstests/results//xfs/033.out.bad 2014-04-16 22:35:08.264401190 -0400 @@ -5,6 +5,7 @@ naming =VERN bsize=XXX log =LDEV bsize=XXX blocks=XXX realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +./tests/xfs/033: line 87: [: -eq: unary operator expected Corrupting root inode - setting bits to 0 Wrote X.XXKb (value 0x0) Phase 1 - find and verify superblock... Print _fs_has_crcs=0 to stderr by default, so old xfsprogs could have this variable set too, and a latter _fs_has_crcs=1 could overwrite it if the fs does have crc support. Signed-off-by: Eryu Guan --- common/filter | 1 + 1 file changed, 1 insertion(+) diff --git a/common/filter b/common/filter index a7d2aa9..05dbae6 100644 --- a/common/filter +++ b/common/filter @@ -143,6 +143,7 @@ _filter_mkfs() return ;; esac + echo "_fs_has_crcs=0" >&2 set - perl -ne ' if (/^meta-data=([\w,|\/.-]+)\s+isize=(\d+)\s+agcount=(\d+), agsize=(\d+) blks/) { -- 1.9.0 From eguan@redhat.com Wed Apr 16 23:18:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 00B557F56 for ; Wed, 16 Apr 2014 23:18:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE0C98F8049 for ; Wed, 16 Apr 2014 21:18:32 -0700 (PDT) X-ASG-Debug-ID: 1397708311-04bdf04553d6bc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sLMUtVQrps4JG5TF for ; Wed, 16 Apr 2014 21:18:31 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3H4IVgt018342 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 17 Apr 2014 00:18:31 -0400 Received: from localhost (vpn1-114-88.nay.redhat.com [10.66.114.88]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3H4IUJj025187; Thu, 17 Apr 2014 00:18:31 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 2/3] generic/009: fix _require_xfs_io_command Date: Thu, 17 Apr 2014 12:16:53 +0800 X-ASG-Orig-Subj: [PATCH 2/3] generic/009: fix _require_xfs_io_command Message-Id: <1397708214-8197-2-git-send-email-eguan@redhat.com> In-Reply-To: <1397708214-8197-1-git-send-email-eguan@redhat.com> References: <1397708214-8197-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1397708311 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 _require_xfs_io_falloc "fzero" should be a typo, it requires falloc command. Use the correct _require_xfs_io_command "fzero". fiemap is also needed, add that too. Signed-off-by: Eryu Guan --- tests/generic/009 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/generic/009 b/tests/generic/009 index b7b0b3f..1e487b4 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -44,7 +44,8 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_os Linux -_require_xfs_io_falloc "fzero" +_require_xfs_io_fiemap +_require_xfs_io_command "fzero" testfile=$TEST_DIR/009.$$ -- 1.9.0 From eguan@redhat.com Wed Apr 16 23:18:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D26407F60 for ; Wed, 16 Apr 2014 23:18:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5828FAC001 for ; Wed, 16 Apr 2014 21:18:36 -0700 (PDT) X-ASG-Debug-ID: 1397708315-04cb6c2438d14b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DpN25XdM9g341qNx for ; Wed, 16 Apr 2014 21:18:35 -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 s3H4IYTJ015831 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Apr 2014 00:18:35 -0400 Received: from localhost (vpn1-114-88.nay.redhat.com [10.66.114.88]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3H4IWQu007242; Thu, 17 Apr 2014 00:18:33 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH 3/3] generic/009: get the correct dev name when testing ext4 Date: Thu, 17 Apr 2014 12:16:54 +0800 X-ASG-Orig-Subj: [PATCH 3/3] generic/009: get the correct dev name when testing ext4 Message-Id: <1397708214-8197-3-git-send-email-eguan@redhat.com> In-Reply-To: <1397708214-8197-1-git-send-email-eguan@redhat.com> References: <1397708214-8197-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: 1397708315 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 If TEST_DEV is a symlink(usually a lvm), we get the wrong DEV name. Follow link and get the correct dev name. Signed-off-by: Eryu Guan --- tests/generic/009 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generic/009 b/tests/generic/009 index 1e487b4..7675c69 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -51,7 +51,7 @@ testfile=$TEST_DIR/009.$$ # Disable extent zeroing for ext4 as that change where holes are created if [ "$FSTYP" = "ext4" ]; then - DEV=`basename $TEST_DEV` + DEV=`basename $(readlink -f $TEST_DEV)` echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb fi -- 1.9.0 From david@fromorbit.com Wed Apr 16 23:23:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6AEAD7F69 for ; Wed, 16 Apr 2014 23:23:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D287DAC001 for ; Wed, 16 Apr 2014 21:23:21 -0700 (PDT) X-ASG-Debug-ID: 1397708597-04cbb06e9dd2520001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id CABDPiEGazS8DcFp for ; Wed, 16 Apr 2014 21:23:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmV+ADpWT1N5LEcvPGdsb2JhbABRCIMGg1WFCqIqk1uFYIEhFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTG4dZB8o4FxaNdg1JB4Q4BJhllg0rgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 13:53:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wadqz-0001no-Ps; Thu, 17 Apr 2014 14:23:13 +1000 Date: Thu, 17 Apr 2014 14:23:13 +1000 From: Dave Chinner To: NeilBrown Cc: Jeff Layton , linux-nfs@vger.kernel.org, Peter Zijlstra , netdev@vger.kernel.org, Ming Lei , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, Ingo Molnar Subject: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts Message-ID: <20140417042313.GV15995@dastard> X-ASG-Orig-Subj: Re: [PATCH/RFC 00/19] Support loop-back NFS mounts References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416104207.75b044e8@tlielax.poochiereds.net> <20140417102048.2fc8275c@notabene.brown> <20140417012739.GU15995@dastard> <20140417115018.460345d0@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140417115018.460345d0@notabene.brown> 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: 1397708598 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 17, 2014 at 11:50:18AM +1000, NeilBrown wrote: > On Thu, 17 Apr 2014 11:27:39 +1000 Dave Chinner wrote: > > > On Thu, Apr 17, 2014 at 10:20:48AM +1000, NeilBrown wrote: > > > A good example is the deadlock with the flush-* threads. > > > flush-* will lock a page, and then call ->writepage. If ->writepage > > > allocates memory it can enter reclaim, call ->releasepage on NFS, and block > > > waiting for a COMMIT to complete. > > > The COMMIT might already be running, performing fsync on that same file that > > > flush-* is flushing. It locks each page in turn. When it gets to the page > > > that flush-* has locked, it will deadlock. > > > > It's nfs_release_page() again.... > > > > > In general, if nfsd is allowed to block on local filesystem, and local > > > filesystem is allowed to block on NFS, then a deadlock can happen. > > > We would need a clear hierarchy > > > > > > __GFP_NETFS > __GFP_FS > __GFP_IO > > > > > > for it to work. I'm not sure the extra level really helps a lot and it would > > > be a lot of churn. > > > > I think you are looking at this the wrong way - it's not the other > > filesystems that have to avoid memory reclaim recursion, it's the > > NFS client mount that is on loopback that needs to avoid recursion. > > > > IMO, the fix should be that the NFS client cannot block on messages sent to the NFSD > > on the same host during memory reclaim. That is, nfs_release_page() > > cannot send commit messages to the server if the server is on > > localhost. Instead, it just tells memory reclaim that it can't > > reclaim that page. > > > > If nfs_release_page() no longer blocks in memory reclaim, and all > > these nfsd-gets-blocked-in-GFP_KERNEL-memory-allocation recursion > > problems go away. Do the same for all the other memory reclaim > > operations in the NFS client, and you've got a solution that should > > work without needing to walk all over the rest of the kernel.... > > Maybe. > It is nfs_release_page() today. I wonder if it could be other things another > day. I want to be sure I have a solution that really makes sense. There could be other things, but in the absence of those things, I don't think that adding another layer to memory reclaim dependencies for this niche corner case makes a lot of sense. ;) > However ... the thing that nfs_release_page is doing it sending a COMMIT to > tell the server to flush to stable storage. It does that so that if the > server crashes, then the client can re-send. > Of course when it is a loop-back mount the client is the server so the COMMIT > is completely pointless. If the client notices that it is sending a COMMIT > to itself, it can simply assume a positive reply. Yes, that's very true. You might have to treat ->writepage specially, too, if that can block, say, on the number of outstanding requests that can be sent to the server. > You are right, that would make the patch set a lot less intrusive. I'll give > it some serious thought - thanks. No worries. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 16 23:41:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B7CA87F5D for ; Wed, 16 Apr 2014 23:41:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 327D6AC001 for ; Wed, 16 Apr 2014 21:41:57 -0700 (PDT) X-ASG-Debug-ID: 1397709714-04cbb06e9bd3500001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id prWQPpFldQYZROMq for ; Wed, 16 Apr 2014 21:41:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmV+AOhaT1N5LEcvPGdsb2JhbABNDIMGg1WFCqIqk1uFYIEhFwMBAQEBODWCJQEBAQMBHQoTHCMFCwgDGAklDwUlAwcaE4d0B8o2FxaNZmYHhDgEmGWKaYskKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 14:11:53 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wae92-0001pe-Tx; Thu, 17 Apr 2014 14:41:52 +1000 Date: Thu, 17 Apr 2014 14:41:52 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ming Lei , xfs@oss.sgi.com Subject: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. Message-ID: <20140417044152.GW15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 04/19] Make effect of PF_FSTRANS to disable __GFP_FS universal. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040336.10604.58240.stgit@notabene.brown> <20140416053756.GC15995@dastard> <20140416161726.51b506e2@notabene.brown> <20140417110350.0470feba@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140417110350.0470feba@notabene.brown> 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: 1397709714 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 17, 2014 at 11:03:50AM +1000, NeilBrown wrote: > On Wed, 16 Apr 2014 16:17:26 +1000 NeilBrown wrote: > > > On Wed, 16 Apr 2014 15:37:56 +1000 Dave Chinner wrote: > > > > > On Wed, Apr 16, 2014 at 02:03:36PM +1000, NeilBrown wrote: > > > > > - /* > > > > - * Given that we do not allow direct reclaim to call us, we should > > > > - * never be called while in a filesystem transaction. > > > > - */ > > > > - if (WARN_ON(current->flags & PF_FSTRANS)) > > > > - goto redirty; > > > > > > We still need to ensure this rule isn't broken. If it is, the > > > filesystem will silently deadlock in delayed allocation rather than > > > gracefully handle the problem with a warning.... > > > > Hmm... that might be tricky. The 'new' PF_FSTRANS can definitely be set when > > xfs_vm_writepage is called and we really want the write to happen. > > I don't suppose there is any other way to detect if a transaction is > > happening? > > I've been thinking about this some more.... > > That code is in xfs_vm_writepage which is only called as ->writepage. > xfs never calls that directly so it could only possibly be called during > reclaim? __filemap_fdatawrite_range or __writeback_single_inode do_writepages ->writepages xfs_vm_writepages write_cache_pages ->writepage xfs_vm_writepage So explicit data flushes or background writeback still end up in xfs_vm_writepage. > We know that doesn't happen, but if it does then PF_MEMALLOC would be set, > but PF_KSWAPD would not... and you already have a test for that. > > How about every time we set PF_FSTRANS, we store the corresponding > xfs_trans_t in current->journal_info, and clear that field when PF_FSTRANS is > cleared. Then xfs_vm_writepage can test for current->journal_info being > clear. > That is the field that several other filesystems use to keep track of the > 'current' transaction. The difference is that we have an explicit transaction handle in XFS which defines the transaction context. i.e. we don't hide transactions in thread contexts - the transaction defines the atomic context of the modification being made..... > I don't know what xfs_trans_t we would use in > xfs_bmapi_allocate_worker, but I suspect you do :-) The same one we use now. But that's exactly my point. i.e. the transaction handle belongs to the operation being executed, not the thread that is currently executing it. We also hand transaction contexts to IO completion, do interesting things with log space reservations for operations that require multiple commits to complete and so pass state when handles are duplicated prior to commit, etc. We still need direct manipulation and control of the transaction structure, regardless of where it is stored. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 17 00:58:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B49A97F5F for ; Thu, 17 Apr 2014 00:58:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87A0B8F804B for ; Wed, 16 Apr 2014 22:58:21 -0700 (PDT) X-ASG-Debug-ID: 1397714298-04bdf04555dc3b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uuJespy3hJUZnfai for ; Wed, 16 Apr 2014 22:58:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmN+AHtsT1N5LEcvPGdsb2JhbABPCoMGg1WFCqIrk1uFYIEfFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3QHyi4XFo1wXAeEOASYZYppiyQr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 17 Apr 2014 15:28:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WafKt-0001xz-6l; Thu, 17 Apr 2014 15:58:11 +1000 Date: Thu, 17 Apr 2014 15:58:11 +1000 From: Dave Chinner To: NeilBrown Cc: linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. Message-ID: <20140417055811.GX15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/19] VFS: use GFP_NOFS rather than GFP_KERNEL in __d_alloc. References: <20140416033623.10604.69237.stgit@notabene.brown> <20140416040337.10604.61837.stgit@notabene.brown> <20140416062520.GG15995@dastard> <20140416164941.37587da6@notabene.brown> <20140416090051.GK15995@dastard> <20140417105105.7772d09d@notabene.brown> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140417105105.7772d09d@notabene.brown> 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: 1397714298 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 17, 2014 at 10:51:05AM +1000, NeilBrown wrote: > On Wed, 16 Apr 2014 19:00:51 +1000 Dave Chinner wrote: > > > On Wed, Apr 16, 2014 at 04:49:41PM +1000, NeilBrown wrote: > > > On Wed, 16 Apr 2014 16:25:20 +1000 Dave Chinner wrote: > > > > > > > On Wed, Apr 16, 2014 at 02:03:37PM +1000, NeilBrown wrote: > > > > > __d_alloc can be called with i_mutex held, so it is safer to > > > > > use GFP_NOFS. > > > > > > > > > > lockdep reports this can deadlock when loop-back NFS is in use, > > > > > as nfsd may be required to write out for reclaim, and nfsd certainly > > > > > takes i_mutex. > > > > > > > > But not the same i_mutex as is currently held. To me, this seems > > > > like a false positive? If you are holding the i_mutex on an inode, > > > > then you have a reference to the inode and hence memory reclaim > > > > won't ever take the i_mutex on that inode. > > > > > > > > FWIW, this sort of false positive was a long stabding problem for > > > > XFS - we managed to get rid of most of the false positives like this > > > > by ensuring that only the ilock is taken within memory reclaim and > > > > memory reclaim can't be entered while we hold the ilock. > > > > > > > > You can't do that with the i_mutex, though.... > > > > > > > > Cheers, > > > > > > > > Dave. > > > > > > I'm not sure this is a false positive. > > > You can call __d_alloc when creating a file and so are holding i_mutex on the > > > directory. > > > nfsd might also want to access that directory. > > > > > > If there was only 1 nfsd thread, it would need to get i_mutex and do it's > > > thing before replying to that request and so before it could handle the > > > COMMIT which __d_alloc is waiting for. > > > > That seems wrong - the NFS client in __d_alloc holds a mutex on a > > NFS client directory inode. The NFS server can't access that > > specific mutex - it's on the other side of the "network". The NFS > > server accesses mutexs from local filesystems, so __d_alloc would > > have to be blocked on a local filesystem inode i_mutex for the nfsd > > to get hung up behind it... > > I'm not thinking of mutexes on the NFS inodes but the local filesystem inodes > exactly as you describe below. > > > > > However, my confusion comes from the fact that we do GFP_KERNEL > > memory allocation with the i_mutex held all over the place. > > Do we? Yes. A simple example: fs/xattr.c. Setting or removing an xattr is done under the i_mutex, yet have a look and the simple_xattr_* implementation that in memory/psuedo filesystems can use. They use GFP_KERNEL for all their allocations.... > Should we? No, I don't think so, because it means that under heavy filesystem memory pressure workloads, direct reclaim can effectively shut off and only kswapd can free memory. > Isn't the whole point of GFP_NOFS to use it when holding > any filesystem lock? Not the way I understand it - we've always used it in XFS to prevent known deadlocks due to recursion, not as a big hammer that we hit everything with. Every filesystem has different recursion deadlock triggers, so use GFP_NOFS differently. using t as a big hammer doesn't play well with memory reclaim on filesystem memory pressure generating workloads... > > If the > > problem is: > > > > local fs access -> i_mutex > > ..... > > nfsd -> i_mutex (blocked) > > ..... > > local fs access -> kmalloc(GFP_KERNEL) > > -> direct reclaim > > -> nfs_release_page > > -> > > > > > > then why is it just __d_alloc that needs this fix? Either this is a > > problem *everywhere* or it's not a problem at all. > > I think it is a problem everywhere that it is a problem :-) > If you are holding an FS lock, then you should be using GFP_NOFS. Only if reclaim recursion can cause a deadlock. > Currently a given filesystem can get away with sometimes using GFP_KERNEL > because that particular lock never causes contention during reclaim for that > particular filesystem. Right, be cause we directly control what recursion can happen. What you are doing is changing the global reclaim recursion context. You're introducing recursion loops between filesystems *of different types*. IOWs, at no point is it safe for anyone to allow any recursion because we don't have the state available to determine if recursion is safe or not. > Adding loop-back NFS into the mix broadens the number of locks which can > cause a problem as it creates interdependencies between different filesystems. And that's a major architectural change to the memory reclaim heirarchy and that means we're going to be breaking assumptions all over the place, including in places we didn't know we had dependencies... > > If it's a problem everywhere it means that we simply can't allow > > reclaim from localhost NFS mounts to run from contexts that could > > block an NFSD. i.e. you cannot run NFS client memory reclaim from > > filesystems that are NFS server exported filesystems..... > > Well.. you cannot allow NFS client memory reclaim *while holding locks in* > filesystems that are NFS exported. > > I think this is most effectively generalised to: > you cannot allow FS memory reclaim while holding locks in filesystems which > can be NFS exported Yes, that's exactly what I said yesterday. > which I think is largely the case already It most definitely isn't. > - and lockdep can help us find > those places where we currently do allow FS reclaim while holding an FS lock. A pox on lockdep. Lockdep is not a crutch that we can to wave away problems a architectural change doesn't identify. We need to think about the architectural impact of the change - if we can't see all the assumptions we're breaking and the downstream impacts, then we nee dto think about the problem harder. We should not not wave away concerns by saying "lockdep will find the things we missed"... For example, if you make all filesystem allocations GFP_NOFS, then the only thing that will be able to do reclaim of inodes and dentries is kswapd, because the shrinkers don't run in GFP_NOFS context. Hence filesystem memory pressure (e.g. find) won't be able to directly reclaim the objects that it is generating, and that will significantly change the behaviour and performance of the system. IOWs, there are lots of nasty, subtle downstream affects of making a blanket "filesystems must use GFP_NOFS is they hold any lock" rule that I can see, so I really think thatwe shoul dbe looking to solve this problem in the NFS client and exhausting all possibilities there before we even consider changing something as fundamental as memory reclaim recursion heirarchies.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Thu Apr 17 05:36:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6DADC7F53 for ; Thu, 17 Apr 2014 05:36:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD63AAC004 for ; Thu, 17 Apr 2014 03:35:59 -0700 (PDT) X-ASG-Debug-ID: 1397730958-04cbb06e9ceaf80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rtsrkLwjLjjg7735 for ; Thu, 17 Apr 2014 03:35:58 -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-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 s3HAZw9Z014053 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 17 Apr 2014 06:35:58 -0400 Received: from localhost.localdomain.com (dhcp-1-205.brq.redhat.com [10.34.1.205]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3HAZu22015826; Thu, 17 Apr 2014 06:35:57 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH] xfstests: Remove unused functions Date: Thu, 17 Apr 2014 12:35:53 +0200 X-ASG-Orig-Subj: [PATCH] xfstests: Remove unused functions Message-Id: <1397730953-11008-1-git-send-email-lczerner@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: 1397730958 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Functions like _mount_opts(), _mkfs_opts() and _fsck_opts() are defined both in common/rc and common/config while used only in common/config. Remove those functions from common/rc and update _mount_opts() to match the superior version of the function. Signed-off-by: Lukas Czerner --- common/config | 4 +++ common/rc | 87 ----------------------------------------------------------- 2 files changed, 4 insertions(+), 87 deletions(-) diff --git a/common/config b/common/config index 49f34cf..0ff9d14 100644 --- a/common/config +++ b/common/config @@ -249,6 +249,10 @@ _mount_opts() # acls aren't turned on by default on gfs2 export MOUNT_OPTIONS="-o acl $GFS2_MOUNT_OPTIONS" ;; + ttmpfs) + # We need to specify the size at mount, use 512 MB by default + export MOUNT_OPTIONS="-o size=512M $TMPFS_MOUNT_OPTIONS" + ;; *) ;; esac diff --git a/common/rc b/common/rc index acf419b..c78b904 100644 --- a/common/rc +++ b/common/rc @@ -81,93 +81,6 @@ _ls_l() ls -l $* | sed "s/\(^[-rwxdlbcpsStT]*\)\. /\1 /" | grep -v 'lost+found' } -_mount_opts() -{ - # SELinux adds extra xattrs which can mess up our expected output. - # So, mount with a context, and they won't be created - # nfs_t is a "liberal" context so we can use it. - if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then - SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" - export SELINUX_MOUNT_OPTIONS - fi - - case $FSTYP in - xfs) - export MOUNT_OPTIONS=$XFS_MOUNT_OPTIONS - ;; - udf) - export MOUNT_OPTIONS=$UDF_MOUNT_OPTIONS - ;; - nfs) - export MOUNT_OPTIONS=$NFS_MOUNT_OPTIONS - ;; - ext2|ext3|ext4|ext4dev) - # acls & xattrs aren't turned on by default on ext$FOO - export MOUNT_OPTIONS="-o acl,user_xattr $EXT_MOUNT_OPTIONS" - ;; - reiserfs) - # acls & xattrs aren't turned on by default on reiserfs - export MOUNT_OPTIONS="-o acl,user_xattr $REISERFS_MOUNT_OPTIONS" - ;; - gfs2) - # acls aren't turned on by default on gfs2 - export MOUNT_OPTIONS="-o acl $GFS2_MOUNT_OPTIONS" - ;; - tmpfs) - # We need to specify the size at mount, use 512 MB by default - export MOUNT_OPTIONS="-o size=512M $TMPFS_MOUNT_OPTIONS" - ;; - *) - ;; - esac -} - -_mkfs_opts() -{ - case $FSTYP in - xfs) - export MKFS_OPTIONS=$XFS_MKFS_OPTIONS - ;; - udf) - [ ! -z "$udf_fsize" ] && \ - UDF_MKFS_OPTIONS="$UDF_MKFS_OPTIONS -s $udf_fsize" - export MKFS_OPTIONS=$UDF_MKFS_OPTIONS - ;; - nfs) - export MKFS_OPTIONS=$NFS_MKFS_OPTIONS - ;; - reiserfs) - export MKFS_OPTIONS="$REISERFS_MKFS_OPTIONS -q" - ;; - gfs2) - export MKFS_OPTIONS="$GFS2_MKFS_OPTIONS -O -p lock_nolock" - ;; - jfs) - export MKFS_OPTIONS="$JFS_MKFS_OPTIONS -q" - ;; - tmpfs) - export MKFS_OPTIONS="$TMPFS_MKFS_OPTIONS" - ;; - *) - ;; - esac -} - -_fsck_opts() -{ - case $FSTYP in - ext2|ext3|ext4|ext4dev) - export FSCK_OPTIONS="-nf" - ;; - reiserfs) - export FSCK_OPTIONS="--yes" - ;; - *) - export FSCK_OPTIONS="-n" - ;; - esac -} - # we need common/config if [ "$iam" != "check" ] then -- 1.8.3.1 From bfoster@redhat.com Thu Apr 17 08:07:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3DF547F52 for ; Thu, 17 Apr 2014 08:07:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1ADFE30408C for ; Thu, 17 Apr 2014 06:07:46 -0700 (PDT) X-ASG-Debug-ID: 1397740064-04cb6c2436f7120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fzPsxb01PcfCk4tP for ; Thu, 17 Apr 2014 06:07:45 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3HD7h1n027173 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Apr 2014 09:07:44 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3HD7gjZ018801 for ; Thu, 17 Apr 2014 09:07:42 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B021912573F; Thu, 17 Apr 2014 09:07:41 -0400 (EDT) Date: Thu, 17 Apr 2014 09:07:41 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: [FAQ v2] XFS speculative preallocation Message-ID: <20140417130741.GB36589@bfoster.bfoster> X-ASG-Orig-Subj: Re: [FAQ v2] XFS speculative preallocation References: <20140407153906.GC48184@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140407153906.GC48184@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1397740064 X-Barracuda-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 07, 2014 at 11:39:06AM -0400, Brian Foster wrote: > Hi all, > > This is v2 of the speculative preallocation FAQ bits. The initial > proposal was here: > > http://oss.sgi.com/archives/xfs/2014-03/msg00316.html > > This version includes some updates based on review from arekm and > dchinner. Most notably, the content has been broken down into a few more > questions. Unless there are further major changes required, I'll plan to > post something along these lines to the wiki when my account is > approved. Thanks for the feedback! > > Brian > > --- I've updated the wiki with this content plus the feedback in this thread. The new FAQs are here: http://xfs.org/index.php/XFS_FAQ#Q:_Why_do_files_on_XFS_use_more_data_blocks_than_expected.3F http://xfs.org/index.php/XFS_FAQ#Q:_What_is_speculative_preallocation.3F http://xfs.org/index.php/XFS_FAQ#Q:_How_can_I_speed_up_or_avoid_delayed_removal_of_speculative_preallocation.3F http://xfs.org/index.php/XFS_FAQ#Q:_Is_speculative_preallocation_permanent.3F http://xfs.org/index.php/XFS_FAQ#Q:_My_workload_has_known_characteristics_-_can_I_disable_speculative_preallocation_or_tune_it_to_an_optimal_fixed_size.3F Thanks for all of the reviews and feedback. If there are any further suggestions... well, it's wiki! Feel free to modify it. ;) Brian > > Q: Why do files on XFS use more data blocks than expected? > > A: > > The XFS speculative preallocation algorithm allocates extra blocks > beyond end of file (EOF) to minimise file fragmentation during buffered > write workloads. Workloads that benefit from this behaviour include > slowly growing files, concurrent writers and mixed reader/writer > workloads. It also provides fragmentation resistence in situations where > memory pressure prevents adequate buffering of dirty data to allow > formation of large contiguous regions of data in memory. > > This post-EOF block allocation is accounted identically to blocks within > EOF. It is visible in 'st_blocks' counts via stat() system calls, > accounted as globally allocated space and against quotas that apply to > the associated file. The space is reported by various userspace > utilities (stat, du, df, ls) and thus provides a common source of > confusion for administrators. Post-EOF blocks are temporary in most > situations and are usually reclaimed via several possible mechanisms in > XFS. > > See the FAQ entry on speculative preallocation for details. > > Q: What is speculative preallocation? > > A: > > XFS speculatively preallocates post-EOF blocks on file extending writes > in anticipation of future extending writes. The size of a preallocation > is dynamic and depends on the runtime state of the file and fs. > Generally speaking, preallocation is disabled for very small files and > preallocation sizes grow as files grow larger. > > Preallocations are capped to the maximum extent size supported by the > filesystem. Preallocation size is throttled automatically as the > filesystem approaches low free space conditions or other allocation > limits on a file (such as a quota). > > In most cases, speculative preallocation is automatically reclaimed when > a file is closed. Preallocation may also persist beyond the lifecycle of > the file descriptor. Certain application behaviors that are known to > cause fragmentation, such as file server workloads, slowly growing > files, etc., benefit from this and delay the removal of preallocated > blocks beyond fd close. > > Q: How can I speed up or avoid delayed removal of speculative > preallocation? > > A: > > Remove the inode from the VFS cache or unmount the filesystem to remove > speculative preallocations associated with an inode. > > Linux 3.8 (and later) includes a scanner to perform background trimming > of files with lingering post-EOF preallocations. The scanner bypasses > dirty files to avoid interference with ongoing writes. A 5 minute scan > interval is used by default and can be adjusted via the following file > (value in seconds): > > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > Q: Is speculative preallocation permanent? > > A: > > Although speculative preallocation can lead to reports of excess space > usage, the preallocated space is not permanent unless explicitly made so > via fallocate or a similar interface. Preallocated space can also be > encoded permanently in situations where file size is extended beyond a > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > blocks are reclaimed on file close, inode reclaim, unmount or in the > background once file write activity subsides. > > Q: My workload has known characteristics - can I tune speculative > preallocation to an optimal fixed size? > > A: > > The 'allocsize=' mount option configures the XFS block allocation > algorithm to use a fixed allocation size. Speculative preallocation is > not dynamically resized when the allocsize mount option is set and thus > the potential for fragmentation is increased. XFS historically set > allocsize to 64k by default. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From webmaster@getit20.livemailz.com Thu Apr 17 08:29:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,RCVD_NUMERIC_HELO,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1D5857F51 for ; Thu, 17 Apr 2014 08:29:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFB958F8033 for ; Thu, 17 Apr 2014 06:29:24 -0700 (PDT) X-ASG-Debug-ID: 1397741346-04cbb06e9cf99b0001-NocioJ Received: from server.livemailz.com (server.livemailz.com [115.124.106.32]) by cuda.sgi.com with ESMTP id Tu1G0DRDvxwfti79 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 06:29:08 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@getit20.livemailz.com X-Barracuda-Apparent-Source-IP: 115.124.106.32 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=getit20.livemailz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=CdDDY07KnCMI+KNW6c29iWtai622BCA8EzgmoKgpYpo=; b=SRCa97oygVdPrAC0XxcAi7O6+5VH5nKQx5Ns4EjbCh1dU0V5FHguVmDNc8z6SAuIm/wR4b0a7eaB7hqQS1b+hek3LUmejokRwxo2NF7+QOrMeNodcR724mgzKLxZ2yDBwff01wren+fkmcdUnun3xTslUUozGyfIeSfPDWrg2L0=; Received: from getit20l by server.livemailz.com with local (Exim 4.82) (envelope-from ) id 1WamND-0006OV-33 for xfs@oss.sgi.com; Thu, 17 Apr 2014 18:59:03 +0530 To: xfs@oss.sgi.com Subject: Love? Me? Marriage? X-PHP-Script: getit20.livemailz.com/mailz/admin/index.php for 116.202.66.186 X-ASG-Orig-Subj: Love? Me? Marriage? Received: from 116.202.66.186 [116.202.66.186] by getit20.livemailz.com with HTTP; Thu, 17 Apr 2014 12:24:52 +0000 Date: Thu, 17 Apr 2014 13:29:03 +0000 From: Perfect Match Reply-To: Perfect Match Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 9 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@getit20.livemailz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_b830e61c4a3fa4fb2ba621ba9e4fceff" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.livemailz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [529 32007] / [47 12] X-AntiAbuse: Sender Address Domain - getit20.livemailz.com X-Get-Message-Sender-Via: server.livemailz.com: authenticated_id: getit20l/from_h X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/getit20l/public_html/mailz/admin/index.php X-Source-Dir: getit20.livemailz.com:/public_html/mailz/admin X-Barracuda-Connect: server.livemailz.com[115.124.106.32] X-Barracuda-Start-Time: 1397741348 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: 1.43 X-Barracuda-Spam-Status: No, SCORE=1.43 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, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5004 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.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.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO --b1_b830e61c4a3fa4fb2ba621ba9e4fceff Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Since 1996 Shaadi.com has helped over 3.2 million members find their soul mates. Join Shaadi.com and meet hundreds of like-minded singles and give your love story a=20 real chance! Benefits of Shaadi.com Membership: - Connect with over 30 million members - Stay connected through phone, email or chat - Get daily Photo Matches via email -- This message was sent to xfs@oss.sgi.com by mira@getit20.livemailz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 --b1_b830e61c4a3fa4fb2ba621ba9e4fceff Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A=0A
3D"Shaadi
=0A=0A=0A= =0A=0A=0A=0A=0A<= td valign=3D"top" align=3D"left" width=3D"292" style=3D"padding: 0;">3D"Let=0A<= td valign=3D"top" align=3D"left" width=3D"292" style=3D"padding: 0;">3D"Let=0A<= /tr>=0A=0A=0A= =0A=0A=0A
3D"Let3D"Let
=0A=0A=0A=0A
Since 1996 Shaadi.com has helped = over 3.2 million members find their soul mates.

Join Shaadi.com and= meet hundreds of like-minded singles and give your love story a
real = chance!

=0A=0A=0A3D"Register=0A=0A=0A
Benefits of Shaadi.com Membership:

- Connect with over = 30 million members
- Stay connected through phone, email or chat
- = Get daily Photo Matches via email


3D"Best

=0A=0A=0A=0A
-- =20

This message was sent to xfs@oss.sgi.com by mira@getit20.livemailz= .com

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

=0A=0A=0A--=0APowered by mailsMagic, www.mailsmagic.com --=0A=0A=0A --b1_b830e61c4a3fa4fb2ba621ba9e4fceff-- From david@fromorbit.com Thu Apr 17 19:16:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 660E47F52 for ; Thu, 17 Apr 2014 19:16:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 498018F8035 for ; Thu, 17 Apr 2014 17:15:58 -0700 (PDT) X-ASG-Debug-ID: 1397780155-04cbb06e9a130aa0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id KOsdRiMLt1sGxdEM for ; Thu, 17 Apr 2014 17:15: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: AmNyAM1tUFN5LEcvPGdsb2JhbABZgwY7gxmFCqI8BgSTdoVggSIXAwEBAQE4NYJmHCMYJDQFJQMHLYd7zDsWjgJKHYQiBIU4kzWWESuBLg Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 18 Apr 2014 09:45:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WawTA-0004YS-Jn; Fri, 18 Apr 2014 10:15:52 +1000 Date: Fri, 18 Apr 2014 10:15:52 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] xfs: fixes for 3.15-rc2 Message-ID: <20140418001552.GZ15995@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: fixes for 3.15-rc2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1397780155 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the updates listed below? The fixes are for data corruption issues, memory corruption and regressions for changes merged in -rc1. More detail is in the tag below. FYI, there have been some recent problems with oss.sgi.com resetting connections on git pulls. Hopefully that has been resolved, but if you have problems pulling the changes please let me know. -Dave. The following changes since commit c9eaa447e77efe77b7fa4c953bd62de8297fd6c5: Linux 3.15-rc1 (2014-04-13 14:18:35 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs.git tags/xfs-for-linus-3.15-rc2 for you to fetch changes up to 330033d697ed8d296fa52b5303db9d802ad901cc: xfs: fix tmpfile/selinux deadlock and initialize security (2014-04-17 08:15:30 +1000) ---------------------------------------------------------------- xfs: bug fixes for 3.15-rc2 Data corruption fixes: - fix a bunch of delayed allocation state mismatches - fix collapse/zero range bugs - fix a direct IO block mapping bug @ EOF Other fixes: - fix a use after free on metadata IO error - fix a use after free on IO error during unmount - fix an incorrect error sign on direct IO write errors - add missing O_TMPFILE inode security context initialisation ---------------------------------------------------------------- Brian Foster (1): xfs: fix tmpfile/selinux deadlock and initialize security Dave Chinner (8): xfs: kill buffers over failed write ranges properly xfs: write failure beyond EOF truncates too much data xfs: xfs_vm_write_end truncates too much on failure xfs: zeroing space needs to punch delalloc blocks xfs: don't map ranges that span EOF for direct IO xfs: collapse range is delalloc challenged xfs: unmount does not wait for shutdown during unmount xfs: wrong error sign conversion during failed DIO writes Eric Sandeen (1): xfs: fix buffer use after free on IO error fs/xfs/xfs_aops.c | 51 ++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_bmap.c | 17 ++++++++++------ fs/xfs/xfs_bmap_util.c | 13 +++++++++++- fs/xfs/xfs_buf.c | 16 +++++++++++---- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_inode.c | 5 +++-- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 20 +++++++++++++++--- fs/xfs/xfs_log.c | 53 ++++++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_trace.h | 1 + 10 files changed, 147 insertions(+), 33 deletions(-) -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Thu Apr 17 19:58:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 126827F53 for ; Thu, 17 Apr 2014 19:58:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 93354AC003 for ; Thu, 17 Apr 2014 17:58:09 -0700 (PDT) X-ASG-Debug-ID: 1397782687-04cbb06e9c132cc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NE3GSkkBdTmTptEA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:07 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0w64e015529 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:07 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3I0w5UE024336 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:06 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0w5Er015327 for ; Fri, 18 Apr 2014 00:58:05 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:05 -0700 Message-ID: <53507899.9030804@oracle.com> Date: Fri, 18 Apr 2014 08:58:01 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 00/10] xfs_ioc_bulkstat code refactoring and consolidation Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 00/10] xfs_ioc_bulkstat code refactoring and consolidation 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: 1397782687 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folk, This is the v2 patch set for xfs_ioc_bulkstat consolidation and code refactoring. v2->v1: - As per Brain's comment, don't call xfs_inobt_lookup() once again after the btree cursor initialization, and only increment through the records via xfs_btree_increment() at xfs_inumbers(), i.e, [patch 03/10]. - Don't call XFS_WANT_CORRUPTED_GOTO() against empty allocation group at xfs_perag_bulkstat() [ found by Mark ]. v1: http://oss.sgi.com/archives/xfs/2013-12/msg00901.html As usual, any comments are welcome! Thanks, -Jeff From jeff.liu@oracle.com Thu Apr 17 19:58:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A6D557F53 for ; Thu, 17 Apr 2014 19:58:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8B3578F8040 for ; Thu, 17 Apr 2014 17:58:25 -0700 (PDT) X-ASG-Debug-ID: 1397782704-04cbb06e9b132d10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5pEwy2dKl0RYCkvv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:24 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wMKO010888 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:23 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wLD8015652 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:22 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s3I0wLYQ024743 for ; Fri, 18 Apr 2014 00:58:21 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:21 -0700 Message-ID: <535078A9.409@oracle.com> Date: Fri, 18 Apr 2014 08:58:17 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 01/10] xfs: remove redundant stat assignment in xfs_bulkstat_one_int Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 01/10] xfs: remove redundant stat assignment in xfs_bulkstat_one_int 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: 1397782704 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Remove the redundant BULKSTAT_RV_NOTHING assignment in case of call xfs_iget() failed at xfs_bulkstat_one_int(). Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f463382..b5bb7b6 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -76,10 +76,8 @@ xfs_bulkstat_one_int( error = xfs_iget(mp, NULL, ino, (XFS_IGET_DONTCACHE | XFS_IGET_UNTRUSTED), XFS_ILOCK_SHARED, &ip); - if (error) { - *stat = BULKSTAT_RV_NOTHING; + if (error) goto out_free; - } ASSERT(ip != NULL); ASSERT(ip->i_imap.im_blkno != 0); @@ -136,7 +134,6 @@ xfs_bulkstat_one_int( IRELE(ip); error = formatter(buffer, ubsize, ubused, buf); - if (!error) *stat = BULKSTAT_RV_DIDONE; -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 935D97F5F for ; Thu, 17 Apr 2014 19:58:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1DD30AC005 for ; Thu, 17 Apr 2014 17:58:29 -0700 (PDT) X-ASG-Debug-ID: 1397782706-04bdf04552137f00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Nuq5IlunfTDSCF4o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:27 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wPme015792 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:26 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 s3I0wPrJ015738 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Fri, 18 Apr 2014 00:58:25 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wOMx024635 for ; Fri, 18 Apr 2014 00:58:24 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:24 -0700 Message-ID: <535078AD.5050209@oracle.com> Date: Fri, 18 Apr 2014 08:58:21 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single 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: 1397782707 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu In xfs_bulkstat_single(), call xfs_bulkstat_one() and xfs_bulkstat() would return different error if either failed, we'd better return the proper error in this case. Moreover, the function argument done is useless in terms of xfs_ioc_bulkstat(), hence we can get rid of it. Signed-off-by: Jie Liu --- fs/xfs/xfs_ioctl.c | 3 +-- fs/xfs/xfs_itable.c | 60 ++++++++++++++++++++++++++--------------------------- fs/xfs/xfs_itable.h | 5 ++--- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0b18776..f9c4512 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -798,8 +798,7 @@ xfs_ioc_bulkstat( error = xfs_inumbers(mp, &inlast, &count, bulkreq.ubuffer, xfs_inumbers_fmt); else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) - error = xfs_bulkstat_single(mp, &inlast, - bulkreq.ubuffer, &done); + error = xfs_bulkstat_single(mp, &inlast, bulkreq.ubuffer); else /* XFS_IOC_FSBULKSTAT */ error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, sizeof(xfs_bstat_t), bulkreq.ubuffer, diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b5bb7b6..f34e95a 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -509,51 +509,51 @@ xfs_bulkstat( } /* - * Return stat information in bulk (by-inode) for the filesystem. - * Special case for non-sequential one inode bulkstat. + * Return stat information in bulk (by-inode) for the filesystem. Special case + * for non-sequential one inode bulkstat. */ -int /* error status */ +int xfs_bulkstat_single( - xfs_mount_t *mp, /* mount point for filesystem */ + struct xfs_mount *mp, /* mount point for filesystem */ xfs_ino_t *lastinop, /* inode to return */ - char __user *buffer, /* buffer with inode stats */ - int *done) /* 1 if there are more stats to get */ + char __user *buffer) /* buffer with inode stats */ { - int count; /* count value for bulkstat call */ - int error; /* return value */ - xfs_ino_t ino; /* filesystem inode number */ + xfs_ino_t ino = *lastinop; int res; /* result from bs1 */ + int error; /* - * note that requesting valid inode numbers which are not allocated + * Note that requesting valid inode numbers which are not allocated * to inodes will most likely cause xfs_imap_to_bp to generate warning - * messages about bad magic numbers. This is ok. The fact that - * the inode isn't actually an inode is handled by the - * error check below. Done this way to make the usual case faster - * at the expense of the error case. + * messages about bad magic numbers. This is ok. The fact that the + * inode isn't actually an inode is handled by the error check below. + * Done this way to make the usual case faster at the expense of the + * error case. */ - - ino = *lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), + error = xfs_bulkstat_one(mp, ino, buffer, sizeof(struct xfs_bstat), NULL, &res); if (error) { + int count = 1; + int done, error2; + /* - * Special case way failed, do it the "long" way - * to see if that works. + * Special case way failed, do it the "long" way to see if + * that works. */ (*lastinop)--; - count = 1; - if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, - sizeof(xfs_bstat_t), buffer, done)) - return error; - if (count == 0 || (xfs_ino_t)*lastinop != ino) - return error == EFSCORRUPTED ? - XFS_ERROR(EINVAL) : error; - else - return 0; + error2 = xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, + sizeof(struct xfs_bstat), buffer, &done); + if (error2) + return error2; + + if (count == 0 || *lastinop != ino) { + if (error == EFSCORRUPTED) + error = XFS_ERROR(EINVAL); + } else + error = 0; } - *done = 0; - return 0; + + return error; } int diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 97295d9..21dbbd7 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -52,10 +52,9 @@ xfs_bulkstat( int xfs_bulkstat_single( - xfs_mount_t *mp, + struct xfs_mount *mp, xfs_ino_t *lastinop, - char __user *buffer, - int *done); + char __user *buffer); typedef int (*bulkstat_one_fmt_pf)( /* used size in bytes or negative error */ void __user *ubuffer, /* buffer to write to */ -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6583A7F66 for ; Thu, 17 Apr 2014 19:58:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C0998F8049 for ; Thu, 17 Apr 2014 17:58:32 -0700 (PDT) X-ASG-Debug-ID: 1397782710-04cb6c243712f550001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2u2DgDo1kkXc4eSH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:31 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wUjK015829 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:30 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wTSW020459 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:30 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s3I0wT7j024913 for ; Fri, 18 Apr 2014 00:58:29 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:28 -0700 Message-ID: <535078B2.8010601@oracle.com> Date: Fri, 18 Apr 2014 08:58:26 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 03/10] xfs: consolidate xfs_inumbers Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 03/10] xfs: consolidate xfs_inumbers 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: 1397782711 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu To fetch the file system number tables, we currently just ignore the errors and proceed to loop over the next AG or bump agino to the next chunk in case of btree operations failed, that is not properly because those errors might hint us potential file system problems. This patch rework xfs_inumbers() to handle the btree operation errors as well as the loop conditions. Also, add pre-checkups for the given inode, we can save alloc/free the format buffer once against an invalid inode number. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 159 ++++++++++++++++++++++------------------------------ 1 file changed, 67 insertions(+), 92 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f34e95a..2025bd0 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -559,12 +559,12 @@ xfs_bulkstat_single( int xfs_inumbers_fmt( void __user *ubuffer, /* buffer to write to */ - const xfs_inogrp_t *buffer, /* buffer to read from */ + const struct xfs_inogrp *buffer, /* buffer to read from */ long count, /* # of elements to read */ long *written) /* # of bytes written */ { if (copy_to_user(ubuffer, buffer, count * sizeof(*buffer))) - return -EFAULT; + return XFS_ERROR(EFAULT); *written = count * sizeof(*buffer); return 0; } @@ -574,126 +574,101 @@ xfs_inumbers_fmt( */ int /* error status */ xfs_inumbers( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t *lastino, /* last inode returned */ - int *count, /* size of buffer/count returned */ - void __user *ubuffer,/* buffer with inode descriptions */ - inumbers_fmt_pf formatter) + struct xfs_mount *mp,/* mount point for filesystem */ + xfs_ino_t *lastino,/* last inode returned */ + int *count,/* size of buffer/count returned */ + void __user *ubuffer,/* buffer with inode desc */ + inumbers_fmt_pf formatter) { - xfs_buf_t *agbp; - xfs_agino_t agino; - xfs_agnumber_t agno; - int bcount; - xfs_inogrp_t *buffer; - int bufidx; - xfs_btree_cur_t *cur; - int error; - xfs_inobt_rec_incore_t r; - int i; - xfs_ino_t ino; - int left; - int tmp; - - ino = (xfs_ino_t)*lastino; - agno = XFS_INO_TO_AGNO(mp, ino); - agino = XFS_INO_TO_AGINO(mp, ino); - left = *count; + xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, *lastino); + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, *lastino); + struct xfs_btree_cur *cur = NULL; + struct xfs_buf *agbp = NULL; + struct xfs_inogrp *buffer; + int left = *count; + int bcount; + int bufidx; + int error; + *count = 0; + if (agno >= mp->m_sb.sb_agcount || + *lastino != XFS_AGINO_TO_INO(mp, agno, agino)) + return 0; + bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); - error = bufidx = 0; - cur = NULL; - agbp = NULL; - while (left > 0 && agno < mp->m_sb.sb_agcount) { - if (agbp == NULL) { + bufidx = error = 0; + do { + struct xfs_inobt_rec_incore r; + int stat; + + if (!agbp) { error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); - if (error) { - /* - * If we can't read the AGI of this ag, - * then just skip to the next one. - */ - ASSERT(cur == NULL); - agbp = NULL; - agno++; - agino = 0; - continue; - } + if (error) + break; cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, - &tmp); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - cur = NULL; - xfs_buf_relse(agbp); - agbp = NULL; - /* - * Move up the last inode in the current - * chunk. The lookup_ge will always get - * us the first inode in the next chunk. - */ - agino += XFS_INODES_PER_CHUNK - 1; - continue; - } - } - error = xfs_inobt_get_rec(cur, &r, &i); - if (error || i == 0) { - xfs_buf_relse(agbp); - agbp = NULL; - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); - cur = NULL; - agno++; - agino = 0; - continue; + &stat); + if (error) + break; + if (!stat) + goto next_ag; } + + error = xfs_inobt_get_rec(cur, &r, &stat); + if (error || !stat) + break; + agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, r.ir_startino); buffer[bufidx].xi_alloccount = XFS_INODES_PER_CHUNK - r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; - bufidx++; - left--; - if (bufidx == bcount) { - long written; - if (formatter(ubuffer, buffer, bufidx, &written)) { - error = XFS_ERROR(EFAULT); + if (++bufidx == bcount) { + long written; + + error = formatter(ubuffer, buffer, bufidx, &written); + if (error) break; - } ubuffer += written; *count += bufidx; bufidx = 0; } - if (left) { - error = xfs_btree_increment(cur, 0, &tmp); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - cur = NULL; - xfs_buf_relse(agbp); - agbp = NULL; - /* - * The agino value has already been bumped. - * Just try to skip up to it. - */ - agino += XFS_INODES_PER_CHUNK; - continue; - } - } - } + if (!--left) + break; + + error = xfs_btree_increment(cur, 0, &stat); + if (error) + break; + if (stat) + continue; + +next_ag: + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = NULL; + xfs_buf_relse(agbp); + agbp = NULL; + agino = 0; + } while (++agno < mp->m_sb.sb_agcount); + if (!error) { if (bufidx) { - long written; - if (formatter(ubuffer, buffer, bufidx, &written)) - error = XFS_ERROR(EFAULT); - else + long written; + + error = formatter(ubuffer, buffer, bufidx, &written); + if (!error) *count += bufidx; } *lastino = XFS_AGINO_TO_INO(mp, agno, agino); } + kmem_free(buffer); if (cur) xfs_btree_del_cursor(cur, (error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR)); if (agbp) xfs_buf_relse(agbp); + return error; } -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 34D217F5F for ; Thu, 17 Apr 2014 19:58:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B71BEAC003 for ; Thu, 17 Apr 2014 17:58:39 -0700 (PDT) X-ASG-Debug-ID: 1397782717-04bdf04553137f30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Z6v2lUR9fBfLkLT9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:38 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0waO1015902 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:37 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3I0wZCW025043 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:36 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wZno020586 for ; Fri, 18 Apr 2014 00:58:35 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:35 -0700 Message-ID: <535078B8.4020905@oracle.com> Date: Fri, 18 Apr 2014 08:58:32 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat 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: 1397782718 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu We should not ignore the btree operation errors in xfs_bulkstat() but to propagate them if any. This patch fix two places in this function and the remains things can be fixed with code refactoring thereafter. Moreover, this fix also get rid of the redundant user buffer count pre-checkups as it has already been validated in upper callers. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 40 ++++++---------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 62cf2f8..cdbcf4e 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -230,9 +230,6 @@ xfs_bulkstat( *ubcountp = 0; return 0; } - if (!ubcountp || *ubcountp <= 0) { - return EINVAL; - } ubcount = *ubcountp; /* statstruct's */ ubleft = ubcount * statstruct_size; /* bytes */ *ubcountp = ubelem = 0; @@ -255,14 +252,8 @@ xfs_bulkstat( while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { cond_resched(); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); - if (error) { - /* - * Skip this allocation group and go to the next one. - */ - agno++; - agino = 0; - continue; - } + if (error) + break; agi = XFS_BUF_TO_AGI(agbp); /* * Allocate and initialize a btree cursor for ialloc btree. @@ -333,34 +324,15 @@ xfs_bulkstat( error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); icount = 0; } + if (error) + break; + /* * Loop through inode btree records in this ag, * until we run out of inodes or space in the buffer. */ while (irbp < irbufend && icount < ubcount) { - xfs_inobt_rec_incore_t r; - - /* - * Loop as long as we're unable to read the - * inode btree. - */ - while (error) { - agino += XFS_INODES_PER_CHUNK; - if (XFS_AGINO_TO_AGBNO(mp, agino) >= - be32_to_cpu(agi->agi_length)) - break; - error = xfs_inobt_lookup(cur, agino, - XFS_LOOKUP_GE, &tmp); - cond_resched(); - } - /* - * If ran off the end of the ag either with an error, - * or the normal way, set end and stop collecting. - */ - if (error) { - end_of_ag = 1; - break; - } + struct xfs_inobt_rec_incore r; error = xfs_inobt_get_rec(cur, &r, &i); if (error || i == 0) { -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 109867F66 for ; Thu, 17 Apr 2014 19:58:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E887E304043 for ; Thu, 17 Apr 2014 17:58:41 -0700 (PDT) X-ASG-Debug-ID: 1397782714-04cbb06e9b132d30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id bF2iTYP4FJLHGRvG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:34 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wXl8015869 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:34 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3I0wWrA024978 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:33 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wWLr015870 for ; Fri, 18 Apr 2014 00:58:32 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:32 -0700 Message-ID: <535078B5.4010700@oracle.com> Date: Fri, 18 Apr 2014 08:58:29 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 04/10] xfs: introduce per allocation group inumbers Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 04/10] xfs: introduce per allocation group inumbers 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: 1397782714 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.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_perag_inumbers(), it could be used to fetch the inode number tables per allocation group via a new ioctl(2) in the future. Also, that would be a net win considering the scalability for a file system with huge number of inodes as multiple allocation groups can be scanned in parallel, refactor xfs_inumbers() with it. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 179 ++++++++++++++++++++++++++++++++-------------------- fs/xfs/xfs_itable.h | 13 +++- 2 files changed, 123 insertions(+), 69 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 2025bd0..62cf2f8 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -570,105 +570,150 @@ xfs_inumbers_fmt( } /* - * Return inode number table for the filesystem. + * Return inode number table in an allocation group. Record how many elements + * have been written out and update the last allocation group inode number on + * success. Otherwise, those values will remain the same and return error. */ -int /* error status */ -xfs_inumbers( - struct xfs_mount *mp,/* mount point for filesystem */ - xfs_ino_t *lastino,/* last inode returned */ - int *count,/* size of buffer/count returned */ - void __user *ubuffer,/* buffer with inode desc */ +static int +xfs_perag_inumbers( + struct xfs_mount *mp, + struct xfs_aginumbers *aip, + struct xfs_inogrp *buffer, + int bcount, inumbers_fmt_pf formatter) { - xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, *lastino); - xfs_agino_t agino = XFS_INO_TO_AGINO(mp, *lastino); - struct xfs_btree_cur *cur = NULL; - struct xfs_buf *agbp = NULL; - struct xfs_inogrp *buffer; - int left = *count; - int bcount; - int bufidx; + xfs_agnumber_t agno = aip->ai_agno; + xfs_agino_t agino = *(aip->ai_lastip); + char *ubuffer = aip->ai_ubuffer; + int ubleft = aip->ai_icount; + int bufidx = 0; + long count = 0;/* # elements written out */ + struct xfs_agi *agi; + struct xfs_buf *agbp; + struct xfs_btree_cur *cur; + int stat; int error; - *count = 0; - if (agno >= mp->m_sb.sb_agcount || - *lastino != XFS_AGINO_TO_INO(mp, agno, agino)) - return 0; - - bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); - buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); - bufidx = error = 0; - do { + error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); + if (error) + return error; + agi = XFS_BUF_TO_AGI(agbp); + cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); + /* Done if failed to lookup or no inode chuck is found */ + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, &stat); + if (error || !stat) + goto error0; + + for (;;) { struct xfs_inobt_rec_incore r; - int stat; - - if (!agbp) { - error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); - if (error) - break; - cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); - error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, - &stat); - if (error) - break; - if (!stat) - goto next_ag; - } error = xfs_inobt_get_rec(cur, &r, &stat); - if (error || !stat) + if (error || !stat) { + pr_info("xfs_inobt_get_rec: stat=%d\n", stat); break; + } agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; - buffer[bufidx].xi_startino = - XFS_AGINO_TO_INO(mp, agno, r.ir_startino); - buffer[bufidx].xi_alloccount = - XFS_INODES_PER_CHUNK - r.ir_freecount; + buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, + r.ir_startino); + buffer[bufidx].xi_alloccount = XFS_INODES_PER_CHUNK - + r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; - if (++bufidx == bcount) { + /* Run out of the given buffer range, it's time to write out */ + if (++bufidx == ubleft) { long written; error = formatter(ubuffer, buffer, bufidx, &written); if (error) break; - ubuffer += written; - *count += bufidx; + count += bufidx; bufidx = 0; + break; } - if (!--left) + if (!--ubleft) break; + /* Done if failed or there are no rightward entries */ error = xfs_btree_increment(cur, 0, &stat); - if (error) + if (error || !stat) break; - if (stat) - continue; - -next_ag: - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); - cur = NULL; - xfs_buf_relse(agbp); - agbp = NULL; - agino = 0; - } while (++agno < mp->m_sb.sb_agcount); + } if (!error) { + /* + * There might have remaining inode number tables reside in + * buffer which have not yet been written out if we iterate + * beyond inode btree. We need to handle them separately. + */ if (bufidx) { long written; error = formatter(ubuffer, buffer, bufidx, &written); - if (!error) - *count += bufidx; + if (error) + goto error0; + count += bufidx; } - *lastino = XFS_AGINO_TO_INO(mp, agno, agino); + /* Update the last AG inode number */ + *(aip->ai_lastip) = agino; + /* Record how many elements have been written out */ + aip->ai_ocount = count; } - kmem_free(buffer); - if (cur) - xfs_btree_del_cursor(cur, (error ? XFS_BTREE_ERROR : - XFS_BTREE_NOERROR)); - if (agbp) - xfs_buf_relse(agbp); +error0: + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_buf_relse(agbp); + + return error; +} + +/* Return inode number table for the filesystem */ +int +xfs_inumbers( + struct xfs_mount *mp,/* mount point for filesystem */ + xfs_ino_t *lastinop,/* last inode returned */ + int *ubcountp,/* size of buffer/count returned */ + void __user *ubuffer,/* buffer with inode desc */ + inumbers_fmt_pf formatter) +{ + xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, *lastinop); + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, *lastinop); + int ubleft = *ubcountp; + struct xfs_inogrp *buffer; + int count; + int error; + *ubcountp = 0; + if (agno >= mp->m_sb.sb_agcount || + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) + return 0; + + count = MIN(ubleft, (int)(PAGE_SIZE / sizeof(*buffer))); + buffer = kmem_alloc(count * sizeof(*buffer), KM_SLEEP); + do { + struct xfs_aginumbers ai; + + ai.ai_agno = agno; + ai.ai_lastip = &agino; + ai.ai_icount = ubleft; + ai.ai_ubuffer = ubuffer; + ai.ai_ocount = 0; + error = xfs_perag_inumbers(mp, &ai, buffer, count, formatter); + if (error) + break; + + *ubcountp += ai.ai_ocount; + ubleft -= ai.ai_ocount; + ASSERT(ubleft >= 0); + if (!ubleft) + break; + + ubuffer = ai.ai_ubuffer; + agino = 0; + } while (++agno < mp->m_sb.sb_agcount); + + if (!error) + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); + + kmem_free(buffer); return error; } diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 21dbbd7..9c3e535 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -83,17 +83,26 @@ xfs_bulkstat_one( typedef int (*inumbers_fmt_pf)( void __user *ubuffer, /* buffer to write to */ - const xfs_inogrp_t *buffer, /* buffer to read from */ + const struct xfs_inogrp *buffer, /* buffer to read from */ long count, /* # of elements to read */ long *written); /* # of bytes written */ int xfs_inumbers_fmt( void __user *ubuffer, /* buffer to write to */ - const xfs_inogrp_t *buffer, /* buffer to read from */ + const struct xfs_inogrp *buffer, /* buffer to read from */ long count, /* # of elements to read */ long *written); /* # of bytes written */ +/* This structure is used for xfs_inumbers per allocation group */ +struct xfs_aginumbers { + xfs_agnumber_t ai_agno;/* AG number */ + xfs_agino_t *ai_lastip;/* last AG inode number */ + char __user *ai_ubuffer;/* user buffer to write to */ + __uint32_t ai_icount;/* # of elements to read */ + __uint32_t ai_ocount;/* # of elements written */ +}; + int /* error status */ xfs_inumbers( xfs_mount_t *mp, /* mount point for filesystem */ -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A97307F76 for ; Thu, 17 Apr 2014 19:58:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 64A13304043 for ; Thu, 17 Apr 2014 17:58:49 -0700 (PDT) X-ASG-Debug-ID: 1397782727-04bdf04554137f60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Qmzg0riFib0q1Sfi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:48 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wks0011103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:46 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3I0wjWS025228 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:46 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wjVk020767 for ; Fri, 18 Apr 2014 00:58:45 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:45 -0700 Message-ID: <535078C3.2040506@oracle.com> Date: Fri, 18 Apr 2014 08:58:43 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 06/10] xfs: introduce xfs_bulkstat_ichunk_ra Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 06/10] xfs: introduce xfs_bulkstat_ichunk_ra 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: 1397782727 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_bulkstat_ichunk_ra() to loop over all clusters in the next inode chunk, then performs readahead if there are any allocated inodes in that cluster. Refactor xfs_bulkstat() with it. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 56 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index cdbcf4e..6bde45d 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -172,6 +172,37 @@ xfs_bulkstat_one( xfs_bulkstat_one_fmt, ubused, stat); } +/* + * Loop over all clusters in a chunk for a given incore inode allocation btree + * record. Do a readahead if there are any allocated inodes in that cluster. + */ +STATIC void +xfs_bulkstat_ichunk_ra( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *irec) +{ + xfs_agblock_t agbno; + struct blk_plug plug; + int blks_per_cluster; + int inodes_per_cluster; + int i; /* inode chunk index */ + + agbno = XFS_AGINO_TO_AGBNO(mp, irec->ir_startino); + blks_per_cluster = xfs_icluster_size_fsb(mp); + inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; + + blk_start_plug(&plug); + for (i = 0; i < XFS_INODES_PER_CHUNK; + i += inodes_per_cluster, agbno += blks_per_cluster) { + if (xfs_inobt_maskn(i, inodes_per_cluster) & ~irec->ir_free) { + xfs_btree_reada_bufs(mp, agno, agbno, blks_per_cluster, + &xfs_inode_buf_ops); + } + } + blk_finish_plug(&plug); +} + #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) /* @@ -187,7 +218,6 @@ xfs_bulkstat( char __user *ubuffer, /* buffer with inode stats */ int *done) /* 1 if there are more stats to get */ { - xfs_agblock_t agbno=0;/* allocation group block number */ xfs_buf_t *agbp; /* agi header buffer */ xfs_agi_t *agi; /* agi header data */ xfs_agino_t agino; /* inode # in allocation group */ @@ -206,8 +236,6 @@ xfs_bulkstat( xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ xfs_ino_t lastino; /* last inode number returned */ - int blks_per_cluster; /* # of blocks per cluster */ - int inodes_per_cluster;/* # of inodes per cluster */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int tmp; /* result value from btree calls */ @@ -236,8 +264,6 @@ xfs_bulkstat( *done = 0; fmterror = 0; ubufp = ubuffer; - blks_per_cluster = xfs_icluster_size_fsb(mp); - inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); if (!irbuf) return ENOMEM; @@ -345,25 +371,7 @@ xfs_bulkstat( * Also start read-ahead now for this chunk. */ if (r.ir_freecount < XFS_INODES_PER_CHUNK) { - struct blk_plug plug; - /* - * Loop over all clusters in the next chunk. - * Do a readahead if there are any allocated - * inodes in that cluster. - */ - blk_start_plug(&plug); - agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino); - for (chunkidx = 0; - chunkidx < XFS_INODES_PER_CHUNK; - chunkidx += inodes_per_cluster, - agbno += blks_per_cluster) { - if (xfs_inobt_maskn(chunkidx, - inodes_per_cluster) & ~r.ir_free) - xfs_btree_reada_bufs(mp, agno, - agbno, blks_per_cluster, - &xfs_inode_buf_ops); - } - blk_finish_plug(&plug); + xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A6DFC7F7C for ; Thu, 17 Apr 2014 19:58:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 276B6AC001 for ; Thu, 17 Apr 2014 17:58:54 -0700 (PDT) X-ASG-Debug-ID: 1397782732-04cb6c243912f5a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id XrwEkPQ81lT0N0G9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:52 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wqUT016107 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:52 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wpKj020843 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:51 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s3I0wouq025327 for ; Fri, 18 Apr 2014 00:58:50 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:50 -0700 Message-ID: <535078C5.5060107@oracle.com> Date: Fri, 18 Apr 2014 08:58:45 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 07/10] xfs: introduce xfs_bulkstat_grab_ichunk Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 07/10] xfs: introduce xfs_bulkstat_grab_ichunk 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: 1397782732 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_bulkstat_grab_ichunk() to look up an inode chunk in where the given inode resides, then grab the record. Update the data for the pointed-to record if the inode was not the last in the chunk and there are some left allocated, return the grabbed inode count on success. Refactor xfs_bulkstat() with it. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 121 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 70 insertions(+), 51 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 6bde45d..be7ab58 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -203,6 +203,63 @@ xfs_bulkstat_ichunk_ra( blk_finish_plug(&plug); } +/* + * Lookup the inode chunk that the given inode lives in and then get the record + * if we found the chunk. If the inode was not the last in the chunk and there + * are some left allocated, update the data for the pointed-to record as well as + * return the count of grabbed inodes. + */ +STATIC int +xfs_bulkstat_grab_ichunk( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agino_t agino, /* starting inode of chunk */ + int *icount,/* return # of inodes grabbed */ + struct xfs_inobt_rec_incore *irec) /* btree record */ +{ + int idx; /* index into inode chunk */ + int stat; + int error = 0; + + /* Lookup the inode chunk that this inode lives in */ + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &stat); + if (error) + return error; + if (!stat) { + *icount = 0; + return error; + } + + /* Get the record, should always work */ + error = xfs_inobt_get_rec(cur, irec, &stat); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(stat == 1); + + /* Check if the record contains the inode in request */ + if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) + return XFS_ERROR(EINVAL); + + idx = agino - irec->ir_startino + 1; + if (idx < XFS_INODES_PER_CHUNK && + (xfs_inobt_maskn(idx, XFS_INODES_PER_CHUNK - idx) & ~irec->ir_free)) { + int i; + + /* We got a right chunk with some left inodes allocated at it. + * Grab the chunk record. Mark all the uninteresting inodes + * free -- because they're before our start point. + */ + for (i = 0; i < idx; i++) { + if (XFS_INOBT_MASK(i) & ~irec->ir_free) + irec->ir_freecount++; + } + + irec->ir_free |= xfs_inobt_maskn(0, idx); + *icount = XFS_INODES_PER_CHUNK - irec->ir_freecount; + } + + return 0; +} + #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) /* @@ -288,67 +345,29 @@ xfs_bulkstat( irbp = irbuf; irbufend = irbuf + nirbuf; end_of_ag = 0; - /* - * If we're returning in the middle of an allocation group, - * we need to get the remainder of the chunk we're in. - */ + icount = 0; if (agino > 0) { - xfs_inobt_rec_incore_t r; - /* - * Lookup the inode chunk that this inode lives in. + * In the middle of an allocation group, we need to get + * the remainder of the chunk we're in. */ - error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, - &tmp); - if (!error && /* no I/O error */ - tmp && /* lookup succeeded */ - /* got the record, should always work */ - !(error = xfs_inobt_get_rec(cur, &r, &i)) && - i == 1 && - /* this is the right chunk */ - agino < r.ir_startino + XFS_INODES_PER_CHUNK && - /* lastino was not last in chunk */ - (chunkidx = agino - r.ir_startino + 1) < - XFS_INODES_PER_CHUNK && - /* there are some left allocated */ - xfs_inobt_maskn(chunkidx, - XFS_INODES_PER_CHUNK - chunkidx) & - ~r.ir_free) { - /* - * Grab the chunk record. Mark all the - * uninteresting inodes (because they're - * before our start point) free. - */ - for (i = 0; i < chunkidx; i++) { - if (XFS_INOBT_MASK(i) & ~r.ir_free) - r.ir_freecount++; - } - r.ir_free |= xfs_inobt_maskn(0, chunkidx); + struct xfs_inobt_rec_incore r; + + error = xfs_bulkstat_grab_ichunk(cur, agino, &icount, &r); + if (error) + break; + if (icount) { irbp->ir_startino = r.ir_startino; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - agino = r.ir_startino + XFS_INODES_PER_CHUNK; - icount = XFS_INODES_PER_CHUNK - r.ir_freecount; - } else { - /* - * If any of those tests failed, bump the - * inode number (just in case). - */ - agino++; - icount = 0; + agino += r.ir_startino + XFS_INODES_PER_CHUNK; } - /* - * In any case, increment to the next record. - */ - if (!error) - error = xfs_btree_increment(cur, 0, &tmp); + /* Increment to the next record */ + error = xfs_btree_increment(cur, 0, &tmp); } else { - /* - * Start of ag. Lookup the first inode chunk. - */ + /* Start of ag. Lookup the first inode chunk */ error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); - icount = 0; } if (error) break; -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:58:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E79097F83 for ; Thu, 17 Apr 2014 19:58:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDBBB8F8040 for ; Thu, 17 Apr 2014 17:58:56 -0700 (PDT) X-ASG-Debug-ID: 1397782735-04cbb06e9d132d80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id gmE12WWehJZ3ckFf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:55 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0ws34016129 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:55 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3I0wrHh025376 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:54 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wrNi020885 for ; Fri, 18 Apr 2014 00:58:53 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:53 -0700 Message-ID: <535078CA.1090609@oracle.com> Date: Fri, 18 Apr 2014 08:58:50 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 08/10] xfs: introduce xfs_bulkstat_ag_ichunk Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 08/10] xfs: introduce xfs_bulkstat_ag_ichunk 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: 1397782735 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_bulkstat_ag_ichunk() to process inodes in chunk with a pointer to a formatter function that will iget the inode and fill in the appropriate structure. Refactor xfs_bulkstat() with it. Reviewed-by: Christoph Hellwig Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 142 ++++++++++++++++++++++++++++++++-------------------- fs/xfs/xfs_itable.h | 16 ++++++ 2 files changed, 104 insertions(+), 54 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index be7ab58..56e1d5f 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -263,6 +263,80 @@ xfs_bulkstat_grab_ichunk( #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) /* + * Process inodes in chunk with a pointer to a formatter function that will + * iget the inode and fill in the appropriate structure. + */ +STATIC int +xfs_bulkstat_ag_ichunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *irbp, + bulkstat_one_pf formatter, + size_t statstruct_size, + struct xfs_bulkstat_agichunk *acp) +{ + xfs_ino_t lastino = acp->ac_lastino; + char __user *ubufp = acp->ac_ubuffer; + int ubleft = acp->ac_ubleft; + int ubelem = acp->ac_ubelem; + int chunkidx, clustidx; + int error = 0; + xfs_agino_t agino; + + for (agino = irbp->ir_startino, chunkidx = clustidx = 0; + XFS_BULKSTAT_UBLEFT(ubleft) && + irbp->ir_freecount < XFS_INODES_PER_CHUNK; + chunkidx++, clustidx++, agino++) { + int fmterror; /* bulkstat formatter result */ + int ubused; + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); + + ASSERT(chunkidx < XFS_INODES_PER_CHUNK); + /* Skip if this inode is free */ + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { + lastino = ino; + continue; + } + + /* + * Count used inodes as free so we can tell when the chunk is + * used up. + */ + irbp->ir_freecount++; + + /* Get the inode and fill in a single buffer */ + ubused = statstruct_size; + error = formatter(mp, ino, ubufp, ubleft, &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_NOTHING) { + if (error && error != ENOENT && error != EINVAL) { + ubleft = 0; + break; + } + error = 0; + lastino = ino; + continue; + } + if (fmterror == BULKSTAT_RV_GIVEUP) { + ubleft = 0; + ASSERT(error); + break; + } + if (ubufp) + ubufp += ubused; + ubleft -= ubused; + ubelem++; + lastino = ino; + } + + if (!error) { + acp->ac_lastino = lastino; + acp->ac_ubleft = ubleft; + acp->ac_ubelem = ubelem; + } + return error; +} + +/* * Return stat information in bulk (by-inode) for the filesystem. */ int /* error status */ @@ -279,8 +353,6 @@ xfs_bulkstat( xfs_agi_t *agi; /* agi header data */ xfs_agino_t agino; /* inode # in allocation group */ xfs_agnumber_t agno; /* allocation group number */ - int chunkidx; /* current index into inode chunk */ - int clustidx; /* current index into inode cluster */ xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ @@ -300,7 +372,6 @@ xfs_bulkstat( int ubleft; /* bytes left in user's buffer */ char __user *ubufp; /* pointer into user's buffer */ int ubelem; /* spaces used in user's buffer */ - int ubused; /* bytes used by formatter */ /* * Get the last inode value, see if there's nothing to do. @@ -417,57 +488,20 @@ xfs_bulkstat( irbufend = irbp; for (irbp = irbuf; irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { - /* - * Now process this chunk of inodes. - */ - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; - XFS_BULKSTAT_UBLEFT(ubleft) && - irbp->ir_freecount < XFS_INODES_PER_CHUNK; - chunkidx++, clustidx++, agino++) { - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); - - ino = XFS_AGINO_TO_INO(mp, agno, agino); - /* - * Skip if this inode is free. - */ - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - lastino = ino; - continue; - } - /* - * Count used inodes as free so we can tell - * when the chunk is used up. - */ - irbp->ir_freecount++; - - /* - * Get the inode and fill in a single buffer. - */ - ubused = statstruct_size; - error = formatter(mp, ino, ubufp, ubleft, - &ubused, &fmterror); - if (fmterror == BULKSTAT_RV_NOTHING) { - if (error && error != ENOENT && - error != EINVAL) { - ubleft = 0; - rval = error; - break; - } - lastino = ino; - continue; - } - if (fmterror == BULKSTAT_RV_GIVEUP) { - ubleft = 0; - ASSERT(error); - rval = error; - break; - } - if (ubufp) - ubufp += ubused; - ubleft -= ubused; - ubelem++; - lastino = ino; - } + struct xfs_bulkstat_agichunk ac; + + ac.ac_lastino = lastino; + ac.ac_ubuffer = ubuffer; + ac.ac_ubleft = ubleft; + ac.ac_ubelem = ubelem; + error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, + formatter, statstruct_size, &ac); + if (error) + rval = error; + + lastino = ac.ac_lastino; + ubleft = ac.ac_ubleft; + ubelem = ac.ac_ubelem; cond_resched(); } diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 9c3e535..d3e004e 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -30,6 +30,22 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, int *ubused, int *stat); +struct xfs_bulkstat_agichunk { + xfs_ino_t ac_lastino; /* last inode returned */ + char __user *ac_ubuffer;/* pointer into user's buffer */ + int ac_ubleft; /* bytes left in user's buffer */ + int ac_ubelem; /* spaces used in user's buffer */ +}; + +int +xfs_bulkstat_ag_ichunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *irbp, + bulkstat_one_pf formatter, + size_t statstruct_size, + struct xfs_bulkstat_agichunk *acp); + /* * Values for stat return value. */ -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:59:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 20A9E7F86 for ; Thu, 17 Apr 2014 19:59:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9899304043 for ; Thu, 17 Apr 2014 17:58:59 -0700 (PDT) X-ASG-Debug-ID: 1397782738-04cb6c243912f5c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KHRu1Cq9Bd5h1bdQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:58:58 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0wvYV011248 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:58:57 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wubm025258 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:58:57 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0wurr020917 for ; Fri, 18 Apr 2014 00:58:56 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:58:55 -0700 Message-ID: <535078CD.6050500@oracle.com> Date: Fri, 18 Apr 2014 08:58:53 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 09/10] xfs: introduce per allocation group bulkstat Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 09/10] xfs: introduce per allocation group bulkstat 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: 1397782738 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce xfs_perag_bulkstat(), we can return stat information in bulk by inode as per the given allocation group number and start inode number in it via a new ioctl(2) in the future. Similar to the per allocation group inumbers, we could perform bulkstat in parallel with that. Refactor xfs_bulkstat() with it. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 288 +++++++++++++++++++++++++++++----------------------- fs/xfs/xfs_itable.h | 20 ++++ 2 files changed, 180 insertions(+), 128 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 56e1d5f..58dc182 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -337,86 +337,44 @@ xfs_bulkstat_ag_ichunk( } /* - * Return stat information in bulk (by-inode) for the filesystem. + * Return stat information in bulk (by-inode) in an allocation group until + * we run out of the AG or user buffers. */ -int /* error status */ -xfs_bulkstat( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t *lastinop, /* last inode returned */ - int *ubcountp, /* size of buffer/count returned */ - bulkstat_one_pf formatter, /* func that'd fill a single buf */ - size_t statstruct_size, /* sizeof struct filling */ - char __user *ubuffer, /* buffer with inode stats */ - int *done) /* 1 if there are more stats to get */ +int +xfs_perag_bulkstat( + struct xfs_mount *mp, + struct xfs_agbulkstat *agbulkp, + struct xfs_inobt_rec_incore *irbuf, + size_t nirbuf, + bulkstat_one_pf formatter, + size_t statstruct_size) { - xfs_buf_t *agbp; /* agi header buffer */ - xfs_agi_t *agi; /* agi header data */ - xfs_agino_t agino; /* inode # in allocation group */ - xfs_agnumber_t agno; /* allocation group number */ - xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ - int end_of_ag; /* set if we've seen the ag end */ - int error; /* error code */ - int fmterror;/* bulkstat formatter result */ - int i; /* loop index */ - int icount; /* count of inodes good in irbuf */ - size_t irbsize; /* size of irec buffer in bytes */ - xfs_ino_t ino; /* inode number (filesystem) */ - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ - xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ - xfs_ino_t lastino; /* last inode number returned */ - int nirbuf; /* size of irbuf */ - int rval; /* return value error code */ - int tmp; /* result value from btree calls */ - int ubcount; /* size of user's buffer */ - int ubleft; /* bytes left in user's buffer */ - char __user *ubufp; /* pointer into user's buffer */ - int ubelem; /* spaces used in user's buffer */ - - /* - * Get the last inode value, see if there's nothing to do. - */ - ino = (xfs_ino_t)*lastinop; - lastino = ino; - agno = XFS_INO_TO_AGNO(mp, ino); - agino = XFS_INO_TO_AGINO(mp, ino); - if (agno >= mp->m_sb.sb_agcount || - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { - *done = 1; - *ubcountp = 0; - return 0; - } - ubcount = *ubcountp; /* statstruct's */ - ubleft = ubcount * statstruct_size; /* bytes */ - *ubcountp = ubelem = 0; - *done = 0; - fmterror = 0; - ubufp = ubuffer; - irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); - if (!irbuf) - return ENOMEM; - - nirbuf = irbsize / sizeof(*irbuf); + xfs_agnumber_t agno = agbulkp->ab_agno; + xfs_agino_t agino = *(agbulkp->ab_aginop); + xfs_ino_t lastino = XFS_AGINO_TO_INO(mp, agno, + agino); + char __user *ubuffer = agbulkp->ab_ubuffer; + int ubcount = agbulkp->ab_icount; + int ubelem = 0;/* # elements written */ + struct xfs_btree_cur *cur = NULL; + struct xfs_buf *agbp = NULL; + int ubleft_bytes; + int error; + + ubleft_bytes = ubcount * statstruct_size; + for (;;) { + struct xfs_inobt_rec_incore *irbp = irbuf; + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; + struct xfs_agi *agi; + int stat; + int icount = 0;/* # inodes in irbuf */ + bool end_of_ag = false; - /* - * Loop over the allocation groups, starting from the last - * inode returned; 0 means start of the allocation group. - */ - rval = 0; - while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { - cond_resched(); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) break; agi = XFS_BUF_TO_AGI(agbp); - /* - * Allocate and initialize a btree cursor for ialloc btree. - */ cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); - irbp = irbuf; - irbufend = irbuf + nirbuf; - end_of_ag = 0; - icount = 0; if (agino > 0) { /* * In the middle of an allocation group, we need to get @@ -434,32 +392,34 @@ xfs_bulkstat( irbp++; agino += r.ir_startino + XFS_INODES_PER_CHUNK; } - /* Increment to the next record */ - error = xfs_btree_increment(cur, 0, &tmp); + error = xfs_btree_increment(cur, 0, &stat); + if (error) + break; + if (!stat) + end_of_ag = true; } else { /* Start of ag. Lookup the first inode chunk */ - error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); + if (error || !stat) + break; } - if (error) - break; /* - * Loop through inode btree records in this ag, - * until we run out of inodes or space in the buffer. + * Loop over inode btree records in this AG until we run out of + * inodes or space in the buffer. */ while (irbp < irbufend && icount < ubcount) { struct xfs_inobt_rec_incore r; - error = xfs_inobt_get_rec(cur, &r, &i); - if (error || i == 0) { - end_of_ag = 1; + error = xfs_inobt_get_rec(cur, &r, &stat); + if (error) + break; + if (!stat) { + end_of_ag = true; break; } - /* - * If this chunk has any allocated inodes, save it. - * Also start read-ahead now for this chunk. - */ + /* If this chunk has any allocated inodes, save it */ if (r.ir_freecount < XFS_INODES_PER_CHUNK) { xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; @@ -468,77 +428,149 @@ xfs_bulkstat( irbp++; icount += XFS_INODES_PER_CHUNK - r.ir_freecount; } - /* - * Set agino to after this chunk and bump the cursor. - */ + + /* Set agino to after this chunk and bump the cursor */ agino = r.ir_startino + XFS_INODES_PER_CHUNK; - error = xfs_btree_increment(cur, 0, &tmp); + error = xfs_btree_increment(cur, 0, &stat); + if (error) + break; + if (!stat) { + end_of_ag = true; + break; + } + cond_resched(); } + + /* Break if previously there is any error has happened */ + if (error) + break; /* - * Drop the btree buffers and the agi buffer. - * We can't hold any of the locks these represent - * when calling iget. + * Drop the btree buffers and the agi buffer. We can't hold + * any of the locks these represent when calling iget. */ xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = NULL; xfs_buf_relse(agbp); - /* - * Now format all the good inodes into the user's buffer. - */ + agbp = NULL; + irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { - struct xfs_bulkstat_agichunk ac; + irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft_bytes); + irbp++) { + struct xfs_bulkstat_agichunk ac; ac.ac_lastino = lastino; ac.ac_ubuffer = ubuffer; - ac.ac_ubleft = ubleft; + ac.ac_ubleft = ubleft_bytes; ac.ac_ubelem = ubelem; error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac); if (error) - rval = error; - + break; lastino = ac.ac_lastino; - ubleft = ac.ac_ubleft; + ubleft_bytes = ac.ac_ubleft; ubelem = ac.ac_ubelem; cond_resched(); } - /* - * Set up for the next loop iteration. - */ - if (XFS_BULKSTAT_UBLEFT(ubleft)) { - if (end_of_ag) { - agno++; - agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); - } else + + if (error || end_of_ag || !XFS_BULKSTAT_UBLEFT(ubleft_bytes)) break; + + /* Set up for the next loop iteration */ + agino = XFS_INO_TO_AGINO(mp, lastino); } + + if (!error) { + agbulkp->ab_ocount = ubelem; + *(agbulkp->ab_aginop) = XFS_INO_TO_AGINO(mp, lastino); + } + + if (cur) { + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + if (agbp) + xfs_buf_relse(agbp); + + return error; +} + +/* + * Return stat information in bulk (by-inode) for the filesystem. + */ +int +xfs_bulkstat( + struct xfs_mount *mp, /* mount point for filesystem */ + xfs_ino_t *lastinop, /* last inode returned */ + int *ubcountp, /* size of buffer/count returned */ + bulkstat_one_pf formatter, /* func that'd fill a single buf */ + size_t statstruct_size, /* sizeof struct filling */ + char __user *ubuffer, /* buffer with inode stats */ + int *done) /* 1 if there are more stats to get */ +{ + xfs_ino_t lastino = *lastinop;/* last inode number */ + xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, lastino); + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, lastino); + int ubleft = *ubcountp;/* size of user's buffer */ + size_t irbsize;/* size of irec buffer in bytes */ + int nirbuf; /* size of irbuf */ + int error; /* error code */ + struct xfs_inobt_rec_incore *irbuf;/* start of irec buffer */ + + /* The given last inode number is beyond file system range, done */ + if (agno >= mp->m_sb.sb_agcount || + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { + *ubcountp = 0; + *done = 1; + return 0; + } + + irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); + if (!irbuf) + return ENOMEM; + nirbuf = irbsize / sizeof(*irbuf); + + *done = 0; /* - * Done, we're either out of filesystem or space to put the data. - */ - kmem_free(irbuf); - *ubcountp = ubelem; - /* - * Found some inodes, return them now and return the error next time. + * Loop over the allocation groups, starting from the last inode + * returned; 0 means start of the allocation group. */ - if (ubelem) - rval = 0; - if (agno >= mp->m_sb.sb_agcount) { + do { + struct xfs_agbulkstat agbulk; + + agbulk.ab_agno = agno; + agbulk.ab_aginop = &agino; + agbulk.ab_ubuffer = ubuffer; + agbulk.ab_icount = ubleft; + agbulk.ab_ocount = 0; + error = xfs_perag_bulkstat(mp, &agbulk, irbuf, nirbuf, + formatter, statstruct_size); + if (error) + break; + + ubleft -= agbulk.ab_ocount; + ASSERT(ubleft >= 0); + if (!ubleft) + break; + /* - * If we ran out of filesystem, mark lastino as off - * the end of the filesystem, so the next call - * will return immediately. + * No more inodes in current allocation group, however the user + * requires more. Proceed to loop over the next one. */ - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); + agino = 0; + } while (++agno < mp->m_sb.sb_agcount); + + kmem_free(irbuf); + + if (!error) { + *ubcountp -= ubleft; + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); *done = 1; - } else - *lastinop = (xfs_ino_t)lastino; + } - return rval; + return error; } /* diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index d3e004e..0488960 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -47,6 +47,26 @@ xfs_bulkstat_ag_ichunk( struct xfs_bulkstat_agichunk *acp); /* + * Structures returned stat information in bulk (by-inode) per AG. + */ +struct xfs_agbulkstat { + xfs_agnumber_t ab_agno; /* AG number */ + xfs_agino_t *ab_aginop; /* last agino returned */ + char __user *ab_ubuffer; /* pointer into user's buffer */ + __uint32_t ab_icount; /* count of entries in buffer */ + __uint32_t ab_ocount; /* output counter */ +}; + +int +xfs_perag_bulkstat( + struct xfs_mount *mp, + struct xfs_agbulkstat *agbulkp, + struct xfs_inobt_rec_incore *irbuf, + size_t nirbuf, + bulkstat_one_pf formatter, + size_t statstruct_size); + +/* * Values for stat return value. */ #define BULKSTAT_RV_NOTHING 0 -- 1.8.3.2 From jeff.liu@oracle.com Thu Apr 17 19:59:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 488A27F8A for ; Thu, 17 Apr 2014 19:59:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9555AC001 for ; Thu, 17 Apr 2014 17:59:07 -0700 (PDT) X-ASG-Debug-ID: 1397782745-04bdf04555137fb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FLtyd6VxxEB7Zf4E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 17 Apr 2014 17:59:06 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3I0x4Dl016458 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 18 Apr 2014 00:59:05 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3I0x3a8025545 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 00:59:04 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3I0x3fx021160 for ; Fri, 18 Apr 2014 00:59:03 GMT Received: from [192.168.1.101] (/218.58.144.70) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Apr 2014 17:59:03 -0700 Message-ID: <535078D4.4000802@oracle.com> Date: Fri, 18 Apr 2014 08:59:00 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 10/10] xfs: isolate xfs_qm_quotacheck to its source file Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 10/10] xfs: isolate xfs_qm_quotacheck to its source file 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: 1397782746 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Isolate xfs_qm_quotacheck() to xfs_qm.c as there is no other users of it. Signed-off-by: Jie Liu --- fs/xfs/xfs_qm.c | 189 ++++++++++++++++++++++++++++---------------------------- fs/xfs/xfs_qm.h | 1 - 2 files changed, 94 insertions(+), 96 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 348e4d2..4c70732 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -272,100 +272,6 @@ xfs_qm_unmount( } } - -/* - * This is called from xfs_mountfs to start quotas and initialize all - * necessary data structures like quotainfo. This is also responsible for - * running a quotacheck as necessary. We are guaranteed that the superblock - * is consistently read in at this point. - * - * If we fail here, the mount will continue with quota turned off. We don't - * need to inidicate success or failure at all. - */ -void -xfs_qm_mount_quotas( - xfs_mount_t *mp) -{ - int error = 0; - uint sbf; - - /* - * If quotas on realtime volumes is not supported, we disable - * quotas immediately. - */ - if (mp->m_sb.sb_rextents) { - xfs_notice(mp, "Cannot turn on quotas for realtime filesystem"); - mp->m_qflags = 0; - goto write_changes; - } - - ASSERT(XFS_IS_QUOTA_RUNNING(mp)); - - /* - * Allocate the quotainfo structure inside the mount struct, and - * create quotainode(s), and change/rev superblock if necessary. - */ - error = xfs_qm_init_quotainfo(mp); - if (error) { - /* - * We must turn off quotas. - */ - ASSERT(mp->m_quotainfo == NULL); - mp->m_qflags = 0; - goto write_changes; - } - /* - * If any of the quotas are not consistent, do a quotacheck. - */ - if (XFS_QM_NEED_QUOTACHECK(mp)) { - error = xfs_qm_quotacheck(mp); - if (error) { - /* Quotacheck failed and disabled quotas. */ - return; - } - } - /* - * If one type of quotas is off, then it will lose its - * quotachecked status, since we won't be doing accounting for - * that type anymore. - */ - if (!XFS_IS_UQUOTA_ON(mp)) - mp->m_qflags &= ~XFS_UQUOTA_CHKD; - if (!XFS_IS_GQUOTA_ON(mp)) - mp->m_qflags &= ~XFS_GQUOTA_CHKD; - if (!XFS_IS_PQUOTA_ON(mp)) - mp->m_qflags &= ~XFS_PQUOTA_CHKD; - - write_changes: - /* - * We actually don't have to acquire the m_sb_lock at all. - * This can only be called from mount, and that's single threaded. XXX - */ - spin_lock(&mp->m_sb_lock); - sbf = mp->m_sb.sb_qflags; - mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL; - spin_unlock(&mp->m_sb_lock); - - if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) { - if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) { - /* - * We could only have been turning quotas off. - * We aren't in very good shape actually because - * the incore structures are convinced that quotas are - * off, but the on disk superblock doesn't know that ! - */ - ASSERT(!(XFS_IS_QUOTA_RUNNING(mp))); - xfs_alert(mp, "%s: Superblock update failed!", - __func__); - } - } - - if (error) { - xfs_warn(mp, "Failed to initialize disk quotas."); - return; - } -} - /* * Called from the vfsops layer. */ @@ -1501,7 +1407,7 @@ out_unlock: * Walk thru all the filesystem inodes and construct a consistent view * of the disk quota world. If the quotacheck fails, disable quotas. */ -int +STATIC int xfs_qm_quotacheck( xfs_mount_t *mp) { @@ -1638,6 +1544,99 @@ xfs_qm_quotacheck( } /* + * This is called from xfs_mountfs to start quotas and initialize all + * necessary data structures like quotainfo. This is also responsible for + * running a quotacheck as necessary. We are guaranteed that the superblock + * is consistently read in at this point. + * + * If we fail here, the mount will continue with quota turned off. We don't + * need to inidicate success or failure at all. + */ +void +xfs_qm_mount_quotas( + struct xfs_mount *mp) +{ + int error = 0; + uint sbf; + + /* + * If quotas on realtime volumes is not supported, we disable + * quotas immediately. + */ + if (mp->m_sb.sb_rextents) { + xfs_notice(mp, "Cannot turn on quotas for realtime filesystem"); + mp->m_qflags = 0; + goto write_changes; + } + + ASSERT(XFS_IS_QUOTA_RUNNING(mp)); + + /* + * Allocate the quotainfo structure inside the mount struct, and + * create quotainode(s), and change/rev superblock if necessary. + */ + error = xfs_qm_init_quotainfo(mp); + if (error) { + /* + * We must turn off quotas. + */ + ASSERT(mp->m_quotainfo == NULL); + mp->m_qflags = 0; + goto write_changes; + } + /* + * If any of the quotas are not consistent, do a quotacheck. + */ + if (XFS_QM_NEED_QUOTACHECK(mp)) { + error = xfs_qm_quotacheck(mp); + if (error) { + /* Quotacheck failed and disabled quotas. */ + return; + } + } + /* + * If one type of quotas is off, then it will lose its + * quotachecked status, since we won't be doing accounting for + * that type anymore. + */ + if (!XFS_IS_UQUOTA_ON(mp)) + mp->m_qflags &= ~XFS_UQUOTA_CHKD; + if (!XFS_IS_GQUOTA_ON(mp)) + mp->m_qflags &= ~XFS_GQUOTA_CHKD; + if (!XFS_IS_PQUOTA_ON(mp)) + mp->m_qflags &= ~XFS_PQUOTA_CHKD; + + write_changes: + /* + * We actually don't have to acquire the m_sb_lock at all. + * This can only be called from mount, and that's single threaded. XXX + */ + spin_lock(&mp->m_sb_lock); + sbf = mp->m_sb.sb_qflags; + mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL; + spin_unlock(&mp->m_sb_lock); + + if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) { + if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) { + /* + * We could only have been turning quotas off. + * We aren't in very good shape actually because + * the incore structures are convinced that quotas are + * off, but the on disk superblock doesn't know that ! + */ + ASSERT(!(XFS_IS_QUOTA_RUNNING(mp))); + xfs_alert(mp, "%s: Superblock update failed!", + __func__); + } + } + + if (error) { + xfs_warn(mp, "Failed to initialize disk quotas."); + return; + } +} + +/* * This is called after the superblock has been read in and we're ready to * iget the quota inodes. */ diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 797fd46..3a07a93 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -157,7 +157,6 @@ struct xfs_dquot_acct { #define XFS_QM_RTBWARNLIMIT 5 extern void xfs_qm_destroy_quotainfo(struct xfs_mount *); -extern int xfs_qm_quotacheck(struct xfs_mount *); extern int xfs_qm_write_sb_changes(struct xfs_mount *, __int64_t); /* dquot stuff */ -- 1.8.3.2 From fdmanana@gmail.com Thu Apr 17 21:38:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 003D47F53 for ; Thu, 17 Apr 2014 21:38:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75AD4AC003 for ; Thu, 17 Apr 2014 19:38:39 -0700 (PDT) X-ASG-Debug-ID: 1397788717-04cb6c2439133e90001-NocioJ Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by cuda.sgi.com with ESMTP id ENZ87xHNXozTmJoI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 17 Apr 2014 19:38:37 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] Received: by mail-wi0-f177.google.com with SMTP id cc10so248241wib.10 for ; Thu, 17 Apr 2014 19:38:36 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=CD+sbRaKlU60p2Nu2pz2gdbl1bEVkfQxoRe6hGwQn6g=; b=IANmlqymJ99G2cUxPADTBsTlxGnDd5sFQGIhRmizYvrDiTSXvvKsFMEzWTOanbmuqE DH4XoMgu4stUwer4opuvpqgtESYFeTu3J1T8B7A8vGFjAst0TPxTqsG2uR6hqrRKgTBV ulYjP5X6XL2hPQKeZOeRLqubi7VWUBmcJgSvw9kVOtYlzf+aO54t7RxgbEidARnf4qiu We6jl3vR4pDvoUIEAIfu5N0zg9AZoi9Hzyi1DZ9UbGl7GI1KTzOCeyMDjNoga5x36U+a NtX/y2tzLbfmA3KwNG5grRVdCYsmeWaNh3J1CBLe+0A6ovoZpGM5ViHzzlkiFREVzUd0 Ak9g== X-Received: by 10.180.93.226 with SMTP id cx2mr574897wib.16.1397788716752; Thu, 17 Apr 2014 19:38:36 -0700 (PDT) Received: from debian-vm3.lan (bl10-198-83.dsl.telepac.pt. [85.243.198.83]) by mx.google.com with ESMTPSA id ct2sm41522071wjb.33.2014.04.17.19.38.35 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 17 Apr 2014 19:38:35 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH] xfstests: btrfs/004, fix filefrag filter for files with 1 block only Date: Fri, 18 Apr 2014 04:34:23 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs/004, fix filefrag filter for files with 1 block only Message-Id: <1397792063-3660-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-wi0-f177.google.com[209.85.212.177] X-Barracuda-Start-Time: 1397788717 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5025 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature If the file consists of a single block, then filefrag mentions '1 block of ...', and the filter expected 'blocks of ...'. Example: $ echo qwerty > foobar $ filefrag -v foobar Filesystem type is: ef53 File size of foobar is 7 (1 block of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 0: 0.. 0: 1: unknown,delalloc,eof foobar: 1 extent found Signed-off-by: Filipe David Borba Manana --- tests/btrfs/004 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/btrfs/004 b/tests/btrfs/004 index 211d8bc..670e1c2 100755 --- a/tests/btrfs/004 +++ b/tests/btrfs/004 @@ -58,7 +58,7 @@ _require_command "/usr/sbin/filefrag" rm -f $seqres.full FILEFRAG_FILTER=' - if (/blocks of (\d+) bytes/) { + if (/blocks? of (\d+) bytes/) { $blocksize = $1; next } -- 1.9.1 From fdmanana@gmail.com Thu Apr 17 21:39:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B16E97F53 for ; Thu, 17 Apr 2014 21:39:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 898EC304039 for ; Thu, 17 Apr 2014 19:39:59 -0700 (PDT) X-ASG-Debug-ID: 1397788797-04cb6c2438133f70001-NocioJ Received: from mail-we0-f182.google.com (mail-we0-f182.google.com [74.125.82.182]) by cuda.sgi.com with ESMTP id 6vcvEzlFGJUeXIVz (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 17 Apr 2014 19:39:58 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.182 Received: by mail-we0-f182.google.com with SMTP id p61so1154269wes.13 for ; Thu, 17 Apr 2014 19:39:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=CpF0TNmYOSzbU0vanyp9OQyIllrczCNK7tdHi/NtpZY=; b=TFTI/HuosDHYyWoh/CoiA2Trx0PBH+DHZ6vfuHk9Xm0EX7BbRAJd3xIWq3WeThrjPp C8pznhRWhfS3RXBZrUsa49PtL44wHLz+ClV9HVL5ncKDrX824CckCg1Ce7hdrJ/i67oe GogN38U8wUYBzbEUOb3HuvfGGjyGXduNd4yCBkKsRWXIyzHWJhpdhqRGIuqZcQfMGJrt 3Ck1ubjbj8fa0Pd5HYn0jZof9Q6JwH3ezCuoyIREFfmfY8MS/3xMrbrDV4w5Cw6SmU9s cNMFyN7tE06Q1mbNaxq6BMmfEDe6m/lpRFQ+tnLtCkqlTHiA1XznE9azP2RYZVb75mXA BzIw== X-Received: by 10.194.109.227 with SMTP id hv3mr14685050wjb.10.1397788796648; Thu, 17 Apr 2014 19:39:56 -0700 (PDT) Received: from debian-vm3.lan (bl10-198-83.dsl.telepac.pt. [85.243.198.83]) by mx.google.com with ESMTPSA id b2sm487827wiz.15.2014.04.17.19.39.55 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 17 Apr 2014 19:39:55 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH] xfstests: btrfs/004, fix failure with inlined file extents Date: Fri, 18 Apr 2014 04:39:46 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs/004, fix failure with inlined file extents Message-Id: <1397792386-18316-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-we0-f182.google.com[74.125.82.182] X-Barracuda-Start-Time: 1397788797 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5025 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Files that consist of an inline extent, have the corresponding data in the filesystem btree and not on a dedicated extent. For such extents filefrag (fiemap) will report a physical location of 0 for that extent and set the 'inline' flag. The btrfs inspect-internal logical-resolve command will cause a lookup in the extent tree for the extent address we give it as an argument, which fails with errno ENOENT if it is 0. This error didn't happen always, as the test uses fsstress to generate a random filesystem, which needed to generate at least one file that could be inlined (content less than 4018 bytes). Example, taken from results/btrfs/004.full: # filefrag -v /home/fdmanana/btrfs-tests/scratch_1/snap1/p0/de/d1b/dcb/fb1 Filesystem type is: 9123683e File size of /home/fdmanana/btrfs-tests/scratch_1/snap1/p0/de/d1b/dcb/fb1 is 3860 (1 block of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 4095: 0.. 4095: 4096: not_aligned,inline,eof 1: 280.. 344: 35190.. 35254: 65: 1: eof /home/fdmanana/btrfs-tests/scratch_1/snap1/p0/de/d1b/dcb/fb1: 2 extents found after filter: 0#0#0 0#0#0 # stat -c %i /home/fdmanana/btrfs-tests/scratch_1/snap1/p0/de/d1b/dcb/fb1 403 # /home/fdmanana/git/hub/btrfs-progs/btrfs inspect-internal logical-resolve -P 0 /home/fdmanana/btrfs-tests/scratch_1 ioctl ret=-1, error: No such file or directory Signed-off-by: Filipe David Borba Manana --- tests/btrfs/004 | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/tests/btrfs/004 b/tests/btrfs/004 index 670e1c2..1d5b816 100755 --- a/tests/btrfs/004 +++ b/tests/btrfs/004 @@ -65,9 +65,11 @@ FILEFRAG_FILTER=' ($ext, $logical, $physical, $length) = (/^\s*(\d+):\s+(\d+)..\s+\d+:\s+(\d+)..\s+\d+:\s+(\d+):/) or next; + ($flags) = /.*:\s*(\S*)$/; print $physical * $blocksize, "#", $length * $blocksize, "#", - $logical * $blocksize, " "' + $logical * $blocksize, "#", + $flags, " "' # this makes filefrag output script readable by using a perl helper. # output is one extent per line, with three numbers separated by '#' @@ -230,16 +232,26 @@ workout() continue; fi for i in $extents; do - physical=$i - length=$i - logical=$i - physical=`echo $physical | sed -e 's/#.*//'` - length=`echo $length | sed -e 's/[^#]+#//'` - length=`echo $length | sed -e 's/#.*//'` - logical=`echo $logical | sed -e 's/.*#//'` - _btrfs_inspect_check $file $physical $length $logical \ - $snap_name - ret=$? + physical=`echo $i | cut -d '#' -f 1` + length=`echo $i | cut -d '#' -f 2` + logical=`echo $i | cut -d '#' -f 3` + flags=`echo $i | cut -d '#' -f 4` + # Skip inline extents, otherwise btrfs inspect-internal + # logical-resolve will fail (with errno ENOENT), as it + # can't find an extent with a start address of 0 in the + # extent tree. + if [ $physical -eq 0 ]; then + echo "$flags" | grep -E '(^|,)inline(,|$)' \ + > /dev/null + ret=$? + if [ $ret -ne 0 ]; then + echo "Unexpected physical address 0 for non-inline extent, file $file, flags $flags" + fi + else + _btrfs_inspect_check $file $physical $length \ + $logical $snap_name + ret=$? + fi if [ $ret -ne 0 ]; then errcnt=`expr $errcnt + 1` fi -- 1.9.1 From kzak@redhat.com Fri Apr 18 05:52:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 16F767F56 for ; Fri, 18 Apr 2014 05:52:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF209AC001 for ; Fri, 18 Apr 2014 03:52:41 -0700 (PDT) X-ASG-Debug-ID: 1397818357-04bdf04554148ee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CxW8f7076SX58uvu for ; Fri, 18 Apr 2014 03:52:37 -0700 (PDT) X-Barracuda-Envelope-From: kzak@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 s3IAqXWQ016507 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Apr 2014 06:52:34 -0400 Received: from x2.net.home (ovpn-113-60.phx2.redhat.com [10.3.113.60]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3IAqW4V003236; Fri, 18 Apr 2014 06:52:33 -0400 Date: Fri, 18 Apr 2014 12:52:32 +0200 From: Karel Zak To: Dongsu Park Cc: Namjae Jeon , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, tytso@mit.edu, Lukas Czerner , Namjae Jeon , Ashish Sangwan Subject: Re: [PATCH v2] util-linux/fallocate: introduce an option -c to support COLLAPSE_RANGE Message-ID: <20140418105232.GJ5786@x2.net.home> X-ASG-Orig-Subj: Re: [PATCH v2] util-linux/fallocate: introduce an option -c to support COLLAPSE_RANGE References: <1393497307-9205-1-git-send-email-dongsu.park@profitbricks.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393497307-9205-1-git-send-email-dongsu.park@profitbricks.com> User-Agent: Mutt/1.5.22.1 (2013-10-16) 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: 1397818357 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 27, 2014 at 11:35:07AM +0100, Dongsu Park wrote: > sys-utils/fallocate.1 | 7 +++++++ > sys-utils/fallocate.c | 45 ++++++++++++++++++++++++++++----------------- > 2 files changed, 35 insertions(+), 17 deletions(-) Applied, thanks. -- Karel Zak http://karelzak.blogspot.com From webmaster@getit19.livemailz.com Fri Apr 18 08:17:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,RCVD_NUMERIC_HELO,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C60A07F58 for ; Fri, 18 Apr 2014 08:17:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C2ED28F8033 for ; Fri, 18 Apr 2014 06:17:13 -0700 (PDT) X-ASG-Debug-ID: 1397827028-04cbb06e9a14bd70001-NocioJ Received: from server.livemailz.com (server.livemailz.com [115.124.106.32]) by cuda.sgi.com with ESMTP id EQsp8DoO8IMNDnyT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 06:17:10 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@getit19.livemailz.com X-Barracuda-Apparent-Source-IP: 115.124.106.32 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=getit19.livemailz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=qesD/GShlT+R7JEf5YVaYMfTm0V9Ag7amXAQ+5S67VM=; b=DBHxxKnRGfPIss7WOif2HEpSdAQFA3k1a9dCCZYg8o+fa1WCqjKLgWKxURf6r2mHPQ/zpkvaE+tKANj/S7LNPJTxjRbx4r38Fu5LkL/GkGpeuYeiB9BPbNgS/KWK5C5yLZYXrRd3gI6GGt5VC4aBFQSWlj9jbvTfEUrzzME5G7s=; Received: from getit19l by server.livemailz.com with local (Exim 4.82) (envelope-from ) id 1Wb8fA-0003Tu-Vk for xfs@oss.sgi.com; Fri, 18 Apr 2014 18:47:05 +0530 To: xfs@oss.sgi.com Subject: Wedding Sale - Upto 25% off X-PHP-Script: getit19.livemailz.com/mailz/admin/index.php for 180.215.202.92 X-ASG-Orig-Subj: Wedding Sale - Upto 25% off Received: from 180.215.202.92 [180.215.202.92] by getit19.livemailz.com with HTTP; Fri, 18 Apr 2014 10:05:36 +0000 Date: Fri, 18 Apr 2014 13:17:04 +0000 From: Candere Reply-To: Candere Message-ID: <15d93cc2496a8f1be5e166e19f26118c@getit19.livemailz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.5 X-MessageID: 7 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@getit19.livemailz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_15d93cc2496a8f1be5e166e19f26118c" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.livemailz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [527 32007] / [47 12] X-AntiAbuse: Sender Address Domain - getit19.livemailz.com X-Get-Message-Sender-Via: server.livemailz.com: authenticated_id: getit19l/from_h X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/getit19l/public_html/mailz/admin/index.php X-Source-Dir: getit19.livemailz.com:/public_html/mailz/admin X-Barracuda-Connect: server.livemailz.com[115.124.106.32] X-Barracuda-Start-Time: 1397827029 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.80 X-Barracuda-Spam-Status: No, SCORE=1.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, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.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 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO --b1_15d93cc2496a8f1be5e166e19f26118c Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Wedding Season Sale Privacy Policy -- This message was sent to xfs@oss.sgi.com by nikita@getit19.livemailz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 Amol --b1_15d93cc2496a8f1be5e166e19f26118c Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A=0A=0A=0AWedding Season Sale= =0A =0A =0A=0A=09 =0A=09=09=0A=09=09=09
=0A=09=09=09=09=0A=09=09=09=09=09 = =0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09=0A=09=09= =09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09 =0A=09= =09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09 =0A=09=09=09= =09=09=09 =0A=09=09=09=09=09=09 =0A=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09
=0A=09=09=09=09=09=09=09=093D"Logo"=0A=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=093D"Wedding=0A=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09= =09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09 =09=0A=09= =09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09=09=09=09=093D"Diamon==0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09= =09=09=09=09=09=09=093D"Mangalsutra"=0A=09=09=09=09=09=09=09= =09=09=09=09 =0A=09=09=09=09=09=09=09=09=09=09=09=093D"Diamond=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09= =09=09=09=09=09=093D"Diamond=0A=09=09=09=09=09= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=093D"Dia==0A=09=09=09=09=09=09=09=09=09=09=09
=09=0A=09=09=09=09=09=09=09
=0A=09=09= =09=09=09=09=09=09 =0A=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=09=09=09 =0A= =09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09= =09 =0A=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09<= /table>=0A=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09 =0A=09=09= =09=09=09=09=0A=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09 =0A=09=09= =09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=0A=09=09=09 =0A=09=09=0A=09=0A
=0A=09=09=09=09=09=09=09=09=09=09= =093D"Diamond=0A=09=09=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09=09=09=09=09=093D"Diamond =0A=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09= =09=09=09=09=09=093D"Diamond=0A=09=09=09=09=09=09=09=09= =09=09
=0A=09=09=09=09=09=09=09=093D"bottom_bar"=0A=09=09=09=09=09=09=09
=0A=09=09=09=09=09= =09=09=09Privacy Policy=0A=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09
=0A
-- =20

This message was sent to xfs@oss.sgi.com by nikita@getit19.livemai= lz.com

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

=0AAmol=0A --b1_15d93cc2496a8f1be5e166e19f26118c-- From BATV+eabb55d153540696a9a3+3890+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 18 11:39:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BC6AE7F54 for ; Fri, 18 Apr 2014 11:39:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4670CAC009 for ; Fri, 18 Apr 2014 09:39:28 -0700 (PDT) X-ASG-Debug-ID: 1397839163-04cbb06e9a15cd40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YVKMVxa8h7TjlPes (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 18 Apr 2014 09:39:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+eabb55d153540696a9a3+3890+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WbBou-0004yr-Os; Fri, 18 Apr 2014 16:39:20 +0000 Date: Fri, 18 Apr 2014 09:39:20 -0700 From: Christoph Hellwig To: Andreas Gruenbacher Cc: Christoph Hellwig , Brian Foster , linux-man@vger.kernel.org, xfs@oss.sgi.com, linux-security-module@vger.kernel.org, Al Viro , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140418163920.GB13808@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> <20140410102421.GA17641@infradead.org> <20140410121947.GA14124@bfoster.bfoster> <20140410122944.GA6579@infradead.org> <20140415175228.GE26404@infradead.org> <1188577823.463241.1397590262478.JavaMail.zimbra@linbit.com> <20140416111402.GA32350@infradead.org> <359356562.473582.1397669369258.JavaMail.zimbra@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <359356562.473582.1397669369258.JavaMail.zimbra@linbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1397839163 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5042 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 16, 2014 at 07:29:29PM +0200, Andreas Gruenbacher wrote: > > Btw, I think the man page is wrong - given that the tmpfile is not > > visible in the namespace it is obviously not created in the directory. > > The directory passed in is just a handle for the filesystem it should be > > created in. > > I don't agree. If the file is created with O_TMPFILE | O_EXCL, it is clear > that the file will never be linked into the namespace. Even then, there are > operations which are affected by the inode permissions and label of the > anonymous file, and those should still behave reasonably. In this context, > I would expect them to behave as if the file was actually created in the > specified directory, not in the file system root or "nowhere" with no clearly > defined permissions and security label. So you want to define the files as being in a directory, but not actually visible? That's defintively a new and strange state to be in. > > Inheriting any ACL on creating an anonymous file seems utterly wrong. > > Why? Because it has no parent to inherit it from. From webmaster@getit20.livemailz.com Sat Apr 19 03:54:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2FA9B7F58 for ; Sat, 19 Apr 2014 03:54:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 10E158F8035 for ; Sat, 19 Apr 2014 01:54:04 -0700 (PDT) X-ASG-Debug-ID: 1397897637-04cbb06e9a18f150001-NocioJ Received: from server.livemailz.com (server.livemailz.com [115.124.106.32]) by cuda.sgi.com with ESMTP id QzdsthDNeWYVuNiN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 19 Apr 2014 01:53:59 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@getit20.livemailz.com X-Barracuda-Apparent-Source-IP: 115.124.106.32 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=getit20.livemailz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=HUBquU+UTasA9uj3u2xtaae3DP1q7QAFUlfOH+vxeEo=; b=yFZoH2u+mlpBbhsfiRxN5irCt6d8Tfazjr8Kn4UgK7p6afygmQEAPcyUSLfNdst67friHQjVIvUP21jhJ6AaKhWlWQDsaVC3QL+bLK6ulm0JBg7/kvEBKVoK9qmjCfO+HgnTueIYwARG1nIQMXCWNZoFofvrqlYPHKyZ/OTAox0=; Received: from getit20l by server.livemailz.com with local (Exim 4.82) (envelope-from ) id 1WbR23-0003Lu-DO for xfs@oss.sgi.com; Sat, 19 Apr 2014 14:23:55 +0530 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: getit20.livemailz.com/mailz/index.php for 66.249.79.236 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-79-236.googlebot.com [66.249.79.236] by getit20.livemailz.com with HTTP; Sat, 19 Apr 2014 08:53:54 +0000 Date: Sat, 19 Apr 2014 08:53:55 +0000 From: Webmaster Reply-To: Webmaster Message-ID: <5a5899d532dba9ad46650db447c93997@getit20.livemailz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@getit20.livemailz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.livemailz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [529 32007] / [47 12] X-AntiAbuse: Sender Address Domain - getit20.livemailz.com X-Get-Message-Sender-Via: server.livemailz.com: authenticated_id: getit20l/from_h X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/getit20l/public_html/mailz/index.php X-Source-Dir: getit20.livemailz.com:/public_html/mailz X-Barracuda-Connect: server.livemailz.com[115.124.106.32] X-Barracuda-Start-Time: 1397897639 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5063 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://getit20.livemailz.com/mailz/?p=subscribe and follow the steps. Thank you From service2@busbarlnsulator.com Sat Apr 19 06:47:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.7 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, FAKE_REPLY_C,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 01BD27F5D for ; Sat, 19 Apr 2014 06:47:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF3898F8033 for ; Sat, 19 Apr 2014 04:47:25 -0700 (PDT) X-ASG-Debug-ID: 1397908018-04cb6c2436196350001-NocioJ Received: from mail.busbarlnsulator.com ([199.192.156.137]) by cuda.sgi.com with ESMTP id WERYImFCHGV0NgsS for ; Sat, 19 Apr 2014 04:46:58 -0700 (PDT) X-Barracuda-Envelope-From: service2@busbarlnsulator.com X-Barracuda-Apparent-Source-IP: 199.192.156.137 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.busbarlnsulator.com CEE7AB5374 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=busbarlnsulator.com; s=busbarlnsulator; t=1397937297; bh=AvMALJJydqqiRvSpCqGEMkRXXhskvO9lUXHAuMdqvlU=; h=Reply-To:Message-ID:From:To:Subject:Date:MIME-Version: Content-Type; b=eAJvLJ3UKmMuTZIgftp0sXCsY7dozTwcBy/3mQXuOB2eYMHMJ7vRIKrlDlgjkPgiU Erz04C5I0LaWbs230stEX1roKEsJsCDecqDA8gFinQ6C/okuyDvfS7VYEuCvgrv7kv 81NU4G/JSThTiT9r0lXBqHE7uuxPXVE71SrMQH88= Reply-To: Message-ID: <2964E2ADD31940505AE87FACB4898032@hwwkbinp> From: "gifts" To: Subject: Re:silicone wristbands only need USD 0.031 Date: Sat, 19 Apr 2014 19:46:29 +0800 X-ASG-Orig-Subj: Re:silicone wristbands only need USD 0.031 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0910_0112C25D.1FA818E0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Barracuda-Connect: UNKNOWN[199.192.156.137] X-Barracuda-Start-Time: 1397908018 X-Barracuda-URL: http://192.48.176.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_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5066 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_0910_0112C25D.1FA818E0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 V2XigJlyZSBhIENoaW5lc2UgbWFudWZhY3R1cmVyLCBtYWlubHkgcHJvZHVjZSBzaWxpY29uZSBX cmlzdGJhbmRzIGFuZCBrZXljaGlhbnMgLGZvciB3cmlzdGJhbmRzLHdlIGNhbiBtYW51ZmFjdHVy ZSAxMDBrIHBjcy9kYXkgLHVuaXQgcHJpY2UgaXMgVVNEIDAuMDMxICwgd2UgY2FuIHNlbmQgZnJl ZSBzYW1wbGVzIGZvciB5b3UgdG8gY2hlY2sgb3VyIGdvb2QgcXVhbGl0eQ0KV2FpdGluZyBmb3Ig eW91ciB1cGRhdGUNCktpbmQgcmVnYXJkcyw= ------=_NextPart_000_0910_0112C25D.1FA818E0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIg aHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTM2Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIA0Kc3R5bGU9IlRFWFQt QUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEJBQ0tHUk9VTkQ6IHdoaXRlOyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tbWFyZ2luLXRvcC1hbHQ6IGF1dG87IG1zby1t YXJnaW4tYm90dG9tLWFsdDogYXV0byIgDQpjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IGJs YWNrOyBGT05ULVNJWkU6IDE4cHQ7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IOWui+S9kyIgDQpsYW5nPUVOLVVTPldl4oCZcmUgYSBDaGluZXNlIG1hbnVmYWN0 dXJlciwgbWFpbmx5IHByb2R1Y2UgPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAn VmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZTsgRk9OVC1TSVpFOiAxOHB0OyBtc28t Zm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiIA0KbGFuZz1F Ti1VUz5zaWxpY29uZSA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtU0la RTogMThwdDsgbXNvLWZvbnQta2VybmluZzogMHB0IiANCmxhbmc9RU4tVVM+V3Jpc3RiYW5kcyBh bmQga2V5Y2hpYW5zICxmb3Igd3Jpc3RiYW5kcyw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09MT1I6 IGJsYWNrOyBGT05ULVNJWkU6IDE4cHQ7IG1zby1mb250LWtlcm5pbmc6IDBwdCIgbGFuZz1FTi1V Uz53ZSBjYW4gDQptYW51ZmFjdHVyZSA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IGJsdWU7 IEZPTlQtU0laRTogMThwdDsgbXNvLWZvbnQta2VybmluZzogMHB0IiBsYW5nPUVOLVVTPjEwMGsg DQpwY3MvZGF5PC9TUEFOPjxTUEFOIHN0eWxlPSJDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMThw dDsgbXNvLWZvbnQta2VybmluZzogMHB0IiANCmxhbmc9RU4tVVM+ICx1bml0IHByaWNlIGlzIDwv U1BBTj48U1BBTiANCnN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1TSVpFOiAxOHB0OyBtc28tZm9u dC1rZXJuaW5nOiAwcHQiIGxhbmc9RU4tVVM+VVNEIA0KMC4wMzE8L1NQQU4+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IENPTE9SOiBibGFjazsgbXNv LWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TOyBtc28tYmlk aS1mb250LXNpemU6IDEwLjVwdCIgDQpsYW5nPUVOLVVTPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0 eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1TSVpFOiAxOHB0OyBtc28tZm9udC1rZXJuaW5nOiAwcHQi IGxhbmc9RU4tVVM+LCB3ZSBjYW4gDQpzZW5kIGZyZWUgc2FtcGxlcyBmb3IgeW91IHRvIGNoZWNr IG91ciBnb29kIHF1YWxpdHk8bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhU LUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBCQUNLR1JPVU5EOiB3aGl0ZTsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48 U1BBTiANCnN0eWxlPSJDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMThwdDsgbXNvLWZvbnQta2Vy bmluZzogMHB0IiBsYW5nPUVOLVVTPldhaXRpbmcgDQpmb3IgeW91ciB1cGRhdGU8L1NQQU4+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IENPTE9SOiBi bGFjazsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2T OyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdCIgDQpsYW5nPUVOLVVTPjxvOnA+PC9vOnA+PC9T UEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAw cHQ7IEJBQ0tHUk9VTkQ6IHdoaXRlOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNs YXNzPU1zb05vcm1hbCBhbGlnbj1sZWZ0PjxTUEFOIA0Kc3R5bGU9IkNPTE9SOiBibGFjazsgRk9O VC1TSVpFOiAxOHB0OyBtc28tZm9udC1rZXJuaW5nOiAwcHQiIGxhbmc9RU4tVVM+S2luZCANCnJl Z2FyZHMsPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAnVmVyZGFuYScsJ3NhbnMt c2VyaWYnOyBDT0xPUjogYmxhY2s7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQiIA0KbGFuZz1FTi1V Uz48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UD4mbmJzcDs8L1A+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_000_0910_0112C25D.1FA818E0-- From enwlinux@gmail.com Sat Apr 19 14:05:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 6DABA7F54 for ; Sat, 19 Apr 2014 14:05:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4428F304043 for ; Sat, 19 Apr 2014 12:05:30 -0700 (PDT) X-ASG-Debug-ID: 1397934328-04bdf045541b8ff0001-NocioJ Received: from mail-qg0-f49.google.com (mail-qg0-f49.google.com [209.85.192.49]) by cuda.sgi.com with ESMTP id AZUAQ37lXAg31zEa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 19 Apr 2014 12:05:28 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.49] Received: by mail-qg0-f49.google.com with SMTP id j5so1979114qga.22 for ; Sat, 19 Apr 2014 12:05:27 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=ApJ1H3HElU++kUYWuYOnsKzlL9hBUh992KLrB/1OmjM=; b=RkPWQPoQuMyiWhLGQJ5a25fb/cgZ3kiNoEWh6hLi1ebbWpq88W135uZU3QacE7GGvf JQpDg9S/Z7UzaJSxTVx9O/FNapYgWXWcWGkIUanJ4T2nsX4nriAUzSmJWG93xdW3UAoZ dkWaVKNQDGm7u6WhQ0lgzCBHLeIG4y3ToIHCr+0JQHyFya72G41cAJ2H4pfmNKTtCj/5 gWqSNp7qXga92a67CH0l5iNb2bYiHLwvkN3GRqcW8qq+1KhGZPDw3kv+gwQqIzfYO5sP +6CoSXddrAwJsOrgDy4oRsjimfM6X30MOTWlhPVGLmGrudgdg9T0tTzsWV1hV9GeJ4br 8q3A== X-Received: by 10.224.151.130 with SMTP id c2mr26821113qaw.67.1397934327706; Sat, 19 Apr 2014 12:05:27 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id 1sm35019996qal.29.2014.04.19.12.05.27 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 19 Apr 2014 12:05:27 -0700 (PDT) Date: Sat, 19 Apr 2014 15:05:24 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH] generic: fix check for zero range support in generic/009 Message-ID: <20140419190524.GA2116@wallace> X-ASG-Orig-Subj: [PATCH] generic: fix check for zero range support in generic/009 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-qg0-f49.google.com[209.85.192.49] X-Barracuda-Start-Time: 1397934328 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5070 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 Generic/001 fails when run on a file system that does not support byte range zeroing. For example, an EOPNOTSUPP failure occurs when the test is run on a pre-3.15 extent-mapped file system. The code in the test intended to prevent this contains an apparent typo that results in a check for fallocate() rather than zero range support. Signed-off-by: Eric Whitney --- tests/generic/009 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generic/009 b/tests/generic/009 index b7b0b3f..65abe3c 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -44,7 +44,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_os Linux -_require_xfs_io_falloc "fzero" +_require_xfs_io_command "fzero" testfile=$TEST_DIR/009.$$ -- 1.8.3.2 From enwlinux@gmail.com Sat Apr 19 14:08:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A0A4D7F58 for ; Sat, 19 Apr 2014 14:08:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 839F7304039 for ; Sat, 19 Apr 2014 12:08:20 -0700 (PDT) X-ASG-Debug-ID: 1397934498-04bdf045521b9320001-NocioJ Received: from mail-qa0-f45.google.com (mail-qa0-f45.google.com [209.85.216.45]) by cuda.sgi.com with ESMTP id mBNiWDtLrHKgo52C (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 19 Apr 2014 12:08:19 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.45] Received: by mail-qa0-f45.google.com with SMTP id cm18so2619826qab.32 for ; Sat, 19 Apr 2014 12:08:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=PicNx70b+YaGn41Kv03fMGiuOb4RFUcLLJpRR4WoACM=; b=sEM0Ymu9mVvdCMptVmTtKr0TUZ8D/9/aznEDsEcNSWcKw2a/rL/OSIJwP/EFEQQ25t t88f2iOn3CmIb6FNSzY+jVjfo8kIqKVLovYax/spA5cDnCrndyODQwRO3oKb+hHmWf+o 3JVzEx0ZatGdBzztnzVp9R7AJ9ON6ZNgW5lfS9KnUEOcfQb14X2lhHbAW81j4ynfeWs8 XebX3fNP1Vi4P/zIJvqtktD8BQtW9QFOZHH4ND4XkO2O0Sk3idNWMA2PbOnsyGRHQ2Lp uCA6vxrrMWeZY+3eK0WGaZE1KHC7rcKiJXgz622BuJje3fFDfLdawIRt2PTnpdiSv0WO GHCg== X-Received: by 10.224.92.197 with SMTP id s5mr4332682qam.93.1397934498242; Sat, 19 Apr 2014 12:08:18 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id j1sm57623174qan.32.2014.04.19.12.08.17 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 19 Apr 2014 12:08:17 -0700 (PDT) Date: Sat, 19 Apr 2014 15:08:15 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH] ext4: fix check for zero range support in ext4/001 Message-ID: <20140419190815.GB2116@wallace> X-ASG-Orig-Subj: [PATCH] ext4: fix check for zero range support in ext4/001 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-qa0-f45.google.com[209.85.216.45] X-Barracuda-Start-Time: 1397934498 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5070 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Ext4/001 fails when run on a file system that does not support byte range zeroing. For example, an EOPNOTSUPP failure occurs when the test is run on a pre-3.15 extent-mapped file system. The code in the test intended to prevent this contains an apparent typo that results in a check for fallocate() rather than zero range support. Signed-off-by: Eric Whitney --- tests/ext4/001 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ext4/001 b/tests/ext4/001 index d575d9a..827d806 100755 --- a/tests/ext4/001 +++ b/tests/ext4/001 @@ -45,7 +45,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_fs ext4 _supported_os Linux -_require_xfs_io_falloc "fzero" +_require_xfs_io_command "fzero" testfile=$TEST_DIR/001.$$ -- 1.8.3.2 From tytso@thunk.org Sat Apr 19 16:41:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C42FC7F61 for ; Sat, 19 Apr 2014 16:41:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66F47AC005 for ; Sat, 19 Apr 2014 14:41:54 -0700 (PDT) X-ASG-Debug-ID: 1397943711-04bdf045551c06c0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 7HdQHWawX6EbUDVr (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 19 Apr 2014 14:41:52 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Wbd1C-0006JE-LE; Sat, 19 Apr 2014 21:41:50 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id DA4755804CE; Sat, 19 Apr 2014 17:41:49 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397943709; bh=dShqz82Vi8dy+mq0mKJN7XEzLa/9pOBvVcQAqhfQSkA=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Y73cT6DRPb+RmCtPUIJEinvAD1pCHcuweUyQ8ZW990gFuEJFaszIIvnLCfpE0dTeY axImYArALrsLfppclj9SOBl84BLNkVTuf/w7se6L+a9Bx7octDzjJwTFxDnlirvh0f 2/urOShIqM3qU4towKeBS9UBvKEh6+ghR9vo311U= Date: Sat, 19 Apr 2014 17:41:49 -0400 From: Theodore Ts'o To: Eric Whitney Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH] generic: fix check for zero range support in generic/009 Message-ID: <20140419214149.GA11494@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] generic: fix check for zero range support in generic/009 References: <20140419190524.GA2116@wallace> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140419190524.GA2116@wallace> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397943712 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5073 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 Sat, Apr 19, 2014 at 03:05:24PM -0400, Eric Whitney wrote: > Generic/001 fails when run on a file system that does not support byte range > zeroing. For example, an EOPNOTSUPP failure occurs when the test is run > on a pre-3.15 extent-mapped file system. The code in the test intended > to prevent this contains an apparent typo that results in a check for > fallocate() rather than zero range support. > > Signed-off-by: Eric Whitney LGTM. Reviewed-by: "Theodore Ts'o" From tytso@thunk.org Sat Apr 19 16:42:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A596129DFD for ; Sat, 19 Apr 2014 16:42:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45E63AC009 for ; Sat, 19 Apr 2014 14:42:06 -0700 (PDT) X-ASG-Debug-ID: 1397943724-04cb6c24371b70c0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id R6gFMMtY1M9CC24T (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 19 Apr 2014 14:42:04 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Wbd1Q-0006JT-2n; Sat, 19 Apr 2014 21:42:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 56CAF5804CE; Sat, 19 Apr 2014 17:42:03 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=ef5046eb; t=1397943723; bh=B6/2WyaOX4rU2Q7JR9I23BGEDtqBG/93lpkH3u/IRpQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Xo5erak9C7Y6PbUbNyQwkolglyIs//GsvIMc0+Dd0zvYyVuIXO8hxhDp3ioDSRR3+ 1+5aqkGdCb86hsxF6qLaB+QaSTz6XSthD17h4ltjYy/G+bZRsRNTXfEwM2GK3VNo81 7KagzclNbx4ozaEZRQn+lKnLEClKksrFEbONc5JI= Date: Sat, 19 Apr 2014 17:42:03 -0400 From: Theodore Ts'o To: Eric Whitney Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH] ext4: fix check for zero range support in ext4/001 Message-ID: <20140419214203.GB11494@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] ext4: fix check for zero range support in ext4/001 References: <20140419190815.GB2116@wallace> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140419190815.GB2116@wallace> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1397943724 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, Apr 19, 2014 at 03:08:15PM -0400, Eric Whitney wrote: > Ext4/001 fails when run on a file system that does not support byte range > zeroing. For example, an EOPNOTSUPP failure occurs when the test is run > on a pre-3.15 extent-mapped file system. The code in the test intended > to prevent this contains an apparent typo that results in a check for > fallocate() rather than zero range support. > > Signed-off-by: Eric Whitney LGTM Reviewed-by: "Theodore Ts'o" From david@fromorbit.com Sat Apr 19 19:56:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA8D17F55 for ; Sat, 19 Apr 2014 19:56:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D79638F8035 for ; Sat, 19 Apr 2014 17:56:51 -0700 (PDT) X-ASG-Debug-ID: 1397955409-04cbb06e9b1be560001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 2CC4acGMZzfbcvDP for ; Sat, 19 Apr 2014 17:56:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoBmAAMaU1N5LEcvPGdsb2JhbABYgwaDZIUKolyZYoEZFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBQ0YAwcaE4gtAxDGJQ2GaxcWjDOBNWQHgySBFASXAIFtjH+JFCuBLA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Apr 2014 10:26:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wbg3q-0001ux-28; Sun, 20 Apr 2014 10:56:46 +1000 Date: Sun, 20 Apr 2014 10:56:46 +1000 From: Dave Chinner To: Eric Whitney Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH] generic: fix check for zero range support in generic/009 Message-ID: <20140420005645.GB15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] generic: fix check for zero range support in generic/009 References: <20140419190524.GA2116@wallace> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140419190524.GA2116@wallace> 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: 1397955409 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5076 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Sat, Apr 19, 2014 at 03:05:24PM -0400, Eric Whitney wrote: > Generic/001 fails when run on a file system that does not support byte range > zeroing. For example, an EOPNOTSUPP failure occurs when the test is run > on a pre-3.15 extent-mapped file system. The code in the test intended > to prevent this contains an apparent typo that results in a check for > fallocate() rather than zero range support. > > Signed-off-by: Eric Whitney > --- > tests/generic/009 | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tests/generic/009 b/tests/generic/009 > index b7b0b3f..65abe3c 100644 > --- a/tests/generic/009 > +++ b/tests/generic/009 > @@ -44,7 +44,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 > > # real QA test starts here > _supported_os Linux > -_require_xfs_io_falloc "fzero" > +_require_xfs_io_command "fzero" There should be a helper in common/rc for this. i.e. _require_xfs_io_fzero. There's helpers for everything else. Can you add the helper and wire the tests up to it properly? Cheers, Dave. -- Dave Chinner david@fromorbit.com From fdmanana@gmail.com Sun Apr 20 08:18:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 D70C77F57 for ; Sun, 20 Apr 2014 08:18:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B19978F8037 for ; Sun, 20 Apr 2014 06:18:18 -0700 (PDT) X-ASG-Debug-ID: 1397999892-04bdf045551e4d30001-NocioJ Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by cuda.sgi.com with ESMTP id 3QWreEjg5gKkDamn (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 20 Apr 2014 06:18:13 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@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 d1so1013888wiv.15 for ; Sun, 20 Apr 2014 06:18:12 -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=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NqXEnwSCy2PYJjXdElNXSyZuJA5rWpY18RwEGdpeNuc=; b=Fm4uKmm6p0hhoDGurMI1WYopnnLDfpYFjXg/yEK/bhjQYXdDr0xvQsu6xPihJ6KXQt TQe6eayDRfa903aGBMXoakCv7UqroeGoqZJqNf6DfF2Z5uZeFtw4nMnqb8nO074QFDzQ sjV89hwJQIwo3S3MDLNg8hzBEqSgPSGJ8b+bNghqSvSE2AlAcNT9B+douKSgsy/ZcxQA iBA55W4LyxuGICVUDbiPILFln3Ug6QSjnZHeWIkHMM4sllwYFDUcwfnlRObTtggA59oa Qye+8wg4QVWIBcRFdnvLX3MKYZVO/dGuwZWFondewa7hL2DEC3ZPeB0zZKziWXyF8YJK ffFg== X-Received: by 10.180.187.225 with SMTP id fv1mr10116072wic.14.1397999891853; Sun, 20 Apr 2014 06:18:11 -0700 (PDT) Received: from debian-vm3.lan (bl9-92-48.dsl.telepac.pt. [85.242.92.48]) by mx.google.com with ESMTPSA id h10sm9852514wix.2.2014.04.20.06.18.10 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 20 Apr 2014 06:18:10 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v4] xfstests: btrfs, test send's ability to punch holes and prealloc extents Date: Sun, 20 Apr 2014 15:17:03 +0100 X-ASG-Orig-Subj: [PATCH v4] xfstests: btrfs, test send's ability to punch holes and prealloc extents Message-Id: <1398003423-14200-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> References: <1397580201-27475-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-wi0-f182.google.com[209.85.212.182] X-Barracuda-Start-Time: 1397999893 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5088 Rule breakdown below pts rule name 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 verifies that after an incremental btrfs send the replicated file has the same exact hole and data structure as in the origin filesystem. This didn't use to be the case before the send stream version 2 - holes were sent as write operations of 0 valued bytes instead of punching holes with the fallocate system call, and pre-allocated extents were sent as well as write operations of 0 valued bytes instead of intructions for the receiver to use the fallocate system call. It also checks that prealloc extents that lie beyond the file's size are replicated by an incremental send. Signed-off-by: Filipe David Borba Manana --- V2: Addressed Dave's comments, and updated btrfs send invocation, by specifying the new command line option (-a) that enables use of fallocate - added function _require_btrfs_send_fallocate_flag() to skip the test when an old version of btrfs-progs is found. V3: Corrected use of fiemap with _filter_fiemap. Was passing -l instead of -v to fiemap, which resulted in output consisting only of a single line related to a hole instead of all holes and data extents (and I wanted to verify the falloc -k extents were preserved after the btrfs send). V4: Updated invocation of btrfs send, as the flag -a was removed from btrfs-send in favour of --stream-version=version common/rc | 9 ++++ tests/btrfs/047 | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/047.out | 35 +++++++++++++++ tests/btrfs/group | 1 + 4 files changed, 167 insertions(+) create mode 100755 tests/btrfs/047 create mode 100644 tests/btrfs/047.out diff --git a/common/rc b/common/rc index acf419b..a9d1c4c 100644 --- a/common/rc +++ b/common/rc @@ -2262,6 +2262,15 @@ _run_btrfs_util_prog() run_check $BTRFS_UTIL_PROG $* } +_require_btrfs_send_stream_version() +{ + $BTRFS_UTIL_PROG send 2>&1 | \ + grep '^[ \t]*\-\-stream\-version ' > /dev/null 2>&1 + if [ $? -ne 0 ]; then + _notrun "Missing btrfs-progs send --stream-version command line option, skipped this test" + fi +} + init_rc() { if [ "$iam" == new ] diff --git a/tests/btrfs/047 b/tests/btrfs/047 new file mode 100755 index 0000000..cc1936d --- /dev/null +++ b/tests/btrfs/047 @@ -0,0 +1,122 @@ +#! /bin/bash +# FS QA Test No. btrfs/047 +# +# Verify that after an incremental btrfs send the replicated file has +# the same exact hole and data structure as in the origin filesystem. +# This didn't use to be the case before the send stream version 2 - +# holes were sent as write operations of 0 valued bytes instead of punching +# holes with the fallocate system call, and pre-allocated extents were sent +# as well as write operations of 0 valued bytes instead of intructions for +# the receiver to use the fallocate system call. Also check that prealloc +# extents that lie beyond the file's size are replicated by an incremental +# send. +# +# More specifically, this structure preserving guarantee was added by the +# following linux kernel commits: +# +# Btrfs: send, use fallocate command to punch holes +# Btrfs: send, use fallocate command to allocate extents +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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" + +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_require_xfs_io_fiemap +_require_btrfs_send_stream_version +_need_to_be_root + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +$XFS_IO_PROG -f -c "pwrite -S 0x01 -b 300000 0 300000" $SCRATCH_MNT/foo \ + | _filter_xfs_io + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +$XFS_IO_PROG -c "fpunch 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc 100000 50000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "pwrite -S 0xff -b 1000 120000 1000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "fpunch 250000 20000" $SCRATCH_MNT/foo + +$XFS_IO_PROG -c "falloc -k 300000 1000000" $SCRATCH_MNT/foo +$XFS_IO_PROG -c "falloc -k 9000000 2000000" $SCRATCH_MNT/foo + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send --stream-version 2 $SCRATCH_MNT/mysnap1 \ + -f $send_files_dir/1.snap +_run_btrfs_util_prog send --stream-version 2 -p $SCRATCH_MNT/mysnap1 \ + $SCRATCH_MNT/mysnap2 -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -v" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap + +_scratch_unmount +_check_scratch_fs + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap + +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch +# List all hole and data segments. +$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo +# List all extents, we're interested here in prealloc extents that lie beyond +# the file's size. +$XFS_IO_PROG -r -c "fiemap -v" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/047.out b/tests/btrfs/047.out new file mode 100644 index 0000000..be39edc --- /dev/null +++ b/tests/btrfs/047.out @@ -0,0 +1,35 @@ +QA output created by 047 +wrote 300000/300000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1000/1000 bytes at offset 120000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +0: [0..495]: data +1: [496..519]: hole +2: [520..2543]: data +3: [2544..17575]: hole +4: [17576..21487]: data +5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo +Whence Result +DATA 0 +HOLE 102400 +DATA 118784 +HOLE 122880 +DATA 147456 +HOLE 253952 +DATA 266240 +HOLE 300000 +0: [0..495]: data +1: [496..519]: hole +2: [520..2543]: data +3: [2544..17575]: hole +4: [17576..21487]: data diff --git a/tests/btrfs/group b/tests/btrfs/group index 3a6d34e..d4e3fc1 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -49,3 +49,4 @@ 044 auto quick 045 auto quick 046 auto quick +047 auto quick -- 1.9.1 From info@chipandcartridge.com Sun Apr 20 13:35:22 2014 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6B5197F55 for ; Sun, 20 Apr 2014 13:35:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1F89304032 for ; Sun, 20 Apr 2014 11:35:21 -0700 (PDT) X-ASG-Debug-ID: 1398018902-04bdf045521f7f30001-NocioJ Received: from mail.chipandcartridge.com ([61.79.251.163]) by cuda.sgi.com with ESMTP id KupeRPvlcl7jlcsR for ; Sun, 20 Apr 2014 11:35:02 -0700 (PDT) X-Barracuda-Envelope-From: info@chipandcartridge.com X-Barracuda-Apparent-Source-IP: 61.79.251.163 Received: from 192.168.0.179 [192.168.0.179] by mail.chipandcartridge.com with ESMTP (SMTPD32-8.10) id A34640D0076; Mon, 21 Apr 2014 03:34:46 +0900 From: =?ks_c_5601-1987?B?TXVoYW4gUHJpbnRpbmc=?= Reply-To: =?ks_c_5601-1987?B?TXVoYW4gUHJpbnRpbmcgU29sdXQ=?= =?ks_c_5601-1987?B?aW9u?= To: =?ks_c_5601-1987?B?eGZz?= Subject: =?ks_c_5601-1987?B?QWJvdXQgRVBTT04gMTE4ODBfOTk=?= =?ks_c_5601-1987?B?MDBfOTcwMF9DSVNT?= Date: Mon, 21 Apr 2014 03:34:46 +0900 X-ASG-Orig-Subj: =?ks_c_5601-1987?B?QWJvdXQgRVBTT04gMTE4ODBfOTk=?= =?ks_c_5601-1987?B?MDBfOTcwMF9DSVNT?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary ="----=_NextPart_000_0339_24DE5D4.3D729B4" X-Priority: 1 X-Mailer: oss.sgi.com Message-Id: <201404210334513.SM01472@192.168.0.179> X-Barracuda-Connect: UNKNOWN[61.79.251.163] X-Barracuda-Start-Time: 1398018902 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 This is a multi-part message in MIME format. ------=_NextPart_000_0339_24DE5D4.3D729B4 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0340_24DE5D4.3D729B4" ------=_NextPart_001_0340_24DE5D4.3D729B4 Content-Type: text/plain; charset="ks_c_5601-1987" Content-Transfer-Encoding: base64 RGVhciBDdXN0b21lcnMgJiBQb3RlbnRpYWwgQ3VzdG9tZXJzDQpTdWJqZWN0IDogQWJvdXQgRVBT T04gMTE4ODAsIDk5MDAsIDk3MDAgQ0lTUw0KV2UgZW5jbG9zZWQgdGhlIHByb2R1Y3QgaW5mb3Jt YXRpb24gZmlsZSBhYm91dCBDSVNTIGZvciBFUFNPTiAxMTg4MCwgOTkwMCwgOTcwMCBQcmludGVy Lg0KDQpUaGlzIENJU1MgY2FuIHNhdmUgdGhlIFByaW50aW5nIEluayBDb3N0IGJ5IE1pbi4gODAg JS4NCg0KLiAgVGhpcyBTeXN0ZW0gaXMgdGhlIGZpcnN0IHJlbGlhYmxlIENJU1MgIGZvciBFUFNP TiAxMTg4MCAgDQogICAgRVBTT04gOTcwMCwgIEVQU09OIDc3MDAgaW4gdGhlIFdvcmxkDQouICBQ cm9kdWN0aW9uIEV4cGVyaWVuY2Ugb3ZlciBUaHJlZSBZZWFycw0KLiAgVGhpcyBDSVNTIGlzIGRp ZmZlcmVudCB3aXRoIFJlZmlsbGFibGUgQ2FydHJpZGdlDQouICBUaGlzIENJU1MgaXMgUmVsaWFi bGUgYW5kIENvbnZlbmllbnQgU3lzdGVtIGJhc2VkIG9uIA0KICAgRnJvbnQgQ29udHJvbCAgUGFu ZWwNCi4gIFRoaXMgU3lzdGVtIGNhbiBiZSBkb25lIHRoZSBQb3dlcmZ1bCBDb3N0IFNhdmluZyBh bmQgIA0KICAgb3BlcmF0ZWQgYnkgRWFzeSBDb250cm9sIFN5c3RlbQ0KLiAgSnVzdCBPbmx5IFB1 c2ggdGhlIFRvdWNoIEJ1dHRvbiBOZWVkbGVzcyB0byBSZXNldCBieSAgDQogICBSZXNldHRlciBm b3IgUHJpbnRpbmcgYWdhaW4gYWZ0ZXIgRW5kaW5nIFNpZ24NCg0KRm9yIG1vcmUgcHJvZHVjdHMs IHlvdSBjYW4gc2VlIGF0ICAiICBodHRwOi8vd3d3LmNoaXBhbmRjYXJ0cmlkZ2UuY29tL211aGFu cHJpbnRpbmcucGRmICAiDQoNCkJlc3QgUmVnYXJkcy4NCg0KQi5HLiBQYXJrDQoNCg0KTVVIQU4g RElHSVRBTCBDby4sIEx0ZCAgICAgICAgICAgICAgIEhFQURRVUFSVEVSUyAgJiAgR0lNUE8gRkFD VE9SWQ0KIzg0NiBNZWthem9uZSwgMTE3IEh3YW5nZ2V1bS1SbywgWWFuZ2Nob24tRXVwLCBHaW1w by1TaSwgR3llb25nZ2ktRG8sIEtvcmVhDQpUZWwgOiA4Mi0zMS05OTktNjkxMCAgICAgICAgRmF4 IDogODItMzEtOTk5LTY5MjANCkh0dHA6Ly93d3cuY2hpcGFuZGNhcnRyaWRnZS5jb20gICBFLU1h aWwgOiBpbmZvQGNoaXBhbmRjYXJ0cmlkZ2UuY29tDQpNVUhBTiBESUdJVEFMIENvLiwgTHRkICAg ICAgICAgICAgICAgV0hBU1VORyBGQUNUT1JZDQojMjYzLCBId2FyaUh5ZW9uLVJpLCBIeWFuZ05h bS1NeWVvbiwgSHdhc2VvbmctQ2l0eSwgR3llb25nR2kgUHJvdmluY2UsIEtvcmVhDQpUZWwgOiA4 Mi01MDItNTYwLTcwMDAgICAgICBGYXggOiA4Mi01MDItNTYwLTAwNzcNCi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t ------=_NextPart_001_0340_24DE5D4.3D729B4 Content-Type: text/html; charset="ks_c_5601-1987" Content-Transfer-Encoding: base64 PGh0bWw+DQo8aGVhZD4NCjxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0i dGV4dC9odG1sOyBjaGFyc2V0PWtzX2NfNTYwMS0xOTg3Ij4NCjx0aXRsZT5VbnRpdGxlZDwvdGl0 bGU+DQo8L2hlYWQ+DQoNCjxib2R5IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPg0KPERJVj48Rk9O VCA+PEZPTlQgY29sb3I9IzEzNTQ4OCBzaXplPTM+IDwvRk9OVD48L0RJVj4NCjxQPjxGT05UIGNv bG9yPSMxMzU0ODggc2l6ZT0zPkRlYXImbmJzcDtDdXN0b21lcnMgJiANClBvdGVudGlhbCBDdXN0 b21lcnM8L0ZPTlQ+PC9QPg0KPFA+PEZPTlQgY29sb3I9IzEzNTQ4OCBzaXplPTM+ICAgIA0KICAg U3ViamVjdCA6IEFib3V0IEVQU09OIDExODgwLCA5OTAwLCA5NzAwIA0KQ0lTUzwvRk9OVD48L1A+ DQo8RElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMTM1NDg4IHNpemU9Mz4gV2UgZW5jbG9zZWQgdGhl IHByb2R1Y3QgDQppbmZvcm1hdGlvbiBmaWxlIGFib3V0IENJU1MgZm9yIEVQU09OIDExODgwLCA5 OTAwLCA5NzAwIFByaW50ZXIuPC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMTM1NDg4 IHNpemU9Mz48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMxMzU0ODggc2l6 ZT0zPlRoaXMgQ0lTUyBjYW4mbmJzcDtzYXZlIHRoZSANClByaW50aW5nIEluayBDb3N0IGJ5IE1p bi4gODAgJS48L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMxMzU0ODggc2l6ZT0zPjwv Rk9OVD4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzEzNTQ4OCBzaXplPTM+LiZuYnNw OyBUaGlzIFN5c3RlbSBpcyB0aGUgDQpmaXJzdCByZWxpYWJsZSBDSVNTJm5ic3A7IGZvciBFUFNP TiAxMTg4MCZuYnNwOyA8QlI+Jm5ic3A7ICZuYnNwOyBFUFNPTiANCjk3MDAsJm5ic3A7IEVQU09O IDc3MDAgaW4gdGhlIFdvcmxkPC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMTM1NDg4 IHNpemU9Mz4uJm5ic3A7IFByb2R1Y3Rpb24gDQpFeHBlcmllbmNlIG92ZXIgVGhyZWUgWWVhcnM8 QlI+LiZuYnNwOyBUaGlzIENJU1MgaXMgZGlmZmVyZW50IHdpdGggUmVmaWxsYWJsZSANCkNhcnRy aWRnZTxCUj4uJm5ic3A7IFRoaXMgQ0lTUyBpcyBSZWxpYWJsZSBhbmQgQ29udmVuaWVudCBTeXN0 ZW0gYmFzZWQgb24gDQo8QlI+Jm5ic3A7Jm5ic3A7IEZyb250IENvbnRyb2wmbmJzcDsgUGFuZWw8 QlI+LiZuYnNwOyBUaGlzIFN5c3RlbSBjYW4gYmUgZG9uZSANCnRoZSBQb3dlcmZ1bCBDb3N0IFNh dmluZyBhbmQmbmJzcDsgPEJSPiZuYnNwOyZuYnNwOyBvcGVyYXRlZCBieSBFYXN5IENvbnRyb2wg DQpTeXN0ZW08QlI+LiZuYnNwOyBKdXN0IE9ubHkgUHVzaCB0aGUgVG91Y2ggQnV0dG9uIE5lZWRs ZXNzIHRvIFJlc2V0IGJ5Jm5ic3A7IA0KPEJSPiZuYnNwOyZuYnNwOyBSZXNldHRlciBmb3IgUHJp bnRpbmcgYWdhaW4gYWZ0ZXIgRW5kaW5nIFNpZ248L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGNv bG9yPSMxMzU0ODggc2l6ZT0zPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9 IzEzNTQ4OCBzaXplPTM+Rm9yIG1vcmUgcHJvZHVjdHMsIHlvdSBjYW4gDQpzZWUgYXQmbmJzcDsg IiZuYnNwOyA8L0ZPTlQ+PEEgDQpocmVmPSJodHRwOi8vd3d3LmNoaXBhbmRjYXJ0cmlkZ2UuY29t L211aGFucHJpbnRpbmcucGRmIj48Rk9OVCBjb2xvcj0jMTM1NDg4IA0Kc2l6ZT0zPmh0dHA6Ly93 d3cuY2hpcGFuZGNhcnRyaWRnZS5jb20vbXVoYW5wcmludGluZy5wZGY8L0ZPTlQ+PC9BPjxGT05U IA0KY29sb3I9IzEzNTQ4OCBzaXplPTM+Jm5ic3A7ICI8QlI+PC9GT05UPjwvRElWPg0KPERJVj48 Rk9OVCBjb2xvcj0jMTM1NDg4IHNpemU9Mz5CZXN0IFJlZ2FyZHMuPC9GT05UPjwvRElWPg0KPERJ Vj48Rk9OVCBjb2xvcj0jMTM1NDg4IHNpemU9Mz48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWPjxG T05UIGNvbG9yPSMxMzU0ODggc2l6ZT0zPkIuRy4gUGFyazwvRk9OVD48L0RJVj4NCjxESVY+PEZP TlQgY29sb3I9IzEzNTQ4OCBzaXplPTM+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBj b2xvcj0jMTM1NDg4IHNpemU9Mz48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05UID4gPEZP TlQgY29sb3I9IzEzNTQ4OCBzaXplPTM+TVVIQU4gRElHSVRBTCBDby4sIA0KTHRkJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KSEVBRFFVQVJURVJTJm5ic3A7ICYmbmJzcDsgR0lNUE8gRkFD VE9SWTxCUj4jODQ2IE1la2F6b25lLCAxMTcgSHdhbmdnZXVtLVJvLCANCllhbmdjaG9uLUV1cCwg R2ltcG8tU2ksIEd5ZW9uZ2dpLURvLCBLb3JlYTxCUj5UZWwgOiANCjgyLTMxLTk5OS02OTEwJm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZheCA6IA0KODItMzEtOTk5 LTY5MjA8QlI+PC9GT05UPjxBIGhyZWY9Imh0dHA6Ly93d3cuY2hpcGFuZGNhcnRyaWRnZS5jb20i PjxGT05UIA0KY29sb3I9IzEzNTQ4OCBzaXplPTM+SHR0cDovL3d3dy5jaGlwYW5kY2FydHJpZGdl LmNvbTwvRk9OVD48L0E+PEZPTlQgDQpjb2xvcj0jMTM1NDg4IHNpemU9Mz4mbmJzcDsmbmJzcDsg RS1NYWlsIDogPC9GT05UPjxBIA0KaHJlZj0ibWFpbHRvOmluZm9AY2hpcGFuZGNhcnRyaWRnZS5j b20iPjxGT05UIGNvbG9yPSMxMzU0ODggDQpzaXplPTM+aW5mb0BjaGlwYW5kY2FydHJpZGdlLmNv bTwvRk9OVD48L0E+ICANCjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzEzNTQ4OCBz aXplPTM+TVVIQU4gRElHSVRBTCBDby4sIA0KTHRkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 IA0KV0hBU1VORyBGQUNUT1JZPEJSPiMyNjMsIEh3YXJpSHllb24tUmksIEh5YW5nTmFtLU15ZW9u LCBId2FzZW9uZy1DaXR5LCBHeWVvbmdHaSANClByb3ZpbmNlLCBLb3JlYTxCUj5UZWwgOiA4Mi01 MDItNTYwLTcwMDAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRmF4IDogDQo4Mi01MDIt NTYwLTAwNzc8L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMxMzU0ODggDQpzaXplPTM+ LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L0ZPTlQ+PC9ESVY+DQo8 RElWPjxGT05UIGNvbG9yPSMxMzU0ODggDQpzaXplPTM+PC9GT05UPjwvRElWPjwvRk9OVD48L0RJ Vj4NCg0KPC9ib2R5Pg0KDQo8L2h0bWw+DQoNCg0KDQoNCg== ------=_NextPart_001_0340_24DE5D4.3D729B4-- ------=_NextPart_000_0339_24DE5D4.3D729B4 Content-Type: application/octet-stream; name= "( EPSON 11880_9900_9700 CISS )_Muhan Printing Solution.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="( EPSON 11880_9900_9700 CISS )_Muhan Printing Solution.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIv TGFuZyhrby1LUikgL1N0cnVjdFRyZWVSb290IDkzIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0 cnVlPj4+Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDIvS2lkc1sg MyAwIFIgNDcgMCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50 IDIgMCBSL1Jlc291cmNlczw8L1BhdHRlcm48PC9QNiA2IDAgUi9QMTUgMTUgMCBSL1AyNCAy NCAwIFIvUDQwIDQwIDAgUi9QNDIgNDIgMCBSPj4vRm9udDw8L0YxIDE2IDAgUi9GMiAyMCAw IFIvRjMgMjYgMCBSL0Y0IDI4IDAgUi9GNSAzMCAwIFI+Pi9YT2JqZWN0PDwvSW1hZ2UxOCAx OCAwIFIvSW1hZ2UyMiAyMiAwIFIvSW1hZ2UyNSAyNSAwIFIvSW1hZ2U0MyA0MyAwIFIvSW1h Z2U0NSA0NSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0g Pj4vTWVkaWFCb3hbIDAgMCA1NDAgNzgwXSAvQ29udGVudHMgNCAwIFIvR3JvdXA8PC9UeXBl L0dyb3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJl bnRzIDA+Pg0KZW5kb2JqDQo0IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3Ro IDExNzE+Pg0Kc3RyZWFtDQp4nO1WS28bNxC+L6D/MKeCG0QU39wFggCK7CQK7FSpZPhQ9KBI sqLWWrlrCYH/fWfIXT0s2XKtSw+9cPmY4XJmvu8jodWDd+9al53uGYj37+HDWQf+biQCBBdC yExLCdYI8JmActJIrt9A0UhaveFyOSkLGN1Dq+fgflSsfYRwUpgdp5s3jeRbI/m3+0pbb+yt 5E4FB5Vx7e32tnB+2QHYikO2LobFFNikaF71062g4vGEMR7Egb9/GOAJPkqQGQxuGolEIwE4 NDzL8Ag5VwoGc1qYUvOpkfzOOj9SzWZ3kGZsWIyhMyyX5Ww8nUDatAxwDTvqv9MxmrVvb9Om 3kzeLEpIZc6uU6PYbDxJmyYsflyU8+ESaNgrZ8VyRsbFNP0DBl8ayfngcO7VizFkLS5nIcc6 49JB03LETdNz5/McRpjoVnc+nE6wHGcLOPQzfVKhFSDAdgqNIMNzeJ7v1/knRp+tW0wjx27O OmHiBybUMkyQ1uwu9IehLUI7Dm20jPMltoYtg33sR99oOQ0t1kH56i+j0F+E+XmYgd0yvD5m lSlu5OGYf0MUTFITQgp/p8MqtpyMCe7faeIBlwFhxS6v0PhzO7XsawSW1Oys+6k7SJ1jbZy6 SCUCsIMGYSf+ljyJJBc0XI6P4Mrs4eqAzlTAkoKbCCyVB/p6h5yWPNsCFVL5CVDZU9VD7STY SM2NAq8ddzqkWFCKRUzxR0poRcBZQelAOmKJczYkwmHai0hWJaru7cORTLnqyLGS0pF4GQwe RVMLx5UFZcOollAJP6uSo8+fUPu4jGzn23uQ8N42kn4jSYzSXOqNUTXeNSJPjTt57tdGmIQ4 3rWpTrgxqiai1V6Q/pVXlTL1leK85jba50dvlOwkTGhQgqRtV2sE1xY8VsQHVCBqSozEemV9 LMiGiNepRIkYp1IgHwMackQOcdIzRIt0qCuoJ6jagvWQYeUMhwUuLhFTuDolz+AVVhc0HCOF V8TJUepQijy7P4Kr/KQcmEM5wCtVIzVJd/eYcTkMdFjdDEdBdFYl8cOwKcYRlMOwX+BbG8UH SfE9JSl6/vxSnBQA0ubR6ZXh1oBT3Jn90199bgchjBroLWtfpJZ0G6ndWfC34eq9OCp7UtZs 1ppIKK0hthwmclIbZaIi3NorfGrqGkFU3VjVEztW5KrjXmpt5XQ98cgqHmvLKk48wV758lfC Ln1x+XUvwtNeCv8/CU95Esr9u/uF1VZ1tW0eQEcOGd6jyMRnq33qFX5AqhDnFk+cZ/R5zPbz Xv/Xr1U2mUytZDKjYmeCWuQ6vt7ynPqinpGW5X4zAyTT0On2+3Asm+6p4J5PLT6FOOYthOMV vbwliQiqWkYCtnkZGf3Uy0i+/NbVPiNpp79Zx60CfGbiJZ9bVPqtX9knf3XajUt3C8/dbgnx rSIQQygXmdsn7YLKgJAuVgvC9+oe8E7sFn+F6vRXd3fUuX0I4O8/3C8n86OVOu3GPBgDXpUY gsi52w8hoBDSHBFoqEFGZ+tGRIJLz6AFsY/xrF1ymvJrw8o6j1a1R2VtouG29X4i/gHiFVbW DQplbmRzdHJlYW0NCmVuZG9iag0KNSAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDAvU2l6ZVsg MTAyMl0gL0RlY29kZVsgMCAxIDAgMSAwIDFdIC9SYW5nZVsgMCAxIDAgMSAwIDFdIC9CaXRz UGVyU2FtcGxlIDgvRG9tYWluWyAwIDFdIC9FbmNvZGVbIDAgMTAyMV0gL09yZGVyIDEvRmls dGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyNT4+DQpzdHJlYW0NCnic7cEBDQAAAMKg/qlvDwcU AADwb40R7qwNCmVuZHN0cmVhbQ0KZW5kb2JqDQo2IDAgb2JqDQo8PC9QYXR0ZXJuVHlwZSAy L1NoYWRpbmc8PC9Db2xvclNwYWNlL0RldmljZVJHQi9TaGFkaW5nVHlwZSAyL0Nvb3Jkc1sg MTM2NS4xMiAxMTQ4LjE2IC05NS4wNCAxMzcuMjhdIC9FeHRlbmRbIHRydWUgdHJ1ZV0gL0Z1 bmN0aW9uIDUgMCBSPj4+Pg0KZW5kb2JqDQo3IDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMy9E b21haW5bIDAgMV0gL0VuY29kZVsgMSAwIDEgMCAxIDAgMSAwIDEgMCAxIDAgMSAwXSAvQm91 bmRzWyAwLjM1IDAuNDQgMC41IDAuNSAwLjU2IDAuNjVdIC9GdW5jdGlvbnNbIDggMCBSIDkg MCBSIDEwIDAgUiAxMSAwIFIgMTIgMCBSIDEzIDAgUiAxNCAwIFJdID4+DQplbmRvYmoNCjgg MCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAyL0RvbWFpblsgMCAxXSAvQzFbIDAgMCAwXSAvQzBb IDAuMDk0MTE4IDAuMTA5OCAwLjc4MDM5XSAvTiAxPj4NCmVuZG9iag0KOSAwIG9iag0KPDwv RnVuY3Rpb25UeXBlIDIvRG9tYWluWyAwIDFdIC9DMVsgMC4wOTQxMTggMC4xMDk4IDAuNzgw MzldIC9DMFsgMC40MzkyMiAwLjAxOTYwOCAwLjgzMTM3XSAvTiAxPj4NCmVuZG9iag0KMTAg MCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAyL0RvbWFpblsgMCAxXSAvQzFbIDAuNDM5MjIgMC4w MTk2MDggMC44MzEzN10gL0MwWyAwLjMwMTk2IDAuNDE1NjkgMC45OTIxNl0gL04gMT4+DQpl bmRvYmoNCjExIDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAw LjMwMTk2IDAuNDE1NjkgMC45OTIxNl0gL0MwWyAwLjMwMTk2IDAuNDE1NjkgMC45OTIxNl0g L04gMT4+DQplbmRvYmoNCjEyIDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAg MV0gL0MxWyAwLjMwMTk2IDAuNDE1NjkgMC45OTIxNl0gL0MwWyAwLjQzOTIyIDAuMDE5NjA4 IDAuODMxMzddIC9OIDE+Pg0KZW5kb2JqDQoxMyAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDIv RG9tYWluWyAwIDFdIC9DMVsgMC40MzkyMiAwLjAxOTYwOCAwLjgzMTM3XSAvQzBbIDAuMDk0 MTE4IDAuMTA5OCAwLjc4MDM5XSAvTiAxPj4NCmVuZG9iag0KMTQgMCBvYmoNCjw8L0Z1bmN0 aW9uVHlwZSAyL0RvbWFpblsgMCAxXSAvQzFbIDAuMDk0MTE4IDAuMTA5OCAwLjc4MDM5XSAv QzBbIDAgMCAwXSAvTiAxPj4NCmVuZG9iag0KMTUgMCBvYmoNCjw8L1BhdHRlcm5UeXBlIDIv U2hhZGluZzw8L0NvbG9yU3BhY2UvRGV2aWNlUkdCL1NoYWRpbmdUeXBlIDIvQ29vcmRzWyA0 OTAuOTMgMTE0OC40NyAxOTYuMzYgNjM4LjI2XSAvRXh0ZW5kWyB0cnVlIHRydWVdIC9GdW5j dGlvbiA3IDAgUj4+Pj4NCmVuZG9iag0KMTYgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBl L1RydWVUeXBlL05hbWUvRjEvQmFzZUZvbnQvVGltZXMjMjBOZXcjMjBSb21hbixCb2xkSXRh bGljL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciAxNyAwIFIvRmly c3RDaGFyIDMyL0xhc3RDaGFyIDEyMS9XaWR0aHMgMTc2IDAgUj4+DQplbmRvYmoNCjE3IDAg b2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL1RpbWVzIzIwTmV3IzIwUm9t YW4sQm9sZEl0YWxpYy9GbGFncyAzMi9JdGFsaWNBbmdsZSAtMTYuNC9Bc2NlbnQgODkxL0Rl c2NlbnQgLTIxNi9DYXBIZWlnaHQgNjc3L0F2Z1dpZHRoIDQxMi9NYXhXaWR0aCAxOTQ4L0Zv bnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUwL0xlYWRpbmcgNDIvU3RlbVYgNDEvRm9udEJCb3hb IC01NDcgLTIxNiAxNDAxIDY3N10gPj4NCmVuZG9iag0KMTggMCBvYmoNCjw8L1R5cGUvWE9i amVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDE1MjgvSGVpZ2h0IDEwNi9Db2xvclNwYWNlL0Rl dmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvSW50ZXJwb2xhdGUgZmFsc2UvU01hc2sgMTkg MCBSL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTYzOD4+DQpzdHJlYW0NCnic7d3ZcxzX dcdxV/kpi1yWniiBJLYBBpgZJk5SsZO4koc8Oonj3bIlS6J2UqK4gwSxECDIAQkMuBMkJW/5 TzPsCREQ0zPo2+f8zj2353fqW6nIlZIdedDd98PTg299i8PhcDgcDofD4XA4HA6Hw+FwOBwO h8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4 HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcFzMa6/V85pLtnm2r0aCNatSK81O sFf7Gw995zvd/nYk+94I9HdV7+/7e+21EekfGGOjV/Qrj6Ni34BSKfqjiLeiP39iG/C0/z1d 53njjR/WaufFXVDqorhLwmZmLotbUOqKuKsaLWp0DdYSpmVhs7MrSq2Ku164NaXWNbqh0Ya4 m+JuyavXu7VhbWK6Le6OUluYtpXqwNrR6K64e/3Nztp337wH4h7CesSYp3Af9UHJfzyHhLuq RLl4Fu/ugTTuIENSucflhrsvD7r7az1R9Ad6BNrSe0jLrfizosojK+4Z+1ZueY/6m9PTS7rO 8/rr33/zzR/Pzi6Iu6LR1ZAWhdXr1zRaEres1Iq4VXHXbVsTt67Ujbk5YRtK3SzcLXFtpTbF 3dbojrgtefPz24F1xO2Iu6vRPXH3kT0Q99Bxj5R63N/cnLwn4naRPRX3DNlzxjwF/bTnJv8J zQ16VZFf9Aalck3OT+9WUjDcPVF+x89N/bliyN9cN/kTWm5BT4nyh9WdwMfj0Afyg4U8/3ea zSczM9fVnefIkR+Njf2yXl8MyZJHdBhkbm5F3KpG18WtiVtXyt4xiiMGCjfm59tKbYq7Xbg7 Sm2Jk14zMdARjTsajQPdC+y+uAfiHmr0SNxjZE/E7SJ7Ku6ZSvPzKj0X9zWsbzT6Paw/MOYm 3Od8UCo/noPCXVXkV7whaV2WX2nALUB+J7JP6y4sf0goHvRpR/4wNqigZ0L5o2nQk3Dos3dO MrO622rttlrParU1bef5xyNHfvTWWz89duxdJLOYbpVoWEq6nAIyFmtO8bElIqEVNLxE0RUP lrKT4upICLPg+AV3+4byC/R5yYOxQPnlubivh+SATaDHRvlR94/I/sSY46Af/txSZKsEbKrv yi+/rZRI5w8jbG0K9Cc7RKT4iKS4DdX9u7Vaz06c+BrqPEePvj0+fnJublmW/XqMkw0ZFdXx 4Dmj++5PmoADUh2556iQjgfPuaekOvZLMh6IhpswrpWmWN8MyYHS4I51zh3mz4x5qjKINLpY NOA6L7+JBEUsGjUsGmnneYk838Cc5/t7znP8+HuTk58avtmksnVzfX5+Tdy6RjfEbYi7qdSt wnl4fUln06bRuKPRlrjtkDoa7Yjrf/+oXPLNSQ/vMT1oNh+G9EjcY42eiNtV6immZ0o9x/S1 Rt+I+31ujYa8P2j0R1h/0ujPsP6HieM/XvQ/RlwqP5794a4nf1S64g1K5Zp8MI07SGgqN77c QHfq53rPEv2BHn56aT2hHSj0QVH+sBr0eBz0NJ4f8n2xB63W0wx59pxH+ft5vvvdH2TO87Oj R39z/Ph7ExMfTU19gYEdD56jpToeSEdFdYp7jh/V0Xlzygfp2KuOnHRUVMeD5+iojq3naKmO nHRUVAf6SOPWc7RUB0U6blQHegQj6TBWsGqQDhR20iOdGKqDIx2c6uBIB6c6IM8poToqfwRp qjolFnskB5AMeZ6fOPF11vPuX9Zqq9rO8/0DzjM5eWp6+qyH7Z35+QMReeg8ZZyn0VDJ0oWC 8Me5C8lRyK8LNZtDkv8hAl3IzIugz3IeUCjfhYa/k1UsrUMH6Ijkx4WMsYixEkGNxRJeoPaC gheNC3LAu1dgeKG9+LQXM6XReoIt/sw8/Jk8Jw20KX8w6f5Tyt7YesV51H/f1gDnOVOrXTD7 ImXfX7xTmS9SHpUv3nGwL5TiF/JofS2Ph+/k0flaHuNXvbI8fCcPvzk5+hf1oL6Tx80vnAJ9 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 KeajzIfud0Rx0lXtbxyfPrP45dffLF+5chWAdndl+fKlry6cPX1yfKSvuzOJMh0fup/JxsVy fbjRnJ6bXzi/uLT0OQDtbmlxceHs/MzU0ZGBWikfZzZ1P4rzpUrf8KGJyamZU7NzpwFoe3Nz s59OTzXHD/bXy4VcnOlo6f76y26hVO0dGD00dmSi2WweA6DdNZsTR8cbo0P91XIxF0cdH7q/ /rKbiXOFrkqtb2BweGRkFIA0GBkeGuzrqXYXC0k205r995eebFIolsqV/bVaHYB0qNX2V7pL hXwSZTZ3fyP8cS7fWSx1AZAapVLnWvXjbMujbsuJf638SS6XByA1crlkrfrb/vZbyp+NAUiT bPS++tuyv3Hr2RABkA4bWd+5+hu//ACk0M7VBwAAAAAA2sZ/2bxxJg0KZW5kc3RyZWFtDQpl bmRvYmoNCjIwIDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0Yy L0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9tYW4sSXRhbGljL0VuY29kaW5nL1dpbkFuc2lF bmNvZGluZy9Gb250RGVzY3JpcHRvciAyMSAwIFIvRmlyc3RDaGFyIDMyL0xhc3RDaGFyIDEy MS9XaWR0aHMgMTc3IDAgUj4+DQplbmRvYmoNCjIxIDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNj cmlwdG9yL0ZvbnROYW1lL1RpbWVzIzIwTmV3IzIwUm9tYW4sSXRhbGljL0ZsYWdzIDMyL0l0 YWxpY0FuZ2xlIC0xNi40L0FzY2VudCA4OTEvRGVzY2VudCAtMjE2L0NhcEhlaWdodCA2OTQv QXZnV2lkdGggNDAyL01heFdpZHRoIDE4MzEvRm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAv TGVhZGluZyA0Mi9TdGVtViA0MC9Gb250QkJveFsgLTQ5OCAtMjE2IDEzMzMgNjk0XSA+Pg0K ZW5kb2JqDQoyMiAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGgg MTQxOC9IZWlnaHQgODA4L0NvbG9yU3BhY2UvRGV2aWNlUkdCL0JpdHNQZXJDb21wb25lbnQg OC9GaWx0ZXIvRENURGVjb2RlL0ludGVycG9sYXRlIHRydWUvU01hc2sgMjMgMCBSL0xlbmd0 aCA4MTUyMj4+DQpzdHJlYW0NCv/Y/+AAEEpGSUYAAQEBAGAAYAAA/+EANkV4aWYAAElJKgAI AAAAAgABAwUAAQAAACYAAAADAwEAAQAAAAAoKP8AAAAAoIYBAI+xAAD/2wBDAAgGBgcGBQgH BwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4z NDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjL/wAARCAMoBYoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ WmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD xMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAA AAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMi MoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldY WVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6 wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5/ooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooxS4oASilxS7aAG0U7bS7KAGUVJspfLPpQBFRiphEf SnCE+lAEGKMGrHkH0pwt29KAKu2jbVwWzelOFq3pQBR20u2r32RvSlFm3pQBR2UbK0RZN6U4 WLelAGZso2VqfYW/u0fYW/umgDL2UbK1PsLf3TR9hb+6aAMvYaNlan2Fv7po+wt/dNAGXso2 VqfYW9KPsLf3aAMvZRsrU+wt/do+wt6UAZeyk21pmxb0phs2HagDP20m2r5tG9KT7K3pQBR2 mjFXDbN6U027elAFXFJirRgPpTfJPpQBXxRU/lH0ppjPpQBFRUhSk2UAMop+2k20ANopdtGK AEooxRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFLil20ANop4SlEZoAjpcVMIj6U 8QMe1AFbbS7auLbMe1SrZse1AGeEpwjJ7VqJYMe1TpprH+GgDGER9KcICe1byaUx/hqwmkMf 4aAOcFux7U8WrHtXUx6Kx/hq1HobH+GkByC2THtUi2Leldomgn+5+lWU0An+CgDhl09j/DUy 6Y392u8j8PH+5+lWo/Dx/ufpQB58ulsf4amXSGP8NeiR+Hf9irUfh3/YoA82XR2/u1Kuit/d r0xfDv8AsVMnh3/Y/SgDzNdEb+7Uo0Nv7tenp4eH9z9KlXw+P7n6UAeWjQj/AHf0qVNBb+5+ leojw+P7n6VIugD+5QB5imgH+5+lSjw+f7leoJoK/wBypRoS/wBz9KAPLP8AhHz/AHKP+EfP 9yvVf7CX+7+lH9hL/coA8q/4R8/3KP8AhHz/AHK9V/sJf7lH9hL/AHKAPKv+EfP9yj/hHz/c r1X+w1/uUf2Ev9ygDyr/AIR8/wByj/hHz/cr1X+w1/ufpR/YS/3KAPKv+EfP9ykPh8/3K9W/ sJf7n6Uh0Jf7lAHkzaAf7n6VA+gn+5Xrj6Cv9yoH0Af3KAPJDoTf3f0ph0Jv7tesN4fH9z9K YfD4/ufpQB5O2iN/dqBtFb+7XrT+Hh/cqB/Do/ufpQB5O2jN/dqJtIYfw16s3h0f3Kgfw7/s UAeVNpTf3aibTG/u16jJ4d/2KqyeHT/c/SgDzNtOYdqiawYdq9Ik8PH+5+lVX8Pn+5QB56bJ h2qM2jDsa72TQW/uVWk0Jh/D+lAHEG2b0phgPpXYSaKw/hqs+jsP4aYHKmI+lNMZ9K6R9KYf w1A+mMP4aAMEpSba2H09h2qBrJh2oAzdtJirzWrDtURgYdqAKuKKnMRHammMjtQBFRTylJto AbRS4pKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAop cUBaAEop4SniMntQBFilC1YWAntUyWrHtQBSCU8RE9q0o7Fj2q3HpjH+GgDFWAntUq2rHtXQ xaQx/hq/DojH+GgDlksie1WI9PY/w12MGgk4+StGDw8ePkpAcNHpbH+Grcejsf4a7+Hw7/sV oQ+Hf9igDzyLRGP8NXYtBJ/h/SvRofDw/ufpV+LQAP4KAPOIvD5P8FXYvDx/uV6RFoSj+Crc eiqP4aAPOYvDv+xV2Lw7/sV6EmkKP4asJpaj+GgDgY/Dw/ufpVuPw8P7ld0unKP4amWwX+7S A4mPQAP4KspoSj+CuxWyUdqkFoo7UAckmhqP4asJoyj+GuoFsvpThbj0oA5xdIUfw1MulKP4 a3xAB2pwiHpQBhLpi/3akXTVH8NbXlj0pfLFAGQNPX+7TxYL6VqhBS7KAMsWC/3acLFR2rS2 D0o20AZ4s19Kd9kX0q+FHpRtoAo/ZFo+yrV7aKNooAo/ZFo+yLV7aKNooAo/ZVo+yr6Ve2ik 20AUvsi0fZVq9to20AUfsi0G0X0q9to20AZ5s19KYbIHtWmVFGygDKNgvpSGwX0rV2CjYKAM dtPU9qjbTlP8NbhjFN8ugDBOmKf4ajbSlP8ADXQ+UKDEPSgDmX0hf7tQPoyn+GurMIPammBT 2oA459EU/wANV30Jf7ldsbdfSmG1U9qAODk0Af3KqyeHx/dr0M2a+lRNYKe1AHm0nh4f3P0q nL4d/wBivT205T/DUL6Yp/hoA8ql8O/7FUpfDx/ufpXrT6Sp/hqtJoyn+GgDyGXw+f7lUZdB I/hr2GXQ1P8ADVKXQVP8FMDx2XRGH8NU5NHYfw16/N4fHPyfpVCbw9/sUAeSSaUw/hqtJpzD +GvVJvD3+xWdN4eP9ygDzR7EjtVdrUjtXoU2gEZ+Ws+bRGGfloA4hoCO1RmIjtXWS6Ow/hql LpjD+GmBzxSmla2JLBh2qs9oR2oAz8UmKttbkdqjaIjtQBBRUhSmlaAG0UuKSgAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAopcUoWgBtLinhKkWEntQBCFpwSraWpParcVgzfw0AZqwk9qmS2J7VuQ6U zfw1pW+iscfLSA5mOyY9qtRaax/hrsLfQScfJWrb+Hjx8n6UAcTDpDN/DWlBobNj5a7u28Pd PkrXttAAx8lAHA2+gE4+StS38PdPkrv4NDUY+StKHRlGPl/SgDgoPDvT5K1IPDw/ufpXbxaU o/hFXI9OUdqQHHQ6Co/grQi0RR/DXUpZKO1TLbAdqAOdi0dR/DVqPS1H8NbogA6CnCIelAGU mnKP4anSxUdq0BGKdtFAFJbRR2qQW6+lWsUuKAK4gHpThEBU2KAKAIhGKXYKkxRigBmz2pdo p1JQAmKMUtFACYowKWigBKXFFGKADFFFFABRRRQAUUUUAFFFFABikpaKAExRS0YoATFLRS4o ATFGKWigAxR2oooAMUUUUAJRS0UAJRiiigBMUYpaKAG4o206koAbtFJsp9FAEZQU0xipqMUA VzCD2pjW4ParWKMUAUmtlPaomslPatLbSbKAMZ9PU9qryaYp/hrfMYpvlCgDmJNIU/w1Tl0V T/DXYmEelRtbg9qAODm0JT/BWbPoA5+T9K9IezU9qryWCntQB5bP4e6/J+lZdx4e6/JXrkum Kf4aoy6Op/hoA8dn0AjPyVmT6Gwz8teyz6Ipz8tZdxoAOfkpgeOTaOwz8tUJdMYZ+WvXbjw/ 1+Ssi58P9fkoA8sksWHaqz2pHavRbjQSM/JWXPojDPy0AcQ0BHaozGR2rqJ9JZc/LWfLp7L2 pgYhWkxWhJaEdqgaAigCrRUpjI7UwrQA2ilxSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFKBQAlGKeEqRYie1AEQWnBM1bjtie1W4rBm7UAZ qwk9qnS1J7VtwaUzfw1q22iMcfLSA5qKwZu1aEGlM2PlrrrXQCcfLW5aeH+nyUAcVbaIxx8t bNroJOPlrt7XQAMfJ+lbVtoajHy0XA4m18P9PkrZtvD44+Suzg0hR/DWhDpqj+GlcDk7fQgM fJWlBowGPlrpUslHap1t1HagDDh0pR/DV6OwVe1aYiA7U8IKAKSWijtVhbcDtVgLSgUARrEP SniMU4UtIBNg9KXGKXNGaYCYpaKKQBRRmimAUUUUAFJS0lABRRRQAUUUtIBKKWigBKKWkpgJ S0UUAGKKKKACkpaKADFFFFABSUtFABRRS0AJRS0UAGKKKKACiiikAUUUUwEpaKKACiiigBKQ 0tFACUUUUAFFFFIBKKWkxQAUUUUAFFFLQAlLRRQAlGKWimA3FBFKaKAGlBTTGKkooAhaIEdK jaAelWaQigCg9qp7VWlsVPatcrTSgpAc9Lpqt/DVCbSFP8NdaYge1RNADTA4S40MHPy1lXOg A5+SvSXtAe1VZdPUg8UAeT3Xh/r8lYt1oBGflr2OfSlYfdrLudFVs/LRcDxa50QjPy1lT6Sy 5+WvZbrQQc/JWHdeH+vyUwPJZdPZe1U5LQjtXpl1oBGfkrFudEIz8tAHDNAR2qIxkdq6mfSW XPy1nS6ey9qYGIVpMVfktSO1V2hIoAr0VIUphWgBKKMUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ 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 xWOVDcU+GWa3UrE+0GufEUp1ElGVi4tLcualJGblwoAPORWM7hInI9KtEH5mJ5PU1nXBxbE/ WrmrQsKO42Q5jRqvE/6HD7ms52/0VPwq+T/oluP9qsMOjSoXoz+7X6U8Go1PyinV1mQ+im5p QaAJI2UOC3Sr9tqDtLgMdv8AcA4rMIyMUKzopVWIBrnxFGVRJRlYqMrbk93dl5pFQAYNYF9I Rapu6lzWsQFUmsLVn220QHdzWktIgtzDSx+z6g1x5gO9s4rrD/qofqK5qZ/30YrpH6wj6VnR 2KnuaAPFPzUY606ugzHg0U3NJmgCRJRG24gHHatKzvvPidSN6gHt0rIIzT/PlEflhsL7VzVq M5tOMrWLjJLcLkxkPtAxXKa3zFt966Ob5YGrmdZbBxWs9hR3KWhNjUI0z3rs4CPtP4VxWgHd qyj3rsrc/wCkn6UU9gluaFGaaDRmrJH5oLd6Znijr1pgPS8aL5VZlB6letaEl1vssyKeuAW6 1kFSG3L1p7M8uPMbOK5pUJOqqnNp2LUly2INQYGMY71Su13Wqj6VYv8AACCornAthVVdgiVr Bs3Kr6Gtm0H75jWHppzffQ1tWZy7/WtIbEvcvg0ZFNzSZqhD80Ejvg0zNITxQA77WUKrGVTJ 5JFXJ5I3twzKCw4zjrWW0fzhh2qRmeTG88Cub2VT23Pze72L5ly2sU9R25TAA5rF1FtpU57V q6gfnQe9YesPhRitKnQSNHTDus3PqK3bbAgX6VgaV/yDifUVu22fIT6VqiSfil+U9QKaKM0A O2of4R+VJsjzygP4UmaQ0DHLPGs+wxx7B/Djk0lzFaOQRCgyOmKarhG3GMM/940xiSWYnk1z 06dSM25O6KbTWhkzBIpW2gKPauYu5sXxIbPNdBey4VmNcbdzj7Ux96dT40NbHR28+LRiT1FU 7iWARZKjJqj9t2WfWse91H9317VpclCajcw84Arlr2dSTipL29LE81izTFj1qWxjZpMk1WJp WbNMqRhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU9WxTKKALcUx U9a17O9Kkc1z4arEUpU9aAPQdN1Urj5q67T9W4HzV5LaXhUjmuj0/UiCPmpAetWuohgPmrRS 6yOtefWGpEgc10FtfZA5pAdKZ/emNPx1rOS43DrSmbI60APv0S8tZIZMEMDXiGv6Y2malJGR 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 xUE9aztC8H2eiz/bWvTPMOVQLjBroDg9aAq9qlq407EN1K0nzN3YGq1+M3S/hVi66qPcVDeD N2PoK48wdsPI1pfEiDT1zqWfY1owczOap6cv+nMfY1btuSxpZb/u8Qq/Ey0DS5ptGa7zEfnF Lmmg0ZoAp6ppsOr2bWs5IVv4h1FQ6N4c0/w+rvayPLM4wWYYwK06UVLirlJleQkzpnk7TXPX WTLKQBnHeuhkOblfoa5+5UbnJUnJPSsa7si4LUsaEpWOQng1qWf+pP8AvGqOkrttJT2zV604 h/E1pDYhlmlpmRSg1Yh9JzSZzSZoAxPEPhyLXxHum8l0GA2M1c0TSYdAsRa28rSknJcjHWtD 8KBSsr3Hcpyn55M9q8nk+fXpD/tH+deqzHH2g+leVwjfrcv+8f51nMaPSdMXGkKPUVtpxGv0 rIsl26VCPVa1l+4v0q47CY8NS5pmaN3rVCHmmNkDilJ4oHNAHNXvhDTdS1Frqd5ELHLKo61v oohgWKIERIuAKmKjrikfAjb6UrWHcgtSTGTWTIM3DfWte0H+jms11/en/eqe5D+JGigxDbD3 rQHAFUSMC2HvVwniqRQ/Jpc1HuppfHemBMTxVeZgUZG+6wIP4015wO9VJrkAHmkBz6eCNLTU vtz3b4U7hFt/rWzdXYSEIpwijCj2qncXqrnmsS/1LCH5qnRFGT4vu/MtI1z3NZljdeXHH9Kq 6/d+asYz3qhHclVHPaob1GblxqJMrnPasm4vS2eapy3JLHmqryk0mwJpZye9VmfNNLZpM0hg TSUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADg1SpIV71BS5oHc0YbojH NaVvfYxzXPq+DUwmIxik0Up2OxttRxj5q2bbUgcfN+tefRXTL3/Wr8F+4x1/Os2johUR6Rb3 6nHz/rWlFcqw++PzrziDU5OOD+dacGpSerj8v8azaZ1RnF9TvUmXH3xUP2pWvookOTuGcVy6 6kRGT8xP0q34TuXu9fzIOBjg0RV2KrUUY6M9HYiK3LFSdq5rw/xbrt1qGqNmRhEhwFzxxX0M BDIjIUGCMV4j4/8AB82m6i15CA1tIfXoe9bxPMZwcreewI+92NWbm6nurdIpgMr0amiIQkDa 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 Omr2sYK4BWTk187x2s6sT5Ug/A04JKsi5R+voadhns2qXulyafFYtrUStGMMQetVINWtIRxq NptVeADya8fvkkM7ERvjPcVTIkH8LflRZAes3/jG2ntZrWZByMKy8isyzitpbiO9gIV1IB+l cZpMkcrmG43DPANalpeCzZ4d3qQaaVhHo9zqynJ3ViXesAZ+auWl1k7MFulZNzqpbPzUyTpZ NbCs3zVmXet7s/PXMS35JPNU5bpm70WQXZs3OqFs/NWRPPuJOaqNKT3qMtmgZI8m6oy1NzSU AKTSUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAZpwam0UASq5FSpMR3qrSg0AaMd0R3q9Dekd6w g9SLKR3oA6mK93LtLZBqudPkeXfbyhCffFY0dyV71chv2XvQBsw6Zqz423n/AJENX4tD11vu 3v8A5FNZVvqrLj5q17XWyMfPRcC3H4a8Sv8Acvf/ACM1Wo/CXixvu3h/7/tUtrr5GPnrctPE J4+ei4GOvgzxifu3h/7/ALVIPBHjY9Lpj/23auwtfEGcfPWxb62Dj56LsDzkeBvHHa4f/v8A tSHwN45x/r5P+/5r1mHVg2Pmq7HqAb+Ki7A8Nn+HPi24bdPF5jerSE1XPw08Sj/l1T/vqvoE XIb+KnBwe9Az56/4Vr4l/wCfRf8AvqmH4ceJR/y5A/Rq+icZpRHSEfOR+HniUf8ALifzpD8P vEg/5cD+dfR4ipfIoA+ebL4b67NJ+/tvKT61oH4VXrHjj617uLenC3FAzwlfhPqR+7JGPrXY eFPCmo+HonjkCyK2TxXpAgHpTxAPSpauByCw3KMc27YrVsJAqEOpT61t+SPSl8lP7in8KjkH czfNiPVxSF4DwSprS+zw/wDPFPypPs0HeFPypcjHczNlue60nlW5PVa0zbW//PBaQ2tv/wA8 Vo5WF0Zogtz/AHKX7PB6LWj9lt/+eIo+zW//ADyH5mjkYXKAt7fHRaT7Lb5+6tX/ALNbf88v 1NH2W2/55fqaORhcoi1t/wC6lL9lg/uLV37Lbf8APL/x40v2W2/55n/vo0crC5R+ywZ+6tH2 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 /jz/AMsjVu41pcEbq4bxPqoaxukDfeTFAjmvhzemLxOpbgBWr0+91DzJs7q8K8K3xtte3bvW u+l1oF87qbA9F0/UljUfNzTdU1hS8R3dGrz1df2D79Ur7xDuK/P39aVgO/v9cUKp3UyXxEAg +ft615jda6XUfNVSXXmI+/TSA9EuvEfX56x7jxF1+f8AWuDm1pm/iqhLqrE/eoA7ifxCcH5/ 1rKuNfY5+auQk1Bj/FVZ7xj3pgdNPrTHPzVnTaozfxVhtck96iMpPegDTe/Y55qvJdlu9US9 NLUATvMWHWomcmmZpKAFBxQTSUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF AC5pQ1NooAkD04Sn1qGigC0twR3qZbsjvVDNLuoA1UvmHerEepMP4qww9KJD60AdLHqzD+Kr sWtMP4q5ATEd6kW4Yd6AO5h11h/FV6LxAR/H+teerdsO9TLfMO9AHpUXiI/36vQ+JD/f/WvL V1Bh/FU6aow/ioA9ai8SdPnq9F4k/wBuvII9XYfxVZTWmH8VAHscXiMf3/1q5H4iH9+vGo9c YfxVaj19h/HSA9mj8Qg/x1aj19f79eMx+IW/v/rVuPxEf79MD2RNcU/xVYTWlP8AFXj0fiQ/ 3/1q0niQ/wB/9aAPXV1hf71TLqyn+KvJY/Ev+3VpPEv+3QB6quqKf4qlXUl/vV5aniQf3/1q wniQf3/1oA9OGoqf4qcNQX+9Xm6+Ix/f/WpB4jH9/wDWgD0UX6+tPF6vrXna+Ih/f/Wp08Qg /wAf60AegC8X1pfti461wq+IF/v0/wDt9cH56APOvjFK9/q/lrkqihjWp8GI0iimf1I5riPi DrbPrEiqc7kArpfhjqC2mm8tjIFHQEe9i7XHWj7WvrXEf2+v9+j+31/v0Adv9rX1o+1r61xH 9vr/AH6P7fX+/QB2xulIwaqzTqpyK5P+31/v0ja6jDBek0B18N+o+UmpjdJ0OCDXANrgVuHq ZPEKsuN/NIZr3tyLWWWBj+6kUkfU187+O8ReIZFI+YNzXsWraqtza5DDch3flXlPje3XUUj1 KL/WDJkFUI9w8A3oXw1CCew/lXUHUF/vV5H4W1oW2ixR7sYUfyrZPiMf3/1oA9Ae/Qjk1TfU BG+c8VxDeIx/f/Wqs3iEEH5/1pNAeiDVVI+9TG1VR/FXmR8SbTjf+tNfxLx9+gD0O81JJI/v DI5zVaHXFeLDN8w6153J4k/26zpfEJjm3q/DdaVgPUX1tR/FVWXXV/vV5pL4jJ5D/rVKTxEf 79MD04+IFU/f/Wo5PEQ/v15W/iBv79QP4gYj79CA9Ql8RjB+f9ayLzxCDCylxXnsmusf4qz7 nV2dGG79aAO1i13bKRv6nNWn8R4XG/8AWvM/7TYEHd0FD6ox/ioA72fxETn5/wBa53WNXM0T jd1Fc4+osf4qqT3ZdSM0AOsbkw3+8H1rafVWP8VcqrkSZqYzk96YG+2qt/eqrNqLMR81Y5mP rTTIT3oA0pL5j3qFrwnvVEvSbqALTXBPeojMT3qHNJmgCQyH1ppam0UALmkzRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABmlzSUUAO3Uu6mUUASBzSiQjvUVFAFgTH1pwuD61VzS5oAui6b1p4vGHes/dS7qANRb5h3 qRdQYd6yN1G+gDdXU2H8VSrqrD+KufEh9aUSn1oA6VNXb+9Uy6yw/irlRMfWnCc+tAHXLrbf 3qmTXGH8VcaLhvWnC5b1oA7ddeb+/Txr7f3v1rhxdN60v2tvWgDul19v7/61OniE/wB/9a8/ F43rTxesO9AHoi+Ij/f/AFp//CRHH3687F+3rS/b2x1oAn8RXhutRZ854re8M6sbS0C7scVx VzKZJMmrNrdGJMA0Aemf8JEf79H/AAkR/v1539vb+8aPt7f3jQB6J/wkR/v0f8JEf79ed/b2 /vGj7e3940Aeif8ACRH+/R/wkR/v1539vb+8aPt7f3jQB6C/iAkffqMeIWU/frgvt7f3jTTf N60gPQH8Qkg5bg9ayJ9TVmkRjmOTtXKm/b1qI3jZ60wO0g1nyE2K3H1p519v7361xH2xvWk+ 1t60Adqdeb+9UL66396uPN23rTTdN60AdTJrLf3qiOst/ermTcE96b559aAOjbV2P8VQPqjM MbqwjMfWmmU+tAG0dTbGN1QtqDH+KsrzD60hegDRN8x70w3jetUN1JuoAuG6Y96jNwTnmq26 kzQBOZTSGU+tQ5ooAkLmmls02igA70uaSigAzRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAGaM0UUALk0bqKKADdRuoooAXdRuoooAXf RvoooAaTk0obFFFAC7zRvNFFABvNG80UUAG80bzRRQAbzRvoooAQtRuoooAN1JuoooAN1G40 UUAGTSZoooAM0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/ 2Q0KZW5kc3RyZWFtDQplbmRvYmoNCjIzIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlw ZS9JbWFnZS9XaWR0aCAxNDE4L0hlaWdodCA4MDgvQ29sb3JTcGFjZS9EZXZpY2VHcmF5L01h dHRlWyAwIDAgMF0gL0JpdHNQZXJDb21wb25lbnQgOC9JbnRlcnBvbGF0ZSBmYWxzZS9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU0NzEwPj4NCnN0cmVhbQ0KeJzsnYd7Vde17W9erl/8 kjjXiR3bsR2bYlMNmGJ672B6seiiF4neZMB0MEU0IUBCqNBEFb0JEN2Y3otNcQEX4pa45d37 7iv37bHmWruufXSEJR1JzPEHbMVBGt/vG3PMuf7lX1gsFovFYrG8+lX2K9T/SSwWi5XXlQPW y97MYrFYWgVyxv+Wi2KDZrFYj56Cc+Bf55KCcmS2ZBaLlZ+VRea1HPJfc0k6Tw6GmUP9fyyL xWIFo4dhXsshH/Pov2eDvF/VeXLwzBzq/49ZLBbLpSDYNzPm9frub3JIXm/OKjOzL7NYrLwm Pw8Ojnnt3EpO+bjQ/xD6bTaLvko/wenLXm72Y2Y/Pw71vwOLxXqklAkB69k3EPM+/rjlvvDL 3xn6vdAT2Sz6Kr6vfFn97OCZWUfKTMksFit3lRkBZ+a9Ttcl/e53yn3hl38w9G9CT2az6Kv4 vvJl+slOatYxs9eXM6PkUP87sVisgqWsEbDTf3Xua3dd0h/+oNz3ySf/aOhPf3rK0NOm/vwL ZX0J3/3Tn/AzyJfpJzup2cvMdlf2Ty8CUHKo/wlZLFY+V9YI2PJfJ/nqmNdiVeW+8NxnDD37 7HOG/mLq+V8o60v47rPP4mfAny1XtlOzm5mdtOzvyYEpOdT/jiwWK5/Jl4EDE7Dbf+3k68e8 xKzKfeG5Lxh68cW//vUlQy9ns/DNv/71xRfxM+DPlisrctYxs52WdZ4cDCUzI7NYrKzJ68LB ErDTf+3k68e8xKyW+75cqHDhIkWKFn3llVcNFctm4ZuvvFK0aJEihQsXetnuyoqcdcxsp2W3 JwdHyUzILBYrKAWk4MwJmNIHu//Ce8l9yX/9mLeQocKGigj3LVa8RImSJUuVKl36NUNlDJXN JuFb+Gbp0qVKlSxZokTxYsKVi+Bn43+DPzMrWsZ/j8XK5MmUXmRGyQEJOdT/8iwWK48oMwrO nIApfTDpV3ovuS/5rx/zFjdUwlBJ4b5lypZ7vXyFihUrVXrDUGVDVbJJ+Ba+WalSxYoVyr9e rmwZ4col8bPxv8GfmRUt479H+LJJyiq9yIySmZBZLJafgqdgvQO7CVilD4b/Su+V7vtyIfJf DfOCVssZMuy3QkXDfStXqVqteo2aNWvVqm2ojqG62SR8C9+sVatmzRrVq1WtYvhypYoVYMqG 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 34iTmZS19II9mTJl0DJ4GcTsmfhpzMzUnJ7CbwaYlyZuoF5wL8iXsl+Xfv/suO+r+DOxA6OL xv7LXYgwBzZRsHCwSCQyysjHZkIOMjJ3LVxKVpzMpOymF/Bk5cqgZfAyiNmZ+PmYmak5PYXf DDAvTdzy5MG34Jvwbey+rv/a7vsH/Jlc/2UC5i6EmYHDKFg4WCQSRVY0Qg5jZJeSvZzsphfw ZHZllSpDrjsHmflZyMy8cF2Ik192X9d/4b5e/nUJOBIDCwWLRKKnlDdADhCymZH9nuxyspeU 2ZVVqgwpdzYx87OQmXnhuhAnv+y+Xvr18q/Zf8McOEDB4sMikegJFD7VC3NkkyebXFlJuXOQ mVl/Sie5v2hiXqZeVtB9w/w3ugOL+4pEovSQD5EjMLKZk8NdmfXb34YxM+uldJL7iybmZd9l hblvGP/GwsBiwyKRKP0UiZFNnBwkZdeVWb/+tYmZdWpOX/Gv+5mXfZel3NdMv0H+FQYWiUQZ LD8ia4wcjZO9ruzysomZdWpOX/Gv+5nX5d7I7mvmXwMDiw+LRKIMU5gvmzhZ92Tdl705Bruy Ts3pK/513Xv17/B+YdB9QzcyxHtFItHzVICSwzjZS8qxMfOzUWTmNflvZP4VFxaJRJlLkXz5 V0aFMbOfm3+pgr9uZl6T/4r3ikSirCYDJgdIOXZmfnYKY95IDiwmLBKJsqrM3hwbMz87RXFc MV6RSJQtFZsjZ5zEf0UikUgpkkM/az3vP7tIJBJlQonxikQikUgkymj9f2kj03YNCmVuZHN0 cmVhbQ0KZW5kb2JqDQoyNCAwIG9iag0KPDwvVHlwZS9QYXR0ZXJuL1BhdHRlcm5UeXBlIDEv UGFpbnRUeXBlIDEvVGlsaW5nVHlwZSAyL0JCb3hbIDAgMCA0MDQgNTldIC9NYXRyaXhbIDEu MzM2NiAwIDAgMS4zNDUzIDAgNzUyLjg3XSAvWFN0ZXAgNDA0L1lTdGVwIDU5L1Jlc291cmNl czw8L1hPYmplY3Q8PC9JbWFnZTI1IDI1IDAgUj4+Pj4vTGVuZ3RoIDMyPj4NCnN0cmVhbQ0K cSA0MDQgMCAwIDU5IDAgMCBjbS9JbWFnZTI1IERvIFENCmVuZHN0cmVhbQ0KZW5kb2JqDQoy NSAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggNDA0L0hlaWdo dCA1OS9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvSW50ZXJwb2xh dGUgZmFsc2UvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA3OTU+Pg0Kc3RyZWFtDQp4nO3d d09TURjA4c8hMdQAhoLg4ku4916491bce+89v62n53ixalTAS3vHkzx/k95z3veXlDTt2NjX MYDyW7r0C0DRaBdQRnm06zNA3rrYrk8A/1L8dn0EqES7PiRLliTvgfJrrfPkdtesXe/avAWK qn1VtevXdi1enLxp8xrorPYFbK2kds24XYsWvWrzEsjPj+XSro6068XChcHzzDPgXyb35UXY IO0qTrtGR59mnkSPoa7SCnzfCO0qZ7seRQ+jByMj96FKwlRn451GXbuq3a570d0FC4I7UB53 w9xmA6xd2hXcDoaHbw0P34xuQLelUbyVhlO7tGvq7Roauh5dGxq6GjSbV5rNy5C3K2nA4qS1 Rk67tGvW2nWp2ZwYHAwuDg5egOkIMzMR5idOkXZpV9fbdX7+/HPR2egMZMPQGowwIdqlXSVp 1+mBgeDUwMDJ6ER//3GqKtxvdtHhxk+H29cu7apcu4719x+NjvT1HaaMwt1ll3hMu7Srxu06 1Nd3MDowb97+aB/F0LqOcC/ZBR3SLu3Srim0a2/QaIw3Gnui3cymdMjj6di1S7u0K+927Wo0 dvb2Bjt6e7czU+H0doaTjOepXdqlXV1p17Zoa7Rl7txgM5kt4Uyyw0kHpV3apV0Fb9emaGO0 oR7Sw6YH1y7t0q7KtGt9T0+yLlpbZukRWo8Tnku7tEu7atmuNdHqYksvUru0S7u060/tWpXM mbOyWyZfg3Zpl3Zp1/+1a0Wb5flp/7PapV3apV0da9ey6dMu7dIu7dIu7dIu7dIu7xm1S7u0 q2Lt8r967dIu7Sp4u4pJu7RLu7TLZ1O1S7u0q0Ttqjzt0i7tqkC70C7t0q4it4sZ0C7t0i7f PVgN2qVd2uU7nytDu7RLu/zWRnVol3bVsl1UkHZpV4XaBdqlXcVvF0yRdmlXF9sFOdIu7cq5 XdBV2qVdU2kXlIJ21bxdUBHaVd12QQ1pV5naBfyVdhWhXUAutGsW2wV0kHZNu11AUWnXh5/b BZRXHdoF1FDp2gXwuwK2C2DGOtAugE7TLqCMfinVN1yueEkNCmVuZHN0cmVhbQ0KZW5kb2Jq DQoyNiAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvTmFtZS9GMy9CYXNl Rm9udC9BQkNERUUryN641b+ivbrG9y9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRm9udERl c2NyaXB0b3IgMjcgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMTcvV2lkdGhzIDE3OCAw IFI+Pg0KZW5kb2JqDQoyNyAwIG9iag0KPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFt ZS9BQkNERUUryN641b+ivbrG9y9GbGFncyAzMi9JdGFsaWNBbmdsZSAwL0FzY2VudCA4NTkv RGVzY2VudCAtMTQxL0NhcEhlaWdodCA4NTkvQXZnV2lkdGggNTAwL01heFdpZHRoIDEwNDUv Rm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAvTGVhZGluZyAzMy9TdGVtViA1MC9Gb250QkJv eFsgLTQzIC0xNDEgMTAwMiA4NTldIC9Gb250RmlsZTIgMTc5IDAgUj4+DQplbmRvYmoNCjI4 IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0Y0L0Jhc2VGb250 L0FCQ0RFRStHZW9yZ2lhLEl0YWxpYy9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRm9udERl c2NyaXB0b3IgMjkgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMjEvV2lkdGhzIDE4MCAw IFI+Pg0KZW5kb2JqDQoyOSAwIG9iag0KPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFt ZS9BQkNERUUrR2VvcmdpYSxJdGFsaWMvRmxhZ3MgMzIvSXRhbGljQW5nbGUgLTEzL0FzY2Vu dCA5MTcvRGVzY2VudCAtMjE3L0NhcEhlaWdodCA3NTYvQXZnV2lkdGggNDQ5L01heFdpZHRo IDEzOTMvRm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAvU3RlbVYgNDQvRm9udEJCb3hbIC0x OTYgLTIxNyAxMTk3IDc1Nl0gL0ZvbnRGaWxlMiAxODEgMCBSPj4NCmVuZG9iag0KMzAgMCBv YmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUvRjUvQmFzZUZvbnQvVGlt ZXMjMjBOZXcjMjBSb21hbixCb2xkL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVz Y3JpcHRvciAzMSAwIFIvRmlyc3RDaGFyIDMyL0xhc3RDaGFyIDExNi9XaWR0aHMgMTgyIDAg Uj4+DQplbmRvYmoNCjMxIDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1l L1RpbWVzIzIwTmV3IzIwUm9tYW4sQm9sZC9GbGFncyAzMi9JdGFsaWNBbmdsZSAwL0FzY2Vu dCA4OTEvRGVzY2VudCAtMjE2L0NhcEhlaWdodCA2NzcvQXZnV2lkdGggNDI3L01heFdpZHRo IDI1NTgvRm9udFdlaWdodCA3MDAvWEhlaWdodCAyNTAvTGVhZGluZyA0Mi9TdGVtViA0Mi9G b250QkJveFsgLTU1OCAtMjE2IDIwMDAgNjc3XSA+Pg0KZW5kb2JqDQozMiAwIG9iag0KPDwv RnVuY3Rpb25UeXBlIDMvRG9tYWluWyAwIDFdIC9FbmNvZGVbIDEgMCAxIDAgMSAwIDEgMCAx IDAgMSAwIDEgMF0gL0JvdW5kc1sgMC4zNSAwLjQ0IDAuNSAwLjUgMC41NiAwLjY1XSAvRnVu Y3Rpb25zWyAzMyAwIFIgMzQgMCBSIDM1IDAgUiAzNiAwIFIgMzcgMCBSIDM4IDAgUiAzOSAw IFJdID4+DQplbmRvYmoNCjMzIDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAg MV0gL0MxWyAwIDAgMF0gL0MwWyAwLjA5NDExOCAwLjEwOTggMC43ODAzOV0gL04gMT4+DQpl bmRvYmoNCjM0IDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAw LjA5NDExOCAwLjEwOTggMC43ODAzOV0gL0MwWyAwLjQzOTIyIDAuMDE5NjA4IDAuODMxMzdd IC9OIDE+Pg0KZW5kb2JqDQozNSAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDIvRG9tYWluWyAw IDFdIC9DMVsgMC40MzkyMiAwLjAxOTYwOCAwLjgzMTM3XSAvQzBbIDAuMzAxOTYgMC40MTU2 OSAwLjk5MjE2XSAvTiAxPj4NCmVuZG9iag0KMzYgMCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAy L0RvbWFpblsgMCAxXSAvQzFbIDAuMzAxOTYgMC40MTU2OSAwLjk5MjE2XSAvQzBbIDAuMzAx OTYgMC40MTU2OSAwLjk5MjE2XSAvTiAxPj4NCmVuZG9iag0KMzcgMCBvYmoNCjw8L0Z1bmN0 aW9uVHlwZSAyL0RvbWFpblsgMCAxXSAvQzFbIDAuMzAxOTYgMC40MTU2OSAwLjk5MjE2XSAv QzBbIDAuNDM5MjIgMC4wMTk2MDggMC44MzEzN10gL04gMT4+DQplbmRvYmoNCjM4IDAgb2Jq DQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAwLjQzOTIyIDAuMDE5NjA4 IDAuODMxMzddIC9DMFsgMC4wOTQxMTggMC4xMDk4IDAuNzgwMzldIC9OIDE+Pg0KZW5kb2Jq DQozOSAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDIvRG9tYWluWyAwIDFdIC9DMVsgMC4wOTQx MTggMC4xMDk4IDAuNzgwMzldIC9DMFsgMCAwIDBdIC9OIDE+Pg0KZW5kb2JqDQo0MCAwIG9i ag0KPDwvUGF0dGVyblR5cGUgMi9TaGFkaW5nPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU2hh ZGluZ1R5cGUgMi9Db29yZHNbIDQ5MC45MyAxMTQ4LjQ3IDE5Ni4zNiA2MzguMjZdIC9FeHRl bmRbIHRydWUgdHJ1ZV0gL0Z1bmN0aW9uIDMyIDAgUj4+Pj4NCmVuZG9iag0KNDEgMCBvYmoN Cjw8L0Z1bmN0aW9uVHlwZSAwL1NpemVbIDUxMl0gL0RlY29kZVsgMCAxIDAgMSAwIDFdIC9S YW5nZVsgMCAxIDAgMSAwIDFdIC9CaXRzUGVyU2FtcGxlIDgvRG9tYWluWyAwIDFdIC9FbmNv ZGVbIDAgNTExXSAvT3JkZXIgMS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEwMTc+Pg0K c3RyZWFtDQp4nG2U90+TURiF/yhEcABuRRQHjhgVQYKMKGgUjKJxxRFHVCLDLtrSQgHZILvs vfcoe5a9N6hPc5UVb84PTdvvu/ee9znn9+9t69cvoZ1rfX2rTGttbZtWV9HahlZWhFbR8vKm lpZWNrS4iJbRwsJfzc8vCc3NocXZWaGFmRmTpqfRPJqaQnOTkyZNTMyi8XGTxsZm0OjoNBoZ mR4enkJG4yQaGpocHJxAAwPjqL9/vK9vDPX2jvb0oJHu7pGuruHOTmTs6DC2txsNhiGDYbCt bbC1daClZaC5uR81NfU1NvY1NPTW1/fW1fWg2trumpqu6uquqqrOysrOioqO8vKOsrL20lJD SYmhuLitqKitsLC1oKAlP78lL685N7cpJ6cpO7tRr2/MymrIzKzPyKhPT69LS6tNTa1NSalJ Tq5OSqpOTKxKSKiMj6+Mi6uIjS2PiSmPji6LiiqNjCyNiCjR6YrDw4u12iKNpjA0tFCtLlCp 8pXKfIUiTy7PlclypdIciSQnODg7KEgfGKgPCMj69i3T3z/z69eML1/SP39O//Qp7ePHtA8f Ut+/T3n3LuXt259v3vx8/Tr51aukly+TXrxIfP488dmzhKdP4588iffzi3v8OO7Ro9iHD2N9 fWN8fGIePIi+fz/63r0fd+/+8PaO8vKKunMn8vbtSE/PCA+PCHd3nZub7tYtnatruItL+M2b Yc7OYU5O2hs3tI6O2uvXNdeuaa5e1Vy5EoouX1ZfuqS+eFF94YLKwUF1/rzq3Dnl2bPKM2eU 9vbK06dDTp0KsbMLOXlSYWurOHFCcfy44tgxOTp6VH7kiPzwYdmhQ7KDB2UHDshsbGTW1lJk ZSXdv1+6b590714k2bNHYmkpsbCQ7N5tkrn59127TDIzM0l85kvxK3/jzzzCgzzOS3gVLxRv Zgs2Yjs2ZWsOwDHEeTgYx+OQHJUDc2wOzxW4CNfhUlyNC3JNLsuVubhwACswBFswB4swCrsw DeswEBsxE0sxFnsxGasxHNsxnxEwCMbBUBgNA2JMDIuRMTjGxxAZJQNlrAyXETNoxs3QGT0A gAEwgARggAeQgArAgA3wgBAggRNQgRaAgRmwgRzggR8QgiJAgiVwgiiggivQgi4AgzEwgzRg gzeQgzrAgz3wEwGCQBwIBdEgIMSEsBAZgkN8CBFRIlDEinARMYJG3Agd0RMZJIxEkmAST5FT AktsCS8RJsjEmVATbQJOzAk7kSf4xF/0AIUgmkG0BHUhekN0CGUiWkU0jGgb0TyihagjSkm0 EzUl+oriEg1GlVFoG+W2UXei/ajBra24tS1Ff4ou3dqulO2O+v23Nlv6f8vU7TvWHwduV68N CmVuZHN0cmVhbQ0KZW5kb2JqDQo0MiAwIG9iag0KPDwvUGF0dGVyblR5cGUgMi9TaGFkaW5n PDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU2hhZGluZ1R5cGUgMi9Db29yZHNbIDI3MCA3NjMu NSAyNzAgNTkwLjI1XSAvRXh0ZW5kWyB0cnVlIHRydWVdIC9GdW5jdGlvbiA0MSAwIFI+Pj4+ DQplbmRvYmoNCjQzIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0 aCA4MDkvSGVpZ2h0IDQ3OC9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50 IDgvRmlsdGVyL0RDVERlY29kZS9JbnRlcnBvbGF0ZSB0cnVlL1NNYXNrIDQ0IDAgUi9MZW5n dGggMTcxNzE+Pg0Kc3RyZWFtDQr/2P/gABBKRklGAAEBAQBgAGAAAP/hADZFeGlmAABJSSoA CAAAAAIAAQMFAAEAAAAmAAAAAwMBAAEAAAAAKCj/AAAAAKCGAQCPsQAA/9sAQwAIBgYHBgUI BwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04Mjwu MzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgB3gMpAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAA AAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQci cRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldY WVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC w8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEA AAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXET IjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+f6K KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKK7XwB8Pp/GOpXAurkafptlj7VcSjbgk8IM8Bvr09+ letav8AtBGlD7BcXMc235bgyeYCexI4BH0xQB594B+Dep+MNPGq3cxsdPfPkkJl5fcA9F9z1 9O9VvH/wovPB1t9ut52u7NSFl3JtePPQn1H/ANal8U+Odd0X4gkabd3FpaaPIlvaWYZkj8pM ABlBwQwHPqDX0X9o07x74Ig1KGNZLW+t/wB5GwztzwynIGcHI6c0AfF1Fa/ibQpvDfiC70yY H90/7tj/ABIeh/L9c1kUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRXUaF4Ln1PSzrWo31vpOi K+w3lzk72HURovzOevT0PpXe23wQsNb0P+0/DviiK/hOR5ixfKGH8LDIZTyOCM8igDxodeel fQnwW0TwLqyXEljBNPrFnhmbUETcVPR0QMQBng9SMjk5FeI+IPDmp+GNRNlqcHlyYyrKcq49 Qau+BPFUvg3xfY6wm5oo22XEa/xxNww+uOR7gUAel/HCyl0vTbaG0gMVrdXr3F46nh5tiquR 9FP+TW9+z/4xGpaVc+Eb+TMtqpmtCT1iJ+Zf+Akg/wDAj6V3vjnQLPxf4VlSN0kgu4Q8My8j OMo49exr5R0fU9Q8F+Lre+jBjvNOuPnQkgNg4ZTjsRkfQ0Aen/HXwgba5j8QW8eORDc4H/fL f0/EVN+z34xFrqVz4SvHHkXm6a1zjiQD5l/FRn/gPvXsmqWWn+OvCUc8S+ZZ6jahwCQDtZcj oeGGfXgivmIabF8OfHNld397b3psbkzLBYzBpMpygfsmTjPJIGeDxkA9W+M3w8vdaih1HSrR 57y3OxkQcyRn+oPP51873NvLaXMlvOoWWNirqCDgj3HFdn4y+K3iXxjJLFLdNZacx4s7ZsKR 6M3V/wAePYVw9ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFTWlrPfXkFnaxmW4nkWKKNerMxwAPqTXq5tfCf wu13TdM13RDrF7IizXt07/Lb5JGI4yCGxg9Tzjt2APIqsWNq19qFtaK21p5ViBxnBYgf1r6R +JPgPwrd+CrrXbOO0hWO3M9vdQYUNxkDjhgen4+tfNMUrwTJKhw6MGU+45oA+kPjb4YWLwHa QadGUttK8tliUcbACp/IHOfY15r8FvGreFfGUdncyhdM1RlgnDEYR+iPkkAYJwT6E+gr6Nju bPxr4JtNTjRHgvrYM8edwGRhlPrg5B+hr5F8WeH5/C3iS506QMFRt0L5+8hPyn69vqKAPpX4 t+Dotd8M3PlRj7TCpmtyOoYdvx6fjXydX1t4U8XJ4i+EdvrN6xM9rE8N2xOSWjXlsnqSMN9T XyW5DOzAYBOcUAfS/wABfFf9u+Ernw5eyFrjTMeSWPJgboP+AnI+hUVwvxk0Twzb65NfRa7C NSZMSWVvH5rM44BYggJ6HJJ6YFebad4k1XSNMurDTrprSO6YGeSH5ZJFAwFLDnbyeB681kkk nJOSaAOvvviPr8/h+00CwuDpulW0QjENsxDP3JZ+pycnAwOcYrkKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorS svD+s6lAZ7LSr24hH/LSKBmX8wKoTQy28zQzxPFKhwyOpUg+4NADKKKKAO1+EkcUvxU8PrNj YJ2YZH8QRiv6gV6F8fvC0z3EevwIWEWYp8DnaTlT9ASfzrxLTNQuNJ1W01G0fZcWsyzRt6Mp yP5V9k6dqGk/EXwjDqNoI5YbhCk0LENsbHzRt7jPfqCD0IoA+Mjd3LWq2rXEpt1bcsRc7AfU Dpmo1jdkd1RiqY3MBwufX0r2TxJ8CNQXUWfQZ4vIdv8AU3BKmP6EA5FYXjDw1b/D7wcmjXFz Hca5qkyy3Hl52xQpnCjPqx6nGce1AEHw0+Kl94BmktZYWvdInbdJbbsMjdN6H1wOR0Pt1ruP GviP4WeOrCK5uNYu7K7jG5EWzkMq56rkKV/XHvXgtFAHda745tF8IReEPDMFzBpAcyXE90R5 1w5OTkKSFHA49vz4WiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiinCOQxtIEYxqQCwHAJ6DNADaKKKACitbRPDWseIpWTS7GSc J9+ThUT/AHmOAPzr0/QPgbLBF9v8V3hgtlXeLezUyPIOv3gP0Gc+tAHjVd38J/B8Xi/xeEvI 9+nWUTXNyucb8fdX6E4z7A1heMW0ZvE1yNCsbqysUwiw3Iw4IGCcHkZ64PP8q9L/AGcb63j8 S6zp0pAlu7NWjz32NyB+DZ/CgDIn+J3iHwv8RLsGZpNKtrhoDpnCwmAHACrjCnHRsZ+teofE Lwj4e8Y+EF1+zuLSBWg+0W947iMDIzhie3Yg9D7iua+Juhab4Xvp/E58PjU7yVwhFw5+zwkD AdkHL5wBgkDpXjOu+J9Y8Ryq2pXjyRx8RQKAkUQ7BUHA9PWgDJYFWKnGQccHNdB4S8F6x40v 5bXSY4z5Kh5pZW2ogPTPU5PsO1Z1/pUlhp+m3Uj/APH9C0yoVwVUOyD652k16F8GviNpvga7 1K21iOX7HfBGE0S7jG6Z4I7ghv096AOM8VeD9W8IXqW+pxpiQExyxtlXx1988ijwt4z17wbf G50W+eEMQZYW+aKXHZl6HqeeozwRXX/F/wCIGleMru0ttFjk+yWzM7TSptMjHAGB1AHPWvMa APXrz9orxZc2nlQWWl20p6ypG7H8AzEfzryvUtSvdXv5b7ULmS5upTueSQ5J/wAB7VVooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooqZLO5kt2uEt5mhT70ioSq/U9KAIaKKKAOi8KP4UhvY5PE0WpTx+YB5NqFVdvqzFgTz2GP r2r6a8Q+CdF1HwGdM0qG3j0+4hDwPAoC5IBR+OvY5718paToupa7d/ZdLsprubGSsS5wPU+n 419Q/CA65beFH8NeJNPuLWezP+ivKMiSE8gAjIJU5/Aj0oA+Vry0msL2e0uEKTQuY3U9iDg1 Z0LSZte16w0m3YLLeTpCrHou44z+HWvTfjh4ROnasmu28REdwfLuMDgOOjfiOPwHrXmeg6tL oPiDT9WhXc9ncJMF/vbSCR+I4oA9s+NHh9PDvgXTdL0eIw6Zazr5yL/GSpwznucnv3IqL4Ce OXlnbwXqjNLDIrS2Lu2fLIGWj+mMsPQg+tepTvoXxP8ACLy6dPHdW1zFtkjJAeMnsw/hYH/E Hoa8L0rwHqPw+8cWWsa9d29jpVhP5wuWlw06r/CiD5mY9CAO5oAu/H3RLaw1fT76JVWWcPHJ gfe24wf1NeZeGfEF34W8R2OtWJHn2sm7aejqeGU+xBI/Gtn4jeNn8ceJ3vlRorOIGO2jbqFz yx9z/gK5J0eMgOrKSMjIxxQB9m6bqnh/4leHTc2MkU8bpsuLeTBaMkfdde3f2Nefap8C/C1j LLql9ez2WnRfPKhnURgD3IJA/GvnvT9Tv9JuRc6de3FnOOBJbytG35g1Y1TxBrOthBqurX18 EOVFzcPIFPsCeKANXx5r1nr3iV30yIQ6XaRra2cYGAI1747ZJJ9ea5iiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA K+sPCmr+DT8LNOkjvtPtYLezRbmN5FVlkx84YHnJbP1zx1r5Prr/AAH4NsvF2rQWl5r1np/m vsjhY5mlPoo6DPbJ5PQGgDmtTktpdWvJLJSlo87tCpGMIWO0Y7cYqrXvXxL+E+maN4PWTRLM pcWOZZHJ3PMn8WT7dfw4614LQB9MQ+H5PBfwPLaQfK1S4sTdzXMP32Yru4PXhTgfT1rxPwd8 QNb8J69b3sV/dS2vmq11bNMSky55BByM4JwcZFfTnhK+g8V/C/SLtBv/ANEWGVWwTvQbHB/F c/TFfLfjjwzL4W8T3NkUIt2YyW7dih7fh0/CgD6p8XaRYeMvCbGJlmtL6APHIB6jKsMjg9DX x3qNhPpeo3FjdJtmgco49x/Svor9n3xJNq3hm/8ADt2Cy6eytBJgcJJuO36gqx/H2rF+MHw7 he6PiL+0LTT4wuy4acnEhHTaACS3bGOfbFAHjfhqyl1PxPpenQzyQPeXUdv5kbbSodgpOfxr 2vxP8F9S1/xm0i6kkGkxokUSsC8kaKANoHQ5wTnPUng14Hb3E1pcxXNvI0U8LiSORTgqwOQR 7g19L6B8UPE118Mr7xNqOj20rQDy7ZoSwNww4Z2XnAB649DwKAOh0H4deEfBNn9qeK3iaMfv L28cFh/wI8L+GKyvE8Pg74g+FdVj0rULa8kso/MZkHzQsQdrDIHof1FeB3upeMPiVrAWRrvU Zi2UhjBEUX0H3VHufzrWk1C18A+GtS0Wyu4L3XdVQQ3s1u+6K0iGcxq38TnJyRwPwoA8+ooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKK9S+JHgZtK8KeGdat4NrNp1vHeKq4w5QYbj3yCfpXAX/h7V9L0+2v7/T57a2u iRC8q7d2AD0PPf8AGgDNVWd1RFLMxwFAySa6TTfA+s3XiTRtHvLSWyfVHHltMuCE/ibHUYGT g11Pwg8V6Jo3iWxsNS0eyAuWMTam7N5sbsfk6naq9AcAepPFe8eMtCWX/T4FK31tbzm0lU4K M8TJ1H+9/KgDi/iH8MPC2jfD26uLO1gt3s4t8dyD+8dx0Bbvk8Y9+1fOEM0ttPHPBI0csbB0 dDgqwOQQfXNDyylTG7uRuyVYnr649aZQB9leFdfg+IHgC01XCfaChiuox0WVeHGPQ8MPYivl vx54Zfwt4qurIIRbOfNtz22Ht+B4rs/gN4yOheLDod0/+g6sQi5Jwk4+4R/vfd/FfSvTfi78 PpPEukefZLGLu0Jkjd2Cjb/EpJ6DHP4CgDyr4P8AxPTwVeyaVqu5tFvJAzOoJNvJwN+O6kAb h14BHTB9r8UeC/D/AMRtFiube7hnt+Xhu7eUHZ64PT6g/wBK+S720ewu5LaSSGR04LQyCRM+ zDg/hUAYgEAkA9R60AeuX+vaZ8KJrHTfC18mo36Xa3Wo3AcFZFUFRDleMYZs9cE/lwPizxhq /jLVWvtUuCwBPlQKSI4h6KP69TWBRQAV2/hH4qeIPB2kyaVaR2V5YO5dYL2IuI2PUqQwPPp0 +mTXEUUAdVr3xF8SeIIXtp7xbWzfra2UYhjPsccsPqTXK0UUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVqN4b1hNDOtSafOmnB gvnuu0EngYzyRnuKAMutzwho0GveKbGwu7iK3s2ffczSuEVIl+ZskkY4GPqa+hPCvwo8N6f4 ISPU7ayuNSltxPeSTEEx5GcAn7oHrx0zXzVqkFvbateQWkvnW8czpFJ/eUMQD+VAH2leNZ6z olrqOmyQXFsyB4HUBkx/CfwP5V8k+OdY8R3/AIhurTxDfSzy2spVYvuxoOxVBwMg/XnmvXP2 e/GC3Fpd+D76XJXM9luP8J++gyex+YADuxrN+O3hBonj1+3TmPEVxgdVJ+VvzOPxoA8OBIII OCOhFfXnw08VL478AQvPIH1OyHkXQJ5ZgOH6k/Mvc9SGr5Dr0z4GeIbnR/iJbWStIbTUlaCa NRkZAJVsexHX0JoAyvil4Xbw34tmeNMWl6TNEfQk/MPz5/GuIr6K+Lfir4f3VubC5eTVLyN9 6xWMgARveTkDqeBk+1fPNw8clxI8MIhjLZWMMW2j0yetAFvRL630zWrS+ureS4it5BL5SS+W XZeVG7BwMgZxzit3xf8AEXxH40nb+0rwx2ufls4CUiH1GfmPuc1ydFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFAGTgUAFFa9j 4W1/U+bPRr6ZT/EsDbfzxitTx54Nn8HalawureVcW0cmSc7ZNo8xc98Nn8DQBylFFbPhvw1e +Jr94LXZFBChlubqU4jgjHVmP9OpoAxqK90+HugfCvWtUOhwG7v9T2Myz3kZSOfHJ8tQ3Yc4 IBwD1qh8V/hXaaBZNq2iwNFHEf8ASIASy7T/ABLnpjv2x9OQDzbwt4gt/Dmqpez6LY6mAynZ dhjtHOdoBAyfUg4x9a+s7620nxj4LiuLZBNpt9BnZnB2sOhIPBB4ODwRXxhXvv7PXi9XS78H 3sgw264sgx6/89EH/oQH+8aAPLfiUtwvxE1v7SzMzXBZS39wgbQPYDA/CuUr3T48eEWXytfg T5ocQ3GP7hPyt+BP6+1eF0AaOg61eeHdcs9WsZClxayiRecBgOqn2IyD7Gvr/dpPxH8HR3lm yTWl7CVdCeVJHKt6MDx/kV8X1ZtdQvbHf9kvLi33jDeTKybh74PNAHd+PvD+leBtMPh21vvt upXN0tzctx+4jRWCIcdzvYn6DgcVwEF1cWvmfZ55YvNQxyeW5XeuQdpx1GQOPaoiSSSTkmig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooA1fDnh6/wDFGuW+k6bEXnmbliDtjXuzHsBXpviCbw78Jlj0vR7KDVPEpRXm vrtA4t/QqvQE8kD0xkniu0+BHh2DTPAVx4hKhrvUpGVXx92JGKgD/gQY/l6V4T45uJbnxzrc szMX+1yL83XAOAPyAoAvD4o+N1uPPXxHeK2c7VKhP++QNv6Vtav8Rk8c+F5tN8UiKLU7ZfNs tQiiIEjjOUkVehI4BAx6gda83ooAK+hvgVpekaz8Pdb0+XypLqe7IuY26mLYoUH/AGc7/wAc 18805HeM5RmU4xlTjigD0ZfCiW/xdksfDV75Vrpcq3M15u3LaqmC5JPXB4x68HvX0XHe6Z47 8GRalaATWl3EysrDnurKR7HNeW6d4IuNC+BVybODdrGs23nzFR85jIBWP1+6enqTSfAfUL7Q LS+stdH2HS7y5WO0+1jy99yVO5Vz1yqj8QAOc0AeMeK9Am8M+I7vTJQdsbZiY/xIfun+n1Bq toWrXeha9Y6rYki5tZlkjAz8xB+6cdiMgj0NfQvxj07wvp1o2qak0EuqpC8dnbFvmcsMAsvc KTu57ivmyOSSGVJYnZJEYMrqcFSOhB7GgD618eeN/B1nofla7MXmubcE6fFh5iGXO1h/D6ZO K+Wtau9LurzOk6Y1jarkKrztK789WJ46dgPzrPd3kkaSRmd2JLMxyST3JptABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QA+JBJKiGRYwzAF3zhfc4ycV7j8Kfh74I10zSvqsetaha4aW2MbxxKDnBCsAXHbJ46ZAyK8L rrvh3rmqeFfFNrrdna3U1nG3l3ghjZlaIkbgccZ7jPcCgDpPjR4QGi64mrWsAjtbo7JFQYVJ AOOO2QP0ry2vsjx74dtfFnhaaJGV47qIPFKOQGxlWH6Gvj27tZrK7mtbhCk0LmN1PZgcGgD6 ++GOy4+EOheVjAtiPxDsD+oNfPvxi0GTSfGst5gmC/USKccBgAGH8j+Nejfs7+L4JNPuvCd3 Oqzo5uLNXb76EfOi59CN2B/eY9jXafEfwRF4o0OW0J2Sg+ZBLjOxx0/wPsaAPkOirmqaVe6L qEtjfwNDPGcFWHUeo9R71TAJOAMmgC7pek3us3jWthC00yxSTFVH8KKWP6DA9yB3qlXpFnaP 8PvA99f34EOv63D9ns7dv9ZBbk/O7D+EtgAfT6483oA+lPBnxo8KN4MsrLxFcyWt/YwJCy+Q 7ibaNoZSoPJAGQcc+1eQfEnx2fG2sobaJoNLtcrbRNwxzjLN2ycfgK4qigBWYscsST6mkooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKs6fp93quoQWFjA891O4SONBksf8APegCtRXrT/ALxDFphnlvrVbrbkQBWK59 N/8A9avLb6xudNvprK8haG4hba6N1BoA6n4YeEI/Gvje2024LCzjRri52nBKLjj8WKj8a7r4 r+Lda8Ka7aaJ4emGl6bFbh0jto1UMdzDHToABx055rI/Z+1KGx+JJglKKb2ykgjLddwKvgfg hrufjr4Se/0oarbRlp7Elmx3iPX8uD+BoA2fg58QJfG+kXulaqYRqlphwYkCCWI4G7aOAQ3X AA5XjrXmfxv8JnTNaj1uCPEVyfLnwOkgHB/ED9PeuG8EeKJvB/i6w1mLcY4n2zxj/lpE3Dr+ XI9wK+rfGOg2fjHwu6J+8t7yENG4XkZGVYAjg9DQB8b2d5c6feRXdnPJBcwsHjljYqyMOhBF fQPhH9oSxuLWKy8X2bxzKoU31um5JD/eZByp/wB3PPQCvE/EfhTVfC1ysGqwxxM5OwCVSWA/ i2g5APbIFYlAH0z4h8T/AAg8R2vmajqsMyr93NrN5g6dMKGFec3njjwR4bnc+DPDImvAP3Wo XxJEbccqhyePcivLKKALuravf65qUuoalcvc3Upy0jn8gPQewqlRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVZ0/Trz Vb2OzsLWW5uZDhY4lLE0AVqK9Mj+BXjA2P2iZbO3cjPkySNu/EhSP1rgNW0i+0PUZbDUIGhu I+qnkEdiD3FAHcfDb4bWfjW8C3Wu20OEMhs4HzcMoIBPIwo59z7d69E8WeHtO+GNjd+IdAtB BfQWgs7ckFtrO4BlJP8AEBnn3rwnw7rl34a8QWOsWTYntZQ4GSAw7qcEcEZBHoa+vdSj03xz 4MjvIR5tlqFvzzyAR0OO4OQfcUAcB8FPiVeeJpLrw54ivGub3aZbSZ1AZ1H3kJHUjqOM43c8 Cuf+Ovg/yjHr9vH80ZEVzjuuflb8zj8favLs6j4C8brJGSt5plyGQngOB0z7Mp59jX1leDTf HfguG+gAmstQtuV6kAjBB9wcg+4oA+N9M1G60jVLXUrKTy7q1lWaJyAcMpyOD1r6+8L+LNG+ JPhxZ7WSNLwJi5s3PzxHoRjup7N059cgfKXiHwvqfh3Ubq3ubWYwQybRceWdjA/dOenPpWZZ X13pt3Hd2N1Na3MZyksLlGX6Ec0Ae1658BhHrEl6mopY6MGMk/mLzEvUhT0x6Z6e9V7r493d npepadptorP9qdbCd8bYbfGFG0DkjBIyT156YPlWqeKfEGtwiHVNa1C8iHSOe4d1/InGfesm gCe9vbrUb2a8vZ5J7mZi0kshyzH3qCiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACinKjuGKqzBRkkDOBTaACiiigAor1HwR8E9W 8V6XFqt3crY2Uy7oRt3SSDsccAA9v5UeLPgnq+gWsl1Y3H29IxlovL2OB6jkg/560AeXV7uP AGt6F8K7J/DjCPVdRhW5vp1bZK0bLkRI3YAEZHc55rwjpXqmn/HTxFaeEodBWytJp4ohBDds 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 Bj3/AOWiD8PmA9m9ad8cvBMs6JrdlCXmtxsmVRktHng49ifyJ9KAPMviF4/vfHmsLcSx/Z7O HIt7cNnAPVmPdjx9K4+pZrae2ZVnhkiLLuUOpXI9RntwaioAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK1fDGmLrXirSdM ddyXd5FC4zj5WcA8/TNAHsvw/wDBll4L8HSeOddhWS+NuZ7WGQY8lMZB5/jbjntkD1rxrxD4 i1LxPq0uo6ncPLK5OxSfljXsqjsBX1P8XbRp/AOqQQDaEtdwVR2U5x+Qr5DoAASCCDgjoRWv q/iS/wBcsLC31EpPLZKY47lgfNaM4wjHPzAYOCRnnrjFZFFABX078C/F3/CR+EpvDt7JuvdM AERYkl4T908/3T8v0K18xV0fgTxVL4N8YWOsJuaKNtlxGv8AHE3DD645HuBQB2fxt8JnStdT WYI8Q3Z2TYH3ZB0P4gfpXofwG8WrrvhSfwzeS5u9NGYdx5aAnj/vljj2BUV2njTw7aeM/DEs UTLLBdwh4pY+R0BRx69jXzr4UN18LfiDBfa+WtRbxS7oYiJHuAV2hQoPGSQwLYHy+tAG58av BU9prS61ZWzulxiO4WNSSHHAbj1HH4D1ryaFYku0S8EqxK4EoQDeBnkDPf616V4y+N/iHxGZ LfTQNKsjkDyjmZh7v2/4Dj6mvMGZncu7FmY5JJySaAPQfFHxh8S+ILcWFrO2maaqCMRQOfMd QMfPJ1Jx1xgH0rz0kk5JyTRRQBt+EL5dL8WaZqL332JLSdZ3mwWO1TkqAAckjK46c84GTXpP jP4+6nq/mWvh61Gn2pyPtEoDzMPYdE/U+9eN0UAS3N1cXtzJc3U8k88h3PJIxZmPqSaioooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAorR0bQdV8QXgtdKsZrqXvsXhR6segHuar6jZNpuoT2cksUskLbHaFty7h1APfB49OOM0A Vq2vCGpRaP4y0XUZziG2vYZZD6KHGf0zWLRQB91a3aJeWTAgOjqVPcEGvjLxf4cn8LeI7nTp VPlht8DH+KMng/0PuK+hvg18SLPxJodv4c1OdU1e0jEcQfA+0xKMAqe7AcEdcDPPONL4j/Dm 38V6dtwI7mLLQXAXJU+h9j6UAfJVFdHqXgPxPpd21vLo13KQeHt4mlVvcFR/PFbmi/Dae2t1 1rxjINH0WJssspxNP/sIvXJ/P2oAw9Q8Ox6d4G0nWZ5HS81C5lEUJXG6BQBv/wC+s/nXOV0P jHxN/wAJPrKzQW4tNPtoxb2VquMRRL0HHc9T/wDWrnqAPRNQ+LuuJ4fs/D2gSyadptpCsKzZ zcSADqW/h+i9OmTXnskjyyNJI7O7HLMxySfUmm0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRUlvby3dzFbwIZJpW CIg6kngCvZ/CHwEurqKPUPEVwEgI3C1tWDFvZnHA/DP1FAHkekaJqevXgtNKsZruc/wxLnHu T0A9zXq2n/BC703RZ9S1kC7vEjLQadC+1WbsHfuPYY+tcr420nW/BHiiS4sRJpto7D7LLYu0 agL90Eg5LDuScnk17n4E+I9nrGgeHrLxFdAalqkMvlzuAqSSRyFNhI6ORtI9c46kAgHgHgTx Bq/hvxhploLy7t7Q3yJdWhkZUYMwR9yHjO3jkZ4HpWH4jtmsvE+q2zDBiu5Ux9HNfQ3xM+FU erk6npirDqcfzK+MLLjs3v714r8UIPJ+I2rtt2id1nA9N6Bv5k0AchT2hlSNZGjcI33WKnB+ hrT8LjTj4r0gavj+zvtkX2ncMjy9w3ZHpjr7V9V/EPTdCXwJfzXQt108WpKEY29Pk2e+cYx7 UAfIMU0kEyTQyPHKhDK6MQVPqCOlemaF8evGWj2gtrh7TVEUAK97GTIAP9pSM/Vsn3rzCigD 1rUv2gfE13CUs9O0qycj/XLCXce43HH5g15trOv6t4hvTd6vfz3k/ZpWyF9lHRR7ACs6igAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKltrWe8uEt7WGSaZzhI41LMx9gK2otGstH16Oz8Vtd28QRXljsRHLKpJHyt lgFOMnuRxxzwAZFlY3epXcdpZW8txcSHCxxKWY/hXQeDNI8P6l4ggsfEV/d2vmXCwLFBEDuY nHzOT8ozweCea+kvDHhTwjP4Lb/hF0glsryIpJMo/eyDkEMTznOeD07V89+OPAWoeCNSFxGG m08yZimxnYc8K3+PegDE8Xw29t4s1K0tbRLSC2maBIkz0T5ckkkknGT9a6D4e/FDV/At6I90 l5pLkebZu/C/7SZ+636Hv7UfibGi/ELVZo1AiuXW5TB7SIG/rXJUAfZU9t4d+JHhX7VZmK9s blcMuMFW7gjqrDj9CK8J+I3hN/Cng3TLQztKtvqUwgc8FY5EVgD77kbpXK+BPHmqeA9a+22L ebbS4W6tHPyTL/Rhzhu3uCQfWvirreleNvhYmvaTKGjiuI2liON8Lk7cMO3Xr3oAh+F3xoSd IvD3i+4GCAlvqMp79llPbt835+tch8dtPNl48jfbgS2q/iQzf0xXmFXtQ1rUtVgs4b+8luI7 KLybcSHJjT+6D1x6eg4oAo1K9zPJAkDzSNEhykZYlV+g7VFRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFKiNI6oi lmY4CgZJPpXo/hr4Na9q0H23VFbTbIDdtdczOPQJ2/HH0oA86iikmlSKJGkkchVRBksfQCrt 9pVzot9Db6rbvE5VZJIAwEiqex67WI5wR3HFaFhrupeDvEVxNpIkspI5seXcRo8iqDwrEr6d cYzV74mqP+FharMgxFcMk8fOfldFYfzoA9g+DviLwFdf8Syw0w6Rq7jAFxIJWuP92XAJP+zg e2aj+KnwnOqNLq2lIF1EDLp0W4A/k3v+B7EfOyO0bq6MVdTlWU4IPqK+jvhV8YIteii8OeKp lW/4W2vX4E/orns/of4vr94A4rwv401jwH4K0+8hDkWusT2l5Yy8B42RHA/2WBDYP16gkH3D TtQ8P/Ezww11ZeXPHIuy4tpACyMRyrD+veuG+N+gw2ngy6nhiUN9phmdlXliMoCfwavCfCvi zVvB2tR6npFx5ci8SRtzHMndXHcfqOoINAHV/GfTF03xZZRxrtiGnxRKMk8R5QcnrwBXnNek fFfxjo3jYaNqenb4rrynF1auCTCxI43Yww4JyOx5ArzegAqRZ5UhkhSV1ikxvQMQGx0yO+Kj ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAr0bwf8HPEXiUx3N5E+maewDCWZPncf7KdfxOPxrzmu78D/ABV1 /wAG6irNczX+nMf31nPKSCPVCc7T9OuOaALHjbQr74deILaXRI57SBI9kd+HLPK5Hzbuyn0A A4/T2L4Z/EpPEHhaH/hKbm3ju5L1rKOfZsEjBFZd3YMctzwDjHWul2+HviX4TF7ZbLqyuV2y ROMNG/dWH8Ljj9CMggnxPxZ4Gm8I+CdftxIZLRb22urVj95fvo4P03Jz3oA9A+J3wqg8QQte 2SrDqKL8kmMLJ/st/j2/SvF/iVZ3FtfaHJcwmKaTR7dJVPUSRgxt9eVr0L4U/GUIIfDfi243 QNiO21CVvueiSn09G7d+ORT/AGhtO+z32j3KD5CsiZ9QdpH9aAPE6ASCCDgjoRRRQB6N/wAL SuNV+Hd74X8QLLdShFFldoAWGCDtkyRkcDDDJ479a85oooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigDpvBPjjVvA2sC906TdDJgXFsx+SZQeh9D6HqPxr3nxb4g0j4hfCPVdU0pwWjg3X Nu3+sgdfmAYfhwehr5gq3Y6nfab5/wBiupbf7RC0E3ltjzI26qfUf4UAVK2b/wAU6vqmgWWi 3t0ZrOyctAHALLkY27uu0c4HvWNRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQB//2Q0KZW5kc3RyZWFtDQplbmRvYmoNCjQ0IDAgb2JqDQo8PC9U eXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCA4MDkvSGVpZ2h0IDQ3OC9Db2xvclNw YWNlL0RldmljZUdyYXkvTWF0dGVbIDAgMCAwXSAvQml0c1BlckNvbXBvbmVudCA4L0ludGVy cG9sYXRlIGZhbHNlL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTQ0ODA+Pg0Kc3RyZWFt DQp4nOyd558c1ZnvdSp2zt3TPTn15CRppBlNTpoZRZBkY68DBgwiChFMEBIIjE0QQiiNAtgY jJAM2L537V17MdkmaQkGlO59ZxDDxP/h3K7qOqeqZ0Ys9/O5dzFVv+8LMV1dgnlxfjznyYsW AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAP7JIBpf9y8BwD83RFJUVVVESAWAC0IkT7yovKKsICBDKQBc AKKEe468+PLLt/fXRlXh6/5tAPjnhCjRfVRnelVLUoVNAWAhpNCb1GBqdUNQ/Lp/HwD+GRF8 XCeUfjJQ5sXlCwALhIgiIUTZRS3sbUsquHwBwCCi4g2HPLIcoHTyjyeZUKY3NASlr/t3A+Cf BCKogbyKxsayWOhhOrGpOv8SppRzPQUumBQANIjkLRgc++Dvf765vfkk3VoTVNxvGEKZXV8X gj8PwCJNJ4Ge81ldTGyir3akFCJUM5PycVcRQsQAZBC8N1n89+eWxcSMdq5nIeLLm8MwKcDp EFGS3NdbdEJ3LolkhEHS7POplaXwUoCzIaI7HAvF3rUK5XBXvhYRltawwNf2pgBMCnAwRPLE qg5vatpP6Z8PvM0jwhc3BoXMl1WfGg/O9uXDSwGOhYhqqGhsgp4e/ZDuboh6r+MmpTulVQ2L I+zBtloEvoBTkVzBon3jmg7up6d681Uh/TdmUtbW+DSTUslMyuneMg9MCnAkgi/12DgzGceX hcVFArcg+zvyNC9FXMUe3LU0CpMCHIm8+B3Tf9/RkjEhRP2r8XHmovqApAW+3mKBr5G0TxJg VIDzqPjsOTPWdYkmlEVCDfv8epfuvpsmZWdXUciHJi7gPERXIPYI08G9y/WcovSM8Xl2XU1A U4XC3JaZb6+oK4tKsCnAaRBBlGqZUM4Ml3pyTMrLHQXqImvga/rFD7YVoOAeOBJ5NdPBPUtj mlMiHzc+T61pCGmBL+62UHqgMwaLAuwPIfNGdZk6ODdc7s58RXgp5OsDxao1PX+4K+5D1hHY HiJIioYsWrVieus7WnQvRWZVX9Mbm7TAl9isf3piqNCPIV/A9hBR9SeKSkpLiwsiLtkMXhHu rU/0l2iVj6aXcmaw1C8SdUPmx6fWFoVgTYD9IVIwv3/nk0899fAtPc0lca/pa5hJxrsWa0Et ot7A3Zb2Er/L/xz94orymBveCbA/kjs+/EsW531hdVd1jNsHIrGRK9Orqjw5JmX62z3VBev/ sSHmV3HpAg5A9C05QE1mXhhtjPJRqUI9e76/La6XQq7hSjlFv5/nVZGRB45A8LR/TumR9Ird TAFn19ZHmFIsdSvrarS2E1LFJXV+T8InYaQ9cARESZyk9JaqoOpt4UoZTPtZkaNQx54e6Ujp EeET2Y/jB0rCuHQBpyD4tMrG/mKVCBL33D/q4wMgicwCX7NrqrW6FXGdLpOxighceOAc9MzI TH+xonnuPM9+d1uSXb5Mk/KX5SlVEpUtmkzqCvwyaiCBYyAeTRyzK7OJdz4wYnptLTcpinHX olNrmguiwVH6+Z7yeAClwsBJiGFdA9ua9GZe6WqmlLEVMdl4xYwIT67tWpPe8GA87EGoCzgL 6VpdAh9365NVLCZlpJR39yrPsqdT9Iv6uBsRYeAAcisfpZ9nFbC2xqc9FUeZJnY0RXjgi5fb 0yM9KS9UAmwPIaKsKLIZrpIfyCrgYFtcG0pvGWu3IsnuXsRlBL6ODqQCLsyuB7aHSK5wqrik MMoju/Ix41I1knXnuZcyOag/0P+Wa4v25MnRgqAMcwJsD5F8eeX3/WrPnpXLy0JG9Fdi07ru XhbJNSlXNgUMUUihtyn9xWBBEJEuYH+0nde3P65rYOaFlfWhrE3hpVszq6u0ARKLyGbjwXXL wlldEPlherAvz6fAmgAHIAWW8z1ZdPrSSp/uq5uO+v3teZpTwmu57m4NG8IQf7Y+hr4s4AxE 3yWUfvEeT4l0F+kj6InKxj3OrkprAyT4qJXL6/3MRxElBISBMyCuDZS+uqLqO0wpl1VldSCv Z0/uaY1qXgpbEfRdyzIHlAgDhyCE3qH09qqA+xpDFjeWe/XTb+bdp0Yq/dpkFUWv+Hq9jYeH AXAKRMuuz4wWq4Jq5EQao0r2K/EYU8prPXpfvKgn64/VY48WcByCVzv8o8UKEdKawRi/NeFi RY9m2co1rVprYzYQdmOJB8Fg4DSyJV1rK9zCIkG58tlHlgcVLgOJzyQ6t6o6ogiKVnj/aEsY Ny/gOOQHNSHs12uEiez2uS3BXqI8wJRyoq825o3sofSjjgJkF4HjMBz0070FWjPv3IGQgqmU 50YXp+/M+PWbi3HxAs7DEMrU2prAQoFeIv+M51f+/h6lH44U+eHJA+dBlGxa8eOOhSfOE7mG tTFS+sXhijDuXcCJMKHM3LE4LFuUQgTRUISgNj2nbaKbONJXFPWgXAU4EsKq6c+uq7Eohcg+ 3vtOBMUXLywuiLhVDFcBToXvyvpdXzrA3Q9x5PnSIP9EBFlRFRFVXcC58GHbszv7yn3GzYqo D7/fErd0LM4NhwHgMJiTQun0vT1lIb21hMiRt/6jNY7WXgA4IiuGpDP7u2sSXkWSlNBu+nQj KrqAc5i/VW7eG7yii848t6YtnZ9IpL5H6ZYyJBaBUyCCJMmyJH3pkZc2c6XQqRMjnW3r92d+ WJaQ4ZUAZyDI/ngylcqL+r7s0JOKN0yl0Okp/R9PVXlhUIAjIJInll5zzbUbO5aUR1xfkikU quhcJjvysBoeOAIihzoPjOun/sTw4qLglyQLxbq5Qrm2zA2dAEcgRe+YYOd+4kRf3ZcohUjD ufbkygJcvIAzEP0HKP31mh98nj37nwxX+L8kLyLVPGLq5MPRuBuhYeAIiHojpSc6Et5aY3nv 2Z4SX46VyA0cC2rj21lr8uRYUQQBL+AQxADVNsD7BJ4m+aij2GU5/4Lq8Xq95g45Iii1i2+6 5JKiPCy9Bs5B0ZY2XNXsIYuEIUMpdy2Nmm6K6El2/EtNVUnIUjEsSIqqqpi2DZwD8Wk3rs2a UBZJRppkqsfszSKemzPOy9QzK2sjlkkR/3UaHwBbIejZ9sdaA8IiIjZkhfL57TFmUYi8Jfvs zFCVD8oAjoIQkTsXor4u67WeuCzK3tRY5ufxfaUxN/PmiWq4+HTH0ggCwcBBEFH2hIJsdl12 yOPM+spwMK97b0YmeyvDbnOrNVnJQsGvrIghEgycg6AE4p27qxOGFyJm98Lfv6Kmfx+lXxyq SQa0sfPMBTGF8tKyKCwKcAaECJn71cABSrdUunKE8r+u+VVGJvtrUgF9/CMR1ewYSLO0/qla P3wU4ACIIMmqN957VC9VqWBC4fO1J49WxP1GyFfwxMK6ySHSX42vl6XUr/O3B+D/LReK2gqy J5ws7D6on/rxH8aNuFbWmc/w+zW1IbYSi8gP/qQgW+xIqj7ThXVvkQ8uCrANRFAWXABHZG9e xRVH/6RrYuZ4S4rl3gU2XvvsxY18ChFxv32k0mOsMq3a9cK7e7sSX1Z+D8A3i4ynnpcMzW8Q EdRozxFeIvyHb6/gCxkE32fG0yMDFWwIqhD4/Ge1XsO6iFoJixtFXcA2ENmXGn5yS11kbp08 UZKHJujEH//T0MT0ibZ8pib5IePh7H09GfnojolyA91a5+HJeWThgX0gGSck2fNERgUrK1y5 55qo8f9B6bGGZPB6ZlRebo0ZNsLc6Tt9fWdJQJUEyR3/Hd0y918CgB0QFH+sUw9o0Z3LY7mX Lzny28zjrqRLVNjEoek764z5jkT5G1PKzL7+xpJ4KFb6O0o7U5iKCuwHUSId+9l5X1UZsOYG Bd+jmaevtoYltrtBq93q1vecLLKalIx+bu9vbV71B0pPtKJgBdgQoe4x87gfas+37oST8rSH p9u1zdZssTWdXV/rZ1UsV1ML2dkqt1QjvQhsiPDGZ3vf5md9pNprWRvn0veWnB0q0vf1rjZe GuNFjqTyb3QOLy/NUyEUYD+I7AuFL2bn/EB7wmx7J/7z+sPNDfr2RdXQ06HWCMsgCuk5SplY lo/pj8CWEFGSqphNmVpVZR50wbhZHenU27Gym60p3ddgOjJC9XGrTt5bXeBFehHYFqGeHfWx rgQPfDGhTK2p07wSUpPNMN5aZon/CqrFTxmrjLnQ5QtsjPKscdanL04zV50LhR7sSmnqUfWX znTkWR1+IlU/oAvo872VcS/S8MDWiDXMKhxqTTAdELYAaGpdQ0gii2TdldldG8wpctQK8Oua lsTDAR+GRgCbQ+RfM5OysooN5yIuVs11aqQqKBFlQ+bHj1qj88yGIEiyJArw4oHNIYSnSehf 2lPMS5FYy8nMT3vKAqr/1syP1xYi/AtsDREucDMiksvjC/yGeymNQWZS+Az62a2D9aW171O6 uSgbFSOwH8CWCLLH61EWkAoR3OGCyqpq1l5CX+vhRkMYZQ9nXrj9xr/T8c3FWhcWEUTV7ZLg kQDbIXiS6YbawsC8gkWiBJbv+2By8qNjp5kmNi6JGFlHInH56I5+XdIjCYLsDsSK0+UJviYe AJtA1Naxv7/0dEeZf05bLlGit4/TXM6sLGGZEiI1sCsZPdyTCqmiqPhiJXWr7rtpaFl10g2l ADtB5BZ9N8Nkd9mcsy1F92hfHP2XLQ9xocx+uynE59hJrtCSG2689f0vVhd6lYxM/Pk1Bz7Q X5tc15aCYw/shOAzxjZ+tDxqzRYuIp6t2uPb0iFVbdjFlHK2O9/sSyGirPq/RbfUBCVR8sS7 DvDG4IzbH8aieGAjJFb5Oz2cn2MExKW6+96bUAgR3Tcwk3JVY8iiACJH3qSrmmOeQLxrn/WO dq6/GN2MwEaI3Ccfzrf2MBJ1t/bw5WUBzXUxcymnBsus5fbuByndOtxYXn9wjjezvTGIUUTA PpgVKp05Vy/ifld7+EpbSD/vvOVk+urFUVMBJPiWlnO87Im5Xj89tTyKuxewD0Q2Fpg8WJPT LkI2Z8Ncg1mv3ByDenqgxLyiidG5AuGvdcQhFGAjSFov23q8NiEJlgS9IRTKSoaltcyk3NUU 4CZFaJynkMP7v3dAE8oKCAXYCiF93Qv7+vIDquz2uXlvFRPKoeXZ0nmh+lNDCWcGSvh6a6Em VyUTR/pifl/kbUpfXRKGjwJshah4vG5VcYWLKsyudvKz7NE/N5Sdg0pk7vXvaOHGgiif5sgk nfTLouh+hNI7qrAsHtgNIojuSMnRiZ80cjPALAq9Z3lMlwWp5CZluIoP1xb4rhN6fqwk6JLI IiIG3qW0LQ+dWsBmEMkVKDgwnpFAbxEzKbw169RwRXYQKg980Xs7Cz2ycUnjc4n+3J/wiFpb sOTZROnPK3wwKMBeCGq4eOg9/bRva+ZFj9z72NmezK41Ud8ynsx8a0VJIpi1GESq2/J8RmNP Vwe15XNEdEfbx+m/1QbgygN7QeRw90lDApODZUaQmKjn2U1rTU3WOpgmZWb7hjuNXScZaXiW jtPjXdpViwiKv2BwnB6pjePiBWwGqd5t+uP3LIsZaUc2gojS+7qN4hbPm+aLJwv5NhStWmxn R0KRJMWX7DtC6aGS8PwtEQB8QxFEvcGKVPx8/cPs/E+tqjJGrZh3r5lNi/Ud8cRlzrQ7UslL vkQtPvb4aG0qkUhV7Z+g43cUeDGMG9iFjNMdDPs0v0JUXG5+qxrryDduTTKbU0T/NqKHuYif TZSgO0rNzUL6atOZsZUrlq85mHFWDlYlPZh0B+wCUcKlTUtqkm5RX+rDJ9JPr6834lVmW3zm 8lWScdXlpDFte/zHRR7TZojPZG3RpPbn4cGUH9cuYB+kyM0nJyZ+sCyVbdcS6rhJWcG8FD5p hU5t7khHfaG99NjfM5/+1JDyWprizez8+IGB4jD2MgIbIQb09pGpTc3ZIl+icpOyqoJ5KZXc pEyPjSytuZTSm6/IuOqV4ZyOeCLXa/OJP997SUHYD5kA26BftTZlFXC201h7IvIZwweXs+ld ZhcKpRMvPq11QRY+e3PKPyf0m/F2AnXBYMDnkiATYBeIpCiS6DaG1M/0FirZxwq7aE2uaWR9 8dIIzeH6Yo+iyvNT7kIWqATYBSJ6YkXFcR/bu0iZRVlEuPk41FvAXHWp1qqTJ8t9MBnAZmQs x7z/9wuSO1p5ZOLRxQWPGGf/w7ooH9TF9plMrzfXXAtVPEhMj5agLgXYDtGbiLhylEIkd7BQ m5QyM9zwTsb7zpz9zy6N8yFFpkl5rdOsQCGuRj0ff/5wfwp5RGA/5BuuqItZu+AFV6TsQLa3 /UAvpTfWd2zamAharI70jCGUmYtrzMkQRFT9S5YXpiLehaauAvDNhqh/negq81iOthy55Qt2 udpIn2pJuBVFtvocZpDr9Q7rYHoiyIqiYJ4wsCNaYuTRxTFLO65i2T76v+ktVT6BkJyzT7hJ mV3bHJEt35I5bwJgF4jrUzq1skozKUTQGqoWiT9etYQXa9Hd1m3Y7O/wopVTIzUhl0tB7xWw O8SbOe/7O2IyERRfQPPqiSCp5tCU/S3B+TLg7Yr0p/1VqUQQVVvA7ojNeqC3KuD2p/rqCrKx LTOrSE915iwmzWJO75o+cePBqjxMRQV2R7pWzx12Vhb3jdGbG7LzHhcJ/HI1ubJkgXnzMk9E UnpgRQRtisDuyA/ogd5LfvTLzD8+aY4YXn1WPxp3NQbmD94yA19He+M+bAMCdoe4sm2757Q/ Jg4VsHGpZlbx456C+Tcr4sqm538xXBxUUK4CbI8Q5FeoycMVCT4BksjXGY+nLmqKzDMpxKPV tjw+XBB2wZoA+0MUvvrn2ca421J6YoaAzwyVzTMp8uKM/flBnm+BCmEA7IcQeMeQw8y3WnL3 L/CFKLPfXjJ3hQlJf/rZ9/L9MpLwwBEQiV2wKH29rygnvGWalLN9+XMTJeJoKOjCcG3gEIhi TuCavbghN7VompQrG0Jz6uaJIMKFB7ZHECVRH9U1ROkYU8on3fmK9aXM/cr45vRAqQeyAE5D m9QVCXm10aYDD7QVbGHhrbX1c0zKKEu/b9cm26HeETgK0RWt/NHyJRXadYrILtXcT9pfkhPe IpV8rPBwdQC1j8BREFd8D6WTz/bqW3szdoIPD56+ujmQowWB7wTa2VuWSvjRuAicgxh5Xj/7 O1oT2bCVGd46PTe8xYd4zbx89OBtMRQJA0egNZwQ9XpDFYNlxsGXmOGYvqLGn+ulWMYQ7S8O wKIAJyAo/rBP9rM1P5fVGh6JWTR/prvQtXAu5fCKmA81wsD+EEH2JoeaywI8xfj9NEswipb9 pNomrYzlMSSkZocQPTGQdEtw5YH9ESR3rPswfbGt8HlDEy+25LGrFKliGZNT/UUZkyK4vNnK ecGj7Q56cm1RcIGeFADsBpH9eX2Pa075+mXv0em/fJE5/QMx85Yl8bUn2xpCApGXlCR0ZYh1 b9FfDBWF0XACnABRYr2PZ4Vwdt0E/UFdIp6f8Fsqf0klmyZxqrdEFT1vXVXh04Xyj92deX40 nABnIPr3M4sx+0N6bEWeIs8Zo8qXYNO7WmPeGN2Y1oVCJI8HMgFOQfzUHD9E6WOtwbmTuixr F2cubiq/k24qzt7LCEbPA+dA0uHWt7lQ9rYuMICI51LozG0PUtq2wOgVAOyOIKl8/w893j6/ tXeR4PorNXm6IYxmE+BACBF5YOvMYOECqUNzw2KGZSm0wgMnQMjcMcAkzUqBZy6u9c6XAZH5 gCJ6dYkXBgXYHyLKOjnxKtMLMff5WhFcP8t+PX5pkReRLmAXLhiQIqI7nCrMkArnjFWx7PMt X8CkLCJS9bXP/XZvVyKAexewDURweRYcFiQo/uLhw0/84YkbOxuLrEMeecMi3dESXehqRQTZ Fwj4kDgBNoKktxRF51dgEcmb3D+R1cPEjt5Kn6kI4mJ1w6f7Sy8wVlvb2fv/73cG4L8dYfT8 uprI3P/5Ezl007gZvdrZmWc2WxGzouuOphD0AGyOFs8SJE8rPdU/d4QjkSNj1MLsumrL7Dqi MJNyqq8I3YrAzhBRdnm9vlAqfYTOXL04d4QjkcO/pZ8f7O18jCnldHeJ2+LP84quHUvD2HAN bAsR1UBeeV39wI+OPp057mcHCt1WwyAG36Qfr0p6VRfbAzR919Ko1aTwwNdouQeXL2BTBCWY 37v9l3/hN6s7GyIWw0A8xyn9SXVAIuYeoFND5RYtmen3nUvjqihiVBewH4LkSw4esbog9NRA hWWEo7hOS7svTrgFYjb33tMetxSsSG8Yj2fWNOVHAioS8MBuCGpkhVaFMv77/T/YesND2bL4 bZabFVFOZJ68MtqccglsPxClZ1ZbtSTUMgG9tqqtoSQElx7YDNHTujdzvif3pVPRgEtWXA0P ZT5+0lfCzzpx6QqYOrYsoRBlA1PEfa2WdQ5E5kvkp16afGGBRAwA32SIa6nWfPXR6sKAKola hFhU63dRutUscCTMAbmtyi96bmGCODdoDXwJPJdCx/ckfQh9AVtB5LXa2T7WmnTzCi8iuu6n 71fxKhUybCjgRFNEXWI6MjuWWrwUohq5lIkDZTEVxSrAVhC5STvcL3fk59QrEnkz3ejmFoWF uh6qCIXeobs+ND5Orqr2WYTyiC6Tw5UxDwY/ApshBTXffKZ/bvKDSKqLWwUin8jaisZ46Dk6 2fl9Hgpui/MrluDNeDoTYzUFfgXd8MBmCF49hnV77fyN79ZMCKnSrlXjvdHARkofbYqywNfU SIVbFLO6ENd8/sXh8ogX4S5gO4j6kH7gO3I3Ys1HdNVv7E4F3MmTlK4s8/BQ8GOtcb8/69wI v95VlOeVYE2A/RDDWR+9NvBfVp0IsiJLgRcofaM7KUl8acP6trGDCd2jJ8KcxkcAbAJRs77H HeVfYZEiIYKauXjR33UmRDO7OPM8vb7YyJmgbAXYEyGYPe23X6jbKhcprI3werwrTyLuZ80g 8aZ8bG0AtkZ6+P9KKIpmUOgTfYWq5NvNdfLvDSHUdQFbMXfaqWpEr35c5v4KQiEevUjl7NrG ZKzIHA/5w8R/EQgA4BuFIKlKbjeW21hesjnt+wotJEIo+/ahkfbW39PjX+gfvtiWcqP9BNgG QiRPtDCZIwjBZxiFsZYFRqHOQ2Jz7KZfmaJ0cDBjjs7vHcrz4OIFbAORXJHS/X9cXmIt6uUn /1xnwVe4PknXmA48fawl6qltiIT9WBEPbAORPZGiPefp1LoWawZefpDFeFdWfAUnxZzeRelk d4FLEEVJROYE2AUiuKJlY59r5/v0QMo0KUQxgl50dkPLV5gxb3Sl6NyLxnhgNwR33mPGGO3p K6sDlr7Fh9i5P9RbcMESLcKLUqQH2PsPphESBnZDajrJLcGZLkuvlcSuXnRqfd2F4l6iy+8y REEqjcqVX6aD2AYE7MZT9B2ulJltlgCXeLV5lVoRX7iHRHA/W5Fk1ywhrdmg9y8vCSAXD2xH eZXP38wUcWqolHspvHGR0rNrKhYu9xJj9JZGPmaCSGp9POpDwwmwIUQQRXOXz/amwLzGxQw7 W+ML3qaUB+hEa8IyQ0KQUEkPbAup5Calr5AXdin/4EKZWVezUKk98bxJjzV+lXQkAHZA5MOB tzXzGZDm9kVKX+9ILRD4EtdSurVsoeVAANgRkmZjt84M8hJI691rdm19aJ4/L3rfoi8tjaK7 FzgGc9HijlY+ZEg+biplcigdnHPFEr2bKL2mBFWPwCkQIpqjUEfT7C4lmHGvjPfSU+rJqUgR XKl36IdN8FCAQyCirHr963nSpD3PqIEk8hsWpbzcVWoZGUwEd947lF5b9JWaugD4xkOUYLyg rKL8PUMQU6MVXualpC1Coc9018RUUdA3yYuKL/8FSh+onnsfA8CeCEp84PDJ8X/7xdNMEHeb mRGh2qqUT1YtLop4VEVR3aFU33lKH6oJo1gFOALRkzhAc5kaqWJeCuFNKVmPfnvP4oqiwsLC 0pWHMx/vrw4j4gUcAXG3axX2k0fu+J2ph4OdeSzwRZTRHBFNHLji0h/+8KlnND3dV+LHFGHg CIiar1VEvtqa53XX7uJJk3VpM4koNdAF+dVQEm2+wCEQ3/Paob+6zicQITu5XuPQ8hj3PYhU ++Z8mXy2vQRtvsAxiM36sd9YrRUH8xUmdGq4wrKwQXQ350rl/OPDxTEP2nyBUyDyI1mh1OhV 9CIfhXqg3drTSES17qFPmUp+/1hRXkCFdwKcA3G9ox/+axr82jWKSKxmZXpNfU6pIxEUb3RZ 29ZNmwrzEz4Xxm0DR0HcRpjL2PhD6rhJ6Y7ntikSQZSzSALGbQObQ3LPOPFkZXFuuDxbMiyz 6drT6yrmtckTg/+23xaArwWt/zDn0sT2+c5uasnOTRF4Zf1rrUkkE4ETIaLijyciXosbTliF yun+omyvvPRr48nM6vqQCOsBHAdRg8nq1raW0rBqzu5yGRO9ptbX+fWnfGc8/bi7yCOjAR44 DKIkVh75YHLy2FBzgY+PTZF/Y8jila7skEgz8DW1bXl5QQzJd+AoiNzy26wAJn68opiHfkXm vE+tq8+OTeW3MTq5fWhDLfp8gaMQA//JBDC1s92seeQ3rVP9xl4t2TqV/s4oyuiBUxAkWfZZ ilBmV1f72RhUtlWLzt69ODs9wjIgcurqQjTEA2dARDWUTEVvsJgJerq7kE1aEflQiZnRdEBT Ct/2QP/UhPpg4AyIpPpTe99f0fAunXicd5xMX9wYYZ1Z5kii13pKg7KojSDK8qvGmAp7AhwA EV2RksH3Kf3kNjp5XUmQl9Gf6itnMyEEPvqOHuyrT4YjJfTFLdqnnZVoXwSOgCiBwmF9ZMT0 7+kjtUFJ4u7H9vaYkXck0l+5Up6/qGvZsn+lv8pcxz6/PN+HAmHgCKTAisNcBCNlbmLes86s 5rvjSfpT/tLMb45/Qun15et/U5J0o0IYOAJSxVdmZWzKUKFKLK77fS0hPmmljubw73WRKpcL 7YvAIZD0g488x07/2WGtmIuo7J51rpcHvhbJtf+w6GTi0jyXgBph4BxExRtks7dnrqzVerNM 131bC284IWIVX79Ix78fc8GYACdBiCDxa9WZjnzNpMjMpJwaTHu51RA8jdmg8Mk9pUHEhIHt mXtlIvJaZlKuatJaTgQ+pmtHW8zclCVI7trG9RsKwn4XfHhgczIGRFGV3Mp4M9B1qr/EkzEp fGr91EiZm8z5y7KIsnpgdwTZEy0oLoh5ZcvdiUhrmFLuWpyQyCJxJfu8vSWSmymBAw/sD1EC qeqLbr1jsK065bfMhSDpz5iXMlKtmRCeYJxZmQ6ghxE4CiL78gd+MalnTI731sUsxSdmoOue FdrSH3M70Gv9lWG3DNcdOAaihDqP8Ajv1EitZYUvqWJeydlRPZeisKrHmXv76guDMmwKcAhE Cd/+hSVn+ElvsWUPluml7GyOyBmTwudBzpyeOpBANBg4BCKFd1P6P/efYN4I3d4aM/10wcXT 8SsrtKyjxJu4xvcVYnMDcAqi/wSduKoiYZbRT4+UWVoTzSXy9yxLZm5agrE/fnysLt8LnQCH IHi2UnpTRVAR5dVMEYda45a9pDIrZJlaVReUSHaE/fi+8ngA9y7gGOQWrWy+OqIIZs2j1tdr akDgAvppf5lfVtsyP43VpHyYtQ2cA1GPZ4Rxf78WEzb99LH2fMV8xc28kpnvdlXGgm/TQ0Mp v4IcCnAQgleXwKuXNoRForKBdlOrasxVQItEnjuZuec7g60PLU+FFRSrAEfB7lWT/cWq4LqF KWJfe8KseSSK2e9L74i53dgDBJwGn8P1cJVbCr7L5DC1tsZnzhoSedHwk8NJN4wJsD9zN5Tw EpWby9y+5ymbkUpf7cyzBL682cb4x0eKw4h0AftDRFl1KdZqeJI2lLE67t9FaecfjI+z66qD 3KSIQa1uZeLSpF9BpAvYHSLI3nBhuqos4bP44tlr1fm78oMbKd1Vs4yZlNe6SzyyIunLGdXW zBuXl0AmwAEQ2Zfs2fbEo4+OdtYXh8wblFR77Piu1og3fpLSgUIvG7I9vWFpMpqMaNsciOvT z7aVRTBIGDgBKdhxyNDA0z21ZjVjxtAoiix7n8tYkY6YYvY0rmzYt7JE74yXro5GvBJ0AmyC IEqSeIHzLPhvNmO8U2uXJMxpKZqDr6zPPN7f5BfFa3nW8Uf0ulJdKESUcOkCdoGInmAkEvTM P9NEFCXXJmph+rbGPOtcIcGvZd/vqvMI5s6TDBvzXca/AToBdkHyd9zx4+XNpf45yxaI5AlF I/F3rEKhk5e1pizxX2Wd9vDuZr9I3Fv5S6+0xrAJCNgMwbNLE8AzXcXW8SgZF0QNFa+8s2kb pUcu79xt3r4uazQVRbx6Odfh7nyvGn6bv3NT9VzRAfBNR34me7p3LItbqk9ExVcw+K908uKP 6RPVEbernqvg9JC5jJGE9EczG5ZVFL9AXzLeuK8qgk5fYDOIm7kfA0Ws8pcIrnDhwFHt6blZ uiJPJkTkFcL0vrZCvubEKGSZfPYn/0Fpz3bt5/FthT7oBNgNc4jjd4tVdv7deQPG6oZZ+lxb VLtHKfy96bX69Ef9RXN6MKWPNscbt+z5TnHUg6ouYDvMaFVXknng0uID5vl/PisUorzBnhzq KzL8eeFqi1A6C12S6nGriAgDG0JUY/vCS3W8SEv+xzsn+fl/YUXWdzHHpE6tqzEmbRPLkpNd lT4hc2mDNQH2RMx2lkxcFuOeheDy+VtM573Uo38h8lXw97aGs5oiLr4360/poHSh/wQANkCq f4ue/0NvVBFYIp0IoiizTPvMNUuzU4h4wTA91ZMyRCUMGY8+aAzDgwe2hojuSF7Ep8jucCLE TzupZLI4M5rO1jXyHpTp1RVG3IuIV+lPDtfGoRNgd4ikyKonXPTYuipLMwkPc93TGs56Kdyk XFnLkpNEqr3+xl0FyZAKnQDbI0ieeMX+cfpJXxGfikqq2AjIs0NG0l5iA4i21XnMkZCSnAGh LmB/BDVYsm9c80c2N0W4S27ZcdIU1Z8K1QsIRS8ihkyATSAXjtsKnrxHxg1/ZKjca5oUFtI6 M2RsXpSM3vg7a92QBrAhRHJ5LrTDnUgP8jnb9O5leQt4KXe3Z58Kxsb4WytdEAqwH4Iazi8M XSjPMfDpb/i8odNDFdwtJwob9Xh6NPuUpfH7ChDjAnaDCIqvcPhoR4XvQk2MiqeezXqkd7Wa gmIGJGNSMk+1LvhsaeSLzSH09wKbIcieeM9RSve3WzqucsjdDD9SYlbRey3LfAOyQKSI/unB cty8gL0gsi+vV68Enryo0WIH5gaqZL7N5L7WPN6eKPGn9/dUx73u4G3az5+0xlCtAuyFFOhg axYPdecbs3+N1fA5DY18d8O5oUoe+7VsdDhx6+LKskFtFd3UxhIPbl7AVpCqh3lAa3p9XXY2 iuQO5ldUlyet+64tfSn3LDcNhrncN2OSPtb3/743kudFoy+wGRXPPMLW8dLXOvNkbT9vsGjg 6NN7RtrTIetmeJW9NzVcYWZJJLY2i57V/zx/uCKqQCfAJnAPhIhyNTvrMxfXB0Uihb87kRXE qtqoxb0XeYhrZ3uCPycsGU+PXn7PLVs3pSIe7G4AdoFIZvEVEXgP4+s9Baro4xNVpr9bEzJP PVGZoKbXpM3AFzcpM+sbwy5FweBHYB/EK2NB01hIxpwVOntRfdC11eJ1DKYtc4XMBVn3LjcH sphNjAdWxGUUdQHbQAipopelw/+nvXt/juK68gDOvf2anvdL0szozegxGklIIAmht5AwSAKD 15s4STmJHTvGgL3e9a5TcZzN5mXMwzwF4uXa3YoDyNjlVG1VKpXgxC7bpFyOTWwjzOZHywik kfgf7nbPTPdtSSPBVqV2o+nv5zc16Aeq+nD73nPuOXxHbi4p17tLwtaGdhP95WquJWVznBc9 SsbB1+yI5SnASqYFiSBKsnfydk8lr240byumtjUdY+y2eSF+dk+LJSUimM27Rlv5PSyzZFif jo3KFVj5tCCRZNVfECnuYeyFtghfUsy+ENdHPmXn6qMtxs//vcWyShDZWFJmRhIewfjMEs8b uxT96f/9Pwvgr4qIijccKUtu23V6Si86qTN35LwvxNyv2GfrIg6H2Xr+h+uC/N23zMHujDkl MVOZz5++1hFR/h/+YQB/PUR0hsvu+/HZP5k78r5IjkNexp6r9lB+IX56sIIP+iHmfiS1vaUy Fsok4Il00Xh6f31AoOhIBCsXVYKdo1OWfTqb3cEPefklXsYe1vfv1Dzh+uG6EN948ICaeWDg gZpQ5vCYP53or3A5nM4liisB/sYRyd0+ll4gzox+7/ibmc36WFuBWd3I+0KwIf0OI5GMuuCZ oWo3f+/N/QibZbcfDgkLn/5oQ7ysPIadCqxI1FE4qmfbX91cFnSpDoez4R+n9K7bcQ/fpRh5 9zs/atbff17a9ZP2QksXez4O6D9qw0YxPX86N37g3z+q8CFQYAWijuJfaS/xrZ/FA4pA9VYP VErsY+xAa4zvUqqNC/ATGysUYrm9ODsUt9wuMXIpp3ojHskMM8lcUhg7UeZ3IDsPKw9RCvQd /NUdFR6R161IT7LpDkt1o2DuUp5f46XWLORoK++8Qhz6VCH2ysZCl/WKPT/4eqWvwCUhTmDl IXI62T7TWjxvCiMRh9jzMb5WkCqjg8REf3q+iWR0p58brjIvCVO3ttCc2RR1S/OOtoiauSp8 djDqknDoBSuR6H9df4efLltwS4SISb/LUukrmFdLftCkLyHULOIaW29WC2vb9uO9xZZp8tnf detfZK8MVwQW/gnAykDd4/rLfrHJu6j8nQrW//yJw8i7fz5YqRJLHj41olcRp/9qfO/aoFNe 2PaRKM3armWgxK+ixB5WJqJkxls/F79rvwd+4eRf00VbvIjrnY3VvkzbLyrJOT6tSDU71BX1 YkQQrFjUk6kGHojdtV6RKMZB1+dD6c6PgpFxn9vdVxUL6J9fS3RHXV3r9TgQJrBiEfnp9Kt+ YUPw7rkNS+5kQ5FoTY/Mnjz3ZmyZJYnM/4oDWGGoM7PRON/qu/sum+dOUpnciXzBzI5Mfw8l 9JC/sh3p2LEW7z285tbOj/rBlzkTe/p0ZQhZRMhf0t7/TaAQlXd+XO2i2s/pdP30WG2xG1lE yGNGxcnxtnvqBsxzKZc2FMmEOq/oq8nqIOqBIa+ZzYEnegrvKcVhXji5s7Uu4FB2stvnasIq zrMgv9GgcWw1XHFPiwIv2prZ1FgRem9fUdiNTTzkO8GYHjf3YN299QPmnR9TqY+ibllCny7I f8I2MzPSFli6w7wliUjMPhPsdK9fxvRFsAMeKDc2lS6VMCSCZDnSErO7mlODxT5UboE98Esm d/4uudS5F632W/rWi/v1vz62Mep3YMgJ2AQvlWdnuopzb+eJuCtuGaKlF3xpq4l3UYkwQN6y 7DhSwwl37kBxXvl1s9EmYhX9OTsyUBZAhSPYijxpRsqJzkjOg15hO5vpMqfN0Ve3BXyolweb kX7Jl5Stdbl250Q5zD7bYN6KJ4IsIUzAbgSzcp6xiU3xHA23BN+H7GDSkmRBlID9EAf/9mI/ 661wLTr5kg8y1lmCg2CwNSLu4oEy+5UNxQuL5QXPH9kv6gNIv4O9Wdtvs9kHW4vmnRETUW89 sT161/v0AHmC0NyrgrjbEik3dqwNW46+qBw6xthPMRYe7IJQ2ZH7UJdUX7FEyrsjiaCRIyGi Gj7J2MfxxY2MAPISVXyximjuhYFaP77Y3FBzeUCVBEGUnaENJxi7mkRJF9gDET2xwdO3l5oL x6f5ptMpLwy2VEVDwXCs+sQtxj5pDOO+CdgCkXwdo4w9U6Xm3moQMWmNFDZ75OHOlnWPjmlh ws7VF2EjDzagj/lNHtZe+be6oktV+xIh8QXL5daj5YvaCAPkHUJFRRFFNnmTsfPt4aVfeaHm Qo4wOVYTdeECI+Q9KqqBtiK3KLkar7DftgaXeeep0vDH+WEydaQ86EJzFch7RHKHu45P1QZE bWEZZp+0LLOi6BsVR90+M0puHuso9DjQBhXyHhEcoaoxxg4l/UK6S/CnG6LLHvNqexnZnWzY 9uy/PLs94PM6USMM+U9bH3xlY9OM3fjqGr1CnqiTMwNVysKxJQs7Q1AqSKpTFQWMggc7oI5A aXrML7vzUk+l3vtUucLuS6rz3n5tBck1y4QuUeoCkG+oIzZ2O7vbuLOns0SlRLzAvlHvtEaF 9mlWUh71yggLsCMiSIqy96Ylffhv7cVOQdjLXpoXKJJvw5n9L/c3RJ34yALbIaLqK4wEd+6z pEXmjnav9slD7D+bPHz1EHxH0vUq31kfxREw2AyhDn/Zxg+/H1UlJfkej5TRvipfI7vcHrKM g89OlZvdWqMiUMBOiKB4S7d8xP6wNiITQqv380VlvD/exq4NFJvHXsRt/NHRRnx7gY0QweEr 6j2tvfp71sf0gKCWthFsvDs5ldpUZtY38j+83ORCoIBtENlXuuVE+tV/d7ghKBHLJFLdHzbf YoPlZqAQcyDQ5TVYUcA+BF/3qPHuv3NfXUChqxT26SM8Uj5/m32rwtyO8A6RB+qwRwF7INry IR2wLB/XhxsjKpUmp3s3WVeVo7X82EvcmXk23blEx2GA/EIESaQkfv7ShzwkUve3RhT5POuq bPqSPz3dEubHXvH0lNPpzaVuZBwh7xEiqoECr0So4qq3LCoz29aEXRfYQ3FvLY+U97tiEv9N qe6pI1+rDDsxuwHyHhEdwc6Tj5e5KCFUcCR518eZR5pL/ontbwxJCbPJyl/6SmTL71LZ6URT erABooRKx6bZ7rLMfpyINe/zSPlu+6PsQEuRKNWOZx/N9VsDJd3pC2EC+Y9IBSdvM3a82Zy+ SKp56cqdEw+z37VGpFW02riQNVixsNAeIL9pX1oC/W76U+sHdbyzNnXwfPzcG+yz9qik51iy kfJI7eIe3AD5S9vCe/0uMf7iukOMPVprSRlSaa/lQHiiM719J0qmberxluWuzQPkFyKowdIj DwVlKsjuKfbPNdbcOpGetBx+9ZWmdyVUGtZ/PNkRzt0CDyDvEKr4y79ziz0f0OtUxIts37xA 0T60RnikDGVXm0yPu9+1hhAoYAtEkNyRvo8Y+369X+8VQUfY/qR33gcVVdaYgbKz2ZdtuC3V M3a12otPL7ABQh2+SO8Hegi81lHq0iKFDrG3WgvmJw2JaNZDnlhv7EqIUPPeU0GUq0D+I4Q6 IxvHstuPI11xbU0h9exa9/z0iB4U9UagtIf4iZikoC095D1CRVFuOmJ+VaVG++JukbpYqrts UR8iuT6TpL9sCZTF3YkA8g6VvaGAh1m7RrzeXxWQlcmZzkWBon191aaT9Nc6lm0PCZBXtNXE Vdh/vDyguuotLYIvbkyEnBfY31csnsxAhHTlykzv8u0hAfIIldRw3yn2cZVHoEL1QR4p7wyt KRhn+xK5SuVpjRYpqYFK7N/BHojoKug5pb/01XoFiuC+yCPl7c2J59ihlpzpEaH6AGPryxAo YAdamESS59K1W1/tiOibEem8pUjlxpZn2O+7IjkvlRDxxYNFHhTSgx2Inooz09kqxx1r9HmK 4lNsnEfK7NPsWndUyvm7RJDQkx5sgThfvs2DYrihwCHQIXbwa7csq8pMXyx3oKSv0wPkt/S9 KvoLZg2JoaaoU0iw36zvmbQ8HSzFRgRsigiK261QGnc3W1o+ph5vL3Um2Z9bI/WW7sKP1aI3 F9gSEWRP5JkSn0S0fYbayBtEzO7uKCuYnG4tlC2XGX+81oe0ItgQVfzR/g+ubgzpRVxarCRe M4Ni7mhn8uZ0R0yyNBc+tT6I8nmwH6KEBj5m7NnVruz7T2te4l9fJ4Z+ywaqnIQqP88+er0d 90zAZgihhCb0898bg7yGi2Yv82bi4hJ7pMFNVhE5e5nxWkcY3bnAVqjkUGXh1YtvaIEyUMIP s6iyi0fKHXasWb+CReSt6Z8n+mI49gIbIZK7oK3QI4qK9x/Y9X5LoBjX3rNG16XvKlKlIf01 NhTHsRfYBhHUgv6zrMsnaPv3WpbqtgZK5jKv4a02P808rEufDyfdCBSwByqpod6zjL1Ynm6+ JU8ubDSfaRCRMdFTmC2fF+q+ZOzrWFHAHqjkjXWf0T+jRhJ6exW99PErCy9k0RojoTI7bDR9 JELi5uTXQxICBWxAcAR6zmRi4FJvrV977bVAebZmYWNHavSmn3ug2pz/Q2vcbuzlIe/pjeiV 0FHzs+rScF1QJuJudnjtojyiYPSmf8JStYJm22ADRHQ41Z2WGkf27mC1XxRH2C/bFqVHtA+t C4sCBSDvEUENl3YU1r+4yxIqv9+YCKpJ9mlrweLyeZqp8TqcQKCAbVBRDVQcm/qvmFMUa/bx SLk+tCbSyD5pK8xxz4Qqeo3XoaQHdZBgD0R0BksP3WLjLQWKtlGRm3ikpLY2l3w53VGs5Pg1 qu5h7Dd1XpR3gR0QwRGsHJ3SouIn3cVO7a2n1sHwM9va/sQGq3PmEanyJHszilEnYAuCK3bf 1UxSZPvaiEpXEcckS/FIuf8ye6zRn3MjQiTV40TmBOyAOjvMedepHa0RVSDKF6lv/5l/fb3H jq9bYvAPwYkw2IRgnYw189i6UpcgXmTfGHnD8ni8JYTvK7A3+sRBS0zMvNBb4Zb2socami2t iN5qK0CggL2l78J/YMbEnbO95Z5dbG+9W+HHxBM9xegcDHZHiFDDG6zcGe9a/SDb1+gR+BDG 2eFazLsGmDftmr3WO8wut4VEIu0xHj3QqCJQAFZRaYhHytv3s2v6rUaibM0+eaIJhSoAq/Ts vOXe4o3Z2S2VDn3Wb13mweFmBAqAjlgrV9jc1tX6UCDjMuPRVozxBUjLXnvPeiyenp5FxMQX 2k/v9IRR0QWQRoQEb5n6eFVm+06EmiuMXe8vWqpPPYDtCAnzMsqxeqN8ntaOs1SzH53tALKI WGtM0XqjLWSEhpA40BVdPMYUwLYINXrTv28ZCiQoqoK9PIAF1SeTav6yydL1DvOyABagrpfT 58ObStB6CGBpmTbcc4MIFIDlEEmvXHkwhquLAMsh8hrGvhnEgTDAsohY+5LPgYMugLsggoAP LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD4W/Q/ecG+Jw0KZW5kc3RyZWFtDQplbmRvYmoNCjQ1IDAgb2JqDQo8PC9UeXBlL1hPYmpl Y3QvU3VidHlwZS9JbWFnZS9XaWR0aCAxMDUxL0hlaWdodCAxNTcvQ29sb3JTcGFjZS9EZXZp Y2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0ludGVycG9sYXRlIGZhbHNlL1NNYXNrIDQ2IDAg Ui9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEyMDg+Pg0Kc3RyZWFtDQp4nO3avW4UVwCG Ya4BSkCyZYPNenZ2ZtYLt0ITWm4GOu4gNCgVihQ6CpSCghQWUCBZIpGRgixA/OPYsc3KSUED Ql/sHc/kefVUpzzdp3NOnJAkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk SZIkSZIkSZIkSZIkqf1OnbpaFL8DAAD/B1X16rAHxQ/z87dGo1cAAEC/jcdb4/HOoQ+Ks2dv LC7eqesPAABAX62u7ly8uH9Eg2Ju7ubS0q9Nsw0AAPTPZLI7XRNHOigWFn5eXn7QNDsAAECf TCZ7ly7tz2BQnDt3dzB41DS7AABAP0zXxHRHzGxQLC/fL4r1ptkDAAC6bnV1758dMctBMRg8 HA43Wl9SAADAfzFdE5PJfiuDoijWy/J563+9AACAzHj8d7uDYjjcGI1e1vU2AADQLU2zPcNB ceXrg2Kzqt7W9RYAANAdf43Hx2dQvKnrTwAAQFc0zZZBAQAAZAwKAAAgZlAAAAAxgwIAAIgZ FAAAQMygAAAAYgYFAAAQMygAAICYQQEAAMQMCgAAIGZQAAAAMYMCAACIGRQAAEDMoAAAAGIG BQAAEDMoAACAmEEBAADEDAoAACBmUAAAADGDAgAAiBkUAABAzKAAAABiBgUAABAzKAAAgJhB AQAAxAwKAAAgZlAAAAAxgwIAAIgZFAAAQMygAAAAYgYFAAAQMygAAICYQQEAAMQMCgAAIGZQ AAAAMYMCAACIGRQAAEDMoAAAAGIGBQAAEDMoAACAmEEBAADEDAoAACBmUAAAADGDAgAAiBkU AABAzKAAAABiBgUAABAzKAAAgJhBAQAAxAwKAAAgZlAAAAAxgwIAAIgZFAAAQMygAAAAYgYF AAAQMygAAICYQQEAAMQMCgAAIGZQAAAAMYMCAACIGRQAAEDMoAAAAGIGBQAAEDMoAACAmEEB AADEDAoAACBmUAAAADGDAgAAiBkUAABAzKAAAABiBgUAABAzKAAAgJhBAQAAxAwKAAAgZlAA AAAxgwIAAIgZFAAAQMygAAAAYgYFAAAQMygAAICYQQEAAMQMCgAAIGZQAAAAMYMCAACIGRQA AEDMoAAAAGIGBQAAEDMoAACAmEEBAADEDAoAACBmUAAAADGDAgAAiBkUAABAzKAAAABiBgUA ABAzKAAAgJhBAQAAxAwKAAAgZlAAAAAxgwIAAIgZFAAAQMygAAAAYgYFAAAQO36D4mPrdwIA AHynYzYo3lbVewAAoCvq+sOxGRQvquo1AADQLXX9rvVBUZZ/TgcFAADQRdNZ0eKgGA7/KMvn AABAd1XVy1YGxcrKk+FwAwAA6LrRaHPGg2IwWCuKdQAAoB/K8tnMBsXB88RjAACgT8ry6QwG xfnzdy9c+A0AAOifonhypINiYeH20tI9AACgr1ZW1o5oUMzN/bi4+AsAANBvg8HaoQ+Kkycv nz597cD1M2f+9cXJNQAAoDfm53863EEhSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk SZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIk SZL07T4DF0DQmQ0KZW5kc3RyZWFtDQplbmRvYmoNCjQ2IDAgb2JqDQo8PC9UeXBlL1hPYmpl Y3QvU3VidHlwZS9JbWFnZS9XaWR0aCAxMDUxL0hlaWdodCAxNTcvQ29sb3JTcGFjZS9EZXZp Y2VHcmF5L01hdHRlWyAwIDAgMF0gL0JpdHNQZXJDb21wb25lbnQgOC9JbnRlcnBvbGF0ZSBm YWxzZS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEyMTk+Pg0Kc3RyZWFtDQp4nO3Z61aU dRTA4WDOBxgOE2dHUEAcFRICETVg4WhCiGIKLhS7ta6kuhRrdb6IGqB0GLe16gu13ue5gvfL /q29/+8HHwAAAAAAAAD893QAyfR3WegEkuf9eTiuQupIGkiYo8k/7kNQhqMwpDOZTBZImubk p0/i0FaGr34DEqtQyOeymXT6nTR0fH3Wnwacne6ucqmYz2VS7TeFNECSVft7e7pLhVymbW/o kAZIstrYyGC1t6uYP94bWtLQKQ2QYDPTF8dHB/u6i8c3RevfCWmABLs+W5+eGBvoLRdOrQ3S AMl268bC3MyF0WqllDudhpQ0QIJtrK4szl46P9hbzqdTLWnolAZIsq1767cWrlwY6e8qtD42 SAMk2+72/fXluamxD7vb0pD+5qw/DTg7e7uf3b01f6k2UClk09IAnHj++cP7dxZmzg9WitIA /Olg79GD1cXL40M90gC88WLv8ebaYl0agFYv9x9vri9dmZAGoMXh890taQDaSAMQkAYgIA1A QBqAgDQAAWkAAtIABKQBCEgDEJAGICANQEAagIA0AAFpAALSAASkAQhIAxCQBiAgDUBAGoCA NAABaQAC0gAEpAEISAMQkAYgIA1AQBqAgDQAAWkAAtIABKQBCEgDEJAGICANQEAagIA0AAFp AALSAASkAQhIAxCQBiAgDUBAGoCANAABaQAC0gAEpAEISAMQkAYgIA1AQBqAgDQAAWkAAtIA BKQBCEgDEJAGICANQEAagIA0AAFpAALSAASkAQhIAxCQBiAgDUBAGoCANAABaQAC0gAEpAEI SAMQkAYgIA1AQBqAgDQAAWkAAtIABKQBCEgDEJAGICANQEAagIA0AAFpAALSAASkAQhIAxCQ BiAgDUBAGoCANAABaQAC0gAEpAEISAMQkAYgIA1AQBqAgDQAAWkAAtIABKQBCEgDEJAGICAN QOBwf3dTGoA2L/cfb64t1celAWjxYq+ZhsUoDV++fv3td9//8ONPP//yK5AwB892Pv3k48vj g5X2NGSLlYHazMLtxvaT/YOXh6++AJLh1eHLg/0n243bCzO1gfY0pDLNNJybvr6ysfno6d7z gxdAUhw833/6aHNj5fr0uWYaMqnTaSh0V0cnry2tNrZ2dp88fQYkxdMnuztbjdWla5Oj1e5C exry5f6Rifr8ylrjwdb2w51HQDLsPNzeetBYW5mvT4z0l/On0tCRSufLPQPnpq4uLN9Z37jb uAckRePuxvqd5YWrU+cGesr5dKqjJQ2dqWyxu3+oNlWfnV+8sXxzBUiKm8s3Fudn61O1of7u Yra5NLxJw8lFUapUh2sXp+tXZ+fm5j4CkqE577NX69MXa8PVSinXek8crw3pbKHcUx0aq41f uDg5OQX/O9P8S1NTkxfOjw1Ve8qFo1+Xp9OQSucKpUpfdXB4ZHR0DEiO0dGR4cFqX6VUyKVP 3RMna0Mmmy91VXr6+qtAsvT39Va6Svls5vTScJSGo+eGbK5QLJXLXUCylMulYiGXPXpoOJ2G k5si1dwcsjkgebLNjSHVdk28XRw6U+l0OgMkTXPyU53vrgwtcWjmAUiao9F/TxhO2vBHHoBE ORn+95ThbR2AxPmLLgAAAPwjvwP8K58tDQplbmRzdHJlYW0NCmVuZG9iag0KNDcgMCBvYmoN Cjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvUmVzb3VyY2VzPDwvUGF0dGVybjw8L1A1MCA1 MCAwIFIvUDU5IDU5IDAgUi9QNzAgNzAgMCBSPj4vRm9udDw8L0YxIDE2IDAgUi9GMiAyMCAw IFIvRjYgNzEgMCBSL0Y3IDgwIDAgUi9GNSAzMCAwIFIvRjggODUgMCBSL0Y5IDg3IDAgUj4+ L1hPYmplY3Q8PC9JbWFnZTYwIDYwIDAgUi9JbWFnZTc2IDc2IDAgUi9JbWFnZTc4IDc4IDAg Uj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXSA+Pi9NZWRpYUJv eFsgMCAwIDU0MCA3ODBdIC9Db250ZW50cyA0OCAwIFIvR3JvdXA8PC9UeXBlL0dyb3VwL1Mv VHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJlbnRzIDE+Pg0K ZW5kb2JqDQo0OCAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyODc4Pj4N CnN0cmVhbQ0KeJztW+tPG0kS/26J/6GllU4zq9D0+7FC6MBAwl3IskAUraL74AWH+BYMa5zL 5f76q6ru8QPP2Ake5+7DSvEw3VMzVV31q0fXTNjOGdvd3TntnhwysbfHDg677I+tjmCCCyFk 0FIyawTzQbBRf6vz7kc23OrsnPXG4/5oyK4e2c6ZFezxaji5SQgnhZm768OPW51ftjrf/OBY PdhbyZ2iG1Tg2tvZx7Kj0y5jMwuRO697wxtW9Ifbby/KmVUl8YQxnoka7geXIMGxZDKwyw9b HQlEgsHQ8BBAhMiVYpd3eOEGDy+3Ou+L7sdSF4MHVoaiN7xm3d5oPBpc3/RZuW0LBtfgRP3/ nBhd7N/eltt6OvnhfsRKGYt3pVHF4Lpfbhu6eHw/uuuNGQ7PRoPheIDEw5vyH+zyb1udo8t6 3auvBpG1cDmQjnXg0rFtywE32547HyO7AkXvnNz1bvpOsMN7VsdMr2VoxaSdNzSADOTwPC7a +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 GFurU/QSnLSWoqWjcqSei0PcRQgFVAcJOGGlFVW5LMVM4fxk7hiDGdYx/6abYGYDSJZQ2PuN awj95bshWUbNw+atjg6z0j3bw7KSsA/c9KKwZdrIZIJklZC8IuKv1wCvj/j4kUcwC5JRDTqm ziqVND/t4OkObAR08RkzNB14e0HMNUkyqYgHD1hATnYh13i4okQJGXM8GqAjX1eVAiYr/M6U KO7TJgUSF1vrQ9M6JwyNKjxqzS0E16aJS3vOp5dwOa0C5yB/PggR9afW6kFJb0UaWA+GaPYP CDyy41+vStsSIFa4m1/L3Z72e5K7ec9lvX7Bnd6+AkH336SPiFVxeAJn1Pq5xG+QX9Nk976M aSHTpsDr8XUZ6ftk9zVZcNVcq122hgW/Q3tiq23/4u2bl22xtAKB1MDy61tm673AirWNZufw bVKLfeYFNthnbuYivqXN3I5fJ8TXiTTN5j8op9vq4hl8M1ergdaiJECrkYdOORwOrXaPIjVD 61lOG3Ojwaune+a2OoMQnDesVQkuUs+DbeMTUzPnvK2dvzQB03YTMFtuHUmrsfvXYEAwmprv rL7BfmBrHdVouNu0U0js5zQxOaUvMzeDTaU0foj8nQypVOCintusJz72SzfXtmqJu7M8NHFv bbPiQjOT7mCc/ncUmLLVCKdCpP+gVMt1WTsw9V3b6tSBeYNvkOKMaqsRsf8XNiGpKMVSEqXK 2lD6m/p36306XZ9sreV2Ufrv1r6rZ99u966Ox7SesKK1No6Q3Gx4RdgWqOcxsyIn2uImA5eb XpGSjTw8OI6oWnYivb50+hu7dS2J6RX245drPrTbEdyw4qkh+N2cIwb8amGzS1LggQ1MNuEe Slr8IGPDawIfbGQy8Qv0FF+TP/4LY+WdLw0KZW5kc3RyZWFtDQplbmRvYmoNCjQ5IDAgb2Jq DQo8PC9GdW5jdGlvblR5cGUgMC9TaXplWyAxMDIyXSAvRGVjb2RlWyAwIDEgMCAxIDAgMV0g L1JhbmdlWyAwIDEgMCAxIDAgMV0gL0JpdHNQZXJTYW1wbGUgOC9Eb21haW5bIDAgMV0gL0Vu Y29kZVsgMCAxMDIxXSAvT3JkZXIgMS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI1Pj4N CnN0cmVhbQ0KeJztwQENAAAAwqD+qW8PBxQAAPBvjRHurA0KZW5kc3RyZWFtDQplbmRvYmoN CjUwIDAgb2JqDQo8PC9QYXR0ZXJuVHlwZSAyL1NoYWRpbmc8PC9Db2xvclNwYWNlL0Rldmlj ZVJHQi9TaGFkaW5nVHlwZSAyL0Nvb3Jkc1sgMTM2NS4xMiAxMTQ4LjE2IC05NS4wNCAxMzcu MjhdIC9FeHRlbmRbIHRydWUgdHJ1ZV0gL0Z1bmN0aW9uIDQ5IDAgUj4+Pj4NCmVuZG9iag0K NTEgMCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAzL0RvbWFpblsgMCAxXSAvRW5jb2RlWyAxIDAg MSAwIDEgMCAxIDAgMSAwIDEgMCAxIDBdIC9Cb3VuZHNbIDAuMzUgMC40NCAwLjUgMC41IDAu NTYgMC42NV0gL0Z1bmN0aW9uc1sgNTIgMCBSIDUzIDAgUiA1NCAwIFIgNTUgMCBSIDU2IDAg UiA1NyAwIFIgNTggMCBSXSA+Pg0KZW5kb2JqDQo1MiAwIG9iag0KPDwvRnVuY3Rpb25UeXBl IDIvRG9tYWluWyAwIDFdIC9DMVsgMCAwIDBdIC9DMFsgMC4wOTQxMTggMC4xMDk4IDAuNzgw MzldIC9OIDE+Pg0KZW5kb2JqDQo1MyAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDIvRG9tYWlu WyAwIDFdIC9DMVsgMC4wOTQxMTggMC4xMDk4IDAuNzgwMzldIC9DMFsgMC40MzkyMiAwLjAx OTYwOCAwLjgzMTM3XSAvTiAxPj4NCmVuZG9iag0KNTQgMCBvYmoNCjw8L0Z1bmN0aW9uVHlw ZSAyL0RvbWFpblsgMCAxXSAvQzFbIDAuNDM5MjIgMC4wMTk2MDggMC44MzEzN10gL0MwWyAw LjMwMTk2IDAuNDE1NjkgMC45OTIxNl0gL04gMT4+DQplbmRvYmoNCjU1IDAgb2JqDQo8PC9G dW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAwLjMwMTk2IDAuNDE1NjkgMC45OTIx Nl0gL0MwWyAwLjMwMTk2IDAuNDE1NjkgMC45OTIxNl0gL04gMT4+DQplbmRvYmoNCjU2IDAg b2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAwLjMwMTk2IDAuNDE1 NjkgMC45OTIxNl0gL0MwWyAwLjQzOTIyIDAuMDE5NjA4IDAuODMxMzddIC9OIDE+Pg0KZW5k b2JqDQo1NyAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDIvRG9tYWluWyAwIDFdIC9DMVsgMC40 MzkyMiAwLjAxOTYwOCAwLjgzMTM3XSAvQzBbIDAuMDk0MTE4IDAuMTA5OCAwLjc4MDM5XSAv TiAxPj4NCmVuZG9iag0KNTggMCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAyL0RvbWFpblsgMCAx XSAvQzFbIDAuMDk0MTE4IDAuMTA5OCAwLjc4MDM5XSAvQzBbIDAgMCAwXSAvTiAxPj4NCmVu ZG9iag0KNTkgMCBvYmoNCjw8L1BhdHRlcm5UeXBlIDIvU2hhZGluZzw8L0NvbG9yU3BhY2Uv RGV2aWNlUkdCL1NoYWRpbmdUeXBlIDIvQ29vcmRzWyA0OTAuOTMgMTE0OC40NyAxOTYuMzYg NjM4LjI2XSAvRXh0ZW5kWyB0cnVlIHRydWVdIC9GdW5jdGlvbiA1MSAwIFI+Pj4+DQplbmRv YmoNCjYwIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCAxNTI4 L0hlaWdodCAxMDYvQ29sb3JTcGFjZS9EZXZpY2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0lu dGVycG9sYXRlIGZhbHNlL1NNYXNrIDYxIDAgUi9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3Ro IDk2Mzg+Pg0Kc3RyZWFtDQp4nO3d2XMc13XHcVf5KYtclp4ogSS2AQaYGSZOUrGTuJKHPDqJ 492yJUuidlKiuIMEsRAgyAEJDLgTJCVv+U8z7AkRENMz6Nvn/M49t+d36lupyJWSHXnQ3ffD 04NvfYvD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6H w+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgc DofD4XBczGuv1fOaS7Z5tq9GgjWrUivNTrBX+xsPfec73f52JPveCPR3Ve/v+3vttRHpHxhj o1f0K4+jYt+AUin6o4i3oj9/YhvwtP89Xed5440f1mrnxV1Q6qK4S8JmZi6LW1DqirirGi1q dA3WEqZlYbOzK0qtirteuDWl1jW6odGGuJvibsmr17u1YW1iui3ujlJbmLaV6sDa0eiuuHv9 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 cDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6H w+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDoeT1vwv+FYRuQ0KZW5kc3RyZWFt DQplbmRvYmoNCjYxIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0 aCAxNTI4L0hlaWdodCAxMDYvQ29sb3JTcGFjZS9EZXZpY2VHcmF5L01hdHRlWyAwIDAgMF0g L0JpdHNQZXJDb21wb25lbnQgOC9JbnRlcnBvbGF0ZSBmYWxzZS9GaWx0ZXIvRmxhdGVEZWNv ZGUvTGVuZ3RoIDExNzM+Pg0Kc3RyZWFtDQp4nO3Z22+TdRzHcdanz9N27dbSdid2ArrBCmOy yYZZgIVNMRGJDEwgZBzCOYpovOHKaAyifybH6X+hGzOhO3C3ZOnze70un6vP1TtPvr99+wAA AAAAgDbWAUAqfTT7mQ0RAOmwkfWdy7/2dS342WwMQJpk1+u/vfz/V//uvTX3AUiL9azfvfu+ /NtuPFE2zr38F4DUeRln18K/PftJvvPVXm8DYPe9zCXRlvB3ZDJxrtBV0X2AFHpVLCTZ1kvP ++N+UihVe1/v9TYAdt+rcjEXRy1vu+vZj/OlSt/wm73eBsDue10vF5I4s6n72bhYrg833u71 NgB23+uBWikft1z4OzqiOOmq9jeOv9vrbQDsvjcjfd2dSdTS/fUzT7k+NDG9utfbANh9bxsH KsV8lMm0dD/JV3pHJuf+3uttAOy+t0eGqqV8FLV0P5sUqv2HTs7rPkAKvWuO1rsK2U3dzxWq A42Zc//s9TYAdt+7yYP17q3d76wdGDu1oPsAKbR64nBPd+fW7tcHx2bP6z5ACq1OHe4p79D9 8dlF3QdIodWpRu8O3R8an1vSfYAUWv1E9wFCovsAYdF9gLDoPkBYdB8gLLoPEBbdBwiL7gOE RfcBwqL7AGHRfYCw6D5AWHQfICy6DxAW3QcIi+4DhEX3AcKi+wBh0X2AsOg+QFh0HyAsug8Q Ft0HCIvuA4RF9wHCovsAYdF9gLDoPkBYdB8gLLoPEBbdBwiL7gOERfcBwqL7AGHRfYCw6D5A WHQfICy6DxAW3QcIi+4DhEX3AcKi+wBh0X2AsOg+QFh0HyAsug8QFt0HCIvuA4RF9wHCovsA YdF9gLDoPkBYdB8gLLoPEBbdBwiL7gOERfcBwqL7AGHRfYCw6D5AWHQfICwf6f7g+Oyi7gOk 0OrUzt0fmz2v+wAptDp1uGd792sHxk4t6D5ACq2eONzTvbX7hepAY+bcyvc/P/v19+cv/vwL gHb34o/nv/3y7MnDldnJg/XuwubuJ4Vq/6GT80vLN+48+u6Hpz8B0PZ+fPrk8f1bVy+en2mO 1rs2dz9K8pXekcm5cxevXr9978HDR48BaHcPH9y/s3Lt0oUzU0eGqqV8tKn7cb5cH5qY/uyL i8vXbqzcvHUbgHZ3c2Xl+reXLyycPtY4UCnmo8yH7ndEcdJV7W8cnz6z+OXX3yxfuXIVgHZ3 Zfnypa8unD19cnykr7sziTIdH7qfycbFcn240Zyem184v7i09DkA7W5pcXHh7PzM1NGRgVop H2c2dT+K86VK3/ChicmpmVOzc6cBaHtzc7OfTk81xw/218uFXJzpaOn++stuoVTtHRg9NHZk otlsHgOg3TWbE0fHG6ND/dVyMRdHHR+6v/6ym4lzha5KrW9gcHhkZBSANBgZHhrs66l2FwtJ NtOa/feXnmxSKJbKlf21Wh2AdKjV9le6S4V8EmU2d38j/HEu31ksdQGQGqVS51r142zLo27L iX+t/EkulwcgNXK5ZK362/72W8qfjQFIk2z0vvrbsr9x69kQAZAOG1nfufobv/wApNDO1QcA AAAAANrGf9m8cSYNCmVuZHN0cmVhbQ0KZW5kb2JqDQo2MiAwIG9iag0KPDwvRnVuY3Rpb25U eXBlIDMvRG9tYWluWyAwIDFdIC9FbmNvZGVbIDEgMCAxIDAgMSAwIDEgMCAxIDAgMSAwIDEg MF0gL0JvdW5kc1sgMC4zNSAwLjQ0IDAuNSAwLjUgMC41NiAwLjY1XSAvRnVuY3Rpb25zWyA2 MyAwIFIgNjQgMCBSIDY1IDAgUiA2NiAwIFIgNjcgMCBSIDY4IDAgUiA2OSAwIFJdID4+DQpl bmRvYmoNCjYzIDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAw IDAgMF0gL0MwWyAwLjA5NDExOCAwLjEwOTggMC43ODAzOV0gL04gMT4+DQplbmRvYmoNCjY0 IDAgb2JqDQo8PC9GdW5jdGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAwLjA5NDExOCAw LjEwOTggMC43ODAzOV0gL0MwWyAwLjQzOTIyIDAuMDE5NjA4IDAuODMxMzddIC9OIDE+Pg0K ZW5kb2JqDQo2NSAwIG9iag0KPDwvRnVuY3Rpb25UeXBlIDIvRG9tYWluWyAwIDFdIC9DMVsg MC40MzkyMiAwLjAxOTYwOCAwLjgzMTM3XSAvQzBbIDAuMzAxOTYgMC40MTU2OSAwLjk5MjE2 XSAvTiAxPj4NCmVuZG9iag0KNjYgMCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAyL0RvbWFpblsg MCAxXSAvQzFbIDAuMzAxOTYgMC40MTU2OSAwLjk5MjE2XSAvQzBbIDAuMzAxOTYgMC40MTU2 OSAwLjk5MjE2XSAvTiAxPj4NCmVuZG9iag0KNjcgMCBvYmoNCjw8L0Z1bmN0aW9uVHlwZSAy L0RvbWFpblsgMCAxXSAvQzFbIDAuMzAxOTYgMC40MTU2OSAwLjk5MjE2XSAvQzBbIDAuNDM5 MjIgMC4wMTk2MDggMC44MzEzN10gL04gMT4+DQplbmRvYmoNCjY4IDAgb2JqDQo8PC9GdW5j dGlvblR5cGUgMi9Eb21haW5bIDAgMV0gL0MxWyAwLjQzOTIyIDAuMDE5NjA4IDAuODMxMzdd IC9DMFsgMC4wOTQxMTggMC4xMDk4IDAuNzgwMzldIC9OIDE+Pg0KZW5kb2JqDQo2OSAwIG9i ag0KPDwvRnVuY3Rpb25UeXBlIDIvRG9tYWluWyAwIDFdIC9DMVsgMC4wOTQxMTggMC4xMDk4 IDAuNzgwMzldIC9DMFsgMCAwIDBdIC9OIDE+Pg0KZW5kb2JqDQo3MCAwIG9iag0KPDwvUGF0 dGVyblR5cGUgMi9TaGFkaW5nPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU2hhZGluZ1R5cGUg Mi9Db29yZHNbIDQ5MC45MyAxMTQ4LjQ3IDE5Ni4zNiA2MzguMjZdIC9FeHRlbmRbIHRydWUg dHJ1ZV0gL0Z1bmN0aW9uIDYyIDAgUj4+Pj4NCmVuZG9iag0KNzEgMCBvYmoNCjw8L1R5cGUv Rm9udC9TdWJ0eXBlL1R5cGUwL0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9tYW4sQm9sZEl0 YWxpYy9FbmNvZGluZy9JZGVudGl0eS1IL0Rlc2NlbmRhbnRGb250cyA3MiAwIFIvVG9Vbmlj b2RlIDE4MyAwIFI+Pg0KZW5kb2JqDQo3MiAwIG9iag0KWyA3MyAwIFJdIA0KZW5kb2JqDQo3 MyAwIG9iag0KPDwvQmFzZUZvbnQvVGltZXMjMjBOZXcjMjBSb21hbixCb2xkSXRhbGljL1N1 YnR5cGUvQ0lERm9udFR5cGUyL1R5cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9EVyAx MDAwL0NJRFN5c3RlbUluZm8gNzQgMCBSL0ZvbnREZXNjcmlwdG9yIDc1IDAgUi9XIDE4NSAw IFI+Pg0KZW5kb2JqDQo3NCAwIG9iag0KPDwvT3JkZXJpbmcoSWRlbnRpdHkpIC9SZWdpc3Ry eShBZG9iZSkgL1N1cHBsZW1lbnQgMD4+DQplbmRvYmoNCjc1IDAgb2JqDQo8PC9UeXBlL0Zv bnREZXNjcmlwdG9yL0ZvbnROYW1lL1RpbWVzIzIwTmV3IzIwUm9tYW4sQm9sZEl0YWxpYy9G bGFncyAzMi9JdGFsaWNBbmdsZSAtMTYuNC9Bc2NlbnQgODkxL0Rlc2NlbnQgLTIxNi9DYXBI ZWlnaHQgNjc3L0F2Z1dpZHRoIDQxMi9NYXhXaWR0aCAxOTQ4L0ZvbnRXZWlnaHQgNzAwL1hI ZWlnaHQgMjUwL0xlYWRpbmcgNDIvU3RlbVYgNDEvRm9udEJCb3hbIC01NDcgLTIxNiAxNDAx IDY3N10gL0ZvbnRGaWxlMiAxODQgMCBSPj4NCmVuZG9iag0KNzYgMCBvYmoNCjw8L1R5cGUv WE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDEwNTEvSGVpZ2h0IDEwNi9Db2xvclNwYWNl L0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvSW50ZXJwb2xhdGUgZmFsc2UvU01hc2sg NzcgMCBSL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTkwPj4NCnN0cmVhbQ0KeJzt3T9r E3Ecx3EfgVjFqRarbW3z73J3SeoT8Ak4CC66+1x0c3bRTRxEcBEcBMFFoYhgoVBERWlVrLVa rVZj2lXRL2mSO19vXhzkxts+/C7cvn2SJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS pFFv//5TBw6cBgAA/gdjY2f6OygOH75QqSwkyWsAAKDcms3VLNvo76A4dOjc0aNX6vWlNF0D AADKa73d3mq1tvo+KCYmLh8/fiNJXub5JgAAUEqdzvf5+R97NCgmJ6/NzNxpNlfzfAsAACiT 7oiYn9/urok9HRRTU7dmZ+83m+/y/BsAAFAOrda3Tmf75MkfAxgUMzN3K5VHWbaZ598BAIAS 6HR+7YiBDYq5uQe12tMs+5Ln2wAAQKG127s7YpCDolp9XK8v9zbF8A9oAACAmHZ7e+d4YhiD YilJXvbefRr+X0gAAIB/1WoNeVA0Gs97n73YzLIvAABAgeT51wEOivO/HxQrabrW2xQAAEAx 5PlmqzVSg+IzAABQFAYFAAAQZlAAAABhBgUAABBmUAAAAGEGBQAAEGZQAAAAYQYFAAAQZlAA AABhBgUAABBmUAAAAGEGBQAAEGZQAAAAYQYFAAAQZlAAAABhBgUAABBmUAAAAGEGBQAAEGZQ AAAAYQYFAAAQZlAAAABhBgUAABBmUAAAAGEGBQAAEGZQAAAAYQYFAAAQZlAAAABhBgUAABBm UAAAAGEGBQAAEGZQAAAAYQYFAAAQZlAAAABhBgUAABBmUAAAAGEGBQAAEGZQAAAAYQYFAAAQ ZlAAAABhBgUAABBmUAAAAGEGBQAAEGZQAAAAYQYFAAAQZlAAAABhBgUAABBmUAAAAGEGBQAA EGZQAAAAYQYFAAAQZlAAAABhBgUAABBmUAAAAGEGBQAAEGZQAAAAYQYFAAAQNnqD4tPQnwkA APCXRmxQfEjTjwAAQFFk2cbIDIo3afoeAAAolixbH/qgSJJX3UEBAAAUUXdWDHFQNBrPkuQ1 AABQXGn6diiDolZbbDSeAwAARddsrgx4UFSrC/X6EgAAUA5J8mJgg6J3PPEEAAAokyRZHsCg OHHibqXyEAAAKJ96fXFPB8XU1M3Z2XsAAEBZ1WoLezQoJievTk/fBgAAyq1aXej7oDh48Oz4 +KXx8Yvd65Eju3o/d+5cBAAASuPYsev9HRSSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS JEmSJEl/7if2YWA+DQplbmRzdHJlYW0NCmVuZG9iag0KNzcgMCBvYmoNCjw8L1R5cGUvWE9i amVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDEwNTEvSGVpZ2h0IDEwNi9Db2xvclNwYWNlL0Rl dmljZUdyYXkvTWF0dGVbIDAgMCAwXSAvQml0c1BlckNvbXBvbmVudCA4L0ludGVycG9sYXRl IGZhbHNlL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTA3OT4+DQpzdHJlYW0NCnic7dr7 ThppHIdxYQ7MjAwglUNFZAqpIphACFRNpIpGS5VQxVioEbe2V9Yr2d072UP2fBG7gBvl8Ot2 t5uN2bzP50+SyQx/8OT7TpibAwAAAAAA+G/4AKjsL8LgB6Cmj8Vh1AVN03QA6hn89kd1mA7D 24Gbm5t3794DUI5pGsYgD0IbvvwdgLIc27YC5mA6+Kfa4PvqoR8NwMMJh9ygYwcMfboNpAFQ WSK+GI24jmXqk2nwkQZAZZl06nEsGnIsY3I2+PykAVBYfjXnLScGbQgMjxRjo4E0ACqrlDby 2XR8wbXN8dng82mkAVBYfbtWLuSWY5H5wWwYS4OfNAAqO9qvb5bzXjIatMZPFKQBUFureVCv bmSXFl3bmEiDThoAhZ23m42t0mo6FrINfSINXz/0owF4ON1O63CnsrYSDzsmaQDwp8uL9ovn 1fVMgjQAuHf1+rS5W1v3EhHSAOBOv3d2vFcreEnSAOBev9c5aTwrPiENAMZcvyENAGaQBgAC 0gBAQBoACEgDAAFpACAgDQAEpAGAgDQAEJAGAALSAEBAGgAISAMAAWkAICANAASkAYCANAAQ kAYAAtIAQEAaAAhIAwABaQAgIA0ABKQBgIA0ABCQBgAC0gBAQBoACEgDAAFpACAgDQAEpAGA gDQAEJAGAALSAEBAGgAISAMAAWkAICANAASkAYCANAAQkAYAAtIAQEAaAAhIAwABaQAgIA0A BKQBgIA0ABCQBgAC0gBAQBoACEgDAAFpACAgDQAEpAGAgDQAEJAGAALSAEBAGgAI+j3SAGBG v3d2vFcreKQBwJir16fN3dq6l5hJw4dvvv3u+x9+/OnnX379DYBiLi/aL55X1zOJ8HQaTCcc X1mr7By2Ot3Lq/71F/j/e3tP/vhTl37mLf/5ZZ/rk98Df8N1/+qy22kd7lTWVuIzaTDsUCz9 tLTVaLbPL7q9NwBU0etenLebja3S03QsZBsTadAM2320lC1W6wfN1qvTs845ADV0zk5ftZoH 9Woxu/TItQ1tLA0+TbeC0aSXL2/W94+aL49PWgDUcHL8snm0X98s571kNGjpmm8iDYH5SCyV K5Rr2/XdvcY+AFU09nbr27VyIZeKReYDk2nwa6btLsTT2fxGqVKtPQOgjlq1UtrIZ9PxBdc2 B+eJuzQMXzboAScUTSx7udV8oVAsbgBQQ7FYKORXc95yIhpyBqPh/lXD7WwwrEEbYslUOuN5 TwCow/My6VQyNiyDMTEa5oZt0E3LcSPRxXgimXwMQB3JZCK+GI24jjX8U8N4GUazQTcCthN0 Q+EIAKWEwyE36NgBQ58aDbdt0HQzYNm248wDUInj2LYVMHVtpgzDNgyHg24YJgD1GIY+mgzT Zbhtg384HQCoZzAY/GIZRm0Y1QGAikYFEMpwVwcAavpIFwAAAAAAAP69PwA0rY4XDQplbmRz dHJlYW0NCmVuZG9iag0KNzggMCBvYmoNCjw8L1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdl L1dpZHRoIDEyMTMvSGVpZ2h0IDU3OC9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29t cG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9JbnRlcnBvbGF0ZSB0cnVlL1NNYXNrIDc5IDAg Ui9MZW5ndGggNTkyMzI+Pg0Kc3RyZWFtDQr/2P/gABBKRklGAAEBAQBgAGAAAP/hADZFeGlm AABJSSoACAAAAAIAAQMFAAEAAAAmAAAAAwMBAAEAAAAAKCj/AAAAAKCGAQCPsQAA/9sAQwAI BgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8n OT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgCQgS9AwEiAAIRAQMRAf/EAB8AAAEFAQEB AQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFB BhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1 tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEB AQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJ SlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMR AD8A+f6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACijFLigBKKXFGKAEop22l20AMop+00uw0AR0YqTYacI80AQ4oxU3lGjyzQBFi jFTCI0vlGgCDFGKseSfSl8k+lAFbFGKs+SfSjyT6UAVsUYqz5J9KBAT2oArYoxVowkcY5pPJ PpQBWxRirPkH0o8k+lAFbFGKs+SfSmmIjtQBBijFS+WaXyz6UgIcUmKmMZo8okZpgQ0VL5Zp NlAEdFSbDSbaAGUU7bRtoAbRS4oxQAlFLikxQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRilxQAlFOxS7aAGUYqQIaURmgCPFGKmERp4hPpQBX20u2rQtye1PFs fSgCnsNLsNXxan0p4tD6UgM4RmlERrTWzJ7VKtkfSgDJEJ9Kd5Bz0rZSxJPSpHsCD0oAxvs5 x0pRbH0reSwygOKeNP8AagDBFqfSnC1PpXQDT/anjT/ai4HO/ZD6U4Wh9K6H7B7U4WHtRcDB S1zwRT2044yBxW8LH2qeK22HBGRQBywsyDyKeLTJ6V1E1lGeVAzUa2Az0pAc8LE+lL9hPpXS fYval+xD0ouBzf2E+lH2E+ldJ9i9qd9iHpRcDmfsJ9KtxaSxjLba6Sz0vzpQNvFaD6eJH8mP hFGWNMDg201lG4ikFjgbiK6+ew8x9sa/KOlU57P5hEBzSuBzYsSRnFL9gPpXULYYGMUv2Ael FwOWGnkn7tR3NiYl5HNdrBpqqpkcDFZF/Es8+yMZwe1FwOZFoT2o+z8cD8a6FNOZuCMKKcbA TyCKJeB1NAzm1tTI2AM1a/s1tnC11I0hLaEccnvT47T92RtouBxL2RU4xUZtD6V1k2n7nJ21 EdO/2aYjlzan0pptj6V050//AGajbT/ai4HMm2PpTTbn0ro20/2qNrA+lAHOmE+lNMJ9K32s D6VE1ifSgDE8o+lN8s1sNZH0qM2h9KAMrYaTaa0jan0phtj6UwM/bRtq6bc+lMMB9KAKmKMV YMJ9KaYjQBBRUpjNIUNAEdFP2mkIoAbRS4pKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooxS4oASinhaUIaAGYoxUwiJ7VIsBPagCsFpw Q1cW2J7VMtoT2oAzxGaeIT6VppZE9qsJYH0pAY4gJ7VItsfStxNPPpU6ad7UXAwVtCe1SrZn 0roU072qdNP9qLgc6tiT2qdLA+ldGmne1WE0/wD2aVwOaXTz6VMun+1dIth7VILIelFwOcXT /wDZqRdP9q6IWYHanC1HpRcDn10/2qVbD2rd+ze1Ktv7UAY6WIB6VPPYAIDtrVEA44qw8G62 zikMxLeyBjPHSpBZgdqv2seCVqcRc9KAMwWY9KPso9K1PKpPKoEZn2X2oFt7VpGPNJ5dAGeL al+zj0q95dHl80AUfs4z0pwgHpV3y/WjZ7UAVPJ9qPJHpVzy6UR0AUvIpwgFXBEDwBSmFmdY kUlmOMCgB9sgSDbEN0jDt2qQpsUQJy7HLGtdrOPRNOVpR/pDjp6GsGORnuC4PJNAGktnFb27 ucZUZrFWz3yPO3c8Vr386JaRQKcyPw1QrHiNR6CgEU/s49KFtgzYPSrjqFUk1lXV6STFD949 T6UAQandeY/2a3/EioILLywFAy56mnxxrET3Y8k0TXoYeRD1PBagBHTe/kw8n+Jq0LKwRcAD gdTSWMaxw8DLE8mrsjrDBsX7zcUhlK7IeTYvQcVIluBDnHJqWC08zBPU81cMWBtA4FMDINoM 5xTDZ+1bBhHpSeV7UAYxsx6VG1kPStsw+1NMA9KAMJrIelRNYj0rfMHtTDbj0oEc81iPSoWs Pauja39qia3HpQBzjWHtULWHtXStbD0qNrYelO4HMNYe1RNYe1dO1qPSomtR6UXA5hrH2qFr L2rqWtB6VE1n7UXA5ZrL2qJrM+ldS1l7VE1iPSi4HLmzPpTDaH0rqv7Pz/DTTpuf4aYHJm1P pUDwEHGK699NwpO2suSyzIeOlAHPOm04qMirtzHiUgdqqleaYEeKKfikxQA2ilxRigBKKMUY oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACilxShaAG4pcU8ITUixE9qAIdtKENW0ty e1TR2hJ6UAURGSalWAntWglkd3StCLTiQOKQGKlqT2qwlmT2rfi0z/Zq7Fpf+zQBzcdgT2q1 Hpx9K6WPTParUemgfw0rgc1Hpv8As1ZTTf8AZrpEsMdqmWyA7UAc8mm+1WE08elby2g9KkFs BQMxUsB6VMtiPStdbcVIsAHakBlLZj0qVbQelaQh9qeIhQBQW1HpUgth6VdEdOWP2oAp+R7U eQPSr3l0hioApGH2pvlVe8um+VQBS8v2o8urZjo8ugCrsqxEu6IrQY/apIlwSKAM6NfLuMe9 WivNMuI9s2an25APtSAj2+1G32qULxS7KYEBSm7anKUbKAK+ykKVY20bKAK+2lCVPs9qNlAE OynBM1NspypQBGse1cmur8J6GjpJql2uI0B259RXPWlu17fRwKOCa7TxBqEdhpcenWpAwoLY +nNJAzjfE+ofbr6SQcJn5RWPbRkAyN0FSXQaedYgOScVpapZDTtJUtwzY4+tMDKtx9quy2ch eRWn5eBVbSLbbb7z1NT3cuxCqfeoQGVql0QPKj5J64rOij8tSx+8epNTzH5ievqazrq6ypVf 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 SUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAuaXdTaKA H76cJCO9RUUATiUjvUi3BHeqmaXNAF9bth3qdL5h3rK3Uu+gDZXUWB+9T/7SfzB83FYm8+tL 5h9aAOgi1IpJndWpBrTKPvVxolNSrcsO9AHdJrzf3qnTXj/f/WuCW7Yd6kF6w70gPQBr5xjf WTqeq+bFIN3UVzAvm9ajmuyynmmA0y/vc+9eg6PrPl2CLu6V5kX+ata1v2jiC5oA9Qt9cwfv VqQa+Bj5/wBa8oj1Rh/FVuPWGH8VID2CDxCOPnqG714PcL8/avMY9cYfx019bYyg7qAPXYtf Aj+9UtjroEzHf3ryZNdIX7361Nba8VYnf+tKwHtI19f79L/bqn+IV5GviI/36kXxEf79MD1o a2p/ipw1lf71eUL4iP8Af/WpV8RH+/8ArSA9WXWV/vVKusr/AHhXlA8RH+/+tPHiM/3/ANaY HrA1lf71O/tpf7wrygeJD/f/AFpf+EkP9/8AWgD1f+2l/vCl/tpf7wryj/hJD/f/AFo/4SQ/ 3/1oA9Rk1hcferNn1ZSfvV56/iMkffqrJ4hJ/josB6VFqyg/eqw2sKV+8K8rTxAQfvVL/wAJ CcffpAerS6wos3G7+GsTRtUVbknd3riJfEZ8hhv7etULDXtjZ3UwOl+IWoieyYA14lI22U/W u08S6ybiAjdmuCll3SE00B7f4J1YQ6MilsYArqf7dXH368X0PVzb2YTdWodfOPv0gPUz4gUf x1GfEI/v/rXlba+f7/61E2vt/foA9WPiIf3/ANaxdf8AEuLCQB+oPevPzrzf36ytW1hpoCu6 gDKvLkzTu5PJNdp4YvxZaeRnBbBrzvzMmtiDUDFAqg9qYHpSeINo+/TZPEZ/v/rXnR1Rv71R tqbH+KkB37+Ij/fqtJ4hP9+uDbUGPeo2v29aAO2k8QN/f/Wqc2uFv4q5Frxj3qM3THvTA6OX V2JPzVVfVWORurCa4J71GZTQBrtqLcjdUDXzZ61mmQnvTS9AGg16x71E10x71T3Um6gCyZz6 0wyk96hzSUASGQ+tNLU2igBc0lFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAGaXNJRQA 7dRuptFAD99BamUUALmpFkIFRUUATiYjvTxcEd6rZozQBdFyw70faTnOapbqN1AGgLtgOtPS 9Yd6zd1G6gDWF+3rThqDf3qyN9G+gDaGosP4qkGpt/erC8w+tL5h9aAN3+02/vU7+1G/vVge YfWl80+tAG//AGo396j+1W/vVgeafWjzT60Ab/8Aarf3qP7Vb+9WB5p9aPNPrQBvHVG/vUw6 kx/irE80+tJ5h9aANsak396nf2m396sLzD60eYfWgDefVGK43VHFqLKPvVimU+tAkPrQBpXl 60q4JrLLUM+e9MzQBoW90Y0xmpTfN61mBsUu+gDQN6x7003betUN1G6gC6btvWoJpi/eoN1B OaAFDVL5pxUFGaAJvNPrSeYfWoqKAJN5pN9MooAdupN1JRQAuaTNFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFAH/9kNCmVuZHN0cmVhbQ0KZW5kb2JqDQo3OSAwIG9iag0KPDwv VHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMTIxMy9IZWlnaHQgNTc4L0NvbG9y U3BhY2UvRGV2aWNlR3JheS9NYXR0ZVsgMCAwIDBdIC9CaXRzUGVyQ29tcG9uZW50IDgvSW50 ZXJwb2xhdGUgZmFsc2UvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0NTIxNj4+DQpzdHJl YW0NCnic7J2HX5VXvvXvvPPeOy3JmOKYYoq9xW7sKPaCvWDsigUFQcTeFWzYe0NFQVFQRMXe FXsLMRqjpmkSk5gyaTNz3/uW++61f3s/7TznnOcIeCh7/QEnn3tH1+e71m/tx3/7NyUlJSUl pcKj3+WI/P1/hZKSUgFWztiU8jQlJaVck3s3+R9PT8rRlJSUnMu7af3+6ci7ifn7/1VKSkp+ kk90pbvK/3w6srMxZWhKSoVbT0JXuqv8u4v+I/ty/VE7G1NUpqRU2JR9unK1qj/kjlztLPtU 5u//9yspKT2Z7G3LKV3peETu8keuP3H9OWdFP0r/AbOVmdnMCZUp+1JSyn/yzFnO6UrHId2w 4DF/YXqG69mcFf0ofl5amdHIdDNzQmWKxZSU8p88c5ZvdEVI9Je/SMOCxzzH9FeuIjkr+lH8 vLQy+g/rXOacyjyzmL//J1JSUoI8kZb7SOiMrgiJnntOGlaRIs8zvfDCi0wvaSqaPek/hJ99 4QX8J8jK6D+sc5lzKvPEYorElJTyhjyRlnvLckZXhETSsGBTf2MqVuxlplc0vZo96T+Eny1W DP8JWJpuZJLLnFGZvY0pElNS8rt8IC2jaUnL8pWuAEdkWLCp15iKF3/99TeY3sxZ4Sdff714 cfwnYGlkZJLNfKUyaWPeTMyGxPz9P7CSUgGVc9Iyc5a0LF/pCnAkDevNt0qUKFmyVKnSpcsw lc1Z4SdLly5VqmTJEiXeelMamWQz36iMbMyOxRSJKSk9TWWPtKRpkWX5QlcAoreYYTHL4oZV tlz58hUqVKxYqdLbTJWZquSM8FP4yUqVKlasUKF8+XJluZGVxH/6rbeIy3yhMrIxOxPzlcT8 /T+9klJ+lqtxOSUtiobStIiwmGU5pisAUTlmWMyyuGFVrlK1WvUaNWvWqvUOU22mOjkj/BR+ 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 3lCIAh57Q/KsrqHlR5YfWm6X6OIS/YQPk0EXCzcxiTHaUSqY9dSsLJKTUVcWo+DxkfzKs6ue Cla0N5TI6sq0/MhyA6KLywNID3+eeCLcxcJMTGKMQEYoU5tKCbJwJ6OuLEbB4yP5lbIrghXh Spbw4bvDsOHQYloOXS4uMU+kYj+yiclyX6JMwUy3MpuTkZVRekUv6qFGe2X4lWlXBCvClSrh uzYtO7C6+5/SxeWnlYCIRWzFgtU+xYSZH2R+JyMrozwTvaiHmu2V7lemXemwotxNDW/zLMcu F5fuzt2ZmMKYBJmCWRBkQSeTXVlMQj/A7ld+YKkPr75QeA3vaOXi8vDm7kxMx5gdZpGdTHZl MQn9gHC/CodVWA1vNS0HLxeXhzxdYSzcyZSV+UEmu7KYhH6Aza/0j2aDVSRkdfc/g4uLy70m kon9GCfTu7KYJdIwGO5XkUyru/8ZXFxc7je2Cerenczfl0UlwR9wr37lYOXi8ljH/r97iJWF O9kDSCS/Cv0O3f2f18XF5QHnXp3sAcT5lYuLy10kgpHZm7IHkPAP1N3/tVxcXB7+RKRa7NPd X9/FxeVxiEOVi4uLi4vLfef/+MrDAg0KZW5kc3RyZWFtDQplbmRvYmoNCjgwIDAgb2JqDQo8 PC9UeXBlL0ZvbnQvU3VidHlwZS9UeXBlMC9CYXNlRm9udC9UaW1lcyMyME5ldyMyMFJvbWFu LEJvbGQvRW5jb2RpbmcvSWRlbnRpdHktSC9EZXNjZW5kYW50Rm9udHMgODEgMCBSL1RvVW5p Y29kZSAxODYgMCBSPj4NCmVuZG9iag0KODEgMCBvYmoNClsgODIgMCBSXSANCmVuZG9iag0K ODIgMCBvYmoNCjw8L0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9tYW4sQm9sZC9TdWJ0eXBl L0NJREZvbnRUeXBlMi9UeXBlL0ZvbnQvQ0lEVG9HSURNYXAvSWRlbnRpdHkvRFcgMTAwMC9D SURTeXN0ZW1JbmZvIDgzIDAgUi9Gb250RGVzY3JpcHRvciA4NCAwIFIvVyAxODggMCBSPj4N CmVuZG9iag0KODMgMCBvYmoNCjw8L09yZGVyaW5nKElkZW50aXR5KSAvUmVnaXN0cnkoQWRv YmUpIC9TdXBwbGVtZW50IDA+Pg0KZW5kb2JqDQo4NCAwIG9iag0KPDwvVHlwZS9Gb250RGVz Y3JpcHRvci9Gb250TmFtZS9UaW1lcyMyME5ldyMyMFJvbWFuLEJvbGQvRmxhZ3MgMzIvSXRh bGljQW5nbGUgMC9Bc2NlbnQgODkxL0Rlc2NlbnQgLTIxNi9DYXBIZWlnaHQgNjc3L0F2Z1dp ZHRoIDQyNy9NYXhXaWR0aCAyNTU4L0ZvbnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUwL0xlYWRp bmcgNDIvU3RlbVYgNDIvRm9udEJCb3hbIC01NTggLTIxNiAyMDAwIDY3N10gL0ZvbnRGaWxl MiAxODcgMCBSPj4NCmVuZG9iag0KODUgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1Ry dWVUeXBlL05hbWUvRjgvQmFzZUZvbnQvVGltZXMjMjBOZXcjMjBSb21hbi9FbmNvZGluZy9X aW5BbnNpRW5jb2RpbmcvRm9udERlc2NyaXB0b3IgODYgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0 Q2hhciAxMjIvV2lkdGhzIDE4OSAwIFI+Pg0KZW5kb2JqDQo4NiAwIG9iag0KPDwvVHlwZS9G b250RGVzY3JpcHRvci9Gb250TmFtZS9UaW1lcyMyME5ldyMyMFJvbWFuL0ZsYWdzIDMyL0l0 YWxpY0FuZ2xlIDAvQXNjZW50IDg5MS9EZXNjZW50IC0yMTYvQ2FwSGVpZ2h0IDY5My9BdmdX aWR0aCA0MDEvTWF4V2lkdGggMjU2OC9Gb250V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9MZWFk aW5nIDQyL1N0ZW1WIDQwL0ZvbnRCQm94WyAtNTY4IC0yMTYgMjAwMCA2OTNdID4+DQplbmRv YmoNCjg3IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UeXBlMC9CYXNlRm9udC9UaW1l cyMyME5ldyMyMFJvbWFuL0VuY29kaW5nL0lkZW50aXR5LUgvRGVzY2VuZGFudEZvbnRzIDg4 IDAgUi9Ub1VuaWNvZGUgMTkwIDAgUj4+DQplbmRvYmoNCjg4IDAgb2JqDQpbIDg5IDAgUl0g DQplbmRvYmoNCjg5IDAgb2JqDQo8PC9CYXNlRm9udC9UaW1lcyMyME5ldyMyMFJvbWFuL1N1 YnR5cGUvQ0lERm9udFR5cGUyL1R5cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9EVyAx MDAwL0NJRFN5c3RlbUluZm8gOTAgMCBSL0ZvbnREZXNjcmlwdG9yIDkxIDAgUi9XIDE5MiAw IFI+Pg0KZW5kb2JqDQo5MCAwIG9iag0KPDwvT3JkZXJpbmcoSWRlbnRpdHkpIC9SZWdpc3Ry eShBZG9iZSkgL1N1cHBsZW1lbnQgMD4+DQplbmRvYmoNCjkxIDAgb2JqDQo8PC9UeXBlL0Zv bnREZXNjcmlwdG9yL0ZvbnROYW1lL1RpbWVzIzIwTmV3IzIwUm9tYW4vRmxhZ3MgMzIvSXRh bGljQW5nbGUgMC9Bc2NlbnQgODkxL0Rlc2NlbnQgLTIxNi9DYXBIZWlnaHQgNjkzL0F2Z1dp ZHRoIDQwMS9NYXhXaWR0aCAyNTY4L0ZvbnRXZWlnaHQgNDAwL1hIZWlnaHQgMjUwL0xlYWRp bmcgNDIvU3RlbVYgNDAvRm9udEJCb3hbIC01NjggLTIxNiAyMDAwIDY5M10gL0ZvbnRGaWxl MiAxOTEgMCBSPj4NCmVuZG9iag0KOTIgMCBvYmoNCjw8L1RpdGxlKP7/wqy3fMd0tNwAIAAx KS9BdXRob3IoTUggRGlnaXRhbCBDby4sIEx0ZCkvQ3JlYXRpb25EYXRlKEQ6MjAxNDA0MjAw NzEwNDcpIC9Nb2REYXRlKEQ6MjAxNDA0MjAwNzEwNDcpIC9Qcm9kdWNlcij+/wBNAGkAYwBy AG8AcwBvAGYAdACuACAATwBmAGYAaQBjAGUAIABQAG8AdwBlAHIAUABvAGkAbgB0AK4AIAAy ADAAMAA3KS9DcmVhdG9yKP7/AE0AaQBjAHIAbwBzAG8AZgB0AK4AIABPAGYAZgBpAGMAZQAg AFAAbwB3AGUAcgBQAG8AaQBuAHQArgAgADIAMAAwADcpPj4NCmVuZG9iag0KOTggMCBvYmoN Cjw8L1R5cGUvT2JqU3RtL04gODIvRmlyc3QgNzAzL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5n dGggMTE0ND4+DQpzdHJlYW0NCnicrVdNb9s4EL0XyH/gsXupyeHwCygKFC32EqAIEt+CPbiJ kQ2QNoXrIO2/3zfSSJZks5aNPSSkpMc3w3kzQ7pEY42z1vhgSjFJHpxxLmH0xgXCiL+cMbIh oJyNhjIwNhjf4LLxkbHGGrayvhhucMlwwjrnTPDC6U2IESOZKJwumMgFI5uYQ2MzeXkfTYry vpiMuSNncoAvZE0WP1w2RfiITMmwSyw+wjB5cQoekbBZ+ZSEXj6J3SSfiiyUT2Dy4obHZy9+ iG0vjnjwMMkTrHAopuBlgJtOtpUkPh6rk/zz4ExJFoEhCzHjc46yEsS5AMPgK5yECxNxmRHK xmUmTCR4jKDKjh1nTALcxQJyRVwpBh6TuIBJKo0q5CU0CAskEZ1EmwKjIRhgBQNCjjCKgFCw sgMwB/EFO6IgCgZrKIrRiEkT+wjmJEmADVCGsi7CRJagRjBniQTcpSIxgphUsqxKxlsJFmTz VrQDhZcEcMlhIvtOhEn2EjbjCZq6xJgEASORqIgJZJKXGHt8YviD7fuAEBY8R1gCyCcngGh8 Rijev19ciTzWXC9uFjc/Vt8XVw/GN8+Xxn74cPGmhRSFXC0ub437x/SwHaRjWa5/bb8+/2qA yGe8/CN8apR6iFTOwKqfb9Uftfr348PLZr34+LR9+5es4UNoKdGBA2G+A7HmgIh6eN9xgOmi vfwMuj/TLK8bi+54oJerr0/r1r0srzo7J6mTdi64kTp5dnBcVR1pZQPKMp8y1CnjKHPtfM5U 58yV6Di3A5E9KmLPoyKiqueL6EorIp1eYm5QY+RH8ZlfZMSn2+WB3bEu82uL6rrQSJePd9uX 1ZMsffv6+vru07+PeHv/abXZbh7vH9bv7p6/XTS17+J846dXjBuUjHejTR+smSlofhV4ajPC 19tfJ/bN0+N9k0alkUH7e3N3aUelsqxj0DG1o1OcU5xTXFttXWY3d4x29DoqDymOFOetjtUK kDNtHGBOe8eUXCf2z6kWeIBpFLy8s1xdsGd6UEhsh6b9CabZ1U0z1UwPaol71l2rqRJpr+Ew Y7+7bsMqIPM5YQoDP0YKxVPCdJZCg+oLI4XyYaYxqMwBdYfKEVQlGycomoWqpNcExbNQYRbq FKWCdoeg1R80eYJ2iaBdIGgXCNpVgnaDUM5Retho48FGO8v5SGcZLwPjo1sMVbLjsPE5VTm9 u9KxPrfftgZ9K+aRt5XMmqAqmTVBVTJrgqpk1gSVZqEqQk9Qlao+rIiejElPqKS5nTS3k+Z2 0txOdQX3T1/5Qdyee1oBXq2xWmO1wloprDhWXFBc7Eb1LqpXUb2Kuj7q+ljrpcvfP9aLm+3m 5W673KzX18/P28XVarP+3jzKD8kmg271BtIFTZh61BeE73L9uz8cv7x8+3kLVFHjzc/PZpEA +juI/lgcXEJ0E/0lpMNpm+gvIYpz6pLrLindDbm7hChPfwlRHCmuv4RM7lHi406p7sbSKaVO 9Adkp1SeKPW/9MSB0jRROlSUPjN/L978Bx/UCCwNCmVuZHN0cmVhbQ0KZW5kb2JqDQoxNzYg MCBvYmoNClsgMjUwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyNTAgMCAwIDI3OCA1MDAgNTAw IDAgMCAwIDAgMCA1MDAgNTAwIDUwMCAwIDAgMCAwIDAgMCAwIDY2NyAwIDY2NyAwIDY2NyA2 NjcgMCAwIDM4OSAwIDAgMCAwIDcyMiA3MjIgNjExIDAgNjY3IDU1NiAwIDAgMCA4ODkgMCAw IDAgMCAwIDAgMCAwIDAgNTAwIDUwMCAwIDUwMCA0NDQgMzMzIDUwMCA1NTYgMjc4IDAgNTAw IDI3OCA3NzggNTU2IDUwMCA1MDAgMCAzODkgMzg5IDI3OCA1NTYgMCAwIDAgNDQ0XSANCmVu ZG9iag0KMTc3IDAgb2JqDQpbIDI1MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMjUwIDAgMjUw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDYxMSAwIDY2NyA3MjIgMCAw IDcyMiA3MjIgMzMzIDAgMCA1NTYgODMzIDY2NyAwIDAgMCA2MTEgMCA1NTYgNzIyIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCA1MDAgNTAwIDQ0NCA1MDAgNDQ0IDAgNTAwIDUwMCAyNzggMCAw IDAgNzIyIDUwMCA1MDAgNTAwIDAgMzg5IDAgMjc4IDAgMCA2NjcgMCA0NDRdIA0KZW5kb2Jq DQoxNzggMCBvYmoNClsgNDAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNjUwIDAgMCAwIDAgMCAw IDAgMCAwIDY3MCAwIDAgMCAwIDAgMCA5MzYgMCAwIDAgMCAwIDAgMCAwIDAgNzExIDAgNjQx IDcxNSA2NTAgMCA3MTEgMCAyMjkgMCAwIDAgOTQxIDY4NCA2NjAgMCAwIDQxMCA0ODggMzk2 IDY4OV0gDQplbmRvYmoNCjE3OSAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0 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 Do4WfKXtUK4l1NNdvMA9/cWvXjCnpFu40OZuWpVd1ZZdPTaWamhMFZJNifTYiOvIZjtSM+dP x1pbY6dPV7anak5/rmP9xVGM2Sji9jtYVeG8aNjLlDqvMxkqKfMrYz/+QSl+73/yvG1P9+XH x7tbWrrHJlxHd9vM+Q805HINH/h059Xz39RxO3aFEqorVC73vaXlnp9ZXu4t/KLkgw+LHcvm lb94j+wc0eLHYkdhdMfvteXzbSvz+RNzL3ckB9qKa9oG5n8NddZlFVNVIVKSsSPbfbj4Oxr8 ExAMOD9Q09Pf3RaudHYbltdVZzP1VfHXOmbOP1i2qnKJ3x+qrKi1o0VmX9PLNuKVdmdrogkv bd+wTLSqxO5IddyTV+/PX4+5g+f65j/tiSaXqAnGnb44m/Yu1942kGtyHxnvXbd6dFsqlnBe XaK2dmxwqG/9+saqVc5LVFVXn62/sm/lKvs0RyuW1jZFmybWtna0RsJVkcoqV/xpLv57qDP2 eatQdaEikinpSJaW+xXhhVO0T5f961Sd6z8ztHFoaOOF3OHDuQsXildn9lW7Aym7uysK1XZ3 7c5mKsJRm06s0ispC5UuuL2J3oGe6uKvR3AD1jtbqLmvPz82Vry94xMVPW0udX9Db/HuZq8O /pvUaOWJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIiIiIj+X3STjv4Pdd+beiLoewtz1ZfpOuu97oteqfV26475Puu95DcG jfv3+h/zv0lERERERERERERERERERERERERERERERERERERERERERERERERERERERET0i5aK KvVH8uVKym35rfaYW3ZaYq/mlj3bZsf8sr9gfcmC5VLbZv/8ckhRHQuWly845nI7ZkS/Ob98 6ZjL7fnS+pIFy5eOuXz+mOM6pGndodt0q/bZe0eU0S51qFk9WmsN2NKEjmpKkzpoy8Xtp2yP o7blHtvr3Vpla6+y93apSxt1u713yNZs1jZ7f59td8D2vE3dVq9t0R10cbvNWm1H33yu7/Hh L3z9qQ9/40Iws8DsKVXpMg6+Mb/QrBVqUVqtWqk2tdu4O9SprI1ntZ1njZ2lx86YU5/6bRZ5 DdpshrROw1qvEY2qoA0as/lcYaN5i660cVylq7VJ19io3qot2qpfsjlcq7fp7bpO23W9brDr e6Nu0s3aqVv0DpvXL9usd9s89wbX7la9U++y+U7Z1She1cPB9Tli1+CYfsVmfId+VXfqLt2t X9MH9YA+pA/rQX1EH9Uf6CE9rI/pD/Vx++x8Qif1ST2iR/UpfVqf0WM6pdN6XH+sz+oJPak/ 0Rn9qZ7S5/R5fUF/pqd1Vn+uL+pL+gt9WV/RV/U1fV3P6Bt6Vn+pv9I5Padv6lv6a/2Nntff 6tv6O53XC/p7/YP+Ud/Ri/on/bNe0nd1QS/rX/Q9vaJ/1b/p+/qBXtVr+nf9UP+h1/UjvaH/ 1IxdexfcgYn/Atxsx8sNCmVuZHN0cmVhbQ0KZW5kb2JqDQoxODAgMCBvYmoNClsgMjQxIDAg MCAwIDAgMCA3MTAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDY3MSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgOTI3IDAgMCAwIDczMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NzMgNTU0IDQ1NCAwIDAgMzI5IDU3MyAwIDI5 NyAwIDAgMCAwIDU5MCAwIDAgMCA0NjEgMCAzNDcgNTc1IDAgMCAwIDU2MF0gDQplbmRvYmoN CjE4MSAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxNjYxOC9MZW5ndGgx IDQ1OTQ4Pj4NCnN0cmVhbQ0KeJzsfQl4VOXV/7n3zr7e2bdk7kxmJtskmSSTZDKThBmSTBYC TCABEyCQQFB2osQNJQQxAsEdQerup9alVYdFDagtVu3iLi7VuhStSytStXVpVTLfee8kMKSE Pu2/z/f8KznM/d13v+899/eec96bZAAKAIwIAuisbWmsz3z9ZSPATjeAra2+NloHmXQ7wJUr sJW9vjnWIg6oKjF/OebL61tmVR9a+eG9mH8K89dNbW1peLo6OgggvhOAbou1+Irr5desBKD+ iPWzZ9dOa1sVP68EQPo9gPDQopVdPVNb7rsLoA3Ho25YdF6vI/pJrQ+gG5tTny/u7i18dMH+ WwCuagOQPHNmz1krb3h49mUAc7Kx/+Gzutb0gAmkeP152IE9a8WFZz5zSdffABZ/DmBSLOle ecEjsZI+APXbAA3xJYu7ul/f2II3S5H7KVuCBer5om2Yx/mCe8nK3gvag8zdOPcIjt+9YvWi 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 8/zZRquCQf/Cs45f7yZpMgQcTYyp07SpczLKy/VZtdrE63LduJfJzX7Hlzp41Az8XbIBcbzX 1Y+92a+Dv/xE+ouPqQNC5oqPR8T5HluwLjTrye0hlW4Ftbs+ti3jLFyzskKtcZAef+hCo5qg VU+vu9Ujaw3zKlsk7PGJ6ejkuw9qT7izLn50WXyzI91wNfd+cGjDneNK3qVmCxabjVt+9tPu T+F+DQEm1/9snJs14gP1zIw/+9nfMJ4aubxR1dTynnZzLOvjo02dLeMLp3+Yvj3rExq02OxU AqerZdF8u9szpsp09x13YvpOuRppvW+AwOVXh5S3OivP24w7d7qhimfiYb31T4+kNN8VLWcf vDE7OaIh7uXuT9n6j32vbJTBbZEM+djbY0osGdIGSQ/x4Z3yb7mp2cetVKYSQ24ABWaZsnGY oeLYU+v9aAeBQ6+nhs7SxNd7uMA747c8nJ3Hw/yrMPR0aFp7bUQBlRK76hyrJX5P3jPy+xgC 63Z+rIxa4DN+3+LaIcLDRbJVL9QmT02fMdjgwaG5DhWLA6vmW/gMf3fahdEvLMb2fmHKiaN+ C1vXapYuG3ynsrElZ++U6eZ5ScZBRy7VPLxt+jyC2QguuI7Km5MwNmbzgsMvVk2ZNff8jTvH uJ1T5kaVqxzdTnli8aLWEjtw4/Ej2+i8uqO6mwZbaB0KrCk6reH+m+nq6o8sdrrRwoVewxln tqR1/EGJ3XGjbop+kGB9UdLzwqsCk5ou5yGHFlywXWhzbh17SvjM88t2Z7Uur1xs+PYgx9ro ctY8nbxjnuzZYfn+Byed6h85/No2p9zjMqbW04sZ58qSZha95ZTWPthuqYrMpI5uUFJuuPk/ PmHoHA0KZW5kc3RyZWFtDQplbmRvYmoNCjE4MiAwIG9iag0KWyAyNTAgMCAwIDAgMCAwIDgz MyAwIDAgMCAwIDAgMjUwIDAgMjUwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDcyMiAwIDcyMiA3MjIgNjY3IDYxMSA3NzggNzc4IDM4OSAwIDAgNjY3IDk0NCA3MjIg Nzc4IDYxMSA3NzggNzIyIDU1NiA2NjcgNzIyIDAgMTAwMCAwIDcyMiAwIDAgMCAwIDAgMCAw IDAgMCAwIDU1NiAwIDAgMCAwIDAgMCAwIDAgMCAwIDUwMCAwIDAgMCAwIDMzM10gDQplbmRv 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 9Rserlvb0NQsr4s0tDbHr1vf0NY8Y11zQ/v6vHUbGzpwUmI56zY3dH6qed3Whu5m6iu/KYH7 zZx0j8atef1uOgk3sybNmfrpd0KT5mzSoWmlvivyrGl0O0Yr6ANMd3Y/cMt6v74j8W09k2JH 00qOHR1Eac6jE2Nz6rrt1Y7mAkMa3bsz1+1s6G0uor+y8zevhOWbVzJ/80qxR+xtws7ftkrn b1vN529bZdl77XvFB+zftv9AOPmbVB/lb1KtiH8ufrVYFf+b+H8Xfv6WVwjS80SW+IgQQhMB kSrWii8Ih/gS0irRKb4mPi72iL8Tz4v9SJ8Q/eKQqBQ/EsfQ8pR4Xbworop/FZ8S/yZuib8S 98Qj8TlJlnLFS1KHtF0ckrql18UPpf8jXRf/Lo/JvxH/acuxvU88si2xuSSbbYXteWmard72 P6Rk20bbS9KTtj7bd6WnbYds16Q/s92w/Zu0xvZr26+lStuY7bfSC7bfKXnSOuUDykekl5WP Kpq0T3lW+ba0X/222i/b1VfVo/J09cfqCfkp9X+p5+U09XX1tvw+9T/ihPxsnC0uXX4ubn5c sVwb74gvlP86vij+I/IX42/E/z/5y9PEtHz5ZSFhzPStmySRQd+zWToAOAo4DhgSqUuPLj2+ dGjp8NJzS0eWXl56beno0rGld5c+KBNlallS2Szkc8syyrLKcssWlTnLSsrKyuj/ydl4xoS9 1l4rZHujvZG/PzZLzpPzMKdFcpGQ5GK5WMjyX8h/IWxymfxR+quHXC5U2St7RZz8cfnjIl5+ Xq4U0+SQHBLT5bXyJ+mvSnJEzJQbcCxKlj8tfxoy/0reKGbz545PwZZ9Yq7tt7bf0qfJ4qK4 wiOj3zoR2gyxVpuhpWipWqaWreVpBVqRVqppmltboa3W/NpaLQJYrzVrG7XN2lZtu7ZT69F2 a/u0A9oh7Yg2qJ3UTmtntQvaJe2qdkO7pd3R7mvjLsWV4JrpmuNKdy1w5bjyXQ5XMdpMpEEj XTDSfTOhhZ6WoLwE7ZYBPK6V1Mq1xhUEVLmirkZXi2sTOLa4trl2uLroe1HKz/n/Clp9mP5v hUM0wiOLxWfgz2XswxXw3UPCC+/9kfDBd18Xz4mbSCvYRh9TlisVYqXiVbzi48rHlI+J1cpf KqvE88pqZbX4hOJX/KJSCSth8YKyVlkr/EqDsl4ElC8oW0RIaVfasRYk0YtVQlZeIOxQphiw BLAM4AGsFCVamVau+bRVWqUW1qq1eq1Ja9XatHatQ+vUurVeba/Wpx3UDmvHtBPaKe2Mdh7l i9oV7bp2U7ut3dMeumRXvGuGK8WV6sp0ZbvyXAWuIlepS3O5XStcq11+11pXxLXe1eza6Nrs 2ura7trp6nHtpu+Q2V+xf4O/AZgwyVqfQXKIf0IqFG8gOfnNeYvFKFKR0qK0iGeUzyqfFcVK h9IhPiykpM6k/ZCSJHJFnBDVVQCsmo/kIm8EtHBZcu23zasO1q5kqKpdUx2tDcaeqUzQWFtV 3VIb5fpNtY3VW2pbJvGa+bbaTVxvPhMf5UQjoHoCkmXmO2q3xOhUJjDpJMesM6GrdhuD2c7U i3ICqtuFPncZ46H+9yDfD1n7HyPPqtNUMPUx4a3aPg76a3ew/qSDSTP1Ij2O13bF9CbbmHVW GIDdrWCOYSqQbiSD8iHDRkfxTLlpQ3qmvsx5Mm1Bc2va1dRnj5ET3eS3thuu3RWbY+LbZeRH DR1Il3O1ezgfqd3P8qitmZt9Uztzvig3dTfHctSQY/Lvt4zFOsbLtf3V12oHqkdrj8b03DNl LFN1NfOpsqOW5yHLM9mJdDLzAcvzWO3xmL9YfdEch+kDd2uHqh/UDsdkmnnwMeMnmY/Tyfps rkNzbtFXZLNOm5rHeNC2RtSeq6mM5taEo4ti9tr1LvKhd1k/le9xdn+bPLLV8jwwxe5TbfF2 +dDkZxr3W+bRidwqJ7Jdt9M75Txn5hqw5qYdzHFM0bNGrR0x11pNUu3lmlm117hs5Dx3pk+R jnNrR2M8GbVjNH81WbV3zX24Jrf2Qc2iqIjZzGyL5xpnVK0piSYRraYsOov5y6Nza3zRjJpV 0axJ6xx+WFMdddbUR0sm7S/Ia5qiZTWt0fKatqivpj26iuuIvyNaSRDZXbcisq9udU1nNBw5 UOePHKpbGzlSF6E9MTJYtz5ysq45crpuY+Rs3ebIhbqtkUt120nHyFXsmWZcsc4l1jD7xNS5 uRGtjPn9rYk+YvV36nZG7tf1xPadx/lsy2N87S3m6k371dR6w0aR8brdtUrdPtMHaxPqDtTO rDtUO6fuiGmrmA7BKfuQ4Tc13dHqx8Yny3NNb7S+Zm+0qaYv2lpzMNpWczjabo1TNceiHTUn op01p6Ldk2QZ8azmTLTXGt9qzkf3xmK+JfbWXIz2cX4lerDmevRwzc3osVgctkDN7egJhnvR UzUPo2eIFpGj5xnioxcpt8bSyIzolUhK9Lo1hkdSozdjMo0xRzKjt01gu0C3SHb0Ho2XxhjJ iz40zw2RgjqZZZttiuriI6V1MyJaXUrEXZcaWVGXGVldlx3x1+VF1tYVRCJ1RZH1daWR5jrt TXvh1NhnxpKp+/Bb5VP9Kzglt+55Ox/jb28Vi6bGJPgrtzfXibnmrecLI54yn2Utx2IG2dTI Oa5Qbq6bqrfI32avfcv1RvManLKOpsY/8zyC50jP5DwW93e8eRyx/K3mY6q+U+YlFivNuDp1 /qx7uxmnrbm5tqomzk9sb+v50ZJHNta5CWrT6wYpHsfO4OZeYsoF1C6oOzlp/VrPxsbai52L DV1qc+pO1+bXna111F2IrXWiF9ddorVntq9dUne1dlndjceeu83+PXW3Jp2xp+xN5j4Uk0H2 pPVu1NMN2/5D+98LEf88/z+3u/F3Bd27M//En2u8JB7x5xch/vziRdsN26+lLv7kooc/udjL n1yc508u/oU/uXhD/XZcsVzGn0dc5M8jLvHnEVf584ibuEnuEwcmbu2Lo6J8cdQRdFQ5oo5G R4tjk2OLY5tjh6PLscuxx7Hf0e8YABx1HHcMOYYd5xwjjsuOa47RxY2Ou44HhaJQLUwqnLW4 ZfGmxZsKcxdvKXQWlhSWLd5W6CtcVVhZGC6sLqwvbCpsLWwrbC8s41RdWA2JlIYp0VNhGQOV AXQDt3+e/1fZ5DvlRlj7c+LzuE0eRHqG75fF4p/FedwgLyB9RPqZNCxKbatsz4sl9BkQWkpi jQhOjNe5Tyxw7nMecB5yHnEOOk86TzvPOi84LzmvOm8gv+W8g3TfOb5YASQsnrl4zuJ05zjo 44xvLV4ArgvOcdaxAzo+xd9VEyIbSRI5SDLusLnCJvKQFJEvPoB7+wdFAe61haJITINOmpgu liHNEOVITwg30kzhQUoWPvEcNP2YWClS4E9rxBz+b9KpogUpTbQhpYvNSO8RZ5AyMPZfiPdK M6QZYr6Q1GWqxzLWSts8/5B/2H/OP+K/nJ/nv+Yf9Y85m/IP+e/6HwREQM0fDCQFZgXmursC Gc7KQFYg13kisCjgdLY52wLOQIlPDZQFyp2dAR9o7YFVgcpAyXM9gXCg2tkEanmgPtAUaA20 BdrRz1Cgw3+ZpAYy0HYidQdK9OTs1BNJiaVyI/UGOtFyb6AkmMeyVDz3BdqcJ/B0meGyf0xP qFO5FySSBs3mOpugd7t/xHkYI2jLz66Y5b8WKPOPefcHDvrPOdsIAoch1xk4FjjhH0F5JHAq cAYal/jvOttNgP6VDCp0mxWoZoB075bAeXcXesuArgTojeFi4Er+PpJr9sISTSAdAIHryEfR 6iZmY8zZaULgduAeNPcFcqHX3MBD9/6g7B8OxgdncP+AYIrbQf1P6hsQTA1mYr6aaLTBbCqZ QBRuDS7/UHA76/YmeBw9uD3/gHvHJP0twHVjzvbgzmBPcLd7h6mhFR5HJ1pwX/CAVfvYKPYF D7mjNMs6kB7OaoxUDc/l+gL/WH5P/s5AK/Du/B73GrbwSLAIM9QaLHVWrh4Lav5rQTc8tx28 hwKtzm7Y8mZABFcE1ODqoN95+Lme4Fp3V2gosCgY8a5xd+VnBtf7zwWbIWEjaJt9rcGtzrb8 POfhcG54UdgZLgmXhcvDvvCqcGU47KwOVwf6/NfC9TST6MEZbgqcIfC1Lt8d8OktqC7cGm4j 34lZ1LSeOdumVUy/MqwQbq+YFe4I9pCHhDsxziPhbmc1+6oI3qcW7NM9sA3s4Azn9/g3YZzH YKkOSvlHQjtCVaGq/CPelfl5L2yH3W4427HSfM5uZ7t3R6grmBLaFdoTKA/tD/VDn6H8Q6EB Z5mzLHQ0dBzt3KGh0HDonHeTT/Wp+XmhkdU7vDvAfTm/J3QtNBrozU8JYR7cC7z789ejXSX5 J2YkL/9I/kZfWXCGszUYcbbnbw3dDT0Ii2CR93JYDSfl7wzPCs/Nh6cFjwQOO9vYEwa9A8GT wdNYfc7g7uDZ4IXgpeBV5Deeyzbt5Wvz9gdvBe/Q6PPzfCqvItjGPxo8oOcY4bg7GlJCCWRX mpNAbvBsaGZoTijdvZ9hQSjH1xbKxz63ygSam6Dszg85fItCxctvTfXU/MHneghobkJLQssY ZoY8vP726OvQLNN6dEfRz8rQGu9lb1UoiBmIhhrRZ4s5r9hR6zHinbQqQ5vg57nYKwG8Qmnv yAq0h7aEtnkfwDeaQHP6VNprw73hveG+8MFwRjgrNBrGruU/Fz7mv+vu8rWG4MfwhLk+NXwi UA5dq/PdvBe3h0+Fz/iywucx6+0YR0+o37s/6A5fDJQBXwlfD4091+MdC9/0qV6sF8zQbaR7 4Ycvyt41L8Yvvxq+8uKMF1NeTOXI9uX/JmediGjkT5XpvW8i54qQFvpFSs6lhWtyriLdQLqF dAfpPtJ4zvhCBSkBaSbSHKT0hcGFC5ByFlYtzEdyIBUjLUFahuRZSBFXtn/RvhV92IVLPAub LRcVOAF4EcdV8ZewTCJsGBCzhZTUnrSDNeK/BpVnCsl3ATnODr5Ltnnlqb6z5ZmAbEAeoABQ BCgFaAA3YAVgNcAPWAuIANYDmgEbAZsBWwHbATsBPYDdgH2AA4BDgCOAQcBJwGnAWcAFwCXA VcANwC3AHcB9wLjv7HIFkACYCZgDSAcsAOQA8gEOQDFgiVFeBvAAVhrjKbDoCr2WrzH0ACwP AqqMZ+i0PKrrtLwR0ALYBNgC2AbYYejSZeiTMNGe9bDCLsAewH5AP2AAcBRwHDCk68L1w7rO ZJ/l53Rdl48YOlP5MuCa3g/PwXoL7JyA5aOAMcBdfQ6WP9DtTblbGO3Rh1sFJOm25Lm9ZMjd qtuU7OWeZeRzARmALN0+7lzDTvAP9yJdLut5dkJX8g23E1ACKDOey3X7k+0od/sAqwCVus+4 w0Zerevhrtd9yN1k5K3GGPP13N2mj83dbowR8+3uAHQCunUfdfcaY9hr+MBJXUd3n5EftOhu 2mFqDr93Hzb8H77pPgY4ATgFOAM4D7ioz4/7ir4+3NeNNXLHAL/hx8b43TcBt/X5Yx0pv6eP n/yax//Qd7ZC1v3bOu6K+InnihkGfbfu++w/DmMtmbSpucFTkYIy1nsFQaZe5rXg0fMK2KsC c1xRYDwXGc+wS4VmoRMffKdihfGMvGK1hc+gW32E13iBYQPkFX7DdxonP1N7k16BvaYiYvjp DWPtJOh5hbEWSL9JdOO5onmCHhv3O+RWm7OtDTu9Ux6bA0tegX3Re12fOy/m3jOm6+O9rcv3 3jP0pL1zUPf3CvhABeU7dVoF9tEKzGHFPn3NVRzQ942KQ7rvVJDtqS3NE/y8AvtqxVnD72h+ Lvhi+2kF/LriquGPS4y+YdMK7LkVd4x5BJ8X68gL/6zA/utRDF+ETp4EX2x/92AP8WA/9qRP rEMP9hBPju4XXqw9D+znxZrzYr15sZa8WENerCEv1pAXa8iLNeTFGvJi/Xg7jD2x/zFrEX7l fTh5jmn9UH+0n/hkvQ8f7OybMdHOhzn1pU6sP1+mPkZf9oRv+ox4R7b00XORbjdf6RSfWmtZ p2Y+xVfINmQrH/zX59b3Dg/ihg9rwYcx+PwTtvKtnbI+zL4O6OuE4o8Zpwg8Dl8sbnqwnj2Y P88yI8fa9SDeeRDbPEFjbz6ij9mD+ORBXPM0GvvYbX0dUczwtBh+YgDL22TAFqP9Nn0MpJsH sc+D2EZnBdoLPXv0nGMywIN458H8eRDvPEeNOL1LB89xIx/SbeSBD3vOGXIR8zyIH55r+pqn GEI24v0C4BnVYxetH45P640+EO88iHFeGi982AseL+Kbd9ZEGy/imBdxzIs45kUM8yJ2eSHf ixjlLdPjFO3z3vKJvZDPQleNfNCSZxt7Tp4+D++YW2NO35S90Iybu/S1y3u3JfZw/5bc63sM 3dwTab2tMtZJpW8iBpm5GYeQe8OTnzknXxx/TG6J24/NLXst97veGKdJbzb2mWbjzDF1/SD3 VvsmxT8+h1hyb72RN1no242YsH1ib5qUT12XltxrnCe8dI7A3upt13Pes6fGzH2G/mZu7u2H 9P3KXMuxHHPi7dTbMt8RfV55rQUNn4C9fRFjDTTq4IO9fLCRb6PuY77NxtxsN9YQ7RdbdR/0 bddl+nbqcYLPxcba8/XocvlMhHnw7dbnhfZ3Wut8TqR9cJ++9tinTxvyDvjefO42ZMfWsUO3 A+/1Rw3AWH2H9HMQ7UM+2l8H9f2K2vA5D3ahb+3w28/Ef487nlQtDfNnnnfEM0KkdQqxQEPe DegF7AX0AQ4CDgOOAU4AThnPZwDnARcBVwzadcBNC9wG3DN4HwqRLuv09HjADEAKIBWQib5X AFZPyf1G/lawEbAZsFUHlptt5Hmg9Rh6HWbdn0nzzK9KW5m2Ji2YVpUWTWtMa0nblLYlbRue dyB1pe1K25O2n1N/2kDa0bTjaUMoD6edSxtJu5x2LW3O/C3zN83fgnxb6unU02lzUNrBeD/o /fP700bTxiDl7vzh+UPzj88/Ck+Z+ebvi/I7+hR+O9+T/Ba+OfwWvnn8/r10fvPee/ibopn8 TdH389v2Psjv2XPwG/YK+Q17Tn63XtGfpA9JUqWV7C0DYqEQqQOAowYcBwwZuRWGjfphC+85 S3kqjAAuCzHnqsE3hZfp14y+RgFjgLuAB1N49f4WplamhlOrU+tTm1JbjdTGuB3QlNoRo7am dqZ2p/Yi3wsgem9qHygHAfVIMT76/IG/6yv4/Yr6mxXt/F3fBP6u73R+s+JcfptiOr9H8T38 BsVMflPiAn5HYja/FzHnv1SWJA6KwxN/v5gjC2/pktKc0mUZZcg9TzaVLnmy6ckmesrILc2h MmpzSj2oXcL0HKb6iFfnRMrNyAXfSgLimyxxQp4hC/VWOToFnAeZvkTvGbU++pxM7qa3Nsp7 5B/Da38ivyYy5J/KN8TTtldtr4qPxn8g/gNCi/9p/Fnh4nc/0m9zzDLey/ieWHsF7feh/X75 mLDLg5CVym3SwTGHsWGPlBQhpczgdt8kTO/kFE5RMsEx+45Inn1/9nhKQooCmIlUnFI8+07K nJT0lAUpOUj5KQ6W0IOep8nfkb+Dnr8vfx+UV+VXhSwPyAPCJv8DtFAwltMijkcxDRr9XCTE /yP0egKraJt0mj/FWimS0esmIUqwX5UUAIqwZy3T80lQCtAeWy+VrBXe2XuRemf3liglCuWz q5H6ZveVJJQkzO5Eono8U92Hb3z4BtVjd+unnNs4kYin+m1SK9JBpM6JFOvP7NPksyarjCk6 ppell7GOhr6Um/rFdHucLtTe1McYVyyRXjNLZnJ9E9IppCYjgUY7e8mcEvpMM4HfCCv43a6S uln9ayGrX1S3ClXtUDtEvLpd/YqYpn5V/apIVF9WXxZJao/6dTFd7VW/iXl8t74rSf3SLZ7v FpwSRPL2dw/F7YAOgPNtoBXQZuSI36mrhVTcJ7zzLiTvSN6SvC15zzO3k6uQB5NXAnc9c/6Z e6BvAm0HUldxHqibnjnP9QPzepIHklfOvffM7Xk3khegTDJWJu8CbEpeOW8cOfFt0cvzdkPK GtQ2otaEbWh7FTIXGH0Gdb5JcAE0A96sY2o+61iFMvRLbqG+Tf3Q5gZ4ByZ0iumzNXlbTB+M k+VuMoD0WvPMQ+RVxQXJQfANIAUxhmByFLSieTvnjRfL7BNfkV/GnL4iv4IV/nX56yJB/bz6 eXhAu9oOD/iS+iV4QKfaJWaor6iviNn8/t4UflvvU7/XfrYGQG8gXc87Wgb/H4RK/pt7ibHL ZTDfRv7LuCSWWfgKBP2dPyXGJ2Hv+Qa8WMbuw/1zbxncG/1aTDx7t2DvVti7VfbuOPbuaezd CezdifDuXjGdJdEYBI/BzmP4M+6b3kxLmut9v5d1bGWtJdEYo8nCb2hu5dO1lkS5QftDNHun sT5ebwlnct3e+7nvTKZtMvQ+ZqGdNuxt5Tts6B01aH+MnzxkP3m87irLECxDYhkyy7CxjHi0 /k9Bv8Rkf3PvLD8x/iHkz3ib2esUA5bZm8+0w2K3xet0WsSwg5W23bCDSfvjrfBuxvHH2Olx VpDEEXGGo34qvTMpCbZIfMjgTcpNKk/yJa1iyACmfFVSZVIYpVyU9PpqpHpQfcD1KK/i1MS4 Fak+qYwhl9NkiaY8vYYkWeWU46mcuXMZ6z3XJ9EvONnUl9SXMOZutRtj/ob6DSG/+xiEWT/G Y+a/5SXiTpQYL7yJXYm7EvcAuhKXJe5Hvgu4n1NX4kCiJ/Eo8ADT9fx44hBqhjktMzj7QdNT F6ddiSPcQpdoyhtgWbqkXdymK/Eyl3ZB1i48n2PQ8RCtcvXL6o4/dIQJ2QzeRLhiYlLiLOC5 iRmJWUi5gEWgiURnYgmoTtSWJZYn+gCrEitBF4lhTnOZP4l5rWmyRFOeE8+CJZGcLJSzQFFR Vw5ZlYnVoFQn1jNuSmzlEW5Td/0eMYNW6gja9RsrcAG99UsqkIrESTz3TKLmSPngk8SWSdQM KUvAe0T9JGqKlCo243n1JGqCNJP3uyWTqHA9sQrPuRaqLO6JUsvOsMAytnde4bPkvfK3wPFt eT929u/K38XZuV/uR8tD8iHY5qh8VMTBNj8R8fIQLDRN/if5nEiUz8u/ENPl1+XXxRPyRfki 7r+X5EsiWb4qX4XMN+Q3sNucjj+N3ebnOH0/idP3P8I36PT+NcZfYfz1N5W/ZinvtJS7LOWX jTLGLq2SKnHGyzPG/jTTPHRPluZOommSGzRlEq1EKsPT7Uk0h1SMp8uTaHlSAUcmKy1LyuXI ZKWlS2T7PZNoNLsS9m4rLUmaxVHbSlOkBDxVWWnioSRbooVOuyseWKKFTrsl7liihU67Lm5a fOJp9nOaf8F7t8R7t8x7tw17905E/y7s4HFTZ0LtfNNM7LTQ/4bL2yzldstsfc1S/sqbyi9b eF62tH3ZIvNlS1962cIf8wYa7wK+z8/h9/7TiLMmuFVd+27GFH8ThF3MEwkx6qS9a0Y+oFF4 pw9NH7JfJDx9xH7bfhDpGMqXp1+zH0TNMaQ+lPumj9LnA6D0TR9DzV1OI9zuGtKYkYb0NEmi IY+l9emSYnJGuG50+l01VU+gPVDlGZhGMXEGe7e78zVpDo+Qvrcpkm4IoVwzYFSHpFuAOyif A4wIYZ87AUn3QRtCfB5IGlBOEU4aUq4ovUh9KA8nnVN6UdOH1I1yd9KI0g08ALiMmmuchrjd OaTLRhrQ0ySJhjyW1q1LiskZ4rqRpGv2eD2BNqrcThpTbv+BZ+x3e4OcIfnYek3wGpGEfdoW mYAkvxBxS3RIWqsD1w2i3AzYCNgM2ArYbpR3AnqMcsQC4H/fGOIm4qHNj5jos5Um7kUeRt5n a7ZlI5b5Eg/a1iKvJkriYcAx225bAXgKOIEzKd6WjaQ/F3BMnCxxQp6PZYVRnpBTCiqe0XZ3 4onEU0zbmnjC1pN44r/g1PkHWT0BVkyAteQFOiSUIk/XIWGFAVSPHTQBlk84CThtwFkjN2kX AJiNhO2GXOLvEd5p56ddlG5Muwh8OiEP+U3kBdK4dGjazWkXE4qkW8hvEyWhFKDJOdIgeAY5 gRM1h5D050FIOz9F4oS8iyzrJsoTck6DimdpUM5JcCesIJo8M8EtL0hw/+mszr/N8cBygqDP /eLHS393iVPfeBLlv0c0oXubxPNI+/DpR0WxfZn+YZb5VniDd+3jTJlL91nwCcZVoB8YPwHc zbWbmJNjtrSK8VHGd5mux0CO1Eas16Msx+RHF7msx3aOyI88hMcfMj+fIWzDjKsJy5uZPsIU mXE709dw2UFYOcQ4nzFLkzu41UnmyXx0AZTrhKW7XF7D5X2M8wjbZC43ce1uxoOM07m2n8ub Gfcx7mK6j3Ej41HG7Yy5L2Um4Uce+3GM9P2MDysUEV9SEsGzPW4e8HfjFlFZlQjbrwH/Tsdx ycBD6gLioVrlJ0z/rJopJHsqYdteosj/onwM+DuEbak6tn+BKDb0aGO63MH0M1y+rRRSrT3E eAf3kslzQWc4niN5rqgAHuXPBXY+egH0M+Pl4Ezkz1nCj0jOBf6E4DZR7OlUxlzkkH0wz5L8 JeIX/8Gz8MIj6ClNJ04b/Q6mJH2KPEq+zzjjUZT9Cr3LZ7jfrwt4plSo+54d9+1Hqv0A8E7C ooSsJyoV8uFunWKjX6dZxpQqHduuMKfKOJ/pH+JWRNnC/AInZaL3AhcwvRt+hJMez1GJ7Q63 pVvYCuavUp5lil5LfzEssF0gOXH10K2ZsChh3G0/QnNt/yDZB/c3ohD/HvvPaX3Zv8+Yfjnm tP01rv3fzM9llT4Lu8wS1jM+rv6CZkd9mmtrWWYNrUf7K9xWb7WLKXSnPx6XzpSjXHubMfW1 nfDDXWzVZgPn8OrL4XIG4wKyM5c9NC+P9jOnaqzTFK5dxhicD5eMN6JcRnM9Pkz4URHjmYxT GWeN3+FyJuO9zAPK+B1udcXgJznNTOlnz5knn4LP99rr4F0FCs6k9vP2KvpesULvjGi1e4Av Gxh09atUtu0jrPzIjpuYmsGUnxGOGyGsbrH7WAJuivYclplCWDlsb0H5b5nnq3YN+AnCaEXl xYTtv2L8BcK21+TfAR/CrQvrHR4tKW30W2O2jVS2/Yb0UVJtjbQn2LDjSuM2zKP8DGHbL2w7 6JRO/OoMG7xdySFsG5bHgM/a4L22i8Rj89tW0r7EbeuIonyI6XuxzmATwsrThG093O80qrUf o7KczX29YMPtyPZN1vYFxh9h/CTjv2P8S9JTTuNeOgjbP2H0hbLyGdZ2B5VFjkyfkKXw7SGD cQ7jAjrNy9elN4C/h/urZNuA6CbZnqUy7qaEX2N6JtMdVJZeZfqg/PfA8TZg6VfMc4HxC/IP gBcy/4eoFmWsHdsTVJZ/QHT5W8z5GfkIU4jnPkv7LUv+Gwl3CumUtE/Q9Q1Yus94CDEKZRlr WQrSW26ke/JCihQKbIW7I+0n49KnUd5qw4gkTf4pJM+SsELlAgP/K+PdLI143k906QTRIeEW 117kfgm/wTiFvmMgC/m94OnicoH0XR7Xr7jtd5j+t9zqh9DhkURW+jLiGOKU9DPeK7AbK820 Imyv2YLsXQ72rpX09zz2wGHyn0dR3sOfenSWLPaIft3vdY6Dz1JZ+jjX/k+qlV/k8ve4/IbO yeUqLifz7n2WW51i3DvuhyY3md5FnKgl3Eu14j7T/cz5hH4qQLRH7OByxDhXUNznG7vUyfgq 432sCUuQ4xnz5zOyxrX8+YuczWU3YyfL0T/Z4fv6+AUeI38uJC9izLdQedA4aeTwmSSH+XWc wWeSHD7hEOZTxKMhxtsI/66P2xaw/I3MM5PweDvjvSRhvJ8wOInSw/iIHrPi3gd8FlpIj3oZ H5J5Z7Z3czShWNPKuNu+jCNLKkeoLMZEryI52MmbuDbMOzxT+CyxnvFxupcjSnZzlOzmKNnN Eeq3jEc5MmZxjzp+L8nniLaFa4V8junbOKLd4Ti4n3vkaMg8VRRDMZZ4Hks8jyWe9ezlXk4w vsIShrkt7cMz7ZcxI6WMjzBuZ7yScTVhOZvLDsY7GG8krORzeZjLqcx5iSmZjK8w7uHaXi7L zFOstNEJxP6ATnpcXktlOZ3LPsaXuPYg4zNce53LRwnbGplnt87J+BzjFsLSGcZXaa3Jg1S2 ZTJlnHniCSueOFhGKSJs64krpHXK5QtMb9P1J7qSyrVHuNzG5Y3MmUll+RLjc4w3E10uZE4P c77BuJ/xQ8bDjE/obelchLET3m1gOu91MN7MlGx9dFSW7jKlg/Fm5kmnX72UmhifNHAV2zbE diPOU4yvG2VqpalZNOMseRFTzqlL6LxNPLZGPq/eJx7lLNvhQ2zDRhqd5CTPlDr1GaFRSPu4 1Rwun+ReFjFeo17nHZusHebx9jHnKJfrWUKXzsmadOgzyz3mGjxsgbhsUMrZc8ZYQibjau5x nMulzJ/O/GPEKd1VZ6D8faIoKtt8Jc/OLOaJp1HbD/NZfdTezz5cR/6g/pi8iGrhG9Sqmii2 vVxuZwlruLaMZzmLKS3qdDoJsJ5HWKZs/yXNJlvsIPfYwpI7WOd/NnQgPXex/u2GJR/wXBN+ nuxsu8OtBnn2T5I/Yyzke6NEV47pWrGEH7AFWrjtGrbkBbbkl/nOksQz7mDdcnl+Bxn/X8Z9 XDuNOa+oIV5H23ilo1bJZJ4OxhppBd8gzmbdesQPG+rlLNbzAe8YRBkgTvkfmH6GsLyI+7rD tRdY5hoe6SjfntpY8kqm6P22MP8cKkub6J4Fiz1Fc830fuO2Ra3+nG5J8DHyk2+xbc+wr15l neMZZ7Mmd7m8g/XpolbwUvZqpidz+SbjuUwZZMluLi9S4hhTuZDxt1jmJvuLdEvlVkuIRzrJ Gjby3c3PnF/Ux6U8wZjKiwyrkkyZ20YYn2QJnbwuXmP5M2iMWHc8dpa2xv4T8i59r2PONTyi Dua/qibxvJAd9rG0EW7VRTMLOd/jVnG8Xmh08dTKnkN+a1/GuISw7UvKGd7nf0m+x+VOpjsY lzNeyaMoJvlKr77WeN2FeXWM0XqxJel7IM/OIta2i3eePvbbYqZ3MF1j/lL281L25EzGfmP9 cpn5ZzH/fH2HV+k3jlN5vfj0HomCPZx1oDJ26WyeTZKwkTixS3TS6jb2vQO8zxP/AEvYyDrn MkXT9166r8HOR3nHi2cJZ3hnbmXdWtnzQ6yzvpN/jlfl59hiJN/BmrSwtHoe+30eSxd7+D2e ka+RJeM5XsTxbo+dCjiOV5n6/6v7DrAokm7tng4zBEFEFERARERAxQFRQEwgsIhEUdesiCgo YSSZUAERTJjFsIqIrgFQWXHFnLOICVgTiDknzAlu1dvtrBu++937/P//7fPvPvv2mVOnTp16 q+p0dU0zO4uixiOKikhoGtPRFNAjbgKykyU8W6GVTchLuWDmOdVr3KZ7FVLXAM9lBPkg9HQ9 MkYHrMRB8LAEmI1SR8ga6EUZ5OdY3fvgvwhr0A1oTtep7WfwhszDLsKsTqezV6aLmW+PUcBO gNeTt6LMA80pspn0mZrwQMc3lJ6EyIr4hVhBTYj9Gjk988yjMpn/NJIEKrMr6coi65fW4qiG yaKnB/wY/D+mA/E0ZwE5C5gKvCQ+5QEXYH+uQqaNR2kd5NsUFSdgEws9A8wDOsCmEKW7gD4U NRpD7gibl/D8he4eufOUcy4XchpF3hcepkLzkJaSnQB2L8Br8GMES2PRBrIcsiNFkvfoONpR WchCqSVka3ofFCYAR1KUxwLlwCMUyRyjEZ6iMv8Klp2BN6BpT5HkZ6q5hVq7IB8VS+n+k0RF 0Zcidx7oyC8jUT2iyIeh1A44ETiI5hzhktQXqskVZtM4efo8u4D/QNhjRd7Qi6u4m4+jJzn8 A8QzjdYS7iOeAYjkNPzI6AmMPAo2h+D/GSwDYRMDnxOwpiZA3gbLNMTcEv0aJI4USltAkweb wViDHBgTWfUCDoNmNO6VZ+hdQCiD/Ru0OxIj689/JlHtFxmjfuSf6LkQH097SrIltdmHWgqe +mmCXOpM45d3RzyDwUM6rcXZ8il0NqJ1nIbJXeHZSriGuUR2MvIr0FyBB06gpx9daVtCtkD/ 7vs8zmRa4xzmPOVcOEltFNn0bi6s4i+TWnbUUp4F1EC0B4EaHD23aUllIQgnPxVUVpyhdRXu VJYH0LbYKtw19KAJoiua34Z7YiotVSyDfil8juFm0V7QGDRGUUvhEh1r4SYi9ETk+2mcig3o NQM29tC67EnBjWAt5URYCG++uH9tg/9ixLmc+pS7IM5QzL0mGN9e4PY07RH3mCLfFXOsK42H OwD9Pegv0lry8bjfHYTmNkqzgfHQzAU2psgmUz/yrrB/j/XoQ33yldw+gjvRSgRFNp8/S7AP h/NtWsrZCD3oShRHHzzcgAd39FoHHpS0FeEAd4yOHWQDyg83GR6eYJ5EQr4Cz4eAg9GvXRzJ 2IIm/Hhip7qJMk+ydEfcPWkmKUSEC2DjjLq20LxFPAxfTTTX4f8ZYgtDzG4UueO0lA9CrSra FvcQES6lew/imdRii3nyBMrVgoEaaiPvSRkmT5E9aK/R9/XwnI5eJ2NMXbgn9H9eTucDn4jS eJQGYD63wGxJlyInqLiGtXkWawHrWj4UOByzyEBEzIRzsPFFPpkKXCnmZOSKtlib86DvLuU6 2voV2KxCqSP0q6B5IF9PcxQ9MWBfYy9UiB7tEVtEZjCAJgV18Ywg3IKHcfIwIg9EPIXQiPv2 HnRvwPelI6iNHK65nZYqnlDU3IA71ET0pRtFLS/cgwZDLwciYwu/inECY6RcTfxr4z6l6Uej UoQDy+GtP9Z4BOKxQeQZdLZwaZjtMchmurBR4RnqkTAXOxbKw3C0gp0wm4G1/wy7UCe6k2RH UFk4iH1IKfgcIxwl3two8kqhFe6wVJ6B87RfYGPPrSHyCp5wyydwpcTmlXjHpDKbTfcDfA6V +TV0dZDZW4pvlOhZmT5wNrA/0Aroj5OxTzgTGwrNCIocCzlbtKQn3rIK2JQA2wCPAGOB6cCV wAXw6YBaC4BbocmhWLeKalgPWK4HboWND87VU2F5SfQMy9n07J0bJWlU9MkXUflCMw2yBuRk fAe0Bpo0sUdi5KjVBviGnvATP7noVy4iVNEWUbcItVaj3eciMyjNoch6wL47cL4UeS49fYK3 TpI3KmeLZ4ZovRY290UbMFAK/Wi0Mgx+khAzWGWbQXMOeBwaN6AKmk2QdwFxdipbCmwHbzxi zoN8D/o3kGdAfwO1LCBjRGQYBRYyi3kii4K9ITR1iPMiNH4oNYHcmH7jxuRjvCKAO1C6BqUJ qBsAbCzNqzEE3SH3BnYGBgJHoJV8yF2APkDEIGOA4YjZFpZGwPvQ4xsc2Y+iPeTxiAfjyJwG 7gaWiAgbjDUZR4oHUFeMuViMTfQDeSCwK3wywCHQZInzBIjVROYALe2Jus7QYB7KFgFFfiYC +6AtF/EUWppjtFY7fI8pF/sF7I7SLygV7YOAW4BLRH7EuQTLx1Tm5ZRtbilkgfpkxZg5jM41 rG70kcV5O2uN0ZkNP1GYw28w5+8D44AjsXauA3msBSXkjsCVqJsOTIJ9HWw0asuwBilWw1IX +v7QdKdI1qA5ZHOsFG+sU2+0RfEI7Jujbit4zoLcEPpO8DMHei/oj1ANWa0UrdHHSDH7ofQj avmjlg/wI0bNGvoOqNVXKqU+f0atKMgtIC+ATRYi90AtK6A+/LyE3BqWu+CnI9ASo6OiNorl VJa/pZzzXykKWCncW/R3L0U5vt3gryAjpcLzKfQF65epgOVQyhgTDdwBTSUQ35LI8oCbkXnO YkyHohfhsGHhsw7e1oEfZBtWF6Vv6jbgTrEBI0vrlkBuQ79bIX4oGsG/E+wRv2wAoo2DfEnM 9mKeF7O6dC8YTJ9SIYei9ISgRU8ncK8sUVwgbNgAjwFXA1XAU8BPFOX3KHL7KPKi/iPk+RQV Z2EzBfqDQCvgAaApLPMhz4HlBGBHiho85KYohX8hGm2VAw8Bk+BhCOQZkOsDLYByiuwwYAg0 8MbOhDfExitQ9wgQGq4K6AxL9JGdCktL6Gejrj80DaBpC81xoDs0lcC7wGuw1IWcAdwGnyhl 2wB3AathyQLrgT2RmQvAvah7C6Uy4FfoNwH3AycD76NUE/bgnEXr/ArI4JkbAMs8yBgL/hLk M5D1gb/C5ibkzxgLDjZ+0AdDbw+fjyHrwYaBXAHLFKA4OsNhCQ0/CCiyHYGejoEmDp4HQgb/ 3EJgHbAG+uWQn8Lbe2iaQ2MLfAMEh6zYInokbwc97DlxxvqiLYwI/wNsMJfkxYgHM03oCsR4 8eIoJwKzgIiBHwVvr6DZAvk68APwImLAHOAewj4Nsjia6KngBn0C8CdowLACDAtBiKoRSvtB xrrgf4bNAmiwOuSdgB3gGfEr+lPUSIcfjK8APvkXkMMRG1Y6dxmaHfDQEIj1zmMuCQIsxZgx dsJmyAGQtSAbwv4o5Omwx7jw8dA8gdwe+rmo9RIormIxY4RBIyJmBYdZwU1DLcxGDjOWXwZN T6ArNEpgFGxE3oyg6QJNJhBzlRNzEXjjz0HzFog1ImAlytEjOdajXBuW21G6CIiZJsf64tcB RW8j4McLcg/IiJMTI+8NhAfeB+gCzXog8gk3FHpRYwdELziMkTZGVhPzQYEspIn8oPBArZUU tZB1NawRYRlQzBXi6MAD3xo4EZ7BngbmqgL8KMQ8JrKEeARxxp4G4l7AYm6wu+HnMPR9YYkV KmDl8uIaQX7jTSCLc7sAUWGFckUoFTMJZpcczLC1KB0NfQvUEue/mFs0YHOeIjOS3rOYCL6Q 7gmphtzVGLwfaM1I7+HXFtD3CmrxXT+5z1FU4Vv7p8BS6Z1GikPxDX4w3iw6BMszogd8U493 2Gpr4Blv87OJwNeSz1N05wMP0UAzoJb4/iE9cyC4AegO3EP6coc+oQv9gCcpsnl4Zs+kyMdR lEPDMyh1QakpNHfo+2NCP+BJigpT0QOVSS6lGtEP3jrjq1D6CLgUnuGTlwGzoe+ESBahlevQ e0IzH9gLml2o2wU2kLl3KF0HvS404yGjLveBomIUbMKBfijVgLchwMNo3QKlp4Ex0K8GNgYG wyYLPmdBsx9yK2AzaEZDPgh8CzwP3Ii6VrAZC6yPVkKBG6DBKLA3YT8PWAENes3ysLGB/glQ APoAVSg1gmyG3tUDDgZqoXQySsG8gJESEBsPG94YCD13FbKPOPp07EgGi6SMUWRdoDEFbod9 A9jbUdTqRPUad6msgfGVF6A0Fpr7GAuMphxzSQE/ZA1G0rrQLIE9ZiNfA//NEa0XNPeAQfAg MgAN2x/ycViuhPwUenDI74V8EfiC7jy5EcDLeEdoJ/axK7AjnUaRh4ath1JPlNpQFEQULR+j 9C1wLWrBntUB5kHvhVay4eEB9EHQ/AT8EZpjqNsTNpBZFqXboDeGfjpk1GV5xBALm3jgAJQa oDQCeA6t26G0HDgZ+s1AC+Aw2OTC/1JoTkNuD2wNTRzks5BlkK8Di1DXAfrxwKZoJQa4HRow zDyB/UrgbWjQa0YPNh2gfw9sAOwHTEKpJWRb9M4IGA5sjNIMlIJ5DuPCITYWNuRZjCL0snuQ Rc8HgKbQdKKogTGSvwRiBPldKJ0KTQ3YxnjxmAlCDkoxc9haeGuL1ntD8wo4BPZij6AhT82D cX5CLTdA/gA9OGFPQq5EreF4Nwz3CG4nngfxt3sc3jnnyvA8eBv3i62iDUUhD++TW0LjDZup 9CmPx/t1XGPxXXR4w7tn/FRocoH1cI/oBMzGCdtg8V0yKgt4Q56bhNIleIJDWzILaO6Kb62L 9x3xmbrOl+A+Ksu7i3FCvx3t4p7Fx4tvyqGt3vDwsHYSsdlEkdtJUVZNkTmAs4tF4tv16BHe 5uXF+6YPbO6j1jN47gJ0Ft/NA58zxXfv4f8u7HvhqdwTreM+yy2X7FV4gqYjckE6naDP4DjN 4McAfenfI5BIqM1zjCZOHZkJ4imE1PfB4MQAEebinIqe+CUCT1Dk0vCG+Tzgj/QtZa4eThI+ 1Kbh7CKNxozSUdIJQxnmRhbmLY3cvPYMss0ZPE2nQZML3s5gxZ2h84S+zU5WYhkwFwyU4fmd nl0MhB9HlPqD21V173B2kYuTQ6pXwt5I8kB5Wy/VOgN+zuC0RwXGcNoJ+woaD/GfRp8+4Bnr nYwyrVsg2oNzfTC5HcwHirlCnJM0EnYE5pU1bI7CHm85kh0MbDA/O1PO+T2ijFK5OAfQljdG xF/cBSGGAqy1rNqFZAeLtaZhTm3kfYB4X1QwQISJFBWIU/gk8oNZ3VFaCyrEMInuOsRdXO1S 8C+eM+fS2YKTjUfiO6JgNQss7RNnBf6CQDypNqe/KyFoSZaYe6wL0ZiJva7Tw72GxnAMo7AG sq94Hg7cCVShtBrvi5qJ6wXc5om7TvKfFn7vjA+dGBvJGI+ODRvLWIaHjYhllJEh8dFMV/pL zQxTV0fgmyT7Tmbx+wq/l7DEU2iUijEGWgLbjIyMGM1Qlji0Sf8Shtbj/6CRMQKjwegzxowF Y0vWdCfGnfFhxL/B6S5ehQJGThqXKXzJZxn9dpWhf/sg01SJnzUr6Kknud6XPn8idcYQv3oy C9aR8+L7MyaS397MQGYEM4aJZSYxqcxMwsByJofZxBQyO5kDzAmmlKlgqpi7zFPmDfOFbErr 8TcYjr/EX+YrcS3jq3At52/iWsFXk+tlIt3C9TLJyfRaxt/BtZy/i2sFf49hyfU++VRGrB/g epl/iGsZ/wjXcv4xrhX8E2Jdxj8ln8qJ9TNcL/PPcS3jX+Bazr/EtYJ/RazL+RryqYJYv8b1 Mv8G1zL+La7l/DtcK/j3xLriT4zQ3wyfwCT/jxj5gJ5f4j9KzHySmPksMfNFYuYraecSXyvx UyfyIjAiL4JM5EVgRUYETmRE4EVGBEFkRJCLjAgKyoigITIiaIqMkJUCRgRtkRGhnsiIoEMZ EXRFRoT6IiOCnsiI0EBkRNAXGREa/htGsphsZgOz9V8xIhiIjAiNREaExiIjgqHIiGAkMiI0 oYwIxiIjQlNxxggmEjOmEjNmEjPN6IwRzCV+mkv8WEi8tJB4sZQYaSkxYiUx0kpixFpixAaM 2EqMtJYYaSMx0lZixE5ipN3/gpFjTAlTxtzAX47XMJ/IFlFLUEqM2EuMOEiMtJcYcZQY6QBG OkqMOEmMOEuMuEiMdJIYcQUjnSVGukiMdJVmTDeJme4SM26YMe4SPz0kfjwkfjwlXnrRngpe Ei8/SLx4S7z0lHjxEXn5XzPyVM2Ir8SIn8SIv8RIgMRIoMRIEBjpLTESLDHSR2Kkr8RIP4mR H8FIf4mRARIjAyVGBkmMDJYYGQJGhkqMDJMYGS4xEiLNmBESM6GYMSMlZsIkZkZJzIwWmaG/ rEnjxp1vEcnr9ZhokotpRjdhrBgl4cuD8Wf6a4YyvBAhjOcaa46UJEPNMEgTiG6UJBlqjibS WNiFS5KhZgQkajdGkgzxOzCWjB3jTMbDl+nHDCdZPZ6ZyszUHKtuKVLdUpS6pWh1SzHqllTq lsapW4r91pLmZCJFCRFElyRJhppTII0luqmS9N9FFKeOKF4dUYI6okR1ROPVEU1QRzRRHdEk dUTT1BElqyNKUUeUqo6I5FaZncyO3HaNWfpeXAu2Be7A9N5Kf0nCAvd0OX6RxpfxI7d3+v9l Zv9Dv0qZzDT5K1fMSmY9WUW7mEtk/XyQ0d+8aCwzl9nKHGVdZd6yRLrr0LjAsPgNB17jolq6 9E1izxFpOaRStXReLV1QSxchsaT/9Vhaezl7h2AWyi6rrcrUUjkkjsxtXcaArUCNIwQzyZ6U xS9L8Oxv39k0Zo9Rf+xxhiOWWewVtaeraumaWrqulm6opUq1VKWWbqqlakgCmXcGZK1ZMNbs adLSatLWGXLNJteTxGI1e4pgNntLXe+21G8FO49dQMY4h91A7DexBYwWu5XdytRnC9lfyAwo Yncw+uxOdg/xz2HvZkDWM92V0VmjkH7FcS0pyGfzic8dxJ5j99NfUaRziF2Cvzunv9VHZ5SC +BCw7yR3LnYlu5IxZVexqxgz4uMg0wx/Td4Nf03eXZqdGoj2AfFUQHd1bA5+jY9jyjU6aDj+ Zc7KSFYmOz7CQxuy5+wujetZxFGiHp+79BcwIN1TS/e/SRz9Lcgl/22/GKwdGRgg/xnSvxAz gJYxHK5MNRws17RN905/ryNTsDmphn5E1ZOVyey1lZpyobUuxxoLjDJErtVaTjYOqU6sjM8J VgYp23ynMck1SzZhOuPfAHKTiWNimEgmjCyPMLItJ/8qm3/njDfIOFasTP+kkZzQdob5pOFn 9laEFhXmpOrbK1N5EhHnm8OxMpbVsstvcCOwbvDqs4e+1TYloajsWytt5FxfXruhRY8Y1cTY iNHh8ebWoTbm9i4uTuZ+EaGxMXExo+LNe8TEquzszZQmonGjP5bExIbER8RE2zdXNqPlXEOj 38t7x8TEm7slxIfHxEbET1SaGeoonZTODuSf9vZKh4GGOvYO5GMHoiT/DFROBFfEibwh2zfY vqGyAf2g0VDrx5C48Ijo0fGkGT2lLlUqGip6h42Mioke+S0wrX8VWAtlczEw4+/LR4aZB0eM jiZezQN7uClTZRZKHfUAymRkC5oqq88QvRabSp4wiidOqRhS5OmyybHA/trHlh16jj/0uVn2 Sc9xLy56PSybe3Ssb+8Rb1awR/2u9IxsZ9k17GBpi2Jt7+JpCZWe+/Pm6wYeb9m6JueBTotm F90sP41Ycb6J58+LfZqtOFfUzuKoT9ukmKuNzFznuui5VO63eTPKta3Moa62lfeGXyNlGas+ 79keOi314+CclLQZ8wprdi1Zd955Q+AMw1YZ/pXKd0yXNyc+dkk5kP4s0mWjneO7HXbbtKaM WDhh1KrlcTrp22qOvTbfHaCfGXq2zVUHzybP9/pkuQYGG5WOCpqYtyXjVL+ua1IDZ0YLv3Q4 PNlyf+9RXVb4l7Se2j467Qf5xewLPulsdDqz/lDGzWCW/o7UupRPypT3yoaETtOWfD2lllyD TF1BUHCcMiWXamV8ykplyrJkvUEXVC8iYrNbBE012O43r+7s2tj//HxLrc8cZuZ07jyzwcWu 70Kf3uyurE9jbCiT1fGCkiMXpSlV6PKNeYMS09JERjVo26trx/xXBnnYrfMIfanUpsX1eZ4s o/Tvlg5HZ8Tk/K1TfaxqSvf5x+f2bxVvm1CU/jXfd8kExu/RmSdGNyKO6+YmvWZ7nDiTUfIh uOTImv39Yl6Gemz2YJ5nnVpZbrJLe00TnSW/XTPbYjPlxbMNcQXzq1zmdVk+Zp9z1KWZ21p8 vfmoIkJz4cz9tbeYvY6v3yd91NO3E57YZC12H2s9rth5frVC5/SQ8HP7k93Gjtq0t3jvPMcz NZxe0qS3l6rdb06uvXWroPbdzXKdIlXFojsBO51zk9qWdbnuqD3CiV2TMqbFrHeDQ+cXDtzr 8tvwuX3TjNu/dV2ek1ovd9icojbFa38+m3/NfOdBZZMZ5gY6tvt6v3GrHqq8s8g6IuOw6vbr jfmlye6xibokx0wiOWaElGNCZOe7IhfW/34dkUe5f3JV04TjQnKMk4ODo9LBhSYce2V79Udl yvT/J7HpYOKQqcv7BQT2/mbO/Qvzf5t79itnffaM3RQ8NntWANPi0IEy0y6/DOju/DpuYarV /Sx9JviqSapu51LTvfvfu2cuK/vibHx398c7Ty+HcAdzLlck+A322vxs6MtLtyMGGcc9LjLJ 5M/ZeOSMHNDObPmQ6JP5Ri6pYcc27stPmNnkccYyA6uiaVaJ68ucXdLuFFmVG31s/ejS6cYD +zSvWZaZkW5T+6Znm/tzPvDdppw7l7UoXWccd/tCbT33DnW/7epWOc9Ta8q733ptGfQyMdZ0 fIspszocMxmyPZDr9UOUYmPfmcvlyRtStvTxv5JS8emg+yH7A311VpQH99RXPrn388ykoccm DTTI0NjhFJHzxMFyrsaTj2UGe6q/nHu8vpGUez4oU97+fe75fRU7TxDiTjV1+GnYovS+22bt ObHil/h5GD7T+nTVk4WsSEbeMG3BGykbJ//9svegBs34LkpXpUuOU06H9Pbh8fGqTu3ahcZG 2kV9G0O70JiodqqxEVTbThUbMzIhND6uXY9gMvHsiErp/S1CmYzvrOykdP72Wcmmt5Ecjh8/ /u8chsV+5yn+TwsK2ceam57fUOdVbYMY98QrPfJ3nXD/ZBnmuDWhcJxyXtbO6Z9i79aec3rQ SbU8yFx3z7gdp9+U35390FoVV/7s1pHJz1/1cxyYnPpE77dY7rG+/9NKnbmTPQLqhSR8jV6l qCxtPdBIx6Vw+NdrdXweu+7Kp3nr9u4/PKaPq/2wu22iz77yszWpMUucnL7tREbFL7bPCkp0 D91dM+3h+YdpsX1SjaJtT2Uv3WFsdjhm8fURGw73Grvl9LMui+5sb5c/abzL6DHM5NTVnF5V 6NKeVu5VSy0OZ2hfMFg37EacQ2xHs7pTNscteweM8j5tarr5uJVLRKD/xqdH5JF2sU1fNb8W ZemdnNKoe9KaknhnnwCSfVaT7DNDzD56Y7RXBBxiWuY3uO7ZrP+k0bl/zkH/zF6nI0k+HZX2 SkdHJ5p6XMjHf2Cv0yciKiwuPiRK9T/d69xwiv687ZS7zzijU6XeXYMPfco32NPGYa9+QO9T 0591bX+1p/0i650LR1Y3C0zbc6TXxWnChxcJB+ac3FS+NUI1akKrUQ93Fr+Ysfvc87yv+uu1 B1jYtDvf/Wo/vmnir1Ejo3z6XK98VXVwzfSTyTen+bJOS94eytboZxb+w7mrhxIHt5uysyW/ o9+gMSahdclJnZ+X8y39XMbHK4YcGXwl3alNwmndx2YumkmJtasjoydVP+06f1n2ON1htgFG I4Y7ZF+a7t/aYnC455yqdml6gds//mqcGfm85U8NP5zV+22G7pvUxLiOJ5ZOyi0ZLn8qFKa3 L/6wZFCaW1r/GUuiC5u18S6JWdWjeszDaVbzxor5JlVmTRix/LuMo/H/x25HT64pPVk0ktEt DPNdoox56N9t2W7H/F7p8/etelzg6tbjxAVlE3UFA5avZ6bFBDMJ5CmkB+P2x53QX7ZRf5Og lvg1sD+SFLi3wby1IQqZ7lyVZ+aLuD77u2kKbet2BQXPMHnmsrB4XT/tqrk7XZte/Fyw8XTx L0HNm8ZoREwdy+VaeD2L3BGVZLHL63La68z6BxSzOx5+MvWRaojnmkWXSkor5x26ddD2XNLT 01sdyjN2nw091vGiUfODiVWuK4uaxmU3n3llxw79PnPfrDoS5rPS2mrV8Nn1XU82DJvgvff8 lumdAgpH9K9SPnrkYnpnVs01l5SPDZvPHZkcKuezalayPdpN9pq5p469GvbRp+oaF7+4SIiu V7L6hnVIkvcrw1UNmjuzJhkF8uNZDrvudT8R3GX/5llVD0c5Zb6xyFpVUji+T1CniliP7S3e kQSVRxLUom/bI/mSttgeaf5z26O/JAKao5zJbqgDSU0O9shR7cWP9vSjMqXoP7E9aqVsKX40 i+4RoQoPizX3CPY09wz27+Tk5uzQtqOzs1tbFy8XB/uWyhZin0z+2Ke2wbRT5sFhsYkRoWH/ Nr0tTdEydzcKmnR16bOfvt7IuPhZd37Dx3lO1vqJtX6B+YnLbBf/UL25XwR7b8lUvxnXp417 kcBc39sj8nNMwbiXrS8mLSpdYrh67fE9H99PrQy51VZptsqqbWK3+15Z87ZemeV0peTF6/OD jn4Jr64ZOf+nh0f1P647kPalYk6p0GW/LDGwFfchrbhxeubwA0Ns2nQ+//PX5QM7mAY0PuR8 xSykW5eORf0MGo1f6qr3iSlcfHuIU36rvaFtvA1S+t6JfLy59dLMmbpT1zE/j7dULLdVcbts LResrDqea9HroO8A+fg+sT0Ku46sXJym0X9n7aOMnpodi4o+tN881Td34jSHATa62b++re6c 3e2pl+v326nfE4L10pkHWdcn15bsmeJV/9PZN1NX1138w07pbzPG/8lOKT5OFRryf2Wn9M1T /N8n6z/s/+SH/i5bMc8Lvty+NHPUGZs7A3efY1KnGg4+bjlAf++m92N/y6jNPPtrYrOmFu/e 3zqzY7ebzNhpi7dTlupTSfuN1nN3ae+Mb2hdXJRwy1bz9pyAm8u7LSt21E95rFdpemPPyPP+ ga6+s782qWy5tTwr43GvY/defnQzHCJ78uPMKYmT7sXUZpgXLF41d+XBYcY5jZSW1blTQxaa 2tgc7bmgU4/ps55XlU+vDGjTwfWBm5ssj6mnXVPRs2mpe+bkwtdtM4fY3DqQOW1ho8Qdwz8b tMqL0Q91t+7fabbrnO53i4+XLPrRxKvf2PlnF/n1E5gzH5TdPf1vNpm5/63ey0rjm9ZmO4Jq xldb3dmrmaJ/w6zTBU97bKf4FaxMpkzJ+Acf2f7wIPn7UVdOyil6d5KGTZOzr/f9ORpp9/dP 2va6yu9LG5Gsoa7I25OpfuBV5LTiwBrTkH2b71Vs7/x+1j2/Zsrw76rUsx+o7J9jl9yG6cNE MFFMGBPHmDP+5DqeXHszMUQXwkQTuScTT6RIYhW61irZ8l/O1fiJqpjRsSGq8Inmf8pNfKqM 2VX6QtbXJN0thjVO+NnVzOtZi5LD4YqXzhVGTcd3KihkhpmuCMwx9zD7bfHaUW9aXE4/cNX2 QfuQcPbH2UPcTU4fumpsNDZ0u3ddDffCYOjAkkmrLDzcNxtnfc2Jt6tY3tA91Wt326cF2R9v z06uahbV2O29TqNewe2e6mSGX3//3nJkz24bmzMv9YffPhza9+bMDSG3391xvmZRMlc3s7jP L16duxz+abTKVuNL5dh3vcexlvN2KPPqn5YPsfiafPUX26tlK/r12XQt9mZCt0GzN/vKqgOn dc1+oKwLz48sM7R8MEw/3jNK45lHy5vHjSvutb3S/sOvYX72+cPHxa2xLTdZXlCxaL7ypiI8 cm0q20yZyjb9fZzk9qlsPaLS+I9PyD/fJP9w61ZIEzJniNLo+9mo/fvRr4y0qS4R7OuTe6pS 6eLgaO/coWMH54F/mYwjNFTa3o0m2Qy2WeqVtKF19M83wkf8KUPRKTIkf02yTxCzbNv+lOZF Q27nXUnjGqy59LqL28pZ04dN4FY1rdVr+KrgVGUH1d46p9LzXpdNf7i72y45k5k0pVYrIn7u l+fei4KM90yeP/KHvoN6l2mv+XBftaf24as7E08sfHyLa+Uxv2v96KqT22f0WmxoOKh8RZhb +8Ifbl332O9Y53FU55jr4o8ls5cuLzwxccTdgvPrN+/8qffF8kdXBmxf+2W4zSynJ5c21qQ/ eJXeOE8nfMF92+hJhw/bztE22PzieFTWFuekmSkbnp60UZovm3SkWWGhxW0nf83PK6I/ZN4v 7nPgxvKQQbcim77YnWxxdu/QifGh9ZxfPm4bUpL1umh7ffu3X39zTnP2CGn2X1xSH7INCmVu ZHN0cmVhbQ0KZW5kb2JqDQoxODUgMCBvYmoNClsgM1sgMjUwIDM4OV0gIDE5WyA1MDAgNTAw XSAgMjdbIDUwMF0gIDM3WyA2NjcgNjY3XSAgNDBbIDY2N10gIDQ0WyAzODkgNTAwXSAgNDlb IDcyMiA3MjIgNjExXSAgNTNbIDY2NyA1NTYgNjExXSAgNjhbIDUwMCA1MDAgNDQ0IDUwMCA0 NDQgMzMzIDUwMCA1NTYgMjc4XSAgNzlbIDI3OCA3NzggNTU2IDUwMF0gIDg1WyAzODkgMzg5 IDI3OCA1NTYgNDQ0IDY2N10gIDkyWyA0NDRdICAxMzVbIDM1MF0gXSANCmVuZG9iag0KMTg2 IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMwOT4+DQpzdHJlYW0NCnic dZLLasMwEEX3/got00WwLCtJC8aQRwNe9EGdfoAjjVNBLQtZWfjvK8+kbilUYJmjuXdmGCnd V4fKmsDSV9+rGgJrjdUehv7qFbAzXIxNMsG0UeFGuKuucUkazfU4BOgq2/ZJUbD0LQaH4Ee2 2Or+DHdJ+uI1eGMvbPG+ryPXV+c+oQMbGE/KkmloY6Knxj03HbAUbctKx7gJ4zJ6fhSn0QET yBk1o3oNg2sU+MZeICl4XCUrjnGVCVj9Jy7JdW7VR+NRnUc154KXSEeiPVKWET0iCYkkM8x7 yzDnm8uLNZk2pM7Ju/3Oi4cbOqRiOVWRVDMnX36Pv5W8Ffune0nqtUTvShAdiSi2wdju8BBJ cL773f00n+ka5+Grq/dx7njXOPBp1MbC/Bxc7ybX9H0Bv1ikiQ0KZW5kc3RyZWFtDQplbmRv YmoNCjE4NyAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0NjEwMi9MZW5n dGgxIDE4ODI0ND4+DQpzdHJlYW0NCnic7J0JYJTF/f6fed/dzSabTTYJIRdkN2wIYUNI3HAZ IWxOIiEQIGqCKOGKIIdBkHpVjnpGrbRaq3jhUbVqZbOxGkA0ta3aVgW1VjwKqHgfUFu1Vcj7 f97ZQEib/oC2+YfW+SzzzLwz33fm+8477+w7u8sbCADJFAtWl00/ecKSyid80J7ZASRdPKGs vGKe66zJEAf6AdrtE2qmTN/j8kdCGI8AD10+YfopJU/ftvAKaA+NBdIunDi9tmKJb6GN+7ex 1vRJtdMr59a2FgAjngOcp0+Znufv33DhrazLzvKGmtJJtRcnXfo1xP43uT3q1LLquukPL40H SrKBuBvmLpndtHP4A09A3DCP+5TMXbnC0/T5n06F2LgbsGc1Np21ZIFn9jcQN94PWD8/a/by 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 NzggMzg5XSAgNDdbIDY2NyA5NDQgNzIyXSAgNTVbIDY2NyA3MjJdICA3MVsgNTU2XSAgODJb IDUwMF0gIDg3WyAzMzNdICAzMDMzWyAwXSBdIA0KZW5kb2JqDQoxODkgMCBvYmoNClsgMjUw IDAgMCA1MDAgMCAwIDAgMCAwIDAgMCAwIDI1MCAzMzMgMjUwIDI3OCA1MDAgNTAwIDUwMCA1 MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgMjc4IDAgMCAwIDAgMCA5MjEgMCAwIDY2NyA3 MjIgNjExIDU1NiA3MjIgNzIyIDAgMCA3MjIgMCA4ODkgNzIyIDAgNTU2IDAgNjY3IDU1NiA2 MTEgMCAwIDAgMCA3MjIgMCAwIDAgMCAwIDAgMCA0NDQgMCA0NDQgNTAwIDQ0NCAzMzMgNTAw IDUwMCAyNzggMCA1MDAgMjc4IDc3OCA1MDAgNTAwIDUwMCAwIDMzMyAzODkgMjc4IDUwMCA1 MDAgNzIyIDUwMCA1MDAgNDQ0XSANCmVuZG9iag0KMTkwIDAgb2JqDQo8PC9GaWx0ZXIvRmxh dGVEZWNvZGUvTGVuZ3RoIDIzND4+DQpzdHJlYW0NCnicXZDPasMwDMbvfgodu0Oxm50GwbC2 DHLYH5btARxbSQ2LbRTnkLef7JYOJrDhQ99PfJI8decu+Azyg6LtMcPogyNc4koWYcDJB3FQ 4LzNN1V/O5skJMP9tmScuzBG0bYgP7m5ZNpg9+zigA9CvpND8mGC3fepZ92vKf3gjCGDElqD w5EHvZr0ZmYEWbF957jv87Zn5s/xtSWEpurDNYyNDpdkLJIJE4pWcWloX7i0wOD+9ZsrNYz2 Yqi6H9mtVKM0q+P5iVWj1LGyN1eZUpa9R7QrEaerF6mxSiAf8H60FFOhyvsFkXtx+Q0KZW5k c3RyZWFtDQplbmRvYmoNCjE5MSAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0 aCA0MTIyNC9MZW5ndGgxIDE4MTAxNj4+DQpzdHJlYW0NCnic7J0JfBNl3sf/z8zk6JE2Bdqm LZCkaaD0oKHcpdr05ChHoQVaBGkpR0GQAoUVFwVXUSworLIgrguoC6LgkqYeBVyt7uqKKIco 4MUhh4C6sh7oKnTe3zwtaN9PeaW4sezL8x2e3zPPMTP/eTL5ZZ6QpMSIKByiUHlWfv++y+Ne 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 YrAnYrAXYrA3YjASMRiFGIxGDMYgBmMRg30Qg30Rg3GIwX6Iwf6IwXjE4ADEYAJiMFHsmzn+ HcZeZClZRTaT3eQwySPXyF3ynHzA+Qf2PKSa2DnVIvXoKzF30+kbgePoO4ET6Z8Cp/OJRGH1 +VCBDflwgY35SIFN/oGG19DwFhreQ8MHaJgEDcOgYQQ0jIIGsQfj30gJUKNt1BgblWaj0m3U WBs1zkaN/0zJf33SoF6AErt2cde/QQj7yAqIIu7PYjcq7tFisyLu03bEIu6vsfiyYRjOhiqT AOz0neyPivgVNen9z5SYD/L84Jj49ULs1a5CzpGOFtEuyvQrvY/9oNxDEOwGTKLmdbkDxNMH C/bVd8RucpU83VCy9H0iOWtf2N7xvzyTkDbJp04exFv4t5FxAnEEO+ajtpOEfPltQ1C/26g/ PlN8iJT+b3fg+jM3E562aXiuJJylPKWl1T5qXzXOeCpn0qUIKSH/9soFXFKilzW9RDdeqFpG aMYbB5NZyUov0VqwWigmk6+9tRBnXo5UKcWItTe38+Im1ZReWzGpWeHW9lbvLzhuS8uOcSP1 8F9bEklSxPSNJzEkVfy/gfzPWv4LZarL9OI+41rtLXAOKHDxCbyVOnzcBX48K93Z15quCoto qyyqmBTFzie7yJV2n7otPrL7c+0ywpQkXy+rJ6cdVfuiHk0Sk4Ylx/Xpm+peNcrT3TcoqLZ7 67io5MSUxNhU9yaJyUk+vmWtbrpwsf9ckpjcOzUuMcG3vLWcLKdFXf8q75CYmOreeFBq38Tk uNRh1rIlHKy1rYF+4n/+vla/LiUcfP3Ez5qCKf7XxToMvhJKeFGlY7hvUWsR+cNS1O6r3il9 4xL6pIpmnKyOkmkuau4QEz0gMSH6s2F2/8ywCtbyumGlviyPjnEPj+uTILS6t2vS2Jpu8rA6 2AbQZGKEppsKE8G3U9JNJrJl2Khz3Tc0DVoRsMr30rtKNVsM2f1nucwDTQc+OdXsbt7U3/q3 6hD5coHyW+sLLeJrVGwQs+t4hS32oVtGD7radOfKGY7t9lfyep51x6FCuVONK76PXHCiZNOf ZoWVW3BsQw2P38Kqj0y8WKxs3alBTkFXd3q+jK1b3eT3qaBK6LJN8aYJi/7ctj5qdPq7bllp 48ZPX/t86+wfTgQuaze+RJUJba5aX5P6L3Pf1U/7NeNRfNByn4DXG33W2I2K/G5o7KL5KQ4Z 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 Fug16DCEMGQy5DKkMhQzKDD4AelyIB3EkA8US2TIA7I9GUqArBygquSFag0qONNqSWVBfnpR YkFGpQJa2cTSBEx9Gdrrf7jd0O/6sI01eY4iu9chu9M3jrheMGoy5ZjGyPXp0tJ4w/UcZ0V9 Lf9+dGsv/Bsy3+LF1zsv1ib+Pvh+Vv3WvPjZHw9n88z8bt+7R/hUoaRtR9OXNYHK/pfmXrDV WP7Iv/hQqXjR5MfPy5vL9iySV2C6o80TWyx/oWHte6+pV5jeC6S5Plpz7l7T79y/tbKfd4Y5 ruT3TDn/Z/mnh5Mmlisr3M6QMVTKyVi2bcP9Ldced515cnruZfvduQvbn5001+u2ELrlyHu8 jMX8ouBt7YsndmQyG8/Z5e6b/bTka+1v2/X+jLw2Yusk7Jh3M8Y03/746zhjJ+vCzGnxJhrZ bwrUTl5z361bYj93YROTvEETkzQintgMm5h4gEIcdE+Q6JUkStXNDk2QC2INJJBTIzdi6JcR aCdchtWQH1inGhhYGpkYWpiamVpEYSTGGSve2t7RUvnacvWeD/uKlgspWxdPQSuhQEmkYIHt 5sTD5053rv6+9f2Pwxyr+N7/3Ox0pv9/j8yfCUejVq637pl6v+vRiUl7H+44qMitd3dJYIy+ 8tabCd/bdS8aNupbpl1ZuuVt0PGb29k7N/QbsS+UOeAeqh9jFy3Y9UCj9vLxlPe8u0Ov5QV2 m9yte2N2sXkly4ZC9wxZ5iQNue/JZeeiduv/Onz+it3lddrMVV3tiXm7GC4vf3W97fxPg8Wm F55KFMicqJGq0Rc7ytkgvsHSU0/+lhzb+qmuPU92moXYW/37NvffSZvHHbPXuJxT4pvLav/m eKnRo5K6w3sV3q0//dntUYGcnUGAnUCf1b70A12fS3WLVh04wLu1l2mHRvWGoPLbGbG5AFqF P/gNCmVuZHN0cmVhbQ0KZW5kb2JqDQoxOTIgMCBvYmoNClsgM1sgMjUwIDMzM10gIDMwMzNb IDBdIF0gDQplbmRvYmoNCjE5MyAwIG9iag0KPDwvVHlwZS9YUmVmL1NpemUgMTkzL1dbIDEg NCAyXSAvUm9vdCAxIDAgUi9JbmZvIDkyIDAgUi9JRFs8MEI1OTMxMEZCOTA3QzY0N0IyNjA4 RkQyNDk5MDFBMzU+PDBCNTkzMTBGQjkwN0M2NDdCMjYwOEZEMjQ5OTAxQTM1Pl0gL0ZpbHRl ci9GbGF0ZURlY29kZS9MZW5ndGggNTA3Pj4NCnN0cmVhbQ0KeJw1011MzXEcx/H/+f9P55we zqmQyFMhUadOT0c5Pag8RRHaEKGFte7cmBW6s5nN1rrIbN00F4pNN+aKzSU2M2wUJUKehtQd 6fj/P29+F7/Xfr/f9+L73T4/w7BXNOqy92TDcDgHd4R5THirhS8D7onYs/BaxDXCAxFfCbdE QjZcEv4gfBSBDyLcICI3RFmrKG92cJ3pdjD3BkSjX+wbFfsvigMXRFNEHCyGz+LQmGjug6g4 fAq+iiMt8FwcrYch0aLOzBNJMCAGNbs58Ux8ouTbiPhxXPz6Ln4/FrMnxZ8Q9Ig5H3TBjIi2 w7iDZdTAhMhSZ1ZQTVi5bfBQ5FXBbRHKgX6RnwqdoiANhuCRKOyC+6JoWJR2iIrTDu7MK+KF C7rhphhugqtiZFC85PJVLTyFKTHaC2/E2Fs7a3bqWo1d0ACr4d/bbrty3Pv/ZIILLIgBN3jA B15IgFiIhzjwQyIEIBmSYD7Mg1RYAAshBRZBGiyGJbAMlsIKWA7psAoyYCXshEzYA1mwBtZC NqyDPMiBXAhCCAogHwqhHIqgGMKwHkqgFDZABMqgAjZCJVRBDVTDJtgM9bAFtsI2qIXtsAPq 7IS8m1Sk3s+JSR/oN7qnn4iZuw4xYQtmRcllMZUifiaKaaXcc80Chd0z8EVcT3fw1p03jL/+ 15y5DQplbmRzdHJlYW0NCmVuZG9iag0KeHJlZg0KMCAxOTQNCjAwMDAwMDAwOTMgNjU1MzUg Zg0KMDAwMDAwMDAxNyAwMDAwMCBuDQowMDAwMDAwMTI1IDAwMDAwIG4NCjAwMDAwMDAxODgg MDAwMDAgbg0KMDAwMDAwMDYxMSAwMDAwMCBuDQowMDAwMDAxODU3IDAwMDAwIG4NCjAwMDAw MDIwODEgMDAwMDAgbg0KMDAwMDAwMjI0MCAwMDAwMCBuDQowMDAwMDAyNDI4IDAwMDAwIG4N CjAwMDAwMDI1MjYgMDAwMDAgbg0KMDAwMDAwMjY0MyAwMDAwMCBuDQowMDAwMDAyNzYxIDAw MDAwIG4NCjAwMDAwMDI4NzggMDAwMDAgbg0KMDAwMDAwMjk5NiAwMDAwMCBuDQowMDAwMDAz MTE0IDAwMDAwIG4NCjAwMDAwMDMyMTMgMDAwMDAgbg0KMDAwMDAwMzM3MiAwMDAwMCBuDQow MDAwMDAzNTU5IDAwMDAwIG4NCjAwMDAwMDM4MTMgMDAwMDAgbg0KMDAwMDAxMzY0NyAwMDAw MCBuDQowMDAwMDE1MDE5IDAwMDAwIG4NCjAwMDAwMTUyMDIgMDAwMDAgbg0KMDAwMDAxNTQ1 MiAwMDAwMCBuDQowMDAwMDk3MTY4IDAwMDAwIG4NCjAwMDAxNTIwNzggMDAwMDAgbg0KMDAw MDE1MjMzMyAwMDAwMCBuDQowMDAwMTUzMzA4IDAwMDAwIG4NCjAwMDAxNTM0ODIgMDAwMDAg bg0KMDAwMDE1MzczNiAwMDAwMCBuDQowMDAwMTUzOTE0IDAwMDAwIG4NCjAwMDAxNTQxNjQg MDAwMDAgbg0KMDAwMDE1NDM0NSAwMDAwMCBuDQowMDAwMTU0NTg5IDAwMDAwIG4NCjAwMDAx NTQ3ODAgMDAwMDAgbg0KMDAwMDE1NDg3OSAwMDAwMCBuDQowMDAwMTU0OTk3IDAwMDAwIG4N CjAwMDAxNTUxMTUgMDAwMDAgbg0KMDAwMDE1NTIzMiAwMDAwMCBuDQowMDAwMTU1MzUwIDAw MDAwIG4NCjAwMDAxNTU0NjggMDAwMDAgbg0KMDAwMDE1NTU2NyAwMDAwMCBuDQowMDAwMTU1 NzI3IDAwMDAwIG4NCjAwMDAxNTY5NDQgMDAwMDAgbg0KMDAwMDE1NzA5NiAwMDAwMCBuDQow MDAwMTc0NDYwIDAwMDAwIG4NCjAwMDAxODkxMzkgMDAwMDAgbg0KMDAwMDE5MDU0MyAwMDAw MCBuDQowMDAwMTkxOTYxIDAwMDAwIG4NCjAwMDAxOTIzNTYgMDAwMDAgbg0KMDAwMDE5NTMx MCAwMDAwMCBuDQowMDAwMTk1NTM1IDAwMDAwIG4NCjAwMDAxOTU2OTYgMDAwMDAgbg0KMDAw MDE5NTg4NyAwMDAwMCBuDQowMDAwMTk1OTg2IDAwMDAwIG4NCjAwMDAxOTYxMDQgMDAwMDAg bg0KMDAwMDE5NjIyMiAwMDAwMCBuDQowMDAwMTk2MzM5IDAwMDAwIG4NCjAwMDAxOTY0NTcg MDAwMDAgbg0KMDAwMDE5NjU3NSAwMDAwMCBuDQowMDAwMTk2Njc0IDAwMDAwIG4NCjAwMDAx OTY4MzQgMDAwMDAgbg0KMDAwMDIwNjY2OCAwMDAwMCBuDQowMDAwMjA4MDQwIDAwMDAwIG4N CjAwMDAyMDgyMzEgMDAwMDAgbg0KMDAwMDIwODMzMCAwMDAwMCBuDQowMDAwMjA4NDQ4IDAw MDAwIG4NCjAwMDAyMDg1NjYgMDAwMDAgbg0KMDAwMDIwODY4MyAwMDAwMCBuDQowMDAwMjA4 ODAxIDAwMDAwIG4NCjAwMDAyMDg5MTkgMDAwMDAgbg0KMDAwMDIwOTAxOCAwMDAwMCBuDQow MDAwMjA5MTc4IDAwMDAwIG4NCjAwMDAyMDkzMjcgMDAwMDAgbg0KMDAwMDIwOTM1NyAwMDAw MCBuDQowMDAwMjA5NTM0IDAwMDAwIG4NCjAwMDAyMDk2MDggMDAwMDAgbg0KMDAwMDIwOTg4 MCAwMDAwMCBuDQowMDAwMjExMDY1IDAwMDAwIG4NCjAwMDAyMTIzNDMgMDAwMDAgbg0KMDAw MDI3MTc2OSAwMDAwMCBuDQowMDAwMzE3MTg1IDAwMDAwIG4NCjAwMDAzMTczMjggMDAwMDAg bg0KMDAwMDMxNzM1OCAwMDAwMCBuDQowMDAwMzE3NTI5IDAwMDAwIG4NCjAwMDAzMTc2MDMg MDAwMDAgbg0KMDAwMDMxNzg2NSAwMDAwMCBuDQowMDAwMzE4MDQxIDAwMDAwIG4NCjAwMDAz MTgyODAgMDAwMDAgbg0KMDAwMDMxODQxOCAwMDAwMCBuDQowMDAwMzE4NDQ4IDAwMDAwIG4N CjAwMDAzMTg2MTQgMDAwMDAgbg0KMDAwMDMxODY4OCAwMDAwMCBuDQowMDAwMzE4OTQ1IDAw MDAwIG4NCjAwMDAwMDAwOTQgNjU1MzUgZg0KMDAwMDAwMDA5NSA2NTUzNSBmDQowMDAwMDAw MDk2IDY1NTM1IGYNCjAwMDAwMDAwOTcgNjU1MzUgZg0KMDAwMDAwMDA5OCA2NTUzNSBmDQow MDAwMDAwMDk5IDY1NTM1IGYNCjAwMDAwMDAxMDAgNjU1MzUgZg0KMDAwMDAwMDEwMSA2NTUz NSBmDQowMDAwMDAwMTAyIDY1NTM1IGYNCjAwMDAwMDAxMDMgNjU1MzUgZg0KMDAwMDAwMDEw NCA2NTUzNSBmDQowMDAwMDAwMTA1IDY1NTM1IGYNCjAwMDAwMDAxMDYgNjU1MzUgZg0KMDAw MDAwMDEwNyA2NTUzNSBmDQowMDAwMDAwMTA4IDY1NTM1IGYNCjAwMDAwMDAxMDkgNjU1MzUg Zg0KMDAwMDAwMDExMCA2NTUzNSBmDQowMDAwMDAwMTExIDY1NTM1IGYNCjAwMDAwMDAxMTIg NjU1MzUgZg0KMDAwMDAwMDExMyA2NTUzNSBmDQowMDAwMDAwMTE0IDY1NTM1IGYNCjAwMDAw MDAxMTUgNjU1MzUgZg0KMDAwMDAwMDExNiA2NTUzNSBmDQowMDAwMDAwMTE3IDY1NTM1IGYN CjAwMDAwMDAxMTggNjU1MzUgZg0KMDAwMDAwMDExOSA2NTUzNSBmDQowMDAwMDAwMTIwIDY1 NTM1IGYNCjAwMDAwMDAxMjEgNjU1MzUgZg0KMDAwMDAwMDEyMiA2NTUzNSBmDQowMDAwMDAw MTIzIDY1NTM1IGYNCjAwMDAwMDAxMjQgNjU1MzUgZg0KMDAwMDAwMDEyNSA2NTUzNSBmDQow MDAwMDAwMTI2IDY1NTM1IGYNCjAwMDAwMDAxMjcgNjU1MzUgZg0KMDAwMDAwMDEyOCA2NTUz NSBmDQowMDAwMDAwMTI5IDY1NTM1IGYNCjAwMDAwMDAxMzAgNjU1MzUgZg0KMDAwMDAwMDEz MSA2NTUzNSBmDQowMDAwMDAwMTMyIDY1NTM1IGYNCjAwMDAwMDAxMzMgNjU1MzUgZg0KMDAw MDAwMDEzNCA2NTUzNSBmDQowMDAwMDAwMTM1IDY1NTM1IGYNCjAwMDAwMDAxMzYgNjU1MzUg Zg0KMDAwMDAwMDEzNyA2NTUzNSBmDQowMDAwMDAwMTM4IDY1NTM1IGYNCjAwMDAwMDAxMzkg NjU1MzUgZg0KMDAwMDAwMDE0MCA2NTUzNSBmDQowMDAwMDAwMTQxIDY1NTM1IGYNCjAwMDAw MDAxNDIgNjU1MzUgZg0KMDAwMDAwMDE0MyA2NTUzNSBmDQowMDAwMDAwMTQ0IDY1NTM1IGYN CjAwMDAwMDAxNDUgNjU1MzUgZg0KMDAwMDAwMDE0NiA2NTUzNSBmDQowMDAwMDAwMTQ3IDY1 NTM1IGYNCjAwMDAwMDAxNDggNjU1MzUgZg0KMDAwMDAwMDE0OSA2NTUzNSBmDQowMDAwMDAw MTUwIDY1NTM1IGYNCjAwMDAwMDAxNTEgNjU1MzUgZg0KMDAwMDAwMDE1MiA2NTUzNSBmDQow MDAwMDAwMTUzIDY1NTM1IGYNCjAwMDAwMDAxNTQgNjU1MzUgZg0KMDAwMDAwMDE1NSA2NTUz NSBmDQowMDAwMDAwMTU2IDY1NTM1IGYNCjAwMDAwMDAxNTcgNjU1MzUgZg0KMDAwMDAwMDE1 OCA2NTUzNSBmDQowMDAwMDAwMTU5IDY1NTM1IGYNCjAwMDAwMDAxNjAgNjU1MzUgZg0KMDAw MDAwMDE2MSA2NTUzNSBmDQowMDAwMDAwMTYyIDY1NTM1IGYNCjAwMDAwMDAxNjMgNjU1MzUg Zg0KMDAwMDAwMDE2NCA2NTUzNSBmDQowMDAwMDAwMTY1IDY1NTM1IGYNCjAwMDAwMDAxNjYg NjU1MzUgZg0KMDAwMDAwMDE2NyA2NTUzNSBmDQowMDAwMDAwMTY4IDY1NTM1IGYNCjAwMDAw MDAxNjkgNjU1MzUgZg0KMDAwMDAwMDE3MCA2NTUzNSBmDQowMDAwMDAwMTcxIDY1NTM1IGYN CjAwMDAwMDAxNzIgNjU1MzUgZg0KMDAwMDAwMDE3MyA2NTUzNSBmDQowMDAwMDAwMTc0IDY1 NTM1IGYNCjAwMDAwMDAxNzUgNjU1MzUgZg0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMzIw NDg2IDAwMDAwIG4NCjAwMDAzMjA3NjYgMDAwMDAgbg0KMDAwMDMyMTAzMiAwMDAwMCBuDQow MDAwMzIxMjYyIDAwMDAwIG4NCjAwMDAzMjQzMDUgMDAwMDAgbg0KMDAwMDMyNDU0MSAwMDAw MCBuDQowMDAwMzQxMjUxIDAwMDAwIG4NCjAwMDAzNDE1MDAgMDAwMDAgbg0KMDAwMDM0MTkx MSAwMDAwMCBuDQowMDAwMzg5MTQxIDAwMDAwIG4NCjAwMDAzODkzOTEgMDAwMDAgbg0KMDAw MDM4OTc3NiAwMDAwMCBuDQowMDAwNDM1OTcxIDAwMDAwIG4NCjAwMDA0MzYxNDIgMDAwMDAg bg0KMDAwMDQzNjQ1OCAwMDAwMCBuDQowMDAwNDM2NzY4IDAwMDAwIG4NCjAwMDA0NzgwODUg MDAwMDAgbg0KMDAwMDQ3ODEzMiAwMDAwMCBuDQp0cmFpbGVyDQo8PC9TaXplIDE5NC9Sb290 IDEgMCBSL0luZm8gOTIgMCBSL0lEWzwwQjU5MzEwRkI5MDdDNjQ3QjI2MDhGRDI0OTkwMUEz NT48MEI1OTMxMEZCOTA3QzY0N0IyNjA4RkQyNDk5MDFBMzU+XSA+Pg0Kc3RhcnR4cmVmDQo0 Nzg4NDINCiUlRU9GDQp4cmVmDQowIDANCnRyYWlsZXINCjw8L1NpemUgMTk0L1Jvb3QgMSAw IFIvSW5mbyA5MiAwIFIvSURbPDBCNTkzMTBGQjkwN0M2NDdCMjYwOEZEMjQ5OTAxQTM1Pjww QjU5MzEwRkI5MDdDNjQ3QjI2MDhGRDI0OTkwMUEzNT5dIC9QcmV2IDQ3ODg0Mi9YUmVmU3Rt IDQ3ODEzMj4+DQpzdGFydHhyZWYNCjQ4Mjg4Mg0KJSVFT0YAAAAAAAAAAAAAAAAAAAAAAAAA ------=_NextPart_000_0339_24DE5D4.3D729B4-- From gcmckenzie@gmail.com Sun Apr 20 14:45:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HK_RANDOM_ENVFROM,HK_RANDOM_FROM,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 71BDA7F55 for ; Sun, 20 Apr 2014 14:45:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6AABE8F8037 for ; Sun, 20 Apr 2014 12:45:06 -0700 (PDT) X-ASG-Debug-ID: 1398023099-04cb6c24391f1220001-NocioJ Received: from spicecorp.in (mailone.spicecorp.in [119.226.164.72]) by cuda.sgi.com with ESMTP id Osl67oQ5FPSnLwO0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 20 Apr 2014 12:45:01 -0700 (PDT) X-Barracuda-Envelope-From: gcmckenzie@gmail.com X-Barracuda-Apparent-Source-IP: 119.226.164.72 Received: (qmail 27197 invoked by uid 65205); 20 Apr 2014 12:45:14 -0000 Received: from 192.168.118.19 by SpiceDirectory (envelope-from , uid 0) with qmail-scanner-1.25 (clamscan: 0.60. Clear:RC:1(192.168.118.19):. Processed in 0.064864 secs); 20 Apr 2014 12:45:14 -0000 Received: from unknown (HELO spicecorp.in) ([192.168.118.19]) (envelope-sender ) by 0 (qmail-ldap-1.03) with SMTP for ; 20 Apr 2014 12:45:14 -0000 Received: (qmail 18779 invoked by uid 65205); 20 Apr 2014 11:38:02 -0000 Received: from 212.156.212.235 by spicemail1 (envelope-from , uid 0) with qmail-scanner-1.25 (clamscan: 0.60. Clear:RC:0(212.156.212.235):. Processed in 0.380974 secs); 20 Apr 2014 11:38:01 -0000 Received: from unknown (HELO meltemsrv.local.meltemsrv.com) (sunil.pathak@spiceworld.co.in@[212.156.212.235]) (envelope-sender ) by 0 (qmail-ldap-1.03) with SMTP for ; 20 Apr 2014 11:38:01 -0000 Content-Type: multipart/alternative; boundary="===============1899534156==" MIME-Version: 1.0 Subject: Re: Donation To: "Gloria C. Mckenzie" X-ASG-Orig-Subj: Re: Donation From: "Gloria C. Mckenzie" Date: Sun, 20 Apr 2014 14:37:14 +0300 Reply-To: gloria.c.mckenzie@aol.com X-Qmail-Scanner-Message-ID: <139799388168618628@spicemail1> X-Barracuda-Connect: mailone.spicecorp.in[119.226.164.72] X-Barracuda-Start-Time: 1398023100 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.84 X-Barracuda-Spam-Status: No, SCORE=1.84 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA609_MID, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 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: <20140420194506.2441D1296190@cuda.sgi.com> You will not see this in a MIME-aware mail reader. --===============1899534156== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body I have a donation for you, contact me on gloria.c.mckenzie@aol.com for more= info. It is important that you add my e-mail address (gloria.c.mckenzie@ao= l.com) to your address book so you can receive further update from me. Thank you --===============1899534156== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body

I have a donation for you, contact me on gloria.c.mckenzie@aol.com for mor= e info. It is important that you add my e-mail address (gloria.c.mckenzie@aol.com) to your address bo= ok so you can receive further update from me.

Thank you

--===============1899534156==-- From mais_mokeeva1994@myrambler.ru Sun Apr 20 20:07:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_FONT_SIZE_LARGE,HTML_MESSAGE,HTML_OBFUSCATE_05_10,MPART_ALT_DIFF 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 7E0177F37 for ; Sun, 20 Apr 2014 20:07:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68DCF304043 for ; Sun, 20 Apr 2014 18:07:12 -0700 (PDT) X-ASG-Debug-ID: 1398042423-04cb6c24371fe5d0001-NocioJ Received: from mx.nnov.vt.ru (mx.nnov.vt.ru [213.177.96.24]) by cuda.sgi.com with ESMTP id 5UYEJjYe3of27VLS for ; Sun, 20 Apr 2014 18:07:03 -0700 (PDT) X-Barracuda-Envelope-From: mais_mokeeva1994@myrambler.ru X-Barracuda-Apparent-Source-IP: 213.177.96.24 Received: from [85.238.105.86] (account junona@mts-nn.ru HELO Unknown) by fr1.mx.nnov.vt.ru (CommuniGate Pro SMTP 5.3.14) with ESMTPSA id 421106498; Mon, 21 Apr 2014 05:07:02 +0400 Subject: =?windows-1251?B?0eDs++Ug4uDm7fvlIOzu7OXt8vsg7/Do4fvr?= =?windows-1251?B?6CDiINDu8fHo6A==?= References: =?windows-1251?B?1eDp4fPr6O0=?= X-ASG-Orig-Subj: =?windows-1251?B?0eDs++Ug4uDm7fvlIOzu7OXt8vsg7/Do4fvr?= =?windows-1251?B?6CDiINDu8fHo6A==?= From: =?windows-1251?B?1eDp4fPr6O0=?= Content-Type: multipart/alternative; boundary="----=_NextPart_000_0783_01CF5D1F.84C81C30" X-Mailer: Wuepau (Axvxceoa) In-Reply-To: =?windows-1251?B?1eDp4fPr6O0=?= Date: Mon, 21 Apr 2014 05:06:57 +0400 To: , , , , , , , , Content-Transfer-Encoding: quoted-printable Mime-Version: 1.0 (1.0) Message-ID: X-Barracuda-Connect: mx.nnov.vt.ru[213.177.96.24] X-Barracuda-Start-Time: 1398042423 X-Barracuda-URL: http://192.48.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.26 X-Barracuda-Spam-Status: No, SCORE=1.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_FONT_LOW_CONTRAST, HTML_FONT_SIZE_LARGE, HTML_MESSAGE, HTML_OBFUSCATE_05_10, HTML_OBFUSCATE_05_10_2, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5102 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.00 BSF_SC0_TG035a Message contains invalid style definition 0.57 HTML_OBFUSCATE_05_10_2 Message is 05% to 10% HTML obfuscation ------=_NextPart_000_0783_01CF5D1F.84C81C30 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
­
=20
=20 Oс=EDοв=EDыe Вопpо&#= 1089;ы Бизнeca Kaκ =E7aрaбο=F2ат=FC б&#= x3BF;льше? Кaк =F1охрa=ED=E8=F2ь =E7= 1;рaбoтa=EDн=EEе? Οт=F7е=F2 налo=E3ο = 74;o=E3ο адвοĸa=F2а http://ulletvenswi.byethost14.com >>>>>>>> Дοпoлни=F2e=EBьн= aя =E8нфoр=ECaци=FF:= ;=20 =D0=E0б=EEч=E8e сx=E5мы и =E2= ce н=E5о=E1xo=E4и=ECыe дo&#x= 3BA;yмeн=F2ы Дοcтa=E2κa =EFο PB= 4; Инфo=F0=ECaци=FF =F9+r87 ­­­9­­0=FF45 kj5n355wa-3=E08-=FC322 =20 =20

=20 ------=_NextPart_000_0783_01CF5D1F.84C81C30 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =20

­
 

 
Oс=EDοв=EDыe = Вопpосы Бизнe= ca
 
Kaκ =E7aрaбο= ;=F2ат=FC бοльше?<= /STRONG>
 
Кaк =F1охD= 0;a=ED=E8=F2ь =E7aрaбoтa=EDн=EE= е?
 
Οт=F7е=F2 на= лo=E3οвo=E3ο адв&#x= 3BF;ĸa=F2а
 
 
=D0=E0б=EEч=E8e сx=E5&#= 1084;ы и =E2ce н=E5о=E1xo=E4и= ;=ECыe дoκyмeн=F2ы
 
Дοcтa=E2κa = ;=EFο PФ
 
Инф= o=F0=ECaци=FF =20 =F9+r87 ­­­9­­0=FF45 kj5n355wa-3=E08-=FC322
  

=20
=20
------=_NextPart_000_0783_01CF5D1F.84C81C30-- From webmaster@getit19.livemailz.com Mon Apr 21 01:13:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5B3257F3F for ; Mon, 21 Apr 2014 01:13:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E390CAC001 for ; Sun, 20 Apr 2014 23:13:32 -0700 (PDT) X-ASG-Debug-ID: 1398060805-04bdf045552133d0001-NocioJ Received: from server.livemailz.com (server.livemailz.com [115.124.106.32]) by cuda.sgi.com with ESMTP id HgEKEWeJPbim8XXg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 20 Apr 2014 23:13:26 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@getit19.livemailz.com X-Barracuda-Apparent-Source-IP: 115.124.106.32 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=getit19.livemailz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=swzPVDMMPXbRtzYv/inaMrhYSxPRqKrhKJNERFg3vyo=; b=mv4eX/0MkMd0HzD43WSF3V0INmxiu3yDj1ubjra8fxCWrVRbGBKZO/NTXLDSmneeFDU0LOd6fAlxZs8oqFWfmDv31lXPG4YFcKhtJVrbZT49DoCt81Ux0LpNrrTgNGofCT0ghwicfXNLkzhnnbEJy0Kv7/EtCVtoMMY/ZTzLEcA=; Received: from getit19l by server.livemailz.com with local (Exim 4.82) (envelope-from ) id 1Wc7Tn-0004uw-4S for xfs@oss.sgi.com; Mon, 21 Apr 2014 11:43:23 +0530 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: getit19.livemailz.com/mailz/index.php for 66.249.70.45 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-70-45.googlebot.com [66.249.70.45] by getit19.livemailz.com with HTTP; Mon, 21 Apr 2014 06:13:22 +0000 Date: Mon, 21 Apr 2014 06:13:23 +0000 From: Webmaster Reply-To: Webmaster Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.5 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@getit19.livemailz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.livemailz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [527 32007] / [47 12] X-AntiAbuse: Sender Address Domain - getit19.livemailz.com X-Get-Message-Sender-Via: server.livemailz.com: authenticated_id: getit19l/from_h X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/getit19l/public_html/mailz/index.php X-Source-Dir: getit19.livemailz.com:/public_html/mailz X-Barracuda-Connect: server.livemailz.com[115.124.106.32] X-Barracuda-Start-Time: 1398060806 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5107 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://getit19.livemailz.com/mailz/?p=subscribe and follow the steps. Thank you From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 01:57:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F6057F4E for ; Mon, 21 Apr 2014 01:57:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D6A6AC001 for ; Sun, 20 Apr 2014 23:57:55 -0700 (PDT) X-ASG-Debug-ID: 1398063473-04cb6c243820af50001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id oB0x3LEmKnWZntB8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 20 Apr 2014 23:57:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8Al-0006O1-06; Mon, 21 Apr 2014 06:57:47 +0000 Date: Sun, 20 Apr 2014 23:57:46 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Steven Rostedt , Christoph Hellwig , Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140421065746.GA20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> <534ED5E4.60903@sandeen.net> <20140416220807.GN15995@dastard> <20140416194444.50176f0f@gandalf.local.home> <20140417003956.GS15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140417003956.GS15995@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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398063473 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 17, 2014 at 10:39:56AM +1000, Dave Chinner wrote: > so, basically a script that does: > > #!/bin/bash > > TRACEDIR=/sys/kernel/debug/tracing > > grep -i 't xfs_' /proc/kallsyms | awk '{print $3}' ; while read F; do > echo "r:ret_$F $F \$retval" >> $TRACEDIR/kprobe_events > done > > for E in $TRACEDIR/events/kprobes/ret_xfs_*/enable; do > echo 1 > $E > done; > > echo 'arg1 > 0xffffffffffffff00' > $TRACEDIR/events/kprobes/filter > > for T in $TRACEDIR/events/kprobes/ret_xfs_*/trigger; do > echo 'traceoff if arg1 > 0xffffffffffffff00' > $T > done This looks incredibly useful! Can we throw this into Documentation/ as a helper script (and make the xfs a command line parameter so it's genericly useful)? One think that would be nice is to specify a module instead of relying on a clean namespace, but to replace the XFS functionality the one above is more than enough. From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 01:58:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1AFFA7F4E for ; Mon, 21 Apr 2014 01:58:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ACE27AC001 for ; Sun, 20 Apr 2014 23:58:09 -0700 (PDT) X-ASG-Debug-ID: 1398063488-04bdf04555214530001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id Z0cb06AnZA8XdvBf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 20 Apr 2014 23:58:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8B6-0006OM-O3; Mon, 21 Apr 2014 06:58:08 +0000 Date: Sun, 20 Apr 2014 23:58:08 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 1/2] xfs: return is not a function Message-ID: <20140421065808.GB20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: return is not a function References: <534EC073.8090006@sandeen.net> <534EC173.7010903@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534EC173.7010903@sandeen.net> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398063488 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 12:44:19PM -0500, Eric Sandeen wrote: > return is not a function. "return(EIO);" is silly; > "return (EIO);" moreso. return is not a function. > Nuke the pointless parens. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 02:00:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0B15A7F4E for ; Mon, 21 Apr 2014 02:00:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9475EAC001 for ; Mon, 21 Apr 2014 00:00:10 -0700 (PDT) X-ASG-Debug-ID: 1398063609-04bdf04554214600001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id q1DsV1BRxaRYAqDI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 00:00:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8D3-0007TP-53; Mon, 21 Apr 2014 07:00:09 +0000 Date: Mon, 21 Apr 2014 00:00:09 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/9] db: don't claim unchecked CRCs are correct Message-ID: <20140421070009.GC20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/9] db: don't claim unchecked CRCs are correct References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-2-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398063609 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > + switch (iocur_crc_valid()) { > + case -1: > + ok = "unchecked"; > + break; > + case 0: > + ok = "bad"; > + break; > + case 1: > + ok = "correct"; > + break; > + default: > + ok = "unknown state"; > + break; > + } We should have symbolic constants for these return values. But then again iocur_crc_valid only has a single caller currently, is it even worth the effort, or should we simply inline it? Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 02:03:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 612B17F4E for ; Mon, 21 Apr 2014 02:03:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4EF31304032 for ; Mon, 21 Apr 2014 00:02:57 -0700 (PDT) X-ASG-Debug-ID: 1398063772-04cbb06e9d2093a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id UoPBDTjPHeZSXw0R (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 00:02:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8Fg-0007Vw-L2; Mon, 21 Apr 2014 07:02:52 +0000 Date: Mon, 21 Apr 2014 00:02:52 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] db: verify buffer on type change Message-ID: <20140421070252.GD20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/9] db: verify buffer on type change References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-3-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398063773 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +void > +set_iocur_type( > + const typ_t *t) > +{ > + const struct xfs_buf_ops *ops = t ? t->bops : NULL; > + struct xfs_buf *bp = iocur_top->bp; > + > + iocur_top->typ = t; > + > + /* verify the buffer if the type has one. */ > + if (!bp) > + return; > + if (!ops) { > + bp->b_ops = NULL; > + bp->b_flags |= LIBXFS_B_UNCHECKED; > + return; > + } The only caller currently makes sure we never pass a NULL t argument, and I think keeping it that way is sensible. If we want to allow clearing the type we should add a separate clear_iocur_type helper for it. From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 02:08:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 04E697F4E for ; Mon, 21 Apr 2014 02:08:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CEECE8F8049 for ; Mon, 21 Apr 2014 00:08:25 -0700 (PDT) X-ASG-Debug-ID: 1398064104-04cbb06e9d209610001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HaVvdL0GKbdePLAz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 00:08:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8L2-0000oj-Ab; Mon, 21 Apr 2014 07:08:24 +0000 Date: Mon, 21 Apr 2014 00:08:24 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Message-ID: <20140421070824.GE20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-5-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398064104 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 15, 2014 at 06:24:56PM +1000, Dave Chinner wrote: > + * Need to handle CRC and validation errors specially here. If > + * there is a validator error, re-read without the verifier so > + * that we get a buffer we can check and repair. Re-attach the > + * ops to the buffer after the read so that when it is rewritten > + * the CRC is recalculated. > + * > + * Returns a positive error on failure, 0 for success, and negative > + * error if a verifier error occurred and we reread the block without > + * the verifier successfully. This comment doesn't come clear to using up the 80 character allowance :) I have to say the positive and negative errno convention is a bit confusing to me. I'd rather always return 0 if we could read it, and pass a bool *crc_error instead that indicates if it needs fixing. From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 02:11:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 470E27F51 for ; Mon, 21 Apr 2014 02:11:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1425AC001 for ; Mon, 21 Apr 2014 00:11:07 -0700 (PDT) X-ASG-Debug-ID: 1398064266-04cbb06e9b209710001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id NRT2rX0FWiDDOAuV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 00:11:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8Ne-0003J1-1b; Mon, 21 Apr 2014 07:11:06 +0000 Date: Mon, 21 Apr 2014 00:11:06 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140421071106.GF20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-6-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398064266 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 15, 2014 at 06:24:57PM +1000, Dave Chinner wrote: > From: Dave Chinner > > repair doesn't currently detect verifier errors in AG header > blocks - apart from the primary superblock they are not detected. > They are, fortunately, corrected in the important cases (AGF, AGI > and AGFL) because these structures are rebuilt in phase 5, but if > you run xfs_repair in checking mode it won't report them as bad. Shouldn't we apply the same scheme as for directories here, that is if it fails with a verifier error re-read without the verifier and then still do the full check as well? Btw, it might make sense to have special read_buf variants in libxfs that always return a valid buffer even if the verifier fails, just telling us about it without having to re-read. From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 02:13:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BE957F54 for ; Mon, 21 Apr 2014 02:13:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5334AC001 for ; Mon, 21 Apr 2014 00:13:06 -0700 (PDT) X-ASG-Debug-ID: 1398064385-04bdf04553214af0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id WQ9LwdutUURbdoMq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 00:13:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8PZ-0003NZ-Tr; Mon, 21 Apr 2014 07:13:05 +0000 Date: Mon, 21 Apr 2014 00:13:05 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 7/9] repair: remove more dirv1 leftovers Message-ID: <20140421071305.GG20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 7/9] repair: remove more dirv1 leftovers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397550301-31883-8-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398064386 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 02:14:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 336AA7F54 for ; Mon, 21 Apr 2014 02:14:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C2F0304032 for ; Mon, 21 Apr 2014 00:14:06 -0700 (PDT) X-ASG-Debug-ID: 1398064446-04bdf04554214b90001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id hNoA7OIW7IpipiIE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 00:14:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wc8QW-00044R-VT; Mon, 21 Apr 2014 07:14:04 +0000 Date: Mon, 21 Apr 2014 00:14:04 -0700 From: Christoph Hellwig To: Brian Foster Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 7/9] repair: remove more dirv1 leftovers Message-ID: <20140421071404.GH20384@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 7/9] repair: remove more dirv1 leftovers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-8-git-send-email-david@fromorbit.com> <20140416132332.GA4180@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416132332.GA4180@laptop.bfoster> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398064446 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5108 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 09:23:34AM -0400, Brian Foster wrote: > I'm not quite familiar with how we manage the .po translation files, but > FYI this string appears in a couple of them. Not sure whether there is > value in keeping the translation around. The string does include the > specific function name. They are dead but harmless after the original ones are removed. The next time the translators generate the translatable strings they won't be in there, and they should be removed with the translation update. From tmtynkky@cs.helsinki.fi Mon Apr 21 05:05:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6B75029DF8 for ; Mon, 21 Apr 2014 05:05:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A6FE304032 for ; Mon, 21 Apr 2014 03:05:10 -0700 (PDT) X-ASG-Debug-ID: 1398074704-04cb6c243820fa40001-NocioJ Received: from script.cs.helsinki.fi (script.cs.helsinki.fi [128.214.11.1]) by cuda.sgi.com with ESMTP id n3wbQTC0IAj8UvGC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 03:05:06 -0700 (PDT) X-Barracuda-Envelope-From: tmtynkky@cs.helsinki.fi X-Barracuda-Apparent-Source-IP: 128.214.11.1 X-DKIM: Courier DKIM Filter v0.50+pk-2014-03-23 mail.cs.helsinki.fi Mon, 21 Apr 2014 13:05:03 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cs.helsinki.fi; h=from:to:cc:subject:date:message-id; s=dkim20130528; bh=+s0No1 DROi4d4Ue+iJKY6y6FLRH3K378sOJAptLtUz8=; b=b/Yx5hfeSaAJpfT85DGZN+ ak6akINKqzeczi3poY9isxPs1UILHQx3P0piHVGSlMOyxuzrS00BiLsjw4T1/sQm YRBHSBDTBiLz8CGVxYzQrhWwhLvn979zmgNom0kgQN49j1cuPy33YJmnqb+MbEiF OaI+ukVbO/5WibhbpXaGQ= Received: from sf-2.cs.helsinki.fi (sf-2.cs.helsinki.fi [128.214.166.196]) (AUTH: PLAIN cs-relay, TLS: TLSv1/SSLv3,256bits,AES256-SHA) by mail.cs.helsinki.fi with ESMTPSA; Mon, 21 Apr 2014 13:05:03 +0300 id 0000000000082F64.000000005354ED4F.00005151 Received: by sf-2.cs.helsinki.fi (Postfix, from userid 18244) id 433E9324C78; Mon, 21 Apr 2014 13:05:01 +0300 (EEST) From: Tuomas Tynkkynen To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Tuomas Tynkkynen Subject: [PATCH] xfs: Fix wrong error codes being returned Date: Mon, 21 Apr 2014 13:04:47 +0300 X-ASG-Orig-Subj: [PATCH] xfs: Fix wrong error codes being returned Message-Id: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: script.cs.helsinki.fi[128.214.11.1] X-Barracuda-Start-Time: 1398074706 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.3.5111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect sign in some cases. While at it, make sure ENOMEM is returned instead of E2BIG if kmalloc fails. Signed-off-by: Tuomas Tynkkynen --- Compile tested only. For the ERANGE case, I also wonder if it should be assigning to ops[i].am_error instead of error, and/or have a break. fs/xfs/xfs_ioctl.c | 5 +++-- fs/xfs/xfs_ioctl32.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0b18776..2d8f4fd 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -543,10 +543,11 @@ xfs_attrmulti_by_handle( ops = memdup_user(am_hreq.ops, size); if (IS_ERR(ops)) { - error = PTR_ERR(ops); + error = -PTR_ERR(ops); goto out_dput; } + error = ENOMEM; attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); if (!attr_name) goto out_kfree_ops; @@ -556,7 +557,7 @@ xfs_attrmulti_by_handle( ops[i].am_error = strncpy_from_user((char *)attr_name, ops[i].am_attrname, MAXNAMELEN); if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) - error = -ERANGE; + error = ERANGE; if (ops[i].am_error < 0) break; diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index a7992f8..944d5ba 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -424,10 +424,11 @@ xfs_compat_attrmulti_by_handle( ops = memdup_user(compat_ptr(am_hreq.ops), size); if (IS_ERR(ops)) { - error = PTR_ERR(ops); + error = -PTR_ERR(ops); goto out_dput; } + error = ENOMEM; attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); if (!attr_name) goto out_kfree_ops; @@ -438,7 +439,7 @@ xfs_compat_attrmulti_by_handle( compat_ptr(ops[i].am_attrname), MAXNAMELEN); if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) - error = -ERANGE; + error = ERANGE; if (ops[i].am_error < 0) break; -- 1.7.9.5 From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 07:45:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0452C7F3F for ; Mon, 21 Apr 2014 07:45:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA5158F804B for ; Mon, 21 Apr 2014 05:45:01 -0700 (PDT) X-ASG-Debug-ID: 1398084297-04bdf0455321d470001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CDZnHPK2jngmpDAw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 05:44:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcDaj-0001iv-8h; Mon, 21 Apr 2014 12:44:57 +0000 Date: Mon, 21 Apr 2014 05:44:57 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 01/10] xfs: remove redundant stat assignment in xfs_bulkstat_one_int Message-ID: <20140421124457.GA4017@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 01/10] xfs: remove redundant stat assignment in xfs_bulkstat_one_int References: <535078A9.409@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078A9.409@oracle.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398084297 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 18, 2014 at 08:58:17AM +0800, Jeff Liu wrote: > From: Jie Liu > > Remove the redundant BULKSTAT_RV_NOTHING assignment in case of call > xfs_iget() failed at xfs_bulkstat_one_int(). > > Signed-off-by: Jie Liu Looks good, Reviewed-by: Christoph Hellwig From jeff.liu@oracle.com Mon Apr 21 07:47:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D2507F3F for ; Mon, 21 Apr 2014 07:47:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0BDFEAC001 for ; Mon, 21 Apr 2014 05:47:10 -0700 (PDT) X-ASG-Debug-ID: 1398084429-04cbb06e9d212510001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id mNdekeM6z1ObUgA2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 05:47:09 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3LCkk2n014329 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 21 Apr 2014 12:46:47 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3LCkjDL000973 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 21 Apr 2014 12:46:46 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3LCkjqp000970; Mon, 21 Apr 2014 12:46:45 GMT Received: from [192.168.1.106] (/123.119.110.200) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 21 Apr 2014 05:46:45 -0700 Message-ID: <5355132F.4070303@oracle.com> Date: Mon, 21 Apr 2014 20:46:39 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Tuomas Tynkkynen , Dave Chinner CC: linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix wrong error codes being returned References: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix wrong error codes being returned In-Reply-To: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> 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: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1398084429 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Tuomas, On 04/21 2014 18:04 PM, Tuomas Tynkkynen wrote: > xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect > sign in some cases. While at it, make sure ENOMEM is returned instead of > E2BIG if kmalloc fails. > > Signed-off-by: Tuomas Tynkkynen > --- > Compile tested only. For the ERANGE case, I also wonder if it should > be assigning to ops[i].am_error instead of error, and/or have a break. If I understand right, ops[i].am_error is used to save the internal operation result, i.e, xfs_attrmult_attr_get{set}... but error is used for the ioctl call results. Therefore, assign ERANGE to error is compatible with the VFS set{get}xattr syscalls in case of "if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)". It seems that we don't need to have a break in this case because xfs_attrmulti_by_handle() is used to process multiple attrs. Hence if a given attrname in ops array is invalid, the am_error will indicate that with ENOATTR or EFAULT...but it should proceed to loop through the left array members. Also, looks there is another minor issue at xfs_attrmulti_attr_set(), we should return -PTR_ERR(kbuf) if call memdup_user() failed. > > fs/xfs/xfs_ioctl.c | 5 +++-- > fs/xfs/xfs_ioctl32.c | 5 +++-- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 0b18776..2d8f4fd 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -543,10 +543,11 @@ xfs_attrmulti_by_handle( > > ops = memdup_user(am_hreq.ops, size); > if (IS_ERR(ops)) { > - error = PTR_ERR(ops); > + error = -PTR_ERR(ops); > goto out_dput; > } > > + error = ENOMEM; > attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); > if (!attr_name) > goto out_kfree_ops; > @@ -556,7 +557,7 @@ xfs_attrmulti_by_handle( > ops[i].am_error = strncpy_from_user((char *)attr_name, > ops[i].am_attrname, MAXNAMELEN); > if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) > - error = -ERANGE; > + error = ERANGE; > if (ops[i].am_error < 0) > break; > > diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c > index a7992f8..944d5ba 100644 > --- a/fs/xfs/xfs_ioctl32.c > +++ b/fs/xfs/xfs_ioctl32.c > @@ -424,10 +424,11 @@ xfs_compat_attrmulti_by_handle( > > ops = memdup_user(compat_ptr(am_hreq.ops), size); > if (IS_ERR(ops)) { > - error = PTR_ERR(ops); > + error = -PTR_ERR(ops); > goto out_dput; > } > > + error = ENOMEM; > attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); > if (!attr_name) > goto out_kfree_ops; > @@ -438,7 +439,7 @@ xfs_compat_attrmulti_by_handle( > compat_ptr(ops[i].am_attrname), > MAXNAMELEN); > if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) > - error = -ERANGE; > + error = ERANGE; > if (ops[i].am_error < 0) > break; > Thanks, -Jeff From bfoster@redhat.com Mon Apr 21 08:01:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CB4787F3F for ; Mon, 21 Apr 2014 08:01:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AC167304043 for ; Mon, 21 Apr 2014 06:01:41 -0700 (PDT) X-ASG-Debug-ID: 1398085296-04cb6c2439214580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tHfFxD8ZtoQ2f9ZH for ; Mon, 21 Apr 2014 06:01:37 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3LD1G0P028362 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Apr 2014 09:01:20 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3LD1FlK010834; Mon, 21 Apr 2014 09:01:16 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E711112573F; Mon, 21 Apr 2014 09:01:14 -0400 (EDT) Date: Mon, 21 Apr 2014 09:01:14 -0400 From: Brian Foster To: Tuomas Tynkkynen Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix wrong error codes being returned Message-ID: <20140421130113.GA24813@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix wrong error codes being returned References: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398085297 X-Barracuda-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 21, 2014 at 01:04:47PM +0300, Tuomas Tynkkynen wrote: > xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect > sign in some cases. While at it, make sure ENOMEM is returned instead of > E2BIG if kmalloc fails. > > Signed-off-by: Tuomas Tynkkynen > --- The fix looks good to me. There has been talk recently of starting to fix up our internal positive-to-negative error conversions to be more consistent with the rest of the kernel. Given that, I wonder if it's better here to go the other way. E.g., remove the negation in the out_dput path and convert the positive error codes (and thus we don't need to add more negative-to-positive-to-negative conversions here). Thoughts? Brian > Compile tested only. For the ERANGE case, I also wonder if it should > be assigning to ops[i].am_error instead of error, and/or have a break. > > fs/xfs/xfs_ioctl.c | 5 +++-- > fs/xfs/xfs_ioctl32.c | 5 +++-- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 0b18776..2d8f4fd 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -543,10 +543,11 @@ xfs_attrmulti_by_handle( > > ops = memdup_user(am_hreq.ops, size); > if (IS_ERR(ops)) { > - error = PTR_ERR(ops); > + error = -PTR_ERR(ops); > goto out_dput; > } > > + error = ENOMEM; > attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); > if (!attr_name) > goto out_kfree_ops; > @@ -556,7 +557,7 @@ xfs_attrmulti_by_handle( > ops[i].am_error = strncpy_from_user((char *)attr_name, > ops[i].am_attrname, MAXNAMELEN); > if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) > - error = -ERANGE; > + error = ERANGE; > if (ops[i].am_error < 0) > break; > > diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c > index a7992f8..944d5ba 100644 > --- a/fs/xfs/xfs_ioctl32.c > +++ b/fs/xfs/xfs_ioctl32.c > @@ -424,10 +424,11 @@ xfs_compat_attrmulti_by_handle( > > ops = memdup_user(compat_ptr(am_hreq.ops), size); > if (IS_ERR(ops)) { > - error = PTR_ERR(ops); > + error = -PTR_ERR(ops); > goto out_dput; > } > > + error = ENOMEM; > attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); > if (!attr_name) > goto out_kfree_ops; > @@ -438,7 +439,7 @@ xfs_compat_attrmulti_by_handle( > compat_ptr(ops[i].am_attrname), > MAXNAMELEN); > if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) > - error = -ERANGE; > + error = ERANGE; > if (ops[i].am_error < 0) > break; > > -- > 1.7.9.5 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Apr 21 08:09:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 31DF07F3F for ; Mon, 21 Apr 2014 08:09:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 223B08F8049 for ; Mon, 21 Apr 2014 06:09:44 -0700 (PDT) X-ASG-Debug-ID: 1398085783-04cb6c2438214c40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9ZOcKPqLHPSExZ2o for ; Mon, 21 Apr 2014 06:09:43 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3LD9Xvs031054 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Apr 2014 09:09:33 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3LD9XUX012146; Mon, 21 Apr 2014 09:09:33 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2D96112573F; Mon, 21 Apr 2014 09:09:32 -0400 (EDT) Date: Mon, 21 Apr 2014 09:09:32 -0400 From: Brian Foster To: Jeff Liu Cc: Tuomas Tynkkynen , Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix wrong error codes being returned Message-ID: <20140421130931.GB24813@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix wrong error codes being returned References: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> <5355132F.4070303@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5355132F.4070303@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1398085783 X-Barracuda-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 21, 2014 at 08:46:39PM +0800, Jeff Liu wrote: > Hi Tuomas, > > On 04/21 2014 18:04 PM, Tuomas Tynkkynen wrote: > > xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect > > sign in some cases. While at it, make sure ENOMEM is returned instead of > > E2BIG if kmalloc fails. > > > > Signed-off-by: Tuomas Tynkkynen > > --- > > Compile tested only. For the ERANGE case, I also wonder if it should > > be assigning to ops[i].am_error instead of error, and/or have a break. > > If I understand right, ops[i].am_error is used to save the internal operation result, > i.e, xfs_attrmult_attr_get{set}... but error is used for the ioctl call results. > Therefore, assign ERANGE to error is compatible with the VFS set{get}xattr syscalls in > case of "if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)". > But we set 'error' in this case and effectively try to continue the operation whereas the traditional vfs path returns... > It seems that we don't need to have a break in this case because xfs_attrmulti_by_handle() > is used to process multiple attrs. Hence if a given attrname in ops array is invalid, > the am_error will indicate that with ENOATTR or EFAULT...but it should proceed to loop > through the left array members. > Perhaps so if am_error == 0, but it depends on what attr_name contains at that point (stale data?). Otherwise, we try to proceed with a truncated name. It looks like the consistent thing to do would be set am_error to ERANGE and continue (i.e., skip the op and move on to the next). Brian > Also, looks there is another minor issue at xfs_attrmulti_attr_set(), we should return > -PTR_ERR(kbuf) if call memdup_user() failed. > > > > > fs/xfs/xfs_ioctl.c | 5 +++-- > > fs/xfs/xfs_ioctl32.c | 5 +++-- > > 2 files changed, 6 insertions(+), 4 deletions(-) > > > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > > index 0b18776..2d8f4fd 100644 > > --- a/fs/xfs/xfs_ioctl.c > > +++ b/fs/xfs/xfs_ioctl.c > > @@ -543,10 +543,11 @@ xfs_attrmulti_by_handle( > > > > ops = memdup_user(am_hreq.ops, size); > > if (IS_ERR(ops)) { > > - error = PTR_ERR(ops); > > + error = -PTR_ERR(ops); > > goto out_dput; > > } > > > > + error = ENOMEM; > > attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); > > if (!attr_name) > > goto out_kfree_ops; > > @@ -556,7 +557,7 @@ xfs_attrmulti_by_handle( > > ops[i].am_error = strncpy_from_user((char *)attr_name, > > ops[i].am_attrname, MAXNAMELEN); > > if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) > > - error = -ERANGE; > > + error = ERANGE; > > if (ops[i].am_error < 0) > > break; > > > > diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c > > index a7992f8..944d5ba 100644 > > --- a/fs/xfs/xfs_ioctl32.c > > +++ b/fs/xfs/xfs_ioctl32.c > > @@ -424,10 +424,11 @@ xfs_compat_attrmulti_by_handle( > > > > ops = memdup_user(compat_ptr(am_hreq.ops), size); > > if (IS_ERR(ops)) { > > - error = PTR_ERR(ops); > > + error = -PTR_ERR(ops); > > goto out_dput; > > } > > > > + error = ENOMEM; > > attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); > > if (!attr_name) > > goto out_kfree_ops; > > @@ -438,7 +439,7 @@ xfs_compat_attrmulti_by_handle( > > compat_ptr(ops[i].am_attrname), > > MAXNAMELEN); > > if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) > > - error = -ERANGE; > > + error = ERANGE; > > if (ops[i].am_error < 0) > > break; > > > > Thanks, > -Jeff > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From arskpak@hotmail.com Mon Apr 21 08:31:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FORGED_HOTMAIL_RCVD2, FREEMAIL_FROM,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 7C24A7F3F for ; Mon, 21 Apr 2014 08:31:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AED2AC001 for ; Mon, 21 Apr 2014 06:31:55 -0700 (PDT) X-ASG-Debug-ID: 1398087114-04cb6c2439215db0001-NocioJ Received: from eventmail.trailraces.com (eventmail.trailraces.com [216.26.176.104]) by cuda.sgi.com with ESMTP id nxVkb69kZjqqfEEY for ; Mon, 21 Apr 2014 06:31:54 -0700 (PDT) X-Barracuda-Envelope-From: arskpak@hotmail.com X-Barracuda-Apparent-Source-IP: 216.26.176.104 Received: from raceitweb01a ([127.0.0.1]) by eventmail.trailraces.com with Microsoft SMTPSVC(7.0.6002.18264); Mon, 21 Apr 2014 09:31:50 -0400 MIME-Version: 1.0 From: arskpak@hotmail.com To: xfs@oss.sgi.com Date: 21 Apr 2014 09:31:50 -0400 Subject: Re: Funds. Content-Type: text/plain; charset=us-ascii X-ASG-Orig-Subj: Re: Funds. Content-Transfer-Encoding: quoted-printable Message-ID: X-OriginalArrivalTime: 21 Apr 2014 13:31:50.0007 (UTC) FILETIME=[0CD07870:01CF5D66] X-Barracuda-Connect: eventmail.trailraces.com[216.26.176.104] X-Barracuda-Start-Time: 1398087114 X-Barracuda-URL: http://192.48.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=FORGED_HOTMAIL_RCVD2, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5114 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' 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 Re: You will donate 10% from proceed to Charity.=0D=0A=0D=0AI hereby request= your co-operation in this business transaction to raise funds. =0D=0AAs= you reply to me more details will be made available to you.=0D=0A=0D=0AThanks,= =0D=0AMaximus.=0D=0A=0D=0A=0D=0AVisit my fundraising page at http://www.RaceIt.com/fundraising/fundraise.aspx?event=3D15197&fundraiser=3D11739 From jeff.liu@oracle.com Mon Apr 21 09:01:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3DBFE7F3F for ; Mon, 21 Apr 2014 09:01:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1ED158F8035 for ; Mon, 21 Apr 2014 07:01:55 -0700 (PDT) X-ASG-Debug-ID: 1398088913-04cb6c24382172a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 8o1hkAIZUt9fufuo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 07:01:53 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3LE1hN7023274 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 21 Apr 2014 14:01:43 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3LE1fkL008810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 21 Apr 2014 14:01:43 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3LE1f0b015323; Mon, 21 Apr 2014 14:01:41 GMT Received: from [192.168.1.106] (/123.119.110.200) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 21 Apr 2014 07:01:40 -0700 Message-ID: <535524BE.7070704@oracle.com> Date: Mon, 21 Apr 2014 22:01:34 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Brian Foster CC: Tuomas Tynkkynen , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix wrong error codes being returned References: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> <5355132F.4070303@oracle.com> <20140421130931.GB24813@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix wrong error codes being returned In-Reply-To: <20140421130931.GB24813@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1398088913 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/21 2014 21:09 PM, Brian Foster wrote: > On Mon, Apr 21, 2014 at 08:46:39PM +0800, Jeff Liu wrote: >> Hi Tuomas, >> >> On 04/21 2014 18:04 PM, Tuomas Tynkkynen wrote: >>> xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect >>> sign in some cases. While at it, make sure ENOMEM is returned instead of >>> E2BIG if kmalloc fails. >>> >>> Signed-off-by: Tuomas Tynkkynen >>> --- >>> Compile tested only. For the ERANGE case, I also wonder if it should >>> be assigning to ops[i].am_error instead of error, and/or have a break. >> >> If I understand right, ops[i].am_error is used to save the internal operation result, >> i.e, xfs_attrmult_attr_get{set}... but error is used for the ioctl call results. >> Therefore, assign ERANGE to error is compatible with the VFS set{get}xattr syscalls in >> case of "if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)". >> > > But we set 'error' in this case and effectively try to continue the operation > whereas the traditional vfs path returns... So the error would always be set to ERANGE if one or more attrname is/are invalid. > >> It seems that we don't need to have a break in this case because xfs_attrmulti_by_handle() >> is used to process multiple attrs. Hence if a given attrname in ops array is invalid, >> the am_error will indicate that with ENOATTR or EFAULT...but it should proceed to loop >> through the left array members. >> > > Perhaps so if am_error == 0, but it depends on what attr_name contains > at that point (stale data?). Otherwise, we try to proceed with a > truncated name. It looks like the consistent thing to do would be set > am_error to ERANGE and continue (i.e., skip the op and move on to the > next). If we continue to process a truncated name in case of MAXNAMELEN, it would return EFAULT for SET/REMOVE operations, and ENOATTR for GET operation, which would be set back to am_error, but error still keep as ERANGE which is consistently. Thanks, -Jeff From BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 21 09:11:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4F3CC7F4E for ; Mon, 21 Apr 2014 09:11:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C8D2304051 for ; Mon, 21 Apr 2014 07:11:49 -0700 (PDT) X-ASG-Debug-ID: 1398089508-04bdf04554221c90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 41hO0uXxR3pyiDOt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 07:11:48 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5fbe208480bd3b8f8894+3893+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcEwm-00072l-Hz; Mon, 21 Apr 2014 14:11:48 +0000 Date: Mon, 21 Apr 2014 07:11:48 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single Message-ID: <20140421141148.GA27064@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single References: <535078AD.5050209@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078AD.5050209@oracle.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398089508 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 18, 2014 at 08:58:21AM +0800, Jeff Liu wrote: > From: Jie Liu > > In xfs_bulkstat_single(), call xfs_bulkstat_one() and xfs_bulkstat() > would return different error if either failed, we'd better return the > proper error in this case. Moreover, the function argument done is > useless in terms of xfs_ioc_bulkstat(), hence we can get rid of it. I've looked at xfs_bulkstat_single I really can't see how falling back to the full xfs_bulkstat could fix any error. We probably should just get rid of the fallback and instead do something like the (lightly tested) patch below: --- From: Christoph Hellwig Subject: xfs: remove xfs_bulkstat_single xfs_bukstat_one doesn't have any failure case that would go away when called through xfs_bulkstat, so remove the fallback and the now unessecary xfs_bulkstat_single function. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_ioctl.c | 4 ++-- fs/xfs/xfs_itable.c | 48 ------------------------------------------------ fs/xfs/xfs_itable.h | 7 ------- 3 files changed, 2 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bcfe612..c6e32d1 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -824,8 +824,8 @@ xfs_ioc_bulkstat( error = xfs_inumbers(mp, &inlast, &count, bulkreq.ubuffer, xfs_inumbers_fmt); else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE) - error = xfs_bulkstat_single(mp, &inlast, - bulkreq.ubuffer, &done); + error = xfs_bulkstat_one(mp, inlast, bulkreq.ubuffer, + sizeof(xfs_bstat_t), NULL, &done); else /* XFS_IOC_FSBULKSTAT */ error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, sizeof(xfs_bstat_t), bulkreq.ubuffer, diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f463382..58fcae0 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -511,54 +511,6 @@ xfs_bulkstat( return rval; } -/* - * Return stat information in bulk (by-inode) for the filesystem. - * Special case for non-sequential one inode bulkstat. - */ -int /* error status */ -xfs_bulkstat_single( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t *lastinop, /* inode to return */ - char __user *buffer, /* buffer with inode stats */ - int *done) /* 1 if there are more stats to get */ -{ - int count; /* count value for bulkstat call */ - int error; /* return value */ - xfs_ino_t ino; /* filesystem inode number */ - int res; /* result from bs1 */ - - /* - * note that requesting valid inode numbers which are not allocated - * to inodes will most likely cause xfs_imap_to_bp to generate warning - * messages about bad magic numbers. This is ok. The fact that - * the inode isn't actually an inode is handled by the - * error check below. Done this way to make the usual case faster - * at the expense of the error case. - */ - - ino = *lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - NULL, &res); - if (error) { - /* - * Special case way failed, do it the "long" way - * to see if that works. - */ - (*lastinop)--; - count = 1; - if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, - sizeof(xfs_bstat_t), buffer, done)) - return error; - if (count == 0 || (xfs_ino_t)*lastinop != ino) - return error == EFSCORRUPTED ? - XFS_ERROR(EINVAL) : error; - else - return 0; - } - *done = 0; - return 0; -} - int xfs_inumbers_fmt( void __user *ubuffer, /* buffer to write to */ diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 97295d9..6ea8b39 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -50,13 +50,6 @@ xfs_bulkstat( char __user *ubuffer,/* buffer with inode stats */ int *done); /* 1 if there are more stats to get */ -int -xfs_bulkstat_single( - xfs_mount_t *mp, - xfs_ino_t *lastinop, - char __user *buffer, - int *done); - typedef int (*bulkstat_one_fmt_pf)( /* used size in bytes or negative error */ void __user *ubuffer, /* buffer to write to */ int ubsize, /* remaining user buffer sz */ -- 1.7.10.4 From bfoster@redhat.com Mon Apr 21 09:36:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6DA1F7F3F for ; Mon, 21 Apr 2014 09:36:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04B2DAC001 for ; Mon, 21 Apr 2014 07:36:46 -0700 (PDT) X-ASG-Debug-ID: 1398091005-04bdf045522236c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fHvrB9ekHySZu9Jp for ; Mon, 21 Apr 2014 07:36:46 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3LEaYJh029000 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 21 Apr 2014 10:36:35 -0400 Received: from laptop.bfoster (vpn-225-232.phx2.redhat.com [10.3.225.232]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3LEaY1b013301; Mon, 21 Apr 2014 10:36:34 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id BD14A120AC3; Mon, 21 Apr 2014 10:36:33 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3LEaV4K004854; Mon, 21 Apr 2014 10:36:31 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 21 Apr 2014 10:36:30 -0400 From: Brian Foster To: Jeff Liu Cc: Tuomas Tynkkynen , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix wrong error codes being returned Message-ID: <20140421143629.GB4371@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix wrong error codes being returned References: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> <5355132F.4070303@oracle.com> <20140421130931.GB24813@bfoster.bfoster> <535524BE.7070704@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535524BE.7070704@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398091005 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Apr 21, 2014 at 10:01:34PM +0800, Jeff Liu wrote: > > On 04/21 2014 21:09 PM, Brian Foster wrote: > > On Mon, Apr 21, 2014 at 08:46:39PM +0800, Jeff Liu wrote: > >> Hi Tuomas, > >> > >> On 04/21 2014 18:04 PM, Tuomas Tynkkynen wrote: > >>> xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect > >>> sign in some cases. While at it, make sure ENOMEM is returned instead of > >>> E2BIG if kmalloc fails. > >>> > >>> Signed-off-by: Tuomas Tynkkynen > >>> --- > >>> Compile tested only. For the ERANGE case, I also wonder if it should > >>> be assigning to ops[i].am_error instead of error, and/or have a break. > >> > >> If I understand right, ops[i].am_error is used to save the internal operation result, > >> i.e, xfs_attrmult_attr_get{set}... but error is used for the ioctl call results. > >> Therefore, assign ERANGE to error is compatible with the VFS set{get}xattr syscalls in > >> case of "if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)". > >> > > > > But we set 'error' in this case and effectively try to continue the operation > > whereas the traditional vfs path returns... > > So the error would always be set to ERANGE if one or more attrname is/are invalid. > Right... > > > >> It seems that we don't need to have a break in this case because xfs_attrmulti_by_handle() > >> is used to process multiple attrs. Hence if a given attrname in ops array is invalid, > >> the am_error will indicate that with ENOATTR or EFAULT...but it should proceed to loop > >> through the left array members. > >> > > > > Perhaps so if am_error == 0, but it depends on what attr_name contains > > at that point (stale data?). Otherwise, we try to proceed with a > > truncated name. It looks like the consistent thing to do would be set > > am_error to ERANGE and continue (i.e., skip the op and move on to the > > next). > > If we continue to process a truncated name in case of MAXNAMELEN, it would return > EFAULT for SET/REMOVE operations, and ENOATTR for GET operation, which would be > set back to am_error, but error still keep as ERANGE which is consistently. > Ah, we should hit an error in the xfs_attr_name_to_xname() call deeper in the callchain, so the truncated name case should not be an issue. The am_error == 0 case still looks weird to me. So we return an error and set am_error if there's an issue with the attr name. If there's another error in the op path, we set am_error only and continue on. Not being familiar with the interface, I'm curious if there is any particular reason for that difference in behavior. It seems like the caller should process all of the return codes anyways. Brian > > Thanks, > -Jeff > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From k.khlebnikov@samsung.com Mon Apr 21 11:43:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_MANY_HDRS_LCASE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9C46A7F3F for ; Mon, 21 Apr 2014 11:43:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8969730404E for ; Mon, 21 Apr 2014 09:43:10 -0700 (PDT) X-ASG-Debug-ID: 1398098588-04cb6c243921db70001-NocioJ Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by cuda.sgi.com with ESMTP id Lwudvfxm9D3di3Nt (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Mon, 21 Apr 2014 09:43:09 -0700 (PDT) X-Barracuda-Envelope-From: k.khlebnikov@samsung.com X-Barracuda-Apparent-Source-IP: 210.118.77.11 X-Barracuda-IPDD: Level2 [samsung.com/210.118.77.11] Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N4E00LQ53RUWD30@mailout1.w1.samsung.com> for xfs@oss.sgi.com; Mon, 21 Apr 2014 17:43:06 +0100 (BST) X-Barracuda-IPDD: Level2 [samsung.com/210.118.77.11] X-Barracuda-IPDD: Level2 [samsung.com/210.118.77.11] X-Barracuda-IPDD: Level2 [samsung.com/210.118.77.11] X-Barracuda-IPDD: Level2 [samsung.com/210.118.77.11] X-Barracuda-IPDD: Level2 [samsung.com/210.118.77.11] X-AuditID: cbfec7f5-b7fae6d000004d6d-d1-53554a9bce1a Received: from eusync3.samsung.com ( [203.254.199.213]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id 8E.33.19821.B9A45535; Mon, 21 Apr 2014 17:43:07 +0100 (BST) Received: from localhost ([106.109.130.68]) by eusync3.samsung.com (Oracle Communications Messaging Server 7u4-23.01 (7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0N4E0005Z3RUTM20@eusync3.samsung.com>; Mon, 21 Apr 2014 17:43:07 +0100 (BST) Subject: [PATCH] xfstests: generic/285: fix seek_sanity_test for generic SEEK_HOLE/DATA From: Konstantin Khlebnikov X-ASG-Orig-Subj: [PATCH] xfstests: generic/285: fix seek_sanity_test for generic SEEK_HOLE/DATA To: xfs@oss.sgi.com Date: Mon, 21 Apr 2014 20:43:05 +0400 Message-id: <20140421164305.22404.92195.stgit@buzz> User-Agent: StGit/0.17.1-dirty MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrPJMWRmVeSWpSXmKPExsVy+t/xq7qzvUKDDab84rL4sbOX1WJR3y1G ByaP1Re2Mnr0bVnFGMAUxWWTkpqTWZZapG+XwJXxaNYi9oLpPBXbT79jbGC8ydnFyMEhIWAi MXdiaBcjJ5ApJnHh3nq2LkYuDiGBpYwSq/t3sEM4jUwSzeseMoFUCQtESrTN2skCYrMJmEls 23ebEWSQiICwxI1OU5Awi4CqxIbZZ8DKeQWMJba9amEGsUUF5CRWXm5hhYgLSvyYfI8FpJVZ QF1iypRckDCzgLzE5jVvmScw8s5CUjULoWoWkqoFjMyrGEVTS5MLipPSc430ihNzi0vz0vWS 83M3MUIC6esOxqXHrA4xCnAwKvHwShiEBguxJpYVV+YeYpTgYFYS4V2vCRTiTUmsrEotyo8v Ks1JLT7EyMTBKdXAeJTzWF/qwYX7nGMXfMk7fPrl9PnT9i9kEVxmEsPbv/jwBJdr14LWHJ+b wffG4+yBsqrakM1nVuz5xXWGz+1o71zZR29a+BivH5G3fNB6w4hrzQxniwP3N5pd7Q28seiX Q0OwkC6//r3eSpmC7BsHgjdeOeRcqioXeE/qz6+W72um7HM8Z7j0nJkSS3FGoqEWc1FxIgBJ nEN+AgIAAA== X-Barracuda-Connect: mailout1.w1.samsung.com[210.118.77.11] X-Barracuda-Start-Time: 1398098589 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 Generic implementation of SEEK_HOLE/DATA reports whole file as data chunk with virtual hole at the end (generic_file_llseek, used by ext2/ext3/reiserfs/nfs). Currently test prepares file smaller than expected for "huge file" testcases (testcases 10-12). This patch fixes test file layout, now second data chunk ends right at the expected end of file. Plus it fixes type of 'filesz' argument, it should be off_t. Signed-off-by: Konstantin Khlebnikov --- src/seek_sanity_test.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c index fbf5a8c..7cf45c0 100644 --- a/src/seek_sanity_test.c +++ b/src/seek_sanity_test.c @@ -157,7 +157,7 @@ static int do_create(const char *filename) return fd; } -static int do_lseek(int testnum, int subtest, int fd, int filsz, int origin, +static int do_lseek(int testnum, int subtest, int fd, off_t filsz, int origin, off_t set, off_t exp) { off_t pos, exp2; @@ -203,7 +203,7 @@ static int huge_file_test(int fd, int testnum, off_t filsz) { char *buf = NULL; int bufsz = alloc_size * 16; /* XFS seems to round allocated size */ - off_t off = filsz - 2*bufsz; + off_t off = filsz - bufsz; int ret = -1; buf = do_malloc(bufsz); @@ -211,6 +211,7 @@ static int huge_file_test(int fd, int testnum, off_t filsz) goto out; memset(buf, 'a', bufsz); + /* |- DATA -|- HUGE HOLE -|- DATA -| */ ret = do_pwrite(fd, buf, bufsz, 0); if (ret) goto out; From sandeen@redhat.com Mon Apr 21 13:20:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 99CD729DF7 for ; Mon, 21 Apr 2014 13:20:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8AF888F8049 for ; Mon, 21 Apr 2014 11:20:38 -0700 (PDT) X-ASG-Debug-ID: 1398104434-04cbb06e9b21fa70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OxlYJBbq2Rg4LuR1 for ; Mon, 21 Apr 2014 11:20:34 -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 s3LIKTPU019333 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 21 Apr 2014 14:20:32 -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 s3LGU3PT025073 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 21 Apr 2014 12:30:04 -0400 Message-ID: <5355478C.8070905@redhat.com> Date: Mon, 21 Apr 2014 11:30:04 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss CC: ext4 development , Theodore Tso Subject: [PATCH] xfstests: introduce FSX_AVOID env var X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: introduce FSX_AVOID env var 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: 1398104434 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Just like FSSTRESS_AVOID, FSX_AVOID can be used to add options at the end of the default fsx runs in each test. i.e. FSX_AVOID="-H -z -C" will disable punch hole, zero range, and collapse range calls in all tests which run fsx. This should handle Ted's concerns about buggy ext4 fallocate code without needing to add tunables to the kernel to reject these operations during xfstests runs. Signed-off-by: Eric Sandeen --- diff --git a/README b/README index 295d67f..b299c8f 100644 --- a/README +++ b/README @@ -68,6 +68,11 @@ Preparing system for tests (IRIX and Linux): - setenv FSTYP "the filesystem you want to test", the filesystem type is devised from the TEST_DEV device, but you may want to override it; if unset, the default is 'xfs' + - setenv FSSTRESS_AVOID and/or FSX_AVOID, which contain options + added to the end of fsstresss and fsx invocations, respectively, + in case you wish to exclude certain operational modes from these + tests. + - or add a case to the switch in common/config assigning these variables based on the hostname of your test machine diff --git a/tests/generic/075 b/tests/generic/075 index 8b4ab39..af4f34b 100755 --- a/tests/generic/075 +++ b/tests/generic/075 @@ -75,7 +75,7 @@ _do_test() # This cd and use of -P gets full debug on $here (not TEST_DEV) cd $out - if ! $here/ltp/fsx $_param -P $here $seq.$_n &>/dev/null + if ! $here/ltp/fsx $_param -P $here $seq.$_n $FSX_AVOID &>/dev/null then echo " fsx ($_param) failed, $? - compare $seqres.$_n.{good,bad,fsxlog}" mv $out/$seq.$_n $seqres.$_n.full diff --git a/tests/generic/091 b/tests/generic/091 index bb176f1..e7b60fe 100755 --- a/tests/generic/091 +++ b/tests/generic/091 @@ -46,7 +46,7 @@ run_fsx() echo fsx $@ | tee -a $seqres.full args=`echo $@ | sed -e "s/ BSIZE / $bsize /g" -e "s/ PSIZE / $psize /g"` rm -f $TEST_DIR/junk - $here/ltp/fsx $args $TEST_DIR/junk >>$seqres.full 2>&1 + $here/ltp/fsx $args $FSX_AVOID $TEST_DIR/junk >>$seqres.full 2>&1 if [ $? -ne 0 ]; then cat $seqres.full exit 1 diff --git a/tests/generic/112 b/tests/generic/112 index 4918f75..1e34d99 100755 --- a/tests/generic/112 +++ b/tests/generic/112 @@ -75,7 +75,7 @@ _do_test() # This cd and use of -P gets full debug on $here (not TEST_DEV) cd $out - if ! $here/ltp/fsx $_param -P $here $seq.$_n &>/dev/null + if ! $here/ltp/fsx $_param -P $here $FSX_AVOID $seq.$_n &>/dev/null then echo " fsx ($_param) returned $? - see $seq.$_n.full" mv $seq.$_n.fsxlog $seqres.$_n.full diff --git a/tests/generic/127 b/tests/generic/127 index 58ca91e..f6b7f95 100755 --- a/tests/generic/127 +++ b/tests/generic/127 @@ -51,7 +51,7 @@ _fsx_lite_nommap() { echo "=== FSX Light Mode, No Memory Mapping ===" dd if=/dev/zero of=$TEST_DIR/fsx_lite_nommap bs=${FSX_FILE_SIZE} count=1 > /dev/null 2>&1 - if ! ltp/fsx $FSX_ARGS -L -R -W $TEST_DIR/fsx_lite_nommap > $tmp.output 2>&1 + if ! ltp/fsx $FSX_ARGS -L -R -W $FSX_AVOID $TEST_DIR/fsx_lite_nommap > $tmp.output 2>&1 then echo "ltp/fsx $FSX_ARGS -L -R -W $TEST_DIR/fsx_lite_nommap" cat $tmp.output @@ -65,7 +65,7 @@ _fsx_lite_mmap() { echo "=== FSX Light Mode, Memory Mapping ===" dd if=/dev/zero of=$TEST_DIR/fsx_lite_mmap bs=${FSX_FILE_SIZE} count=1 > /dev/null 2>&1 - if ! ltp/fsx $FSX_ARGS -L $TEST_DIR/fsx_lite_mmap > $tmp.output 2>&1 + if ! ltp/fsx $FSX_ARGS -L $FSX_AVOID $TEST_DIR/fsx_lite_mmap > $tmp.output 2>&1 then echo "ltp/fsx $FSX_ARGS -L fsx_lite_mmap" cat $tmp.output @@ -78,7 +78,7 @@ _fsx_lite_mmap() _fsx_std_nommap() { echo "=== FSX Standard Mode, No Memory Mapping ===" - if ! ltp/fsx $FSX_ARGS -R -W $TEST_DIR/fsx_std_nommap > $tmp.output 2>&1 + if ! ltp/fsx $FSX_ARGS -R -W $FSX_AVOID $TEST_DIR/fsx_std_nommap > $tmp.output 2>&1 then echo "ltp/fsx $FSX_ARGS -R -W fsx_std_nommap" cat $tmp.output @@ -91,7 +91,7 @@ _fsx_std_nommap() _fsx_std_mmap() { echo "=== FSX Standard Mode, Memory Mapping ===" - if ! ltp/fsx $FSX_ARGS $TEST_DIR/fsx_std_mmap > $tmp.output 2>&1 + if ! ltp/fsx $FSX_ARGS $FSX_AVOID $TEST_DIR/fsx_std_mmap > $tmp.output 2>&1 then echo "ltp/fsx $FSX_ARGS fsx_std_mmap" cat $tmp.output diff --git a/tests/generic/231 b/tests/generic/231 index a7cff35..df7d76c 100755 --- a/tests/generic/231 +++ b/tests/generic/231 @@ -48,7 +48,7 @@ _fsx() SEED=$RANDOM echo "ltp/fsx $FSX_ARGS -S $SEED $SCRATCH_MNT/fsx_file$i" >>$seqres.full su $qa_user -c "ltp/fsx $FSX_ARGS -S $SEED \ - $SCRATCH_MNT/fsx_file$i" >$tmp.output$i 2>&1 & + $FSX_AVOID $SCRATCH_MNT/fsx_file$i" >$tmp.output$i 2>&1 & done for (( i = 1; i <= $tasks; i++ )); do diff --git a/tests/generic/263 b/tests/generic/263 index bc59865..6ecb74d 100755 --- a/tests/generic/263 +++ b/tests/generic/263 @@ -46,7 +46,7 @@ run_fsx() echo fsx $@ | tee -a $seqres.full args=`echo $@ | sed -e "s/ BSIZE / $bsize /g" -e "s/ PSIZE / $psize /g"` rm -f $TEST_DIR/junk - $here/ltp/fsx $args $TEST_DIR/junk >>$seqres.full 2>&1 + $here/ltp/fsx $args $FSX_AVOID $TEST_DIR/junk >>$seqres.full 2>&1 if [ $? -ne 0 ]; then cat $seqres.full exit 1 From sandeen@redhat.com Mon Apr 21 15:26:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C9D829DF7 for ; Mon, 21 Apr 2014 15:26:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 10D51304043 for ; Mon, 21 Apr 2014 13:26:53 -0700 (PDT) X-ASG-Debug-ID: 1398112009-04cbb06e9d224120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qJtXiosAOtBgfv4g for ; Mon, 21 Apr 2014 13:26:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3LKQnOg008149 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 21 Apr 2014 16:26:49 -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 s3LKQmDA020728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 16:26:48 -0400 Message-ID: <53557F09.8090000@redhat.com> Date: Mon, 21 Apr 2014 15:26:49 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: test X_QUOTARM functionality X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: test X_QUOTARM functionality 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: 1398112009 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The Q_XQUOTARM quotactl was not working properly, because we weren't passing in proper flags. The xfs_fs_set_xstate() ioctl handler used the same flags for Q_XQUOTAON/OFF as well as Q_XQUOTARM, but Q_XQUOTAON/OFF look for XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, i.e. quota type + state, while Q_XQUOTARM looks only for the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. Unfortunately these flag spaces overlap a bit, so we got semi-random results for Q_XQUOTARM; i.e. the value for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. Anyway, here's a simple test that demonstrates it, kernel patch to fix it will follow. Signed-off-by: Eric Sandeen --- It only tests user & group; if we really want project as well, it could be expanded w/ a little more complexity... diff --git a/tests/xfs/307 b/tests/xfs/307 new file mode 100755 index 0000000..8969e4a --- /dev/null +++ b/tests/xfs/307 @@ -0,0 +1,79 @@ +#! /bin/bash +# FS QA Test No. 307 +# +# Test to verify Q_XQUOTARM functionality. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/quota + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux Irix + +_require_scratch +_require_xfs_quota + +_scratch_mkfs_xfs >/dev/null 2>&1 + +_qmount_option "uquota,gquota" +_qmount + +echo "*** umount" +umount $SCRATCH_MNT + +UQUOTINO=`xfs_db -c "sb 0" -c "p" $SCRATCH_DEV | grep uquotino | awk '{print $NF}'` +GQUOTINO=`xfs_db -c "sb 0" -c "p" $SCRATCH_DEV | grep gquotino | awk '{print $NF}'` + +echo "*** Usage before quotarm ***" +xfs_db -c "inode $UQUOTINO" -c "p core.nblocks" $SCRATCH_DEV +xfs_db -c "inode $GQUOTINO" -c "p core.nblocks" $SCRATCH_DEV + +_qmount +echo "*** turn off user and group quotas" +xfs_quota -x -c 'off -ug' $SCRATCH_MNT +xfs_quota -x -c "remove -ug" $SCRATCH_MNT +echo "*** umount" +umount $SCRATCH_MNT + +echo "*** Usage after quotarm ***" +xfs_db -c "inode $UQUOTINO" -c "p core.nblocks" $SCRATCH_DEV +xfs_db -c "inode $GQUOTINO" -c "p core.nblocks" $SCRATCH_DEV + +# success, all done +status=0 +exit diff --git a/tests/xfs/307.out b/tests/xfs/307.out new file mode 100644 index 0000000..b2fce7a --- /dev/null +++ b/tests/xfs/307.out @@ -0,0 +1,10 @@ +QA output created by 307 +*** umount +*** Usage before quotarm *** +core.nblocks = 1 +core.nblocks = 1 +*** turn off user and group quotas +*** umount +*** Usage after quotarm *** +core.nblocks = 0 +core.nblocks = 0 diff --git a/tests/xfs/group b/tests/xfs/group index e9c4808..d3f7148 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -190,3 +190,4 @@ 304 auto quick quota 305 auto quota 306 auto stress log metadata repair +307 auto quota quick From sandeen@redhat.com Mon Apr 21 15:33:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 394C229DF7 for ; Mon, 21 Apr 2014 15:33:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1A9830404E for ; Mon, 21 Apr 2014 13:33:38 -0700 (PDT) X-ASG-Debug-ID: 1398112417-04bdf04555230c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yrHLeRvy6mDRu1Mc for ; Mon, 21 Apr 2014 13:33:37 -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 s3LKXbR3010436 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 21 Apr 2014 16:33:37 -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 s3LKXao6023374 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 16:33:37 -0400 Message-ID: <535580A1.20806@redhat.com> Date: Mon, 21 Apr 2014 15:33:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: fix Q_XQUOTARM ioctl X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: fix Q_XQUOTARM ioctl 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: 1398112417 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The Q_XQUOTARM quotactl was not working properly, because we weren't passing around proper flags. The xfs_fs_set_xstate() ioctl handler used the same flags for Q_XQUOTAON/OFF as well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, i.e. quota type + state, while Q_XQUOTARM looks only for the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. Unfortunately these flag spaces overlap a bit, so we got semi-random results for Q_XQUOTARM; i.e. the value for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. Split out the flag conversion from userspace to kernelspace, depending on the quotactl that is being executed; add 2 new helpers to do this, so that we send the right flags to the lower-level functions. This has been broken more or less forever, AFAICT. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index af33caf..6f14b8f 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -66,19 +66,11 @@ xfs_fs_get_xstatev( return -xfs_qm_scall_getqstatv(mp, fqs); } +/* Convert quotactl flags to internal flags for Q_XQUOTAON/OFF */ STATIC int -xfs_fs_set_xstate( - struct super_block *sb, - unsigned int uflags, - int op) +xfs_qm_import_flags(unsigned int uflags) { - struct xfs_mount *mp = XFS_M(sb); - unsigned int flags = 0; - - if (sb->s_flags & MS_RDONLY) - return -EROFS; - if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp)) - return -ENOSYS; + unsigned int flags = 0; if (uflags & FS_QUOTA_UDQ_ACCT) flags |= XFS_UQUOTA_ACCT; @@ -93,16 +85,52 @@ xfs_fs_set_xstate( if (uflags & FS_QUOTA_PDQ_ENFD) flags |= XFS_PQUOTA_ENFD; + return flags; +} + +/* Convert quotactl flags to internal flags for Q_XQUOTARM */ +STATIC int +xfs_qm_import_qtype_flags(unsigned int uflags) +{ + unsigned int flags = 0; + + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_USER; + if (uflags & FS_GROUP_QUOTA) + flags |= XFS_DQ_GROUP; + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_PROJ; + + return flags; +} + +STATIC int +xfs_fs_set_xstate( + struct super_block *sb, + unsigned int uflags, + int op) +{ + struct xfs_mount *mp = XFS_M(sb); + unsigned int flags; + + if (sb->s_flags & MS_RDONLY) + return -EROFS; + if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp)) + return -ENOSYS; + switch (op) { case Q_XQUOTAON: + flags = xfs_qm_import_flags(uflags); return -xfs_qm_scall_quotaon(mp, flags); case Q_XQUOTAOFF: if (!XFS_IS_QUOTA_ON(mp)) return -EINVAL; + flags = xfs_qm_import_flags(uflags); return -xfs_qm_scall_quotaoff(mp, flags); case Q_XQUOTARM: if (XFS_IS_QUOTA_ON(mp)) return -EINVAL; + flags = xfs_qm_import_qtype_flags(uflags); return -xfs_qm_scall_trunc_qfiles(mp, flags); } From enwlinux@gmail.com Mon Apr 21 15:37:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 222CE29DF7 for ; Mon, 21 Apr 2014 15:37:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D1E9E8F8064 for ; Mon, 21 Apr 2014 13:37:00 -0700 (PDT) X-ASG-Debug-ID: 1398112618-04bdf04553230ed0001-NocioJ Received: from mail-yh0-f43.google.com (mail-yh0-f43.google.com [209.85.213.43]) by cuda.sgi.com with ESMTP id Hcy07Kwp2Aet3DqD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 13:36:59 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@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 b6so3979503yha.16 for ; Mon, 21 Apr 2014 13:36:58 -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=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=t8k4tBepI9lrHXD6CAVteO3fZgCTAxPBh0UTVUV4Q2w=; b=TeZph08dldZJoQbcMJX1qvcRistid/5jckODaF3TwSHOp5kENAVl32ig6Z0p6HZ2+/ uU0VAXaLLBHJxiblt7aae7cK15ux8Gp2OiyuuUZSIXdyQqiDgQKmQ7JXtcKQDKS574Be 39963h4DWp2h5sZlTjUMuQ7+pu05Lg/OJzZwDRqQEQBZEVjYVKLTD7Hd29jzYDL3uBaS VlAYfTueToz9ncGpRZ4wFM+FYeqqmr8iE0Md/g9mzPzCtd7A0drDlT5xVBikvWZ0xKku pyARgWTXyjo/U62rwQFEgugjjXzjfMaIJwCS/4U1gmQpS7Abl+98SjBDpZVQ40k+8H4o Uy0A== X-Received: by 10.236.35.201 with SMTP id u49mr5508619yha.98.1398112618747; Mon, 21 Apr 2014 13:36:58 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id 44sm72734312yhp.17.2014.04.21.13.36.57 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 21 Apr 2014 13:36:58 -0700 (PDT) Date: Mon, 21 Apr 2014 16:36:55 -0400 From: Eric Whitney To: Dave Chinner Cc: Eric Whitney , xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH] generic: fix check for zero range support in generic/009 Message-ID: <20140421203655.GA960@wallace> X-ASG-Orig-Subj: Re: [PATCH] generic: fix check for zero range support in generic/009 References: <20140419190524.GA2116@wallace> <20140420005645.GB15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140420005645.GB15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-yh0-f43.google.com[209.85.213.43] X-Barracuda-Start-Time: 1398112619 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5125 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 * Dave Chinner : > On Sat, Apr 19, 2014 at 03:05:24PM -0400, Eric Whitney wrote: > > Generic/001 fails when run on a file system that does not support byte range > > zeroing. For example, an EOPNOTSUPP failure occurs when the test is run > > on a pre-3.15 extent-mapped file system. The code in the test intended > > to prevent this contains an apparent typo that results in a check for > > fallocate() rather than zero range support. > > > > Signed-off-by: Eric Whitney > > --- > > tests/generic/009 | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/tests/generic/009 b/tests/generic/009 > > index b7b0b3f..65abe3c 100644 > > --- a/tests/generic/009 > > +++ b/tests/generic/009 > > @@ -44,7 +44,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 > > > > # real QA test starts here > > _supported_os Linux > > -_require_xfs_io_falloc "fzero" > > +_require_xfs_io_command "fzero" > > There should be a helper in common/rc for this. i.e. > _require_xfs_io_fzero. There's helpers for everything else. Can you > add the helper and wire the tests up to it properly? > Sure. For naming consistency with the other related helper functions, it looks like we'd want to call this _require_xfs_io_falloc_zero(). I'm happy to change this if I'm mistaken. Patches on the way. Thanks, Eric From enwlinux@gmail.com Mon Apr 21 15:40:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 D19A329DF7 for ; Mon, 21 Apr 2014 15:40:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B44EF8F804B for ; Mon, 21 Apr 2014 13:40:28 -0700 (PDT) X-ASG-Debug-ID: 1398112827-04cb6c2438225f70001-NocioJ Received: from mail-yh0-f54.google.com (mail-yh0-f54.google.com [209.85.213.54]) by cuda.sgi.com with ESMTP id McmvcAwV5DTdlqZa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 13:40:27 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@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 f73so4016132yha.27 for ; Mon, 21 Apr 2014 13:40:27 -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=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=yYJ5dx4q7zJ6wEfu3pBEEHWV6oZ0P7wEMP2QKSd+gmg=; b=IcWqsUvACZv81M5OD/3g50646A8/lPARTbEN2WGJY7LNmla5Xcz56N9vwkYJCoBcDl HFF2FDEzWDChlf1KzzE/aE6x9yYFBb2vQE87im1d1BPp4slw/OTr9HYM5uTxfZCGhC43 xT5thxAJLkSyVA/YpbE+hlkYmGws2yKwwckIX0Lipl7d/mme3x/PAWmJ8mvvF6DGezC7 jKwssIzYRrw7OBmaKbiScGmaJibwSxuzN2Vz/hCg8wXUdlNSDo5cRdq2PjuwdqoGFbXl KPdAKoDC0bB8U82wyVXiCBoL50TFSfgFEw8EhQzZgLAnuxw5mWBvTxy/JMSCSDwYcI3o E1ag== X-Received: by 10.236.181.4 with SMTP id k4mr4253684yhm.129.1398112827176; Mon, 21 Apr 2014 13:40:27 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id s26sm68442092yhg.4.2014.04.21.13.40.26 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 21 Apr 2014 13:40:26 -0700 (PDT) Date: Mon, 21 Apr 2014 16:40:23 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH 1/3] xfstests: add helper for zero range support check Message-ID: <20140421204023.GB960@wallace> X-ASG-Orig-Subj: [PATCH 1/3] xfstests: add helper for zero range support check MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-yh0-f54.google.com[209.85.213.54] X-Barracuda-Start-Time: 1398112827 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add a helper function to verify fallocate zero range support in a style similar to _require_xfs_io_falloc_collapse(), etc. Signed-off-by: Eric Whitney --- common/rc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/rc b/common/rc index acf419b..bcda96a 100644 --- a/common/rc +++ b/common/rc @@ -1375,6 +1375,13 @@ _require_xfs_io_falloc_collapse() _require_xfs_io_command "fcollapse" } +# check that xfs_io, kernel, and filesystem all support fallocate with zero +# range +_require_xfs_io_falloc_zero() +{ + _require_xfs_io_command "fzero" +} + # check that xfs_io, kernel and filesystem support fiemap _require_xfs_io_fiemap() { -- 1.8.3.2 From enwlinux@gmail.com Mon Apr 21 15:43:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E852129DF7 for ; Mon, 21 Apr 2014 15:43:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BAAE58F804B for ; Mon, 21 Apr 2014 13:43:14 -0700 (PDT) X-ASG-Debug-ID: 1398112993-04cb6c2437226170001-NocioJ Received: from mail-yk0-f172.google.com (mail-yk0-f172.google.com [209.85.160.172]) by cuda.sgi.com with ESMTP id S1hdLBEowlqKLa0P (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 13:43:13 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.172] Received: by mail-yk0-f172.google.com with SMTP id 200so3848407ykr.31 for ; Mon, 21 Apr 2014 13:43:13 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=enJumf1toPtVCd/gi15I0+z0SZx5+WM9d8eQMgEVxUQ=; b=Vx1c5EXROXYBO7r/5lKlmwQ+ZMIz1hfmn7oSdHpfqnQubaLJ6GkXhH0AhJ1I2/HOj2 +JE9T2zWD3ZZ9dl/UnXbf02p5Vgj23eLkToAjD5c4LQQ2TkP41ooNlXvwjFY8WGnm+2J i7h1WE/3sDlDHVkadrvNZF5VyzyOUhQ+iZExIxWGVslFGIC15Ts+AwS5lO4TLDzFwOj1 I+p2YDmm4Sjx/S3KNyytct2AdW1A/BdeZuFRq1Q6aSa9uRwcb/4UOxrxFvLtiwzheFJ+ +5F4TUxPzd4mVDEf5+ELBUyZwt20IANN/hFv6UcY2fYK3gOClM+D4eWxNNg4aZrP3T7X Ntlw== X-Received: by 10.236.123.130 with SMTP id v2mr5650674yhh.85.1398112993383; Mon, 21 Apr 2014 13:43:13 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id o62sm72847445yha.27.2014.04.21.13.43.12 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 21 Apr 2014 13:43:12 -0700 (PDT) Date: Mon, 21 Apr 2014 16:43:09 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH v2 2/3] ext4: fix check for zero range support in ext4/001 Message-ID: <20140421204309.GC960@wallace> X-ASG-Orig-Subj: [PATCH v2 2/3] ext4: fix check for zero range support in ext4/001 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-yk0-f172.google.com[209.85.160.172] X-Barracuda-Start-Time: 1398112993 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Ext4/001 fails when run on a file system that does not support byte range zeroing. For example, an EOPNOTSUPP failure occurs when the test is run on a pre-3.15 extent-mapped file system. The code in the test intended to prevent this contains an apparent typo that results in a check for fallocate() rather than zero range support. v2: Use new wrapper function for the check. Signed-off-by: Eric Whitney --- tests/ext4/001 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ext4/001 b/tests/ext4/001 index d575d9a..8239f0e 100755 --- a/tests/ext4/001 +++ b/tests/ext4/001 @@ -45,7 +45,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_fs ext4 _supported_os Linux -_require_xfs_io_falloc "fzero" +_require_xfs_io_falloc_zero testfile=$TEST_DIR/001.$$ -- 1.8.3.2 From enwlinux@gmail.com Mon Apr 21 15:45:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1D60C29DF7 for ; Mon, 21 Apr 2014 15:45:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7945BAC005 for ; Mon, 21 Apr 2014 13:44:59 -0700 (PDT) X-ASG-Debug-ID: 1398113098-04cb6c24382262e0001-NocioJ Received: from mail-yk0-f174.google.com (mail-yk0-f174.google.com [209.85.160.174]) by cuda.sgi.com with ESMTP id Iffpmandnb1FW3oM (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 13:44:58 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.174] Received: by mail-yk0-f174.google.com with SMTP id 20so3802374yks.5 for ; Mon, 21 Apr 2014 13:44:57 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=974E+tb5Y7VTxcZjPk+1VQ5rab5r7YueEbTol3XM17o=; b=uUMgBR7ESQZ6IKQTkSSMVyXjRgJMdh8MewBnrubbR1GVRQkqlxxwVndPwQ+LS+ySvK jqdONPtngJ/w4ZXTMm/Z4IyK4XOBHjci7w9D9sfUrj2HGrfL3BAk6f99hbA+W86qYRhM jAVv9snuMCiwKGxBBroTzhO6wuEfUeXNY6fbpcFJpGuoL9kWQK1rfiyZoJkK7PM8fo9N B9Ags1uvkOen8/CkPar1tZU9YxAVx1wfadLySbZzpihd6ZBvzQ+fZhzMsOEbdUktmVlb te6JfGPh00ayKDiPzl6YZmFbXV0VwZUMvLnq9ZHJ5x3MOXp6S0NZukkhMmMT3f/bc9Fe r1TQ== X-Received: by 10.236.83.66 with SMTP id p42mr4806687yhe.122.1398113097903; Mon, 21 Apr 2014 13:44:57 -0700 (PDT) Received: from wallace (c-75-67-250-69.hsd1.nh.comcast.net. [75.67.250.69]) by mx.google.com with ESMTPSA id 46sm72881947yhg.36.2014.04.21.13.44.57 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 21 Apr 2014 13:44:57 -0700 (PDT) Date: Mon, 21 Apr 2014 16:44:54 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH v3 3/3] generic: fix check for zero range support in generic/009 Message-ID: <20140421204454.GD960@wallace> X-ASG-Orig-Subj: [PATCH v3 3/3] generic: fix check for zero range support in generic/009 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-yk0-f174.google.com[209.85.160.174] X-Barracuda-Start-Time: 1398113098 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5124 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 Generic/001 fails when run on a file system that does not support byte range zeroing. For example, an EOPNOTSUPP failure occurs when the test is run on a pre-3.15 extent-mapped file system. The code in the test intended to prevent this contains an apparent typo that results in a check for fallocate() rather than zero range support. v2: Use new helper function for the check. Signed-off-by: Eric Whitney --- tests/generic/009 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/generic/009 b/tests/generic/009 index b7b0b3f..b4d3e4b 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -44,7 +44,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_os Linux -_require_xfs_io_falloc "fzero" +_require_xfs_io_falloc_zero testfile=$TEST_DIR/009.$$ -- 1.8.3.2 From sandeen@redhat.com Mon Apr 21 15:45:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 53CDC29DFF for ; Mon, 21 Apr 2014 15:45:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B02A8F804B for ; Mon, 21 Apr 2014 13:45:10 -0700 (PDT) X-ASG-Debug-ID: 1398113109-04bdf04555231630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dlCREt1feFmMFWrq for ; Mon, 21 Apr 2014 13:45:10 -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 s3LKj9Tw009257 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 21 Apr 2014 16:45:09 -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 s3LKj7J1007987 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 21 Apr 2014 16:45:08 -0400 Message-ID: <53558354.5040309@redhat.com> Date: Mon, 21 Apr 2014 15:45:08 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() 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: 1398113109 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Coverity noticed that if we sent junk into xfs_qm_scall_trunc_qfiles(), we could get back an uninitialized error value. So sanitize the flags we will accept, and initialize error anyway for good measure. (This bug may have been introduced via c61a9e39). Should resolve Coverity CID 1163872. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 3daf5ea..17ec2c2 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -278,9 +279,10 @@ xfs_qm_scall_trunc_qfiles( xfs_mount_t *mp, uint flags) { - int error; + int error = EINVAL; - if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) { + if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0 || + (flags & ~XFS_DQ_ALLTYPES)) { xfs_debug(mp, "%s: flags=%x m_qflags=%x", __func__, flags, mp->m_qflags); return XFS_ERROR(EINVAL); From david@fromorbit.com Mon Apr 21 18:13:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DBF757F3F for ; Mon, 21 Apr 2014 18:13:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A83C2304053 for ; Mon, 21 Apr 2014 16:13:45 -0700 (PDT) X-ASG-Debug-ID: 1398122023-04bdf04552238760001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 5UfGEEHO0k8264xM for ; Mon, 21 Apr 2014 16:13:43 -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: AlZxAM+lVVN5LEcvPGdsb2JhbABZgwaIbqJok36FZIEeFwMBAQEBODWCJQEBBAE6HCMFCwgDDgoJJQ8FJQMHGhOIOQfNRRcWjkwHgySBFASYbZYTKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 08:43:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcNOe-00073x-Kt; Tue, 22 Apr 2014 09:13:08 +1000 Date: Tue, 22 Apr 2014 09:13:08 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/9] db: don't claim unchecked CRCs are correct Message-ID: <20140421231308.GB18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/9] db: don't claim unchecked CRCs are correct References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-2-git-send-email-david@fromorbit.com> <20140421070009.GC20384@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421070009.GC20384@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398122023 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 21, 2014 at 12:00:09AM -0700, Christoph Hellwig wrote: > > + switch (iocur_crc_valid()) { > > + case -1: > > + ok = "unchecked"; > > + break; > > + case 0: > > + ok = "bad"; > > + break; > > + case 1: > > + ok = "correct"; > > + break; > > + default: > > + ok = "unknown state"; > > + break; > > + } > > We should have symbolic constants for these return values. But then > again iocur_crc_valid only has a single caller currently, is it even > worth the effort, or should we simply inline it? If we grow another user, I'll add an enum for it... > Otherwise looks good, > > Reviewed-by: Christoph Hellwig Thanks. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 21 18:14:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 535BC7F3F for ; Mon, 21 Apr 2014 18:14:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2720E8F8066 for ; Mon, 21 Apr 2014 16:14:15 -0700 (PDT) X-ASG-Debug-ID: 1398122053-04cbb06e9c22c280001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ZTDWEy6vz0t6iou3 for ; Mon, 21 Apr 2014 16:14:13 -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: AlRxAM+lVVN5LEcvPGdsb2JhbABZgwaIbqJok36FZIEeFwMBAQEBODWCJQEBBScTHCMQCAMOCgklDwUlAwcaE4hAzUUXFo5MB4MkgRQBA5htlhMr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 08:44:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcNPW-000748-8d; Tue, 22 Apr 2014 09:14:02 +1000 Date: Tue, 22 Apr 2014 09:14:02 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] db: verify buffer on type change Message-ID: <20140421231402.GC18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/9] db: verify buffer on type change References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-3-git-send-email-david@fromorbit.com> <20140421070252.GD20384@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421070252.GD20384@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398122053 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 21, 2014 at 12:02:52AM -0700, Christoph Hellwig wrote: > > +void > > +set_iocur_type( > > + const typ_t *t) > > +{ > > + const struct xfs_buf_ops *ops = t ? t->bops : NULL; > > + struct xfs_buf *bp = iocur_top->bp; > > + > > + iocur_top->typ = t; > > + > > + /* verify the buffer if the type has one. */ > > + if (!bp) > > + return; > > + if (!ops) { > > + bp->b_ops = NULL; > > + bp->b_flags |= LIBXFS_B_UNCHECKED; > > + return; > > + } > > The only caller currently makes sure we never pass a NULL t argument, > and I think keeping it that way is sensible. If we want to allow > clearing the type we should add a separate clear_iocur_type helper for > it. Ok, I'll clear the conditional initialisation of *ops. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 21 18:27:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED35C7F3F for ; Mon, 21 Apr 2014 18:27:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CBD69304053 for ; Mon, 21 Apr 2014 16:27:30 -0700 (PDT) X-ASG-Debug-ID: 1398122844-04cb6c243622dba0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id R1fagY6WsF2bIolA for ; Mon, 21 Apr 2014 16:27: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: AldxAPOnVVN5LEcvPGdsb2JhbABZgwaIbqJok36FZIEeFwMBAQEBODWCJQEBBAEnExwjEAgDDgcDCSUPBSUDBxoTiDkHzUcXFo5MB4MkgRQEmG2WEyuBLiQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 08:57:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcNcR-00075e-9H; Tue, 22 Apr 2014 09:27:23 +1000 Date: Tue, 22 Apr 2014 09:27:23 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-ID: <20140421232723.GD18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-10-git-send-email-david@fromorbit.com> <20140416132503.GC4180@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416132503.GC4180@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398122844 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 09:25:04AM -0400, Brian Foster wrote: > On Tue, Apr 15, 2014 at 06:25:01PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Currently the attribute code will not detect and correct errors in > > the attribute tree. It also fails to validate the CRCs and headers > > on remote attribute blocks. Ensure that all the attribute blocks are > > CRC checked and that the processing functions understand the correct > > block formats for decoding. > > > > Signed-off-by: Dave Chinner > > --- > > repair/attr_repair.c | 35 ++++++++++++++++++++++++++++------- > > 1 file changed, 28 insertions(+), 7 deletions(-) > > > > diff --git a/repair/attr_repair.c b/repair/attr_repair.c > > index ba85ac2..13ec90e 100644 > > --- a/repair/attr_repair.c > > +++ b/repair/attr_repair.c > > @@ -611,6 +611,8 @@ verify_da_path(xfs_mount_t *mp, > > ASSERT(cursor->level[this_level].dirty == 0 || > > (cursor->level[this_level].dirty && !no_modify)); > > > > + if (bp->b_error == EFSBADCRC) > > + cursor->level[this_level].dirty++; > > I was wondering why this wasn't checked closer to the readbuf call, then > I noticed the assert. Any reason not to be consistent with the other > changes, move this up closer to the call and nuke the assert? Because I didn't want to modify the cursor state if the buffer failed the basic checks (i.e. if (bad) {... return} branch was taken) as if it is bad we aren't even going to try to repair it. Hence marking it dirty for writeout when it might not even be an attr block is probably a bad thing... > > if (!bp) { > > do_warn( > > _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), > > da_bno, dev_bno, ino); > > goto error_out; > > } > > + if (bp->b_error == EFSBADCRC) > > + repair++; > > Could you remind me why we only check EFSBADCRC in some places and > EFSCORRUPTED as well in others? Here we are checking and repairing the buffer, so EFSCORRUPTED detection doesn't provide any value - if there is a corruption, repair will already handle it and fix it. Hence this is here to catch a buffer with a bad CRC but is otherwise good (e.g. bit error in usused/unreferenced space in the metadata block). > > > > > leaf = bp->b_addr; > > xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); > > @@ -1382,9 +1401,9 @@ process_leaf_attr_level(xfs_mount_t *mp, > > > > current_hashval = greatest_hashval; > > > > - if (repair && !no_modify) > > + if (repair && !no_modify) > > libxfs_writebuf(bp, 0); > > - else > > + else > > libxfs_putbuf(bp); > > } while (da_bno != 0); > > > > @@ -1512,6 +1531,8 @@ process_longform_attr( > > ino); > > return(1); > > } > > + if (bp->b_error == EFSBADCRC) > > + (*repair)++; > > Note that repair is unconditionally reset to 0 at the beginning of > process_leaf_attr_block() (in the XFS_ATTR_LEAF_MAGIC case further down > this function). Oh, so it is. I missed that. Good catch! Will fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 21 18:35:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B575B7F3F for ; Mon, 21 Apr 2014 18:35:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 345FDAC007 for ; Mon, 21 Apr 2014 16:35:16 -0700 (PDT) X-ASG-Debug-ID: 1398123313-04cb6c243722e140001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id sr4cTuQKfJJEMmHz for ; Mon, 21 Apr 2014 16:35:14 -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: AlhxAHuqVVN5LEcvPGdsb2JhbABZgwaIbqJok36FZIEeFwMBAQEBODWCJQEBBAEnExwjBQsIAw4HAwklDwUlAwcaE4g5B800FxaOTAeDJIEUBJhtlhMr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 09:05:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcNk0-00076h-8B; Tue, 22 Apr 2014 09:35:12 +1000 Date: Tue, 22 Apr 2014 09:35:12 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140421233512.GE18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> <20140421071106.GF20384@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421071106.GF20384@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398123313 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 21, 2014 at 12:11:06AM -0700, Christoph Hellwig wrote: > On Tue, Apr 15, 2014 at 06:24:57PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > repair doesn't currently detect verifier errors in AG header > > blocks - apart from the primary superblock they are not detected. > > They are, fortunately, corrected in the important cases (AGF, AGI > > and AGFL) because these structures are rebuilt in phase 5, but if > > you run xfs_repair in checking mode it won't report them as bad. > > Shouldn't we apply the same scheme as for directories here, that is if > it fails with a verifier error re-read without the verifier and then > still do the full check as well? The directory code is the special case - it uses xfs_trans_read_buf* interfaces, which return either a good buffer with no error or an error with no buffer. Hence for the directory code, we have to re-read the buffer without the verifier to grab the unchecked buffer from the cache when the verifier detects an error. > Btw, it might make sense to have special read_buf variants in libxfs > that always return a valid buffer even if the verifier fails, just > telling us about it without having to re-read. That's exactly what they do now - you get the xfs_buf, the data in bp->b_addr and the verifier error in bp->b_error all in one call. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 21 18:44:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 44E337F3F for ; Mon, 21 Apr 2014 18: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 F06DF8F8068 for ; Mon, 21 Apr 2014 16:44:00 -0700 (PDT) X-ASG-Debug-ID: 1398123838-04bdf04555239d70001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ySB31F3UwMTIoKqX for ; Mon, 21 Apr 2014 16:43:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: As1yANWsVVN5LEcvPGdsb2JhbABZgwZPiB+iYgaTfoVkgR4XAwEBAQE4NYIlAQEEATocIwULCAMOCgklDwUlAwcaE4g5B802FxaOTAeDJIEUBJhtimuLKCs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 09:13:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcNrp-00077S-Ne; Tue, 22 Apr 2014 09:43:17 +1000 Date: Tue, 22 Apr 2014 09:43:17 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Steven Rostedt , Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140421234317.GF18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> <20140416175117.GA23643@infradead.org> <534EC42D.1080704@sandeen.net> <534ED5E4.60903@sandeen.net> <20140416220807.GN15995@dastard> <20140416194444.50176f0f@gandalf.local.home> <20140417003956.GS15995@dastard> <20140421065746.GA20384@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421065746.GA20384@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398123838 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5132 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Apr 20, 2014 at 11:57:46PM -0700, Christoph Hellwig wrote: > On Thu, Apr 17, 2014 at 10:39:56AM +1000, Dave Chinner wrote: > > so, basically a script that does: > > > > #!/bin/bash > > > > TRACEDIR=/sys/kernel/debug/tracing > > > > grep -i 't xfs_' /proc/kallsyms | awk '{print $3}' ; while read F; do > > echo "r:ret_$F $F \$retval" >> $TRACEDIR/kprobe_events > > done > > > > for E in $TRACEDIR/events/kprobes/ret_xfs_*/enable; do > > echo 1 > $E > > done; > > > > echo 'arg1 > 0xffffffffffffff00' > $TRACEDIR/events/kprobes/filter > > > > for T in $TRACEDIR/events/kprobes/ret_xfs_*/trigger; do > > echo 'traceoff if arg1 > 0xffffffffffffff00' > $T > > done > > This looks incredibly useful! Can we throw this into Documentation/ as > a helper script (and make the xfs a command line parameter so it's > genericly useful)? So does that mean you have no more objections to removing XFS_ERROR()? The thing is, that's a quick hack that spews errors all over the place, especially if you run it twice. It needs a counterpart to turn off the tracing, clean up the triggers, etc.... FWIW, what I'd really like is a trace event trigger that triggers a BUG(), so that we can use it to drop into kernel debuggers or get kdump to generate a core that can be analysed offline... > One think that would be nice is to specify a module instead of relying > on a clean namespace, but to replace the XFS functionality the one above > is more than enough. My current hack is invoked like this: $ grep -i 't xfs_' /proc/kallsyms | retval_filter.sh Makes it completely independent of how you supply the symbols to the function. Hence my coments about how it'd be really cool to have this built into in trace-cmd, because the mechanism is independent of how you specify the function list... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Apr 21 18:52:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 574427F3F for ; Mon, 21 Apr 2014 18:52:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2A173304053 for ; Mon, 21 Apr 2014 16:52:53 -0700 (PDT) X-ASG-Debug-ID: 1398124371-04cb6c243922edc0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id wCZJpyrG9bGjepOV for ; Mon, 21 Apr 2014 16:52:52 -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: AldxAPetVVN5LEcvPGdsb2JhbABZgwaIbqJok36FZIEfFwMBAQEBODWCJQEBBTocIxAIAw4HAgEJJQ8FJQMHDA4TiEDNLBcWjkwHhDgEmG2Ka4soKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 09:22:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcO13-00078e-Us; Tue, 22 Apr 2014 09:52:49 +1000 Date: Tue, 22 Apr 2014 09:52:49 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Jeff Liu , "xfs@oss.sgi.com" Subject: Re: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single Message-ID: <20140421235249.GG18672@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single References: <535078AD.5050209@oracle.com> <20140421141148.GA27064@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421141148.GA27064@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398124371 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5132 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 21, 2014 at 07:11:48AM -0700, Christoph Hellwig wrote: > On Fri, Apr 18, 2014 at 08:58:21AM +0800, Jeff Liu wrote: > > From: Jie Liu > > > > In xfs_bulkstat_single(), call xfs_bulkstat_one() and xfs_bulkstat() > > would return different error if either failed, we'd better return the > > proper error in this case. Moreover, the function argument done is > > useless in terms of xfs_ioc_bulkstat(), hence we can get rid of it. > > I've looked at xfs_bulkstat_single I really can't see how falling back > to the full xfs_bulkstat could fix any error. We probably should just > get rid of the fallback and instead do something like the (lightly tested) > patch below: > > --- > From: Christoph Hellwig > Subject: xfs: remove xfs_bulkstat_single > > xfs_bukstat_one doesn't have any failure case that would go away when > called through xfs_bulkstat, so remove the fallback and the now unessecary > xfs_bulkstat_single function. > > Signed-off-by: Christoph Hellwig *nod* I like this approach :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Apr 21 19:00:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 572C27F3F for ; Mon, 21 Apr 2014 19:00:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13F0C8F8035 for ; Mon, 21 Apr 2014 17:00:31 -0700 (PDT) X-ASG-Debug-ID: 1398124827-04bdf0455223a8f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id d8lVl5wzJXmr22Je for ; Mon, 21 Apr 2014 17:00:28 -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: AodwAGKwVVN5LEcvPGdsb2JhbABRCIMGiG6iaJsBFwMBAQEBODWCJQEtLyMYGGoDBy0ZiCfNQI4MCYUMBKx8ggQrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 09:26:06 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WcO4D-00079L-SU; Tue, 22 Apr 2014 09:56:05 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WcO4D-0003T5-Qh; Tue, 22 Apr 2014 09:56:05 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: viro@ZenIV.linux.org.uk Subject: [PATCH] xfs: remove dquot hints Date: Tue, 22 Apr 2014 09:56:05 +1000 X-ASG-Orig-Subj: [PATCH] xfs: remove dquot hints Message-Id: <1398124565-13299-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398124827 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5132 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner group and project quota hints are currently stored on the user dquot. If we are attaching quotas to the inode, then the group and project dquots are stored as hints on the user dquot to save having to look them up again later. The thing is, the hints are not used for that inode for the rest of the life of the inode - the dquots are attached directly to the inode itself - so the only time the hints are used is when an inode first has dquots attached. When the hints on the user dquot don't match the dquots being attache dto the inode, they are then removed and replaced with the new hints. If a user is concurrently modifying files in different group and/or project contexts, then this leads to thrashing of the hints attached to user dquot. If user quotas are not enabled, then hints are never even used. So, if the hints are used to avoid the cost of the lookup, is the cost of the lookup significant enough to justify the hint infrstructure? Maybe it was once, when there was a global quota manager shared between all XFS filesystems and was hash table based. However, lookups are now much simpler, requiring only a single lock and radix tree lookup local to the filesystem and no hash or LRU manipulations to be made. Hence the cost of lookup is much lower than when hints were implemented. Turns out that benchmarks show that, too, with thir being no differnce in performance when doing file creation workloads as a single user with user, group and project quotas enabled - the hints do not make the code go any faster. In fact, removing the hints shows a 2-3% reduction in the time it takes to create 50 million inodes.... So, let's just get rid of the hints and the complexity around them. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dquot.c | 53 ++----------- fs/xfs/xfs_dquot.h | 2 - fs/xfs/xfs_qm.c | 214 ++++++----------------------------------------------- 3 files changed, 29 insertions(+), 240 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 868b19f..5fec738 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -832,47 +832,6 @@ restart: return (0); } - -STATIC void -xfs_qm_dqput_final( - struct xfs_dquot *dqp) -{ - struct xfs_quotainfo *qi = dqp->q_mount->m_quotainfo; - struct xfs_dquot *gdqp; - struct xfs_dquot *pdqp; - - trace_xfs_dqput_free(dqp); - - if (list_lru_add(&qi->qi_lru, &dqp->q_lru)) - XFS_STATS_INC(xs_qm_dquot_unused); - - /* - * If we just added a udquot to the freelist, then we want to release - * the gdquot/pdquot reference that it (probably) has. Otherwise it'll - * keep the gdquot/pdquot from getting reclaimed. - */ - gdqp = dqp->q_gdquot; - if (gdqp) { - xfs_dqlock(gdqp); - dqp->q_gdquot = NULL; - } - - pdqp = dqp->q_pdquot; - if (pdqp) { - xfs_dqlock(pdqp); - dqp->q_pdquot = NULL; - } - xfs_dqunlock(dqp); - - /* - * If we had a group/project quota hint, release it now. - */ - if (gdqp) - xfs_qm_dqput(gdqp); - if (pdqp) - xfs_qm_dqput(pdqp); -} - /* * Release a reference to the dquot (decrement ref-count) and unlock it. * @@ -888,10 +847,14 @@ xfs_qm_dqput( trace_xfs_dqput(dqp); - if (--dqp->q_nrefs > 0) - xfs_dqunlock(dqp); - else - xfs_qm_dqput_final(dqp); + if (--dqp->q_nrefs == 0) { + struct xfs_quotainfo *qi = dqp->q_mount->m_quotainfo; + trace_xfs_dqput_free(dqp); + + if (list_lru_add(&qi->qi_lru, &dqp->q_lru)) + XFS_STATS_INC(xs_qm_dquot_unused); + } + xfs_dqunlock(dqp); } /* diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index d22ed00..68a68f7 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -52,8 +52,6 @@ typedef struct xfs_dquot { int q_bufoffset; /* off of dq in buffer (# dquots) */ xfs_fileoff_t q_fileoffset; /* offset in quotas file */ - struct xfs_dquot*q_gdquot; /* group dquot, hint only */ - struct xfs_dquot*q_pdquot; /* project dquot, hint only */ xfs_disk_dquot_t q_core; /* actual usage & quotas */ xfs_dq_logitem_t q_logitem; /* dquot log item */ xfs_qcnt_t q_res_bcount; /* total regular nblks used+reserved */ diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 348e4d2..72bd0e8 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -193,47 +193,6 @@ xfs_qm_dqpurge( } /* - * Release the group or project dquot pointers the user dquots maybe carrying - * around as a hint, and proceed to purge the user dquot cache if requested. -*/ -STATIC int -xfs_qm_dqpurge_hints( - struct xfs_dquot *dqp, - void *data) -{ - struct xfs_dquot *gdqp = NULL; - struct xfs_dquot *pdqp = NULL; - uint flags = *((uint *)data); - - xfs_dqlock(dqp); - if (dqp->dq_flags & XFS_DQ_FREEING) { - xfs_dqunlock(dqp); - return EAGAIN; - } - - /* If this quota has a hint attached, prepare for releasing it now */ - gdqp = dqp->q_gdquot; - if (gdqp) - dqp->q_gdquot = NULL; - - pdqp = dqp->q_pdquot; - if (pdqp) - dqp->q_pdquot = NULL; - - xfs_dqunlock(dqp); - - if (gdqp) - xfs_qm_dqrele(gdqp); - if (pdqp) - xfs_qm_dqrele(pdqp); - - if (flags & XFS_QMOPT_UQUOTA) - return xfs_qm_dqpurge(dqp, NULL); - - return 0; -} - -/* * Purge the dquot cache. */ void @@ -241,18 +200,8 @@ xfs_qm_dqpurge_all( struct xfs_mount *mp, uint flags) { - /* - * We have to release group/project dquot hint(s) from the user dquot - * at first if they are there, otherwise we would run into an infinite - * loop while walking through radix tree to purge other type of dquots - * since their refcount is not zero if the user dquot refers to them - * as hint. - * - * Call the special xfs_qm_dqpurge_hints() will end up go through the - * general xfs_qm_dqpurge() against user dquot cache if requested. - */ - xfs_qm_dquot_walk(mp, XFS_DQ_USER, xfs_qm_dqpurge_hints, &flags); - + if (flags & XFS_QMOPT_UQUOTA) + xfs_qm_dquot_walk(mp, XFS_DQ_USER, xfs_qm_dqpurge, NULL); if (flags & XFS_QMOPT_GQUOTA) xfs_qm_dquot_walk(mp, XFS_DQ_GROUP, xfs_qm_dqpurge, NULL); if (flags & XFS_QMOPT_PQUOTA) @@ -409,7 +358,6 @@ xfs_qm_dqattach_one( xfs_dqid_t id, uint type, uint doalloc, - xfs_dquot_t *udqhint, /* hint */ xfs_dquot_t **IO_idqpp) { xfs_dquot_t *dqp; @@ -419,9 +367,9 @@ xfs_qm_dqattach_one( error = 0; /* - * See if we already have it in the inode itself. IO_idqpp is - * &i_udquot or &i_gdquot. This made the code look weird, but - * made the logic a lot simpler. + * See if we already have it in the inode itself. IO_idqpp is &i_udquot + * or &i_gdquot. This made the code look weird, but made the logic a lot + * simpler. */ dqp = *IO_idqpp; if (dqp) { @@ -430,49 +378,10 @@ xfs_qm_dqattach_one( } /* - * udqhint is the i_udquot field in inode, and is non-NULL only - * when the type arg is group/project. Its purpose is to save a - * lookup by dqid (xfs_qm_dqget) by caching a group dquot inside - * the user dquot. - */ - if (udqhint) { - ASSERT(type == XFS_DQ_GROUP || type == XFS_DQ_PROJ); - xfs_dqlock(udqhint); - - /* - * No need to take dqlock to look at the id. - * - * The ID can't change until it gets reclaimed, and it won't - * be reclaimed as long as we have a ref from inode and we - * hold the ilock. - */ - if (type == XFS_DQ_GROUP) - dqp = udqhint->q_gdquot; - else - dqp = udqhint->q_pdquot; - if (dqp && be32_to_cpu(dqp->q_core.d_id) == id) { - ASSERT(*IO_idqpp == NULL); - - *IO_idqpp = xfs_qm_dqhold(dqp); - xfs_dqunlock(udqhint); - return 0; - } - - /* - * We can't hold a dquot lock when we call the dqget code. - * We'll deadlock in no time, because of (not conforming to) - * lock ordering - the inodelock comes before any dquot lock, - * and we may drop and reacquire the ilock in xfs_qm_dqget(). - */ - xfs_dqunlock(udqhint); - } - - /* - * Find the dquot from somewhere. This bumps the - * reference count of dquot and returns it locked. - * This can return ENOENT if dquot didn't exist on - * disk and we didn't ask it to allocate; - * ESRCH if quotas got turned off suddenly. + * Find the dquot from somewhere. This bumps the reference count of + * dquot and returns it locked. This can return ENOENT if dquot didn't + * exist on disk and we didn't ask it to allocate; ESRCH if quotas got + * turned off suddenly. */ error = xfs_qm_dqget(ip->i_mount, ip, id, type, doalloc | XFS_QMOPT_DOWARN, &dqp); @@ -490,48 +399,6 @@ xfs_qm_dqattach_one( return 0; } - -/* - * Given a udquot and group/project type, attach the group/project - * dquot pointer to the udquot as a hint for future lookups. - */ -STATIC void -xfs_qm_dqattach_hint( - struct xfs_inode *ip, - int type) -{ - struct xfs_dquot **dqhintp; - struct xfs_dquot *dqp; - struct xfs_dquot *udq = ip->i_udquot; - - ASSERT(type == XFS_DQ_GROUP || type == XFS_DQ_PROJ); - - xfs_dqlock(udq); - - if (type == XFS_DQ_GROUP) { - dqp = ip->i_gdquot; - dqhintp = &udq->q_gdquot; - } else { - dqp = ip->i_pdquot; - dqhintp = &udq->q_pdquot; - } - - if (*dqhintp) { - struct xfs_dquot *tmp; - - if (*dqhintp == dqp) - goto done; - - tmp = *dqhintp; - *dqhintp = NULL; - xfs_qm_dqrele(tmp); - } - - *dqhintp = xfs_qm_dqhold(dqp); -done: - xfs_dqunlock(udq); -} - static bool xfs_qm_need_dqattach( struct xfs_inode *ip) @@ -562,7 +429,6 @@ xfs_qm_dqattach_locked( uint flags) { xfs_mount_t *mp = ip->i_mount; - uint nquotas = 0; int error = 0; if (!xfs_qm_need_dqattach(ip)) @@ -570,77 +436,39 @@ xfs_qm_dqattach_locked( ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - if (XFS_IS_UQUOTA_ON(mp)) { + if (XFS_IS_UQUOTA_ON(mp) && !ip->i_udquot) { error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER, flags & XFS_QMOPT_DQALLOC, - NULL, &ip->i_udquot); + &ip->i_udquot); if (error) goto done; - nquotas++; + ASSERT(ip->i_udquot); } - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - if (XFS_IS_GQUOTA_ON(mp)) { + if (XFS_IS_GQUOTA_ON(mp) && !ip->i_gdquot) { error = xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP, flags & XFS_QMOPT_DQALLOC, - ip->i_udquot, &ip->i_gdquot); - /* - * Don't worry about the udquot that we may have - * attached above. It'll get detached, if not already. - */ + &ip->i_gdquot); if (error) goto done; - nquotas++; + ASSERT(ip->i_gdquot); } - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - if (XFS_IS_PQUOTA_ON(mp)) { + if (XFS_IS_PQUOTA_ON(mp) && !ip->i_pdquot) { error = xfs_qm_dqattach_one(ip, xfs_get_projid(ip), XFS_DQ_PROJ, flags & XFS_QMOPT_DQALLOC, - ip->i_udquot, &ip->i_pdquot); - /* - * Don't worry about the udquot that we may have - * attached above. It'll get detached, if not already. - */ + &ip->i_pdquot); if (error) goto done; - nquotas++; + ASSERT(ip->i_pdquot); } +done: /* - * Attach this group/project quota to the user quota as a hint. - * This WON'T, in general, result in a thrash. + * Don't worry about the dquots that we may have attached before any + * error - they'll get detached later if it has not already been done. */ - if (nquotas > 1 && ip->i_udquot) { - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(ip->i_gdquot || !XFS_IS_GQUOTA_ON(mp)); - ASSERT(ip->i_pdquot || !XFS_IS_PQUOTA_ON(mp)); - - /* - * We do not have i_udquot locked at this point, but this check - * is OK since we don't depend on the i_gdquot to be accurate - * 100% all the time. It is just a hint, and this will - * succeed in general. - */ - if (ip->i_udquot->q_gdquot != ip->i_gdquot) - xfs_qm_dqattach_hint(ip, XFS_DQ_GROUP); - - if (ip->i_udquot->q_pdquot != ip->i_pdquot) - xfs_qm_dqattach_hint(ip, XFS_DQ_PROJ); - } - - done: -#ifdef DEBUG - if (!error) { - if (XFS_IS_UQUOTA_ON(mp)) - ASSERT(ip->i_udquot); - if (XFS_IS_GQUOTA_ON(mp)) - ASSERT(ip->i_gdquot); - if (XFS_IS_PQUOTA_ON(mp)) - ASSERT(ip->i_pdquot); - } ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); -#endif return error; } -- 1.9.0 From david@fromorbit.com Mon Apr 21 19:09:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE06A7F3F for ; Mon, 21 Apr 2014 19:09:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD3498F8040 for ; Mon, 21 Apr 2014 17:09:26 -0700 (PDT) X-ASG-Debug-ID: 1398125364-04cbb06e9d22e860001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id X3c52aWHFN6tTTXs for ; Mon, 21 Apr 2014 17:09:24 -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: AlNxANuyVVN5LEcvPGdsb2JhbABZgwaIbqJok36FZIEgFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDNKxcWjWhkB4Q4BJhtlhMrgSw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Apr 2014 09:37:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcOFf-0007B8-EU; Tue, 22 Apr 2014 10:07:55 +1000 Date: Tue, 22 Apr 2014 10:07:55 +1000 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] generic/009: get the correct dev name when testing ext4 Message-ID: <20140422000755.GH18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] generic/009: get the correct dev name when testing ext4 References: <1397708214-8197-1-git-send-email-eguan@redhat.com> <1397708214-8197-3-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397708214-8197-3-git-send-email-eguan@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: 1398125364 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5132 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 Thu, Apr 17, 2014 at 12:16:54PM +0800, Eryu Guan wrote: > If TEST_DEV is a symlink(usually a lvm), we get the wrong DEV > name. Follow link and get the correct dev name. > > Signed-off-by: Eryu Guan > --- > tests/generic/009 | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tests/generic/009 b/tests/generic/009 > index 1e487b4..7675c69 100644 > --- a/tests/generic/009 > +++ b/tests/generic/009 > @@ -51,7 +51,7 @@ testfile=$TEST_DIR/009.$$ > > # Disable extent zeroing for ext4 as that change where holes are created > if [ "$FSTYP" = "ext4" ]; then > - DEV=`basename $TEST_DEV` > + DEV=`basename $(readlink -f $TEST_DEV)` > echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb > fi We've made this mistake several times now. Can you add a function in common/rc that does this. e.g. "_real_dev()" and replace all the current 'readlink -f $DEV' calls with that function? i.e. something like: _real_dev() { local _dev=$1 if [ -L "$_dev" ]; then _dev=`readlink -f $_dev` fi echo $_dev } _short_dev() { echo `basename $(_real_dev $1)` } Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Mon Apr 21 22:13:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F4A87F3F for ; Mon, 21 Apr 2014 22:13:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88E9D8F8064 for ; Mon, 21 Apr 2014 20:13:52 -0700 (PDT) X-ASG-Debug-ID: 1398136431-04cbb06e9b236290001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vIQme8qDsusGC231 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 20:13:51 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3M3DOoQ008409 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 03:13:24 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3M3DLEM008706 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Apr 2014 03:13:22 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3M3DLp2018017; Tue, 22 Apr 2014 03:13:21 GMT Received: from [10.191.15.36] (/10.191.15.36) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 21 Apr 2014 20:13:20 -0700 Message-ID: <5355DE4B.2000009@oracle.com> Date: Tue, 22 Apr 2014 11:13:15 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig , Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single References: <535078AD.5050209@oracle.com> <20140421141148.GA27064@infradead.org> <20140421235249.GG18672@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 02/10] xfs: consolidate xfs_bulkstat_single In-Reply-To: <20140421235249.GG18672@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1398136431 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/22 2014 07:52 PM, Dave Chinner wrote: > On Mon, Apr 21, 2014 at 07:11:48AM -0700, Christoph Hellwig wrote: >> On Fri, Apr 18, 2014 at 08:58:21AM +0800, Jeff Liu wrote: >>> From: Jie Liu >>> >>> In xfs_bulkstat_single(), call xfs_bulkstat_one() and xfs_bulkstat() >>> would return different error if either failed, we'd better return the >>> proper error in this case. Moreover, the function argument done is >>> useless in terms of xfs_ioc_bulkstat(), hence we can get rid of it. >> >> I've looked at xfs_bulkstat_single I really can't see how falling back >> to the full xfs_bulkstat could fix any error. We probably should just >> get rid of the fallback and instead do something like the (lightly tested) >> patch below: >> >> --- >> From: Christoph Hellwig >> Subject: xfs: remove xfs_bulkstat_single >> >> xfs_bukstat_one doesn't have any failure case that would go away when >> called through xfs_bulkstat, so remove the fallback and the now unessecary >> xfs_bulkstat_single function. >> >> Signed-off-by: Christoph Hellwig > > *nod* > > I like this approach :) I reconsidered the call interface in xfs_fsr and xfs_io/parent. Yep, your idea is better and the patch looks good to me. Thanks, -Jeff From eguan@redhat.com Mon Apr 21 22:27:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8B23D7F3F for ; Mon, 21 Apr 2014 22:27:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D7E3AC005 for ; Mon, 21 Apr 2014 20:27:51 -0700 (PDT) X-ASG-Debug-ID: 1398137260-04cb6c24392383a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wKkQ40ylfmqPbMOD for ; Mon, 21 Apr 2014 20:27:40 -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 s3M3ReF7023966 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 21 Apr 2014 23:27:40 -0400 Received: from localhost (vpn1-114-140.nay.redhat.com [10.66.114.140]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3M3RcUn025054; Mon, 21 Apr 2014 23:27:39 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] common: new function to get real device path name and basename Date: Tue, 22 Apr 2014 11:27:27 +0800 X-ASG-Orig-Subj: [PATCH] common: new function to get real device path name and basename Message-Id: <1398137247-4883-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: 1398137260 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 If TEST_DEV or SCRATCH_DEV is symlink(mostly a lvm lv), a simple basename is not enough, symlink should be followed. This task is common enough, so introduce new helper functions and replace all readlink calls in ext4/305 generic/009 generic/019 generic/285 generic/312 Signed-off-by: Eryu Guan --- common/rc | 16 ++++++++++++++++ tests/ext4/305 | 2 +- tests/generic/009 | 2 +- tests/generic/019 | 4 +--- tests/generic/285 | 2 +- tests/generic/312 | 2 +- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/common/rc b/common/rc index acf419b..68b040d 100644 --- a/common/rc +++ b/common/rc @@ -2302,6 +2302,22 @@ init_rc() export XFS_IO_PROG="$XFS_IO_PROG -F" } +# get real device path name by following link +_real_dev() +{ + local _dev=$1 + if [ -b "$_dev" ] && [ -L "$_dev" ]; then + _dev=`readlink -f "$_dev"` + fi + echo $_dev +} + +# basename of a device +_basename_dev() +{ + echo `basename $(_real_dev $1)` +} + init_rc ################################################################################ diff --git a/tests/ext4/305 b/tests/ext4/305 index eee461a..645f5c8 100755 --- a/tests/ext4/305 +++ b/tests/ext4/305 @@ -49,7 +49,7 @@ _require_scratch rm -f $seqres.full echo "Silence is golden" -DEV_BASENAME=$(basename $(readlink -f $SCRATCH_DEV)) +DEV_BASENAME=$(_basename_dev $SCRATCH_DEV) echo "Start test on device $SCRATCH_DEV, basename $DEV_BASENAME" >$seqres.full _scratch_mkfs >>$seqres.full 2>&1 diff --git a/tests/generic/009 b/tests/generic/009 index b7b0b3f..0886594 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -50,7 +50,7 @@ testfile=$TEST_DIR/009.$$ # Disable extent zeroing for ext4 as that change where holes are created if [ "$FSTYP" = "ext4" ]; then - DEV=`basename $TEST_DEV` + DEV=`_basename_dev $TEST_DEV` echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb fi diff --git a/tests/generic/019 b/tests/generic/019 index 1208c49..8c37a31 100755 --- a/tests/generic/019 +++ b/tests/generic/019 @@ -41,9 +41,7 @@ _need_to_be_root _require_scratch _require_fail_make_request -# TODO: Function are common enough to be moved to common/blkdev -SCRATCH_REAL_DEV=`readlink -f $SCRATCH_DEV` -SCRATCH_BDEV=`basename $SCRATCH_REAL_DEV` +SCRATCH_BDEV=`_basename_dev $SCRATCH_DEV` allow_fail_make_request() { diff --git a/tests/generic/285 b/tests/generic/285 index 8078b1c..8826023 100755 --- a/tests/generic/285 +++ b/tests/generic/285 @@ -48,7 +48,7 @@ BASE_TEST_FILE=$TEST_DIR/seek_sanity_testfile # Disable extent zeroing for ext4 as that change where holes are created if [ "$FSTYP" = "ext4" ]; then - DEV=`basename $TEST_DEV` + DEV=`_basename_dev $TEST_DEV` echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb fi diff --git a/tests/generic/312 b/tests/generic/312 index eaec43c..a81b0df 100755 --- a/tests/generic/312 +++ b/tests/generic/312 @@ -52,7 +52,7 @@ _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}') +dev_blocks=$(grep $(_basename_dev $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 -- 1.9.0 From jeff.liu@oracle.com Mon Apr 21 22:56:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A9EA87F3F for ; Mon, 21 Apr 2014 22:56:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92623304059 for ; Mon, 21 Apr 2014 20:56:54 -0700 (PDT) X-ASG-Debug-ID: 1398139013-04cb6c2437239710001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2zPfCUvEEJxFPABB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 20:56:53 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3M3uqIw004886 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 03:56:53 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3M3upwb014287 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 22 Apr 2014 03:56:52 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3M3upjY016170; Tue, 22 Apr 2014 03:56:51 GMT Received: from [10.191.15.36] (/10.191.15.36) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 21 Apr 2014 20:56:51 -0700 Message-ID: <5355E87F.8030906@oracle.com> Date: Tue, 22 Apr 2014 11:56:47 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Konstantin Khlebnikov , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: generic/285: fix seek_sanity_test for generic SEEK_HOLE/DATA References: <20140421164305.22404.92195.stgit@buzz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: generic/285: fix seek_sanity_test for generic SEEK_HOLE/DATA In-Reply-To: <20140421164305.22404.92195.stgit@buzz> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1398139013 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.3.5137 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 04/22 2014 00:43 AM, Konstantin Khlebnikov wrote: > Generic implementation of SEEK_HOLE/DATA reports whole file as data chunk with > virtual hole at the end (generic_file_llseek, used by ext2/ext3/reiserfs/nfs). > > Currently test prepares file smaller than expected for "huge file" testcases > (testcases 10-12). This patch fixes test file layout, now second data chunk > ends right at the expected end of file. > > Plus it fixes type of 'filesz' argument, it should be off_t. Am not verified against NFS, but the fix look good to me. Thanks, -Jeff From david@fromorbit.com Tue Apr 22 00:11:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 08BEC7F3F for ; Tue, 22 Apr 2014 00:11:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E3A338F8064 for ; Mon, 21 Apr 2014 22:11:01 -0700 (PDT) X-ASG-Debug-ID: 1398143454-04cbb06e9a23c5a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hiQkCrCpAVXy9j0M for ; Mon, 21 Apr 2014 22:10: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: AkBmAI74VVN5LEcvPGdsb2JhbABZgwaIbqJmk36FY4EfFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDMZhcWjkAHhDgEmG2WFCs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2014 14:40:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcSyp-0007ki-9y; Tue, 22 Apr 2014 15:10:51 +1000 Date: Tue, 22 Apr 2014 15:10:51 +1000 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH] common: new function to get real device path name and basename Message-ID: <20140422051051.GI18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] common: new function to get real device path name and basename References: <1398137247-4883-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398137247-4883-1-git-send-email-eguan@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: 1398143455 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 11:27:27AM +0800, Eryu Guan wrote: > If TEST_DEV or SCRATCH_DEV is symlink(mostly a lvm lv), a simple > basename is not enough, symlink should be followed. > > This task is common enough, so introduce new helper functions and > replace all readlink calls in > > ext4/305 > generic/009 > generic/019 > generic/285 > generic/312 > > Signed-off-by: Eryu Guan > --- > common/rc | 16 ++++++++++++++++ > tests/ext4/305 | 2 +- > tests/generic/009 | 2 +- > tests/generic/019 | 4 +--- > tests/generic/285 | 2 +- > tests/generic/312 | 2 +- > 6 files changed, 21 insertions(+), 7 deletions(-) > > diff --git a/common/rc b/common/rc > index acf419b..68b040d 100644 > --- a/common/rc > +++ b/common/rc > @@ -2302,6 +2302,22 @@ init_rc() > export XFS_IO_PROG="$XFS_IO_PROG -F" > } > > +# get real device path name by following link > +_real_dev() > +{ > + local _dev=$1 > + if [ -b "$_dev" ] && [ -L "$_dev" ]; then > + _dev=`readlink -f "$_dev"` > + fi > + echo $_dev > +} > + > +# basename of a device > +_basename_dev() > +{ > + echo `basename $(_real_dev $1)` > +} I don't really like that function name. It describes the implementation, not what the function actually returns. i.e. we're getting the -short- device names here, basename is the implemenation used to turn a full device name to a short device name... Cheers, Dave -- Dave Chinner david@fromorbit.com From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 01:27:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 09D947F3F for ; Tue, 22 Apr 2014 01:27:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC1CD8F804B for ; Mon, 21 Apr 2014 23:27:38 -0700 (PDT) X-ASG-Debug-ID: 1398148056-04cbb06e9d23e920001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AqwKVzDrBbunZxiD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 23:27:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcUB6-0001UZ-Ia; Tue, 22 Apr 2014 06:27:36 +0000 Date: Mon, 21 Apr 2014 23:27:36 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() Message-ID: <20140422062736.GA31337@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() References: <53558354.5040309@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53558354.5040309@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398148057 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 21, 2014 at 03:45:08PM -0500, Eric Sandeen wrote: > Coverity noticed that if we sent junk into > xfs_qm_scall_trunc_qfiles(), we could get back an > uninitialized error value. So sanitize the flags we > will accept, and initialize error anyway for good measure. > > (This bug may have been introduced via c61a9e39). > > Should resolve Coverity CID 1163872. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 01:28:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA1057F3F for ; Tue, 22 Apr 2014 01:28:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B98CF304053 for ; Mon, 21 Apr 2014 23:28:21 -0700 (PDT) X-ASG-Debug-ID: 1398148097-04bdf0455224a510001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id PWCPibAmplYD0xiL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 23:28:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcUBl-0001mk-04; Tue, 22 Apr 2014 06:28:17 +0000 Date: Mon, 21 Apr 2014 23:28:16 -0700 From: Christoph Hellwig To: Eric Whitney Cc: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check Message-ID: <20140422062816.GB31337@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: add helper for zero range support check References: <20140421204023.GB960@wallace> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421204023.GB960@wallace> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398148097 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +# check that xfs_io, kernel, and filesystem all support fallocate with zero > +# range > +_require_xfs_io_falloc_zero() > +{ > + _require_xfs_io_command "fzero" > +} I'd rather remove all the wrappers around _require_xfs_io_command, they don't actually add any value. From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 01:43:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C80657F3F for ; Tue, 22 Apr 2014 01:43:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B51A88F8066 for ; Mon, 21 Apr 2014 23:43:17 -0700 (PDT) X-ASG-Debug-ID: 1398148996-04cb6c243823f3d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DccuNmDmQHMZyGvx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 23:43:16 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcUQG-0007yY-4e; Tue, 22 Apr 2014 06:43:16 +0000 Date: Mon, 21 Apr 2014 23:43:16 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140422064316.GA30375@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535580A1.20806@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398148996 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5140 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 21, 2014 at 03:33:37PM -0500, Eric Sandeen wrote: > The Q_XQUOTARM quotactl was not working properly, because > we weren't passing around proper flags. The xfs_fs_set_xstate() > ioctl handler used the same flags for Q_XQUOTAON/OFF as > well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for > XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, > i.e. quota type + state, while Q_XQUOTARM looks only for > the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. > > Unfortunately these flag spaces overlap a bit, so we > got semi-random results for Q_XQUOTARM; i.e. the value > for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. > > Split out the flag conversion from userspace to kernelspace, > depending on the quotactl that is being executed; add 2 new > helpers to do this, so that we send the right flags to the > lower-level functions. > > This has been broken more or less forever, AFAICT. So if this isn't very urgent I'd rather replace ->set_xstate with one operation per ioctl, so that we don't multiple different kinds of flags over the same operation. From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 01:44:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 051DE7F3F for ; Tue, 22 Apr 2014 01:44:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C963C8F8065 for ; Mon, 21 Apr 2014 23:44:20 -0700 (PDT) X-ASG-Debug-ID: 1398149059-04bdf0455224af80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id xBc9hhUMUBUwoxz5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 23:44:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcURH-0008JN-D5; Tue, 22 Apr 2014 06:44:19 +0000 Date: Mon, 21 Apr 2014 23:44:19 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: test X_QUOTARM functionality Message-ID: <20140422064419.GB30375@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: test X_QUOTARM functionality References: <53557F09.8090000@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53557F09.8090000@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398149059 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 01:47:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A99B7F3F for ; Tue, 22 Apr 2014 01:47:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16B128F8049 for ; Mon, 21 Apr 2014 23:47:39 -0700 (PDT) X-ASG-Debug-ID: 1398149257-04cb6c243623f6b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id c9tRJ0ohGpazfoZZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 23:47:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcUUT-0002GO-Ax; Tue, 22 Apr 2014 06:47:37 +0000 Date: Mon, 21 Apr 2014 23:47:37 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140422064737.GA32026@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> <20140421071106.GF20384@infradead.org> <20140421233512.GE18672@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140421233512.GE18672@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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398149257 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 22, 2014 at 09:35:12AM +1000, Dave Chinner wrote: > > Shouldn't we apply the same scheme as for directories here, that is if > > it fails with a verifier error re-read without the verifier and then > > still do the full check as well? > > The directory code is the special case - it uses xfs_trans_read_buf* > interfaces, which return either a good buffer with no error or an > error with no buffer. Hence for the directory code, we have to > re-read the buffer without the verifier to grab the unchecked buffer > from the cache when the verifier detects an error. How about just having a variant of xfs_da_read_buf that doesn't use xfs_trans_read_buf *? xfs_da_read_buf is pretty simple, especially when removing the magic test that has been superceeded by the verifiers. From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 01:50:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F29EC7F3F for ; Tue, 22 Apr 2014 01:50:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99AACAC005 for ; Mon, 21 Apr 2014 23:50:16 -0700 (PDT) X-ASG-Debug-ID: 1398149415-04bdf0455324b320001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id G6yfaGVdCJaH1ZgX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 21 Apr 2014 23:50:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcUX1-0004B1-B7; Tue, 22 Apr 2014 06:50:15 +0000 Date: Mon, 21 Apr 2014 23:50:15 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, viro@ZenIV.linux.org.uk Subject: Re: [PATCH] xfs: remove dquot hints Message-ID: <20140422065015.GA8730@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove dquot hints References: <1398124565-13299-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398124565-13299-1-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398149415 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From eguan@redhat.com Tue Apr 22 01:58:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BE0E7F3F for ; Tue, 22 Apr 2014 01:58:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D834EAC005 for ; Mon, 21 Apr 2014 23:58:21 -0700 (PDT) X-ASG-Debug-ID: 1398149900-04bdf0455424b920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 39kyNJEn0a6AKQNH for ; Mon, 21 Apr 2014 23:58:20 -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 s3M6wK8c015543 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 22 Apr 2014 02:58:20 -0400 Received: from localhost (dhcp12-144.nay.redhat.com [10.66.12.144] (may be forged)) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3M6wIM3021214; Tue, 22 Apr 2014 02:58:19 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH v2] common: new function to get real device path name and basename Date: Tue, 22 Apr 2014 14:57:13 +0800 X-ASG-Orig-Subj: [PATCH v2] common: new function to get real device path name and basename Message-Id: <1398149833-9761-1-git-send-email-eguan@redhat.com> In-Reply-To: <20140422051051.GI18672@dastard> References: <20140422051051.GI18672@dastard> 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: 1398149900 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 If TEST_DEV or SCRATCH_DEV is symlink(mostly a lvm lv), a simple basename is not enough, symlink should be followed. This task is common enough, so introduce new helper functions and replace all readlink calls in ext4/305 generic/009 generic/019 generic/285 generic/312 Signed-off-by: Eryu Guan --- v2: rename _basename_dev to _short_dev as Dave suggested common/rc | 16 ++++++++++++++++ tests/ext4/305 | 2 +- tests/generic/009 | 2 +- tests/generic/019 | 4 +--- tests/generic/285 | 2 +- tests/generic/312 | 2 +- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/common/rc b/common/rc index acf419b..f16328d 100644 --- a/common/rc +++ b/common/rc @@ -2302,6 +2302,22 @@ init_rc() export XFS_IO_PROG="$XFS_IO_PROG -F" } +# get real device path name by following link +_real_dev() +{ + local _dev=$1 + if [ -b "$_dev" ] && [ -L "$_dev" ]; then + _dev=`readlink -f "$_dev"` + fi + echo $_dev +} + +# basename of a device +_short_dev() +{ + echo `basename $(_real_dev $1)` +} + init_rc ################################################################################ diff --git a/tests/ext4/305 b/tests/ext4/305 index eee461a..860d0a6 100755 --- a/tests/ext4/305 +++ b/tests/ext4/305 @@ -49,7 +49,7 @@ _require_scratch rm -f $seqres.full echo "Silence is golden" -DEV_BASENAME=$(basename $(readlink -f $SCRATCH_DEV)) +DEV_BASENAME=$(_short_dev $SCRATCH_DEV) echo "Start test on device $SCRATCH_DEV, basename $DEV_BASENAME" >$seqres.full _scratch_mkfs >>$seqres.full 2>&1 diff --git a/tests/generic/009 b/tests/generic/009 index b7b0b3f..aa662b2 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -50,7 +50,7 @@ testfile=$TEST_DIR/009.$$ # Disable extent zeroing for ext4 as that change where holes are created if [ "$FSTYP" = "ext4" ]; then - DEV=`basename $TEST_DEV` + DEV=`_short_dev $TEST_DEV` echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb fi diff --git a/tests/generic/019 b/tests/generic/019 index 1208c49..7a019ad 100755 --- a/tests/generic/019 +++ b/tests/generic/019 @@ -41,9 +41,7 @@ _need_to_be_root _require_scratch _require_fail_make_request -# TODO: Function are common enough to be moved to common/blkdev -SCRATCH_REAL_DEV=`readlink -f $SCRATCH_DEV` -SCRATCH_BDEV=`basename $SCRATCH_REAL_DEV` +SCRATCH_BDEV=`_short_dev $SCRATCH_DEV` allow_fail_make_request() { diff --git a/tests/generic/285 b/tests/generic/285 index 8078b1c..ac34d34 100755 --- a/tests/generic/285 +++ b/tests/generic/285 @@ -48,7 +48,7 @@ BASE_TEST_FILE=$TEST_DIR/seek_sanity_testfile # Disable extent zeroing for ext4 as that change where holes are created if [ "$FSTYP" = "ext4" ]; then - DEV=`basename $TEST_DEV` + DEV=`_short_dev $TEST_DEV` echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb fi diff --git a/tests/generic/312 b/tests/generic/312 index eaec43c..eb6cec9 100755 --- a/tests/generic/312 +++ b/tests/generic/312 @@ -52,7 +52,7 @@ _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}') +dev_blocks=$(grep $(_short_dev $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 -- 1.9.0 From dave@fromorbit.com Tue Apr 22 01:59:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 531457F3F for ; Tue, 22 Apr 2014 01:59:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 422A6304032 for ; Mon, 21 Apr 2014 23:59:20 -0700 (PDT) X-ASG-Debug-ID: 1398149953-04cbb06e9d23ff30001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id nCjcaTdK2Xw11LRS for ; Mon, 21 Apr 2014 23:59:15 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag5mAGQSVlN5LEcvPGdsb2JhbABZgwaIbqJomn4XAwEBAQE4NYIlAS0vOxgYUgMHLYhAmhWyV45nhC4ErwEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2014 16:29:12 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WcUfd-000823-P6 for xfs@oss.sgi.com; Tue, 22 Apr 2014 16:59:09 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WcUfd-0002xF-O3 for xfs@oss.sgi.com; Tue, 22 Apr 2014 16:59:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: remote attribute overwrite causes transaction overrun Date: Tue, 22 Apr 2014 16:59:09 +1000 X-ASG-Orig-Subj: [PATCH] xfs: remote attribute overwrite causes transaction overrun Message-Id: <1398149949-11324-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1398149953 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Commit e461fcb ("xfs: remote attribute lookups require the value length") passes the remote attribute length in the xfs_da_args structure on lookup so that CRC calculations and validity checking can be performed correctly by related code. This, unfortunately has the side effect of changing the args->valuelen parameter in cases where it shouldn't. That is, when we replace a remote attribute, the incoming replacement stores the value and length in args->value and args->valuelen, but then the lookup which finds the existing remote attribute overwrites args->valuelen with the length of the remote attribute being replaced. Hence when we go to create the new attribute, we create it of the size of the existing remote attribute, not the size it is supposed to be. When the new attribute is much smaller than the old attribute, this results in a transaction overrun and an ASSERT() failure on a debug kernel: XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 Fix this by keeping the remote attribute value length separate to the attribute value length in the xfs_da_args structure. The enables us to pass the length of the remote attribute to be removed without overwriting the new attribute's length. Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 7 ++++++- fs/xfs/xfs_attr_leaf.c | 21 +++++++++++---------- fs/xfs/xfs_attr_remote.c | 11 ++++++++--- fs/xfs/xfs_da_btree.h | 2 ++ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 01b6a01..dbaa674 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -213,7 +213,7 @@ xfs_attr_calc_size( * Out of line attribute, cannot double split, but * make room for the attribute value itself. */ - uint dblocks = XFS_B_TO_FSB(mp, valuelen); + uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); nblks += dblocks; nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); } @@ -703,6 +703,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) args->index2 = args->index; args->rmtblkno2 = args->rmtblkno; args->rmtblkcnt2 = args->rmtblkcnt; + args->rmtvaluelen2 = args->rmtvaluelen; } /* @@ -794,6 +795,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) args->blkno = args->blkno2; args->rmtblkno = args->rmtblkno2; args->rmtblkcnt = args->rmtblkcnt2; + args->rmtvaluelen = args->rmtvaluelen2; if (args->rmtblkno) { error = xfs_attr_rmtval_remove(args); if (error) @@ -1004,8 +1006,10 @@ restart: args->index2 = args->index; args->rmtblkno2 = args->rmtblkno; args->rmtblkcnt2 = args->rmtblkcnt; + args->rmtvaluelen2 = args->rmtvaluelen; args->rmtblkno = 0; args->rmtblkcnt = 0; + args->rmtvaluelen = 0; } retval = xfs_attr3_leaf_add(blk->bp, state->args); @@ -1133,6 +1137,7 @@ restart: args->blkno = args->blkno2; args->rmtblkno = args->rmtblkno2; args->rmtblkcnt = args->rmtblkcnt2; + args->rmtvaluelen = args->rmtvaluelen2; if (args->rmtblkno) { error = xfs_attr_rmtval_remove(args); if (error) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index fe9587f..511c283 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1229,6 +1229,7 @@ xfs_attr3_leaf_add_work( name_rmt->valueblk = 0; args->rmtblkno = 1; args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); + args->rmtvaluelen = args->valuelen; } xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), @@ -2167,11 +2168,11 @@ xfs_attr3_leaf_lookup_int( if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; args->index = probe; - args->valuelen = be32_to_cpu(name_rmt->valuelen); + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); args->rmtblkno = be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt = xfs_attr3_rmt_blocks( args->dp->i_mount, - args->valuelen); + args->rmtvaluelen); return XFS_ERROR(EEXIST); } } @@ -2220,19 +2221,19 @@ xfs_attr3_leaf_getvalue( 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); + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); args->rmtblkno = be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, - valuelen); + args->rmtvaluelen); if (args->flags & ATTR_KERNOVAL) { - args->valuelen = valuelen; + args->valuelen = args->rmtvaluelen; return 0; } - if (args->valuelen < valuelen) { - args->valuelen = valuelen; + if (args->valuelen < args->rmtvaluelen) { + args->valuelen = args->rmtvaluelen; return XFS_ERROR(ERANGE); } - args->valuelen = valuelen; + args->valuelen = args->rmtvaluelen; } return 0; } @@ -2519,7 +2520,7 @@ xfs_attr3_leaf_clearflag( ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); 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); + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); } @@ -2677,7 +2678,7 @@ xfs_attr3_leaf_flipflags( ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); 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); + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); xfs_trans_log_buf(args->trans, bp1, XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); } diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 6e37823..2324c66 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -337,7 +337,7 @@ xfs_attr_rmtval_get( struct xfs_buf *bp; xfs_dablk_t lblkno = args->rmtblkno; __uint8_t *dst = args->value; - int valuelen = args->valuelen; + int valuelen; int nmap; int error; int blkcnt = args->rmtblkcnt; @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( ASSERT(!(args->flags & ATTR_KERNOVAL)); + /* remote value might be different size to the buffer supplied. */ + if (args->rmtvaluelen = args->valuelen) + args->valuelen = args->rmtvaluelen; + valuelen = args->valuelen; + while (valuelen > 0) { nmap = ATTR_RMTVALUE_MAPSIZE; error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, @@ -415,7 +420,7 @@ xfs_attr_rmtval_set( * attributes have headers, we can't just do a straight byte to FSB * conversion and have to take the header space into account. */ - blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); + blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen); error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, XFS_ATTR_FORK); if (error) @@ -480,7 +485,7 @@ xfs_attr_rmtval_set( */ lblkno = args->rmtblkno; blkcnt = args->rmtblkcnt; - valuelen = args->valuelen; + valuelen = args->rmtvaluelen; while (valuelen > 0) { struct xfs_buf *bp; xfs_daddr_t dblkno; diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6e95ea7..201c609 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -60,10 +60,12 @@ typedef struct xfs_da_args { int index; /* index of attr of interest in blk */ xfs_dablk_t rmtblkno; /* remote attr value starting blkno */ int rmtblkcnt; /* remote attr value block count */ + int rmtvaluelen; /* remote attr value length in bytes */ xfs_dablk_t blkno2; /* blkno of 2nd attr leaf of interest */ int index2; /* index of 2nd attr in blk */ xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ int rmtblkcnt2; /* remote attr value block count */ + int rmtvaluelen2; /* remote attr value length in bytes */ int op_flags; /* operation flags */ enum xfs_dacmp cmpresult; /* name compare result for lookups */ } xfs_da_args_t; -- 1.9.0 From david@fromorbit.com Tue Apr 22 02:03:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 671117F3F for ; Tue, 22 Apr 2014 02:03:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56E2E304032 for ; Tue, 22 Apr 2014 00:02:57 -0700 (PDT) X-ASG-Debug-ID: 1398150175-04cbb06e9c2401f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bHEM0ySjadAb1aSO for ; Tue, 22 Apr 2014 00:02:55 -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: AkhnALcTVlN5LEcvPGdsb2JhbABZgwZPiB+iYgaSJoFYhwAXAwEBAQE4NYJmHDskNAUlAwctiECaGbJXFo5dghgPZ4EUBJhtlBCCBCs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2014 16:32:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcUiu-000844-Ea for xfs@oss.sgi.com; Tue, 22 Apr 2014 17:02:32 +1000 Date: Tue, 22 Apr 2014 17:02:32 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfstests: master branch updated to 6f55bbd Message-ID: <20140422070232.GE15995@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 6f55bbd MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1398150175 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. The new head of the master branch is commit: 6f55bbd xfs/167: need at least 10GB of scratch space to run New Commits: Dave Chinner (1): [6f55bbd] xfs/167: need at least 10GB of scratch space to run Eric Sandeen (2): [c365b11] fsx: introduce FSX_AVOID env var [de876b9] xfs: test X_QUOTARM functionality Eric Whitney (3): [b90e14f] common: add helper for zero range support check [9c04c84] ext4/001: fix check for zero range support [fbd6c52] generic/009: fix check for zero range support Eryu Guan (1): [7f783df] common: set _fs_has_crcs=0 as default in _filter_mkfs() Filipe David Borba Manana (4): [f81be18] btrfs: punch holes and prealloc extents with send [57e801d] btrfs: add test for btrfs properties [73d9443] btrfs/004: fix filefrag filter for files with 1 block only [6fcbf58] btrfs/004: fix failure with inlined file extents Konstantin Khlebnikov (1): [35ee392] generic/285: fix test for generic SEEK_HOLE/DATA implementations Lukas Czerner (1): [9631a1f] common: Remove unused functions Namjae Jeon (1): [d37388c] fsstress: remove duplicate COLLAPSE_RANGE flags Code Diffstat: README | 5 ++ common/config | 4 + common/filter | 1 + common/rc | 103 ++++------------------- ltp/fsstress.c | 1 - src/seek_sanity_test.c | 5 +- tests/btrfs/004 | 36 +++++--- tests/btrfs/047 | 122 +++++++++++++++++++++++++++ tests/btrfs/047.out | 35 ++++++++ tests/btrfs/048 | 220 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/048.out | 78 ++++++++++++++++++ tests/btrfs/group | 2 + tests/ext4/001 | 2 +- tests/generic/009 | 2 +- tests/generic/075 | 2 +- tests/generic/091 | 2 +- tests/generic/112 | 2 +- tests/generic/127 | 8 +- tests/generic/231 | 2 +- tests/generic/263 | 2 +- tests/xfs/007 | 79 ++++++++++++++++++ tests/xfs/007.out | 10 +++ tests/xfs/167 | 6 ++ tests/xfs/group | 1 + 24 files changed, 617 insertions(+), 113 deletions(-) create mode 100755 tests/btrfs/047 create mode 100644 tests/btrfs/047.out create mode 100755 tests/btrfs/048 create mode 100644 tests/btrfs/048.out create mode 100755 tests/xfs/007 create mode 100644 tests/xfs/007.out -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Apr 22 03:19:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BCB947F3F for ; Tue, 22 Apr 2014 03:19:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84ECA30404E for ; Tue, 22 Apr 2014 01:19:16 -0700 (PDT) X-ASG-Debug-ID: 1398154754-04cb6c2439243be0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id v6y02C6umJn38Kam (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 01:19:15 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3M8J46h021968 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 08:19:04 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s3M8J3kQ022705 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 22 Apr 2014 08:19:04 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3M8J3qR011847; Tue, 22 Apr 2014 08:19:03 GMT Received: from [192.168.1.106] (/123.119.106.47) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 22 Apr 2014 01:19:02 -0700 Message-ID: <535625AC.2030807@oracle.com> Date: Tue, 22 Apr 2014 16:17:48 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Brian Foster CC: Tuomas Tynkkynen , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix wrong error codes being returned References: <1398074687-26548-1-git-send-email-tuomas.tynkkynen@iki.fi> <5355132F.4070303@oracle.com> <20140421130931.GB24813@bfoster.bfoster> <535524BE.7070704@oracle.com> <20140421143629.GB4371@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix wrong error codes being returned In-Reply-To: <20140421143629.GB4371@laptop.bfoster> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1398154754 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/12 2014 22:36 PM, Brian Foster wrote: > On Mon, Apr 21, 2014 at 10:01:34PM +0800, Jeff Liu wrote: >> >> On 04/21 2014 21:09 PM, Brian Foster wrote: >>> On Mon, Apr 21, 2014 at 08:46:39PM +0800, Jeff Liu wrote: >>>> Hi Tuomas, >>>> >>>> On 04/21 2014 18:04 PM, Tuomas Tynkkynen wrote: >>>>> xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect >>>>> sign in some cases. While at it, make sure ENOMEM is returned instead of >>>>> E2BIG if kmalloc fails. >>>>> >>>>> Signed-off-by: Tuomas Tynkkynen >>>>> --- >>>>> Compile tested only. For the ERANGE case, I also wonder if it should >>>>> be assigning to ops[i].am_error instead of error, and/or have a break. >>>> >>>> If I understand right, ops[i].am_error is used to save the internal operation result, >>>> i.e, xfs_attrmult_attr_get{set}... but error is used for the ioctl call results. >>>> Therefore, assign ERANGE to error is compatible with the VFS set{get}xattr syscalls in >>>> case of "if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)". >>>> >>> >>> But we set 'error' in this case and effectively try to continue the operation >>> whereas the traditional vfs path returns... >> >> So the error would always be set to ERANGE if one or more attrname is/are invalid. >> > > Right... > >>> >>>> It seems that we don't need to have a break in this case because xfs_attrmulti_by_handle() >>>> is used to process multiple attrs. Hence if a given attrname in ops array is invalid, >>>> the am_error will indicate that with ENOATTR or EFAULT...but it should proceed to loop >>>> through the left array members. >>>> >>> >>> Perhaps so if am_error == 0, but it depends on what attr_name contains >>> at that point (stale data?). Otherwise, we try to proceed with a >>> truncated name. It looks like the consistent thing to do would be set >>> am_error to ERANGE and continue (i.e., skip the op and move on to the >>> next). >> >> If we continue to process a truncated name in case of MAXNAMELEN, it would return >> EFAULT for SET/REMOVE operations, and ENOATTR for GET operation, which would be >> set back to am_error, but error still keep as ERANGE which is consistently. >> > > Ah, we should hit an error in the xfs_attr_name_to_xname() call > deeper in the callchain, so the truncated name case should not be an > issue. The am_error == 0 case still looks weird to me. IMO am_error == 0 case means that the supplied attrname is NULL, and this would be detected by xfs_attr_name_to_xname() as well, i.e, if (!aname) return EINVAL; > > So we return an error and set am_error if there's an issue with the attr > name. But the am_error would be replaced with another errno if any operation is failed thereafter, or 0 on success. So the error is only used to indicate the ioctl call status anyway. > If there's another error in the op path, we set am_error only and > continue on. Not being familiar with the interface, I'm curious if there > is any particular reason for that difference in behavior. It seems like > the caller should process all of the return codes anyways. It seems to me that the design is convenient to the user space as the user could get more precise call status for one/more particular attrname{s} operations. Thanks, -Jeff From anonymous@bilgenet.com Tue Apr 22 03:26:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A07A27F3F for ; Tue, 22 Apr 2014 03:26:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 665878F8039 for ; Tue, 22 Apr 2014 01:26:12 -0700 (PDT) X-ASG-Debug-ID: 1398155166-04cb6c24392442c0001-NocioJ Received: from bilgenet.com (rvyetenekhavuzu.org [95.0.223.229]) by cuda.sgi.com with ESMTP id 2nAkgQOsk4be76Hj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 01:26:07 -0700 (PDT) X-Barracuda-Envelope-From: anonymous@bilgenet.com X-Barracuda-Apparent-Source-IP: 95.0.223.229 Received: (qmail 12916 invoked by uid 48); 22 Apr 2014 10:12:28 +0300 Date: 22 Apr 2014 10:12:28 +0300 To: , , , , , , , , , , , , , , , , , , , Subject: =?windows-1251?B?0e7h8fLi5e3t++kg4ejn7eXxIPEg4u7n7O7m?= =?windows-1251?B?7e7x8vz+IOfg8ODh7vLg8vwg5O4gNzAg8vvx?= =?windows-1251?B?IPDz4SDiIO3l5OXr/iE=?= From: =?windows-1251?B?zejq7uvg6SDN7uLo6u7i?= X-ASG-Orig-Subj: =?windows-1251?B?0e7h8fLi5e3t++kg4ejn7eXxIPEg4u7n7O7m?= =?windows-1251?B?7e7x8vz+IOfg8ODh7vLg8vwg5O4gNzAg8vvx?= =?windows-1251?B?IPDz4SDiIO3l5OXr/iE=?= Reply-To: X-Priority: 3 (Normal) Message-ID: <2325184944.20140422111214@mail.ru> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_25CA_01CF5E1B.B6E8C5F0" X-Barracuda-Connect: rvyetenekhavuzu.org[95.0.223.229] X-Barracuda-Start-Time: 1398155167 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.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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA584 Custom Rule SA584 ------=_NextPart_000_25CA_01CF5E1B.B6E8C5F0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C7=E0=F0=E0=E1=E0=F2=FB=E2=E0=E9, =ED=E5 =EE=F2=F0=FB=E2=E0=FF=F1=FC =EE= =F2 =E4=EE=EC=E0=F8=ED=E8=F5 =E4=E5=EB! =C2=C8=CF-=D0=C0=C1=CE=D2=C0.=D0=D3= =20 ------=_NextPart_000_25CA_01CF5E1B.B6E8C5F0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C7=E0=F0=E0=E1=E0=F2=FB=E2=E0=E9, =ED=E5 =EE=F2=F0=FB=E2=E0=FF=F1=FC= =EE=F2 =E4=EE=EC=E0=F8=ED=E8=F5 =E4=E5=EB! =C2=C8=CF-=D0=C0=C1=CE=D2=C0.=D0= =D3
 
------=_NextPart_000_25CA_01CF5E1B.B6E8C5F0-- From david@fromorbit.com Tue Apr 22 04:10:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 988A27F3F for ; Tue, 22 Apr 2014 04:10:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85D38304043 for ; Tue, 22 Apr 2014 02:10:50 -0700 (PDT) X-ASG-Debug-ID: 1398157846-04cb6c2439246cb0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id e0wJU3y7oYp5XrCn for ; Tue, 22 Apr 2014 02:10:46 -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: AppcAAYxVlN5LEcvPGdsb2JhbABZgwaDZIUKomeUBIVjgRMXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQMwoFxaOQAeDJIEUBJhvlhYr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2014 18:40:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcWix-0008OE-Bb; Tue, 22 Apr 2014 19:10:43 +1000 Date: Tue, 22 Apr 2014 19:10:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140422091043.GF15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> <20140421071106.GF20384@infradead.org> <20140421233512.GE18672@dastard> <20140422064737.GA32026@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422064737.GA32026@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: 1398157846 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 21, 2014 at 11:47:37PM -0700, Christoph Hellwig wrote: > On Tue, Apr 22, 2014 at 09:35:12AM +1000, Dave Chinner wrote: > > > Shouldn't we apply the same scheme as for directories here, that is if > > > it fails with a verifier error re-read without the verifier and then > > > still do the full check as well? > > > > The directory code is the special case - it uses xfs_trans_read_buf* > > interfaces, which return either a good buffer with no error or an > > error with no buffer. Hence for the directory code, we have to > > re-read the buffer without the verifier to grab the unchecked buffer > > from the cache when the verifier detects an error. > > How about just having a variant of xfs_da_read_buf that doesn't use > xfs_trans_read_buf *? xfs_da_read_buf is pretty simple, especially > when removing the magic test that has been superceeded by the verifiers. Right now I ijust want to keep the change as small as possible and get a release out. Yes, I agree there's much more cleanup that is needed in this code, but at this point is seems unnecessary and doesn't matter for the purpose of providing this functionality initially. We have to provide the same functionality for the kernel code for it to be able to handle CRC errors sanely, and so we're going to need to restructure xfs_trans_read_buf() to handle it. in doing this, we solve the libxfs problem, too, because what we do to the kernel code will flow on to userspace... So really, I'd prefer to leave the userspace code doing this retry for this one piece of infrastructure and do all the major restructing of the directory buffer read code in the kernel code first. That way we can pick up all the changes for userspace when the libxfs code is updated. Keep in mind that right now we've got a *lot* of updates from the kernel to the libxfs code pending that are stalled waiting for a release to be done... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 22 04:14:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A0957F4E for ; Tue, 22 Apr 2014 04:14:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3C7988F8049 for ; Tue, 22 Apr 2014 02:14:48 -0700 (PDT) X-ASG-Debug-ID: 1398158085-04cb6c24382470f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id oowRsFHs2g9USuIA for ; Tue, 22 Apr 2014 02:14:46 -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: AppcAC8yVlN5LEcvPGdsb2JhbABZgwaDZIUKomeUBIVjgRMXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQMwpFxaOQAeEOAEDmG+WFis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2014 18:44:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcWmp-0008OV-To; Tue, 22 Apr 2014 19:14:43 +1000 Date: Tue, 22 Apr 2014 19:14:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Eric Whitney , xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check Message-ID: <20140422091443.GG15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: add helper for zero range support check References: <20140421204023.GB960@wallace> <20140422062816.GB31337@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422062816.GB31337@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: 1398158085 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 21, 2014 at 11:28:16PM -0700, Christoph Hellwig wrote: > > +# check that xfs_io, kernel, and filesystem all support fallocate with zero > > +# range > > +_require_xfs_io_falloc_zero() > > +{ > > + _require_xfs_io_command "fzero" > > +} > > I'd rather remove all the wrappers around _require_xfs_io_command, they > don't actually add any value. I don't really care either way, as long as all the checks are done consistently. Send a patch to change them all... :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 04:16:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E71D17F55 for ; Tue, 22 Apr 2014 04:16:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9924B8F8065 for ; Tue, 22 Apr 2014 02:16:23 -0700 (PDT) X-ASG-Debug-ID: 1398158182-04cb6c24372472c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FQ3vGXfb0hrqMFkE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 02:16:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcWoO-0001Xh-3n; Tue, 22 Apr 2014 09:16:20 +0000 Date: Tue, 22 Apr 2014 02:16:20 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , Eric Whitney , xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check Message-ID: <20140422091620.GA4980@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: add helper for zero range support check References: <20140421204023.GB960@wallace> <20140422062816.GB31337@infradead.org> <20140422091443.GG15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422091443.GG15995@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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398158182 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 22, 2014 at 07:14:43PM +1000, Dave Chinner wrote: > I don't really care either way, as long as all the checks are done > consistently. Send a patch to change them all... :) My flink test already avoids the wrapper :) So how about we stop adding them for now at least. From lczerner@redhat.com Tue Apr 22 04:29:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EBC77F4E for ; Tue, 22 Apr 2014 04:29:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DB5A4AC008 for ; Tue, 22 Apr 2014 02:29:03 -0700 (PDT) X-ASG-Debug-ID: 1398158938-04bdf04554254fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B8CdB6uf2Kj30rjC for ; Tue, 22 Apr 2014 02:28:59 -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 s3M9SYlg031528 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 05:28:35 -0400 Received: from vpn1-4-38.ams2.redhat.com (vpn1-4-38.ams2.redhat.com [10.36.4.38]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3M9SVGS020662 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Apr 2014 05:28:33 -0400 Date: Tue, 22 Apr 2014 11:28:31 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Eric Whitney Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check In-Reply-To: <20140422091620.GA4980@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: add helper for zero range support check Message-ID: References: <20140421204023.GB960@wallace> <20140422062816.GB31337@infradead.org> <20140422091443.GG15995@dastard> <20140422091620.GA4980@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398158939 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, 22 Apr 2014, Christoph Hellwig wrote: > Date: Tue, 22 Apr 2014 02:16:20 -0700 > From: Christoph Hellwig > To: Dave Chinner > Cc: Christoph Hellwig , linux-ext4@vger.kernel.org, > xfs@oss.sgi.com, Eric Whitney > Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check > > On Tue, Apr 22, 2014 at 07:14:43PM +1000, Dave Chinner wrote: > > I don't really care either way, as long as all the checks are done > > consistently. Send a patch to change them all... :) > > My flink test already avoids the wrapper :) > > So how about we stop adding them for now at least. I agree, even though I screwed up when using _require_xfs_io_command with fzero :) I think that we can avoid the wrappers and just use _require_xfs_io_command() with the command name. -Lukas > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 22 04:42:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E78CC7F4E for ; Tue, 22 Apr 2014 04:42:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D234F8F8040 for ; Tue, 22 Apr 2014 02:42:00 -0700 (PDT) X-ASG-Debug-ID: 1398159719-04cb6c2437248b70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DFBkHZFnaZQpqnnX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 02:42:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bd25337ece1fc3b91b42+3894+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WcXDD-0005Bp-Hb; Tue, 22 Apr 2014 09:41:59 +0000 Date: Tue, 22 Apr 2014 02:41:59 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140422094159.GB17700@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1397550301-31883-1-git-send-email-david@fromorbit.com> <1397550301-31883-6-git-send-email-david@fromorbit.com> <20140421071106.GF20384@infradead.org> <20140421233512.GE18672@dastard> <20140422064737.GA32026@infradead.org> <20140422091043.GF15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422091043.GF15995@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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398159720 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Apr 22, 2014 at 07:10:43PM +1000, Dave Chinner wrote: > Right now I ijust want to keep the change as small as possible and > get a release out. Oh well. I'll probably ACK it next time it comes around. I think the series needs enough changes for a resend anyway. From david@fromorbit.com Tue Apr 22 04:46:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10EC07F3F for ; Tue, 22 Apr 2014 04:46:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2B7E8F8064 for ; Tue, 22 Apr 2014 02:46:17 -0700 (PDT) X-ASG-Debug-ID: 1398159975-04cb6c2439248f40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OhFzzEsYQlkyD9HB for ; Tue, 22 Apr 2014 02:46:15 -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: ArRcAGc5VlN5LEcvPGdsb2JhbABZgwaDZFGEOaJnlASFY4EVFwMBAQEBODWCJQEBBSMPASMjEAgBAhEDAQIBAgIFIQICDwUNGAMHDA4TiC0DEIx+nBucJg2GaxcWgROLFYIYB4JvgUkBA5cCgW2NAYkVKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Apr 2014 19:16:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcXHI-0008U8-73; Tue, 22 Apr 2014 19:46:12 +1000 Date: Tue, 22 Apr 2014 19:46:12 +1000 From: Dave Chinner To: =?utf-8?B?THVrw6HFoQ==?= Czerner Cc: Christoph Hellwig , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Eric Whitney Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check Message-ID: <20140422094612.GJ18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: add helper for zero range support check References: <20140421204023.GB960@wallace> <20140422062816.GB31337@infradead.org> <20140422091443.GG15995@dastard> <20140422091620.GA4980@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1398159975 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 11:28:31AM +0200, Lukáš Czerner wrote: > On Tue, 22 Apr 2014, Christoph Hellwig wrote: > > > Date: Tue, 22 Apr 2014 02:16:20 -0700 > > From: Christoph Hellwig > > To: Dave Chinner > > Cc: Christoph Hellwig , linux-ext4@vger.kernel.org, > > xfs@oss.sgi.com, Eric Whitney > > Subject: Re: [PATCH 1/3] xfstests: add helper for zero range support check > > > > On Tue, Apr 22, 2014 at 07:14:43PM +1000, Dave Chinner wrote: > > > I don't really care either way, as long as all the checks are done > > > consistently. Send a patch to change them all... :) > > > > My flink test already avoids the wrapper :) > > > > So how about we stop adding them for now at least. > > I agree, > > even though I screwed up when using _require_xfs_io_command with > fzero :) I think that we can avoid the wrappers and just use > _require_xfs_io_command() with the command name. Send patches ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Apr 22 07:01:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EBD1A7F50 for ; Tue, 22 Apr 2014 07:01:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B71DC30404E for ; Tue, 22 Apr 2014 05:01:15 -0700 (PDT) X-ASG-Debug-ID: 1398168069-04cb6c2439252260001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Sqbp6DAwxflPlKjY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 05:01:10 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3MC17W0031102 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 12:01:08 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3MC12eG011162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Apr 2014 12:01:07 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s3MC12SS000521; Tue, 22 Apr 2014 12:01:02 GMT Received: from [192.168.1.106] (/123.119.106.47) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 22 Apr 2014 05:01:01 -0700 Message-ID: <535659F7.4060702@oracle.com> Date: Tue, 22 Apr 2014 20:00:55 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun In-Reply-To: <1398149949-11324-1-git-send-email-david@fromorbit.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: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1398168070 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5148 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/22 2014 14:59 PM, Dave Chinner wrote: > From: Dave Chinner > > Commit e461fcb ("xfs: remote attribute lookups require the value > length") passes the remote attribute length in the xfs_da_args > structure on lookup so that CRC calculations and validity checking > can be performed correctly by related code. This, unfortunately has > the side effect of changing the args->valuelen parameter in cases > where it shouldn't. > > That is, when we replace a remote attribute, the incoming > replacement stores the value and length in args->value and > args->valuelen, but then the lookup which finds the existing remote > attribute overwrites args->valuelen with the length of the remote > attribute being replaced. Hence when we go to create the new > attribute, we create it of the size of the existing remote > attribute, not the size it is supposed to be. When the new attribute > is much smaller than the old attribute, this results in a > transaction overrun and an ASSERT() failure on a debug kernel: > > XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 > > Fix this by keeping the remote attribute value length separate to > the attribute value length in the xfs_da_args structure. The enables > us to pass the length of the remote attribute to be removed without > overwriting the new attribute's length. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_attr.c | 7 ++++++- > fs/xfs/xfs_attr_leaf.c | 21 +++++++++++---------- > fs/xfs/xfs_attr_remote.c | 11 ++++++++--- > fs/xfs/xfs_da_btree.h | 2 ++ > 4 files changed, 27 insertions(+), 14 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 01b6a01..dbaa674 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -213,7 +213,7 @@ xfs_attr_calc_size( > * Out of line attribute, cannot double split, but > * make room for the attribute value itself. > */ > - uint dblocks = XFS_B_TO_FSB(mp, valuelen); > + uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); > nblks += dblocks; > nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); > } > @@ -703,6 +703,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > args->index2 = args->index; > args->rmtblkno2 = args->rmtblkno; > args->rmtblkcnt2 = args->rmtblkcnt; > + args->rmtvaluelen2 = args->rmtvaluelen; > } > > /* > @@ -794,6 +795,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > args->blkno = args->blkno2; > args->rmtblkno = args->rmtblkno2; > args->rmtblkcnt = args->rmtblkcnt2; > + args->rmtvaluelen = args->rmtvaluelen2; > if (args->rmtblkno) { > error = xfs_attr_rmtval_remove(args); > if (error) > @@ -1004,8 +1006,10 @@ restart: > args->index2 = args->index; > args->rmtblkno2 = args->rmtblkno; > args->rmtblkcnt2 = args->rmtblkcnt; > + args->rmtvaluelen2 = args->rmtvaluelen; > args->rmtblkno = 0; > args->rmtblkcnt = 0; > + args->rmtvaluelen = 0; > } > > retval = xfs_attr3_leaf_add(blk->bp, state->args); > @@ -1133,6 +1137,7 @@ restart: > args->blkno = args->blkno2; > args->rmtblkno = args->rmtblkno2; > args->rmtblkcnt = args->rmtblkcnt2; > + args->rmtvaluelen = args->rmtvaluelen2; > if (args->rmtblkno) { > error = xfs_attr_rmtval_remove(args); > if (error) > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index fe9587f..511c283 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1229,6 +1229,7 @@ xfs_attr3_leaf_add_work( > name_rmt->valueblk = 0; > args->rmtblkno = 1; > args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); > + args->rmtvaluelen = args->valuelen; > } > xfs_trans_log_buf(args->trans, bp, > XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), > @@ -2167,11 +2168,11 @@ xfs_attr3_leaf_lookup_int( > if (!xfs_attr_namesp_match(args->flags, entry->flags)) > continue; > args->index = probe; > - args->valuelen = be32_to_cpu(name_rmt->valuelen); > + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); > args->rmtblkno = be32_to_cpu(name_rmt->valueblk); > args->rmtblkcnt = xfs_attr3_rmt_blocks( > args->dp->i_mount, > - args->valuelen); > + args->rmtvaluelen); > return XFS_ERROR(EEXIST); > } > } > @@ -2220,19 +2221,19 @@ xfs_attr3_leaf_getvalue( > 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); > + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); > args->rmtblkno = be32_to_cpu(name_rmt->valueblk); > args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, > - valuelen); > + args->rmtvaluelen); > if (args->flags & ATTR_KERNOVAL) { > - args->valuelen = valuelen; > + args->valuelen = args->rmtvaluelen; > return 0; > } > - if (args->valuelen < valuelen) { > - args->valuelen = valuelen; > + if (args->valuelen < args->rmtvaluelen) { > + args->valuelen = args->rmtvaluelen; > return XFS_ERROR(ERANGE); > } > - args->valuelen = valuelen; > + args->valuelen = args->rmtvaluelen; > } > return 0; > } > @@ -2519,7 +2520,7 @@ xfs_attr3_leaf_clearflag( > ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); > 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); > + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); > xfs_trans_log_buf(args->trans, bp, > XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); > } > @@ -2677,7 +2678,7 @@ xfs_attr3_leaf_flipflags( > ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); > 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); > + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); > xfs_trans_log_buf(args->trans, bp1, > XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); > } > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > index 6e37823..2324c66 100644 > --- a/fs/xfs/xfs_attr_remote.c > +++ b/fs/xfs/xfs_attr_remote.c > @@ -337,7 +337,7 @@ xfs_attr_rmtval_get( > struct xfs_buf *bp; > xfs_dablk_t lblkno = args->rmtblkno; > __uint8_t *dst = args->value; > - int valuelen = args->valuelen; > + int valuelen; > int nmap; > int error; > int blkcnt = args->rmtblkcnt; > @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > > + /* remote value might be different size to the buffer supplied. */ > + if (args->rmtvaluelen = args->valuelen) ^^^ Here is a typo... Thanks, -Jeff From jeff.liu@oracle.com Tue Apr 22 07:43:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ED8AA7F51 for ; Tue, 22 Apr 2014 07:43:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9E3698F8064 for ; Tue, 22 Apr 2014 05:43:31 -0700 (PDT) X-ASG-Debug-ID: 1398170610-04cbb06e9d2552e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id orLu55j87Qsj5RMg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 05:43:30 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s3MCh58w025014 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 12:43:06 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3MCh2bQ022430 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 22 Apr 2014 12:43:03 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3MCh25f022420; Tue, 22 Apr 2014 12:43:02 GMT Received: from [192.168.1.106] (/123.119.106.47) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 22 Apr 2014 05:43:02 -0700 Message-ID: <535663CB.5080309@oracle.com> Date: Tue, 22 Apr 2014 20:42:51 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Eric Sandeen CC: Christoph Hellwig , xfs-oss Subject: Re: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() References: <53558354.5040309@redhat.com> <20140422062736.GA31337@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() In-Reply-To: <20140422062736.GA31337@infradead.org> 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: 1398170610 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5149 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/22 2014 14:27 PM, Christoph Hellwig wrote: > On Mon, Apr 21, 2014 at 03:45:08PM -0500, Eric Sandeen wrote: >> Coverity noticed that if we sent junk into >> xfs_qm_scall_trunc_qfiles(), we could get back an >> uninitialized error value. So sanitize the flags we >> will accept, and initialize error anyway for good measure. >> >> (This bug may have been introduced via c61a9e39). Indeed, my mistake. >> >> Should resolve Coverity CID 1163872. >> >> Signed-off-by: Eric Sandeen > > Looks good, > > Reviewed-by: Christoph Hellwig Looks good to me too. Reviewed-by: Jie Liu Thanks, -Jeff From bfoster@redhat.com Tue Apr 22 09:17:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E39A7F53 for ; Tue, 22 Apr 2014 09:17:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5923B304032 for ; Tue, 22 Apr 2014 07:17:54 -0700 (PDT) X-ASG-Debug-ID: 1398176272-04cb6c243925a970001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gwGK1wv5T2rzgv70 for ; Tue, 22 Apr 2014 07:17:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3MEHkYl029541 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Apr 2014 10:17:47 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3MEHkTr014005; Tue, 22 Apr 2014 10:17:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4A45B12573F; Tue, 22 Apr 2014 10:17:45 -0400 (EDT) Date: Tue, 22 Apr 2014 10:17:44 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun Message-ID: <20140422141743.GA55823@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398149949-11324-1-git-send-email-david@fromorbit.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: 1398176272 X-Barracuda-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, Apr 22, 2014 at 04:59:09PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Commit e461fcb ("xfs: remote attribute lookups require the value > length") passes the remote attribute length in the xfs_da_args > structure on lookup so that CRC calculations and validity checking > can be performed correctly by related code. This, unfortunately has > the side effect of changing the args->valuelen parameter in cases > where it shouldn't. > > That is, when we replace a remote attribute, the incoming > replacement stores the value and length in args->value and > args->valuelen, but then the lookup which finds the existing remote > attribute overwrites args->valuelen with the length of the remote > attribute being replaced. Hence when we go to create the new > attribute, we create it of the size of the existing remote > attribute, not the size it is supposed to be. When the new attribute > is much smaller than the old attribute, this results in a > transaction overrun and an ASSERT() failure on a debug kernel: > > XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 > > Fix this by keeping the remote attribute value length separate to > the attribute value length in the xfs_da_args structure. The enables > us to pass the length of the remote attribute to be removed without > overwriting the new attribute's length. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_attr.c | 7 ++++++- > fs/xfs/xfs_attr_leaf.c | 21 +++++++++++---------- > fs/xfs/xfs_attr_remote.c | 11 ++++++++--- > fs/xfs/xfs_da_btree.h | 2 ++ > 4 files changed, 27 insertions(+), 14 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 01b6a01..dbaa674 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -213,7 +213,7 @@ xfs_attr_calc_size( > * Out of line attribute, cannot double split, but > * make room for the attribute value itself. > */ > - uint dblocks = XFS_B_TO_FSB(mp, valuelen); > + uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); > nblks += dblocks; > nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); > } > @@ -703,6 +703,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > args->index2 = args->index; > args->rmtblkno2 = args->rmtblkno; > args->rmtblkcnt2 = args->rmtblkcnt; > + args->rmtvaluelen2 = args->rmtvaluelen; > } Why don't we zero out the first set of values here similar to the node case? > > /* > @@ -794,6 +795,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > args->blkno = args->blkno2; > args->rmtblkno = args->rmtblkno2; > args->rmtblkcnt = args->rmtblkcnt2; > + args->rmtvaluelen = args->rmtvaluelen2; > if (args->rmtblkno) { > error = xfs_attr_rmtval_remove(args); > if (error) > @@ -1004,8 +1006,10 @@ restart: > args->index2 = args->index; > args->rmtblkno2 = args->rmtblkno; > args->rmtblkcnt2 = args->rmtblkcnt; > + args->rmtvaluelen2 = args->rmtvaluelen; > args->rmtblkno = 0; > args->rmtblkcnt = 0; > + args->rmtvaluelen = 0; > } > > retval = xfs_attr3_leaf_add(blk->bp, state->args); > @@ -1133,6 +1137,7 @@ restart: > args->blkno = args->blkno2; > args->rmtblkno = args->rmtblkno2; > args->rmtblkcnt = args->rmtblkcnt2; > + args->rmtvaluelen = args->rmtvaluelen2; > if (args->rmtblkno) { > error = xfs_attr_rmtval_remove(args); > if (error) > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index fe9587f..511c283 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1229,6 +1229,7 @@ xfs_attr3_leaf_add_work( > name_rmt->valueblk = 0; > args->rmtblkno = 1; > args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); > + args->rmtvaluelen = args->valuelen; > } > xfs_trans_log_buf(args->trans, bp, > XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), > @@ -2167,11 +2168,11 @@ xfs_attr3_leaf_lookup_int( > if (!xfs_attr_namesp_match(args->flags, entry->flags)) > continue; > args->index = probe; > - args->valuelen = be32_to_cpu(name_rmt->valuelen); > + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); > args->rmtblkno = be32_to_cpu(name_rmt->valueblk); > args->rmtblkcnt = xfs_attr3_rmt_blocks( > args->dp->i_mount, > - args->valuelen); > + args->rmtvaluelen); > return XFS_ERROR(EEXIST); > } > } > @@ -2220,19 +2221,19 @@ xfs_attr3_leaf_getvalue( > 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); > + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); > args->rmtblkno = be32_to_cpu(name_rmt->valueblk); > args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, > - valuelen); > + args->rmtvaluelen); > if (args->flags & ATTR_KERNOVAL) { > - args->valuelen = valuelen; > + args->valuelen = args->rmtvaluelen; > return 0; > } > - if (args->valuelen < valuelen) { > - args->valuelen = valuelen; > + if (args->valuelen < args->rmtvaluelen) { > + args->valuelen = args->rmtvaluelen; > return XFS_ERROR(ERANGE); > } > - args->valuelen = valuelen; > + args->valuelen = args->rmtvaluelen; > } > return 0; > } > @@ -2519,7 +2520,7 @@ xfs_attr3_leaf_clearflag( > ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); > 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); > + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); > xfs_trans_log_buf(args->trans, bp, > XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); > } > @@ -2677,7 +2678,7 @@ xfs_attr3_leaf_flipflags( > ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); > 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); > + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); > xfs_trans_log_buf(args->trans, bp1, > XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); > } > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > index 6e37823..2324c66 100644 > --- a/fs/xfs/xfs_attr_remote.c > +++ b/fs/xfs/xfs_attr_remote.c > @@ -337,7 +337,7 @@ xfs_attr_rmtval_get( > struct xfs_buf *bp; > xfs_dablk_t lblkno = args->rmtblkno; > __uint8_t *dst = args->value; > - int valuelen = args->valuelen; > + int valuelen; > int nmap; > int error; > int blkcnt = args->rmtblkcnt; > @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > > + /* remote value might be different size to the buffer supplied. */ > + if (args->rmtvaluelen = args->valuelen) > + args->valuelen = args->rmtvaluelen; > + valuelen = args->valuelen; > + Jeff already called this out as a potential typo... I'm guessing the intent is to handle the case where we call from xfs_attr3_leaf_list_int(). The other callers call xfs_attr3_leaf_getvalue() first, which sets rmtvaluelen and fixes up valuelen or returns an error (if short). The list_int() case looks like it queries the remote length just the same, but only sets valuelen... Why not just set both valuelen and rmtvaluelen there? Brian > while (valuelen > 0) { > nmap = ATTR_RMTVALUE_MAPSIZE; > error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, > @@ -415,7 +420,7 @@ xfs_attr_rmtval_set( > * attributes have headers, we can't just do a straight byte to FSB > * conversion and have to take the header space into account. > */ > - blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); > + blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen); > error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, > XFS_ATTR_FORK); > if (error) > @@ -480,7 +485,7 @@ xfs_attr_rmtval_set( > */ > lblkno = args->rmtblkno; > blkcnt = args->rmtblkcnt; > - valuelen = args->valuelen; > + valuelen = args->rmtvaluelen; > while (valuelen > 0) { > struct xfs_buf *bp; > xfs_daddr_t dblkno; > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index 6e95ea7..201c609 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -60,10 +60,12 @@ typedef struct xfs_da_args { > int index; /* index of attr of interest in blk */ > xfs_dablk_t rmtblkno; /* remote attr value starting blkno */ > int rmtblkcnt; /* remote attr value block count */ > + int rmtvaluelen; /* remote attr value length in bytes */ > xfs_dablk_t blkno2; /* blkno of 2nd attr leaf of interest */ > int index2; /* index of 2nd attr in blk */ > xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ > int rmtblkcnt2; /* remote attr value block count */ > + int rmtvaluelen2; /* remote attr value length in bytes */ > int op_flags; /* operation flags */ > enum xfs_dacmp cmpresult; /* name compare result for lookups */ > } xfs_da_args_t; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Tue Apr 22 10:54:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 565977F56 for ; Tue, 22 Apr 2014 10:54:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 120D28F8065 for ; Tue, 22 Apr 2014 08:54:34 -0700 (PDT) X-ASG-Debug-ID: 1398182073-04cbb06e9a25f950001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ml2hGzL7cweEncca for ; Tue, 22 Apr 2014 08:54:34 -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 s3MFsCne019000 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2014 11:54:12 -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 s3MFsBL4032172 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 22 Apr 2014 11:54:12 -0400 Message-ID: <535690A3.3080609@redhat.com> Date: Tue, 22 Apr 2014 10:54:11 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss Subject: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <20140422064316.GA30375@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl In-Reply-To: <20140422064316.GA30375@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398182074 X-Barracuda-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/22/14, 1:43 AM, Christoph Hellwig wrote: > On Mon, Apr 21, 2014 at 03:33:37PM -0500, Eric Sandeen wrote: >> The Q_XQUOTARM quotactl was not working properly, because >> we weren't passing around proper flags. The xfs_fs_set_xstate() >> ioctl handler used the same flags for Q_XQUOTAON/OFF as >> well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for >> XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, >> i.e. quota type + state, while Q_XQUOTARM looks only for >> the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. >> >> Unfortunately these flag spaces overlap a bit, so we >> got semi-random results for Q_XQUOTARM; i.e. the value >> for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. >> >> Split out the flag conversion from userspace to kernelspace, >> depending on the quotactl that is being executed; add 2 new >> helpers to do this, so that we send the right flags to the >> lower-level functions. >> >> This has been broken more or less forever, AFAICT. > > So if this isn't very urgent I'd rather replace ->set_xstate with one > operation per ioctl, so that we don't multiple different kinds of flags > over the same operation. > eh, that's probably better, I'll take a look. Thanks, -Eric From sandeen@sandeen.net Tue Apr 22 10:56:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A32C47F56 for ; Tue, 22 Apr 2014 10:56:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35C2AAC00F for ; Tue, 22 Apr 2014 08:56:21 -0700 (PDT) X-ASG-Debug-ID: 1398182180-04cbb06e9a25fa10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id l14IfobKmD47krxc for ; Tue, 22 Apr 2014 08:56:20 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AF15363C5FF0; Tue, 22 Apr 2014 10:56:19 -0500 (CDT) Message-ID: <53569123.2080807@sandeen.net> Date: Tue, 22 Apr 2014 10:56:19 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Jeff Liu CC: Christoph Hellwig , xfs-oss Subject: Re: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() References: <53558354.5040309@redhat.com> <20140422062736.GA31337@infradead.org> <535663CB.5080309@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: bulletfproof xfs_qm_scall_trunc_qfiles() In-Reply-To: <535663CB.5080309@oracle.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398182180 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5155 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/22/14, 7:42 AM, Jeff Liu wrote: > > On 04/22 2014 14:27 PM, Christoph Hellwig wrote: >> On Mon, Apr 21, 2014 at 03:45:08PM -0500, Eric Sandeen wrote: >>> Coverity noticed that if we sent junk into >>> xfs_qm_scall_trunc_qfiles(), we could get back an >>> uninitialized error value. So sanitize the flags we >>> will accept, and initialize error anyway for good measure. >>> >>> (This bug may have been introduced via c61a9e39). > > Indeed, my mistake. No worries, it's a very small thing, and programatically impossible. Not trying to point fingers, just looking for whether it's a new warning or an old one. Thanks, -Eric From sandeen@sandeen.net Tue Apr 22 13:48:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E09687F3F for ; Tue, 22 Apr 2014 13:48:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5E7C9AC00E for ; Tue, 22 Apr 2014 11:48:40 -0700 (PDT) X-ASG-Debug-ID: 1398192518-04cbb06e9b265570001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bsVsBbBgERKshwAG for ; Tue, 22 Apr 2014 11:48:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0296763C5FF0; Tue, 22 Apr 2014 13:48:38 -0500 (CDT) Message-ID: <5356B986.2060906@sandeen.net> Date: Tue, 22 Apr 2014 13:48:38 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs-oss CC: Jan Kara Subject: [PATCH V2] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfs: fix Q_XQUOTARM ioctl In-Reply-To: <535580A1.20806@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398192518 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5160 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The Q_XQUOTARM quotactl was not working properly, because we weren't passing around proper flags. The xfs_fs_set_xstate() ioctl handler used the same flags for Q_XQUOTAON/OFF as well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, i.e. quota type + state, while Q_XQUOTARM looks only for the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. Unfortunately these flag spaces overlap a bit, so we got semi-random results for Q_XQUOTARM; i.e. the value for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. Add a new quotactl op vector specifically for the QUOTARM operation, since it operates with a different flag space. This has been broken more or less forever, AFAICT. Signed-off-by: Eric Sandeen --- diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 2b363e2..ff3f0b3 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -278,6 +278,17 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id, return ret; } +static int quota_rmxquota(struct super_block *sb, void __user *addr) +{ + __u32 flags; + + if (copy_from_user(&flags, addr, sizeof(flags))) + return -EFAULT; + if (!sb->s_qcop->rm_xquota) + return -ENOSYS; + return sb->s_qcop->rm_xquota(sb, flags); +} + /* Copy parameters and call proper function */ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, void __user *addr, struct path *path) @@ -316,8 +327,9 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, return sb->s_qcop->quota_sync(sb, type); case Q_XQUOTAON: case Q_XQUOTAOFF: - case Q_XQUOTARM: return quota_setxstate(sb, cmd, addr); + case Q_XQUOTARM: + return quota_rmxquota(sb, addr); case Q_XGETQSTAT: return quota_getxstate(sb, addr); case Q_XGETQSTATV: diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index af33caf..2ad1b98 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -100,16 +100,36 @@ xfs_fs_set_xstate( if (!XFS_IS_QUOTA_ON(mp)) return -EINVAL; return -xfs_qm_scall_quotaoff(mp, flags); - case Q_XQUOTARM: - if (XFS_IS_QUOTA_ON(mp)) - return -EINVAL; - return -xfs_qm_scall_trunc_qfiles(mp, flags); } return -EINVAL; } STATIC int +xfs_fs_rm_xquota( + struct super_block *sb, + unsigned int uflags) +{ + struct xfs_mount *mp = XFS_M(sb); + unsigned int flags = 0; + + if (sb->s_flags & MS_RDONLY) + return -EROFS; + + if (XFS_IS_QUOTA_ON(mp)) + return -EINVAL; + + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_USER; + if (uflags & FS_GROUP_QUOTA) + flags |= XFS_DQ_GROUP; + if (uflags & FS_USER_QUOTA) + flags |= XFS_DQ_PROJ; + + return -xfs_qm_scall_trunc_qfiles(mp, flags); +} + +STATIC int xfs_fs_get_dqblk( struct super_block *sb, struct kqid qid, @@ -149,6 +169,7 @@ const struct quotactl_ops xfs_quotactl_operations = { .get_xstatev = xfs_fs_get_xstatev, .get_xstate = xfs_fs_get_xstate, .set_xstate = xfs_fs_set_xstate, + .rm_xquota = xfs_fs_rm_xquota, .get_dqblk = xfs_fs_get_dqblk, .set_dqblk = xfs_fs_set_dqblk, }; diff --git a/include/linux/quota.h b/include/linux/quota.h index cc7494a..0f3c5d3 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -329,6 +329,7 @@ struct quotactl_ops { int (*get_xstate)(struct super_block *, struct fs_quota_stat *); int (*set_xstate)(struct super_block *, unsigned int, int); int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); + int (*rm_xquota)(struct super_block *, unsigned int); }; struct quota_format_type { From david@fromorbit.com Tue Apr 22 16:07:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 125B57F3F for ; Tue, 22 Apr 2014 16:07:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EFFC630404E for ; Tue, 22 Apr 2014 14:07:05 -0700 (PDT) X-ASG-Debug-ID: 1398200819-04cbb06e9b2697c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id PaBKfLto74ngTvHL for ; Tue, 22 Apr 2014 14:07:00 -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: AlJlAIvZVlN5LEcvPGdsb2JhbABZgwaDZIUKonCZZoEVFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDNXxcWjkAHhDgEmG+WFis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 06:36:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wchu3-000262-Cu; Wed, 23 Apr 2014 07:06:55 +1000 Date: Wed, 23 Apr 2014 07:06:55 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: filestream allocator rewrite Message-ID: <20140422210655.GK18672@dastard> X-ASG-Orig-Subj: Re: filestream allocator rewrite References: <1397289723-26243-1-git-send-email-hch@lst.de> <20140414022347.GI27694@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414022347.GI27694@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398200819 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5163 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 14, 2014 at 12:23:47PM +1000, Dave Chinner wrote: > On Sat, Apr 12, 2014 at 10:01:54AM +0200, Christoph Hellwig wrote: > > This series is a major overhaul of the filestream allocator. The main point > > is to use the dcache to get the parent and avoiding to maintain a fstrm_item > > for each inode that the filestream is applied to in favor of just tracking > > the parent, but there's various more or less related fallout from this as well. > > OVerall it looks good. I'll need to do some testing on it and > have a deeper look at the main use-the-dentry-cache patch, but it > removes a heap of complexity and code and gets rid of the use of > inode IO locks, so there's a loot to like here... So I've looked over this in more detail and done some testing on it, and apart from the comment I made about a function name, I can't spot any problems with the code. In terms of testing, this passes all of the filestreams group tests except of xfs/172, which still randomly fails. That makes it at least as reliable as the current code. However, the failure of xfs/172 is interesting. It is expecting buffered IO to *fail* due to a short filestreams timeout that is set. However, when it fails, it's actually separating the streams correctly: $ cat results//xfs/172.full stream 1 AGs: 0 0 0 0 0 4 4 4 stream 2 AGs: 1 1 1 1 1 5 5 5 stream 3 AGs: 2 2 2 2 2 6 6 6 stream 4 AGs: 3 3 3 3 3 7 7 7 - streams are in separate AGs, expected _matching_ $ And that's because it's able to create an association with it's parent at allocation time rather than create time. So, the test failure is actually a case of "this works better than the old code" and not a negative at all. And you can see where the AGs filled up in this test, and so new associations for the streams had to be made, and that worked just fine, too. I've done some other, higher bandwidth testing similar to realtime file-per-frame video ingest for 2k resolution video (12.8MB files, writing as fast as possible using direct IO with a directory per "video") and that works just fine at the limits of my local hardware (about 850MB/s to disk). So I'm going to modify the function name I disliked, and commit this to a topic branch and push it into the for-next branch for wider testing. If we need further modifications, we can fix them up later.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 22 16:30:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CDF177F4E for ; Tue, 22 Apr 2014 16:30:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A730C8F8040 for ; Tue, 22 Apr 2014 14:30:55 -0700 (PDT) X-ASG-Debug-ID: 1398202253-04bdf0455327ae60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ZcXFAzkNNOFa8zQM for ; Tue, 22 Apr 2014 14:30:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlBlADzeVlN5LEcvPGdsb2JhbABZgwaDZIUKonCZZoEVFwMBAQEBODWCJQEBBTocIxAIAxgJJQ8FJQMHGhOIQM4KFxaNc00HhDgEmG+KbIsqK4Et Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:00:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WciHD-0002DL-Am; Wed, 23 Apr 2014 07:30:51 +1000 Date: Wed, 23 Apr 2014 07:30:51 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , xfs-oss , Jan Kara Subject: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140422213051.GL18672@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <5356B986.2060906@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5356B986.2060906@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398202253 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5164 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 01:48:38PM -0500, Eric Sandeen wrote: > The Q_XQUOTARM quotactl was not working properly, because > we weren't passing around proper flags. The xfs_fs_set_xstate() > ioctl handler used the same flags for Q_XQUOTAON/OFF as > well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for > XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, > i.e. quota type + state, while Q_XQUOTARM looks only for > the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. > > Unfortunately these flag spaces overlap a bit, so we > got semi-random results for Q_XQUOTARM; i.e. the value > for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. > > Add a new quotactl op vector specifically for the QUOTARM > operation, since it operates with a different flag space. > > This has been broken more or less forever, AFAICT. > > Signed-off-by: Eric Sandeen > --- Looks fine to me, but I'll need Jan to ack it before I pull it in. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 22 16:39:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 35AF37F50 for ; Tue, 22 Apr 2014 16:39:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B34B8F8049 for ; Tue, 22 Apr 2014 14:39:03 -0700 (PDT) X-ASG-Debug-ID: 1398202741-04bdf0455427b1a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 8ZzXNYZaf7MBQ4SX for ; Tue, 22 Apr 2014 14:39:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq1xAJTgVlN5LEcvPGdsb2JhbABZgwaIbqJwmWeBFRcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTiEDODxcWjkAHhDgEmG+KbIsqKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:09:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WciP3-0002KO-Nb; Wed, 23 Apr 2014 07:38:57 +1000 Date: Wed, 23 Apr 2014 07:38:57 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro Message-ID: <20140422213857.GM18672@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: Nuke XFS_ERROR macro References: <534EC073.8090006@sandeen.net> <534EC282.7010905@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <534EC282.7010905@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398202741 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5164 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 16, 2014 at 12:48:50PM -0500, Eric Sandeen wrote: > XFS_ERROR was designed long ago to trap return values, > but it's not runtime configurable, it's not consistently used, > and we can do the same thing today with systemtap, using > something like: > > probe module("xfs").function("xfs_*").return { if (@defined($return) && $return == VALUE) { ... } } > > Just nuke XFS_ERROR and associated bits. > > Signed-off-by: Eric Sandeen Eric, given the rebasing impact of this change on other pending work, I think we should plan to merge this just prior to the next upstream merge. Perhaps regenerate it against the for-next branch a week before the merge window is likely to open, and then apply it? That way we (well, I) don't have to spend a alrge proportion of this merge window fixing up patch mismatches vs the master branch? Is that an acceptible approach for everyone? (Note: I'm assuming Christoph is OK with this given the ftrace scripts we can use to replace this macro...) Cheers, Dave. -- Dave Chinner david@fromorbit.com From jack@suse.cz Tue Apr 22 16:48:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E30977F52 for ; Tue, 22 Apr 2014 16:48:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81A94AC00D for ; Tue, 22 Apr 2014 14:48:34 -0700 (PDT) X-ASG-Debug-ID: 1398203311-04cbb06e9a26a8b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id I37s5WYaqCEmEDxU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 14:48:32 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A139AAB46; Tue, 22 Apr 2014 21:48:30 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id C56AC81C3A; Tue, 22 Apr 2014 23:48:28 +0200 (CEST) Date: Tue, 22 Apr 2014 23:48:28 +0200 From: Jan Kara To: Dave Chinner Cc: Eric Sandeen , Eric Sandeen , xfs-oss , Jan Kara Subject: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140422214828.GL366@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <5356B986.2060906@sandeen.net> <20140422213051.GL18672@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422213051.GL18672@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1398203312 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 23-04-14 07:30:51, Dave Chinner wrote: > On Tue, Apr 22, 2014 at 01:48:38PM -0500, Eric Sandeen wrote: > > The Q_XQUOTARM quotactl was not working properly, because > > we weren't passing around proper flags. The xfs_fs_set_xstate() > > ioctl handler used the same flags for Q_XQUOTAON/OFF as > > well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for > > XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, > > i.e. quota type + state, while Q_XQUOTARM looks only for > > the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. > > > > Unfortunately these flag spaces overlap a bit, so we > > got semi-random results for Q_XQUOTARM; i.e. the value > > for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. > > > > Add a new quotactl op vector specifically for the QUOTARM > > operation, since it operates with a different flag space. > > > > This has been broken more or less forever, AFAICT. > > > > Signed-off-by: Eric Sandeen > > --- > > Looks fine to me, but I'll need Jan to ack it before I pull it in. The patch looks good to me as well. So feel free to add: Acked-by: Jan Kara Honza -- Jan Kara SUSE Labs, CR From dave@fromorbit.com Tue Apr 22 17:04:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0716A7F3F for ; Tue, 22 Apr 2014 17:04:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D920304032 for ; Tue, 22 Apr 2014 15:04:44 -0700 (PDT) X-ASG-Debug-ID: 1398204282-04cb6c243626aef0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6LKU8jOC0kOLYYYV for ; Tue, 22 Apr 2014 15:04:42 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AphxAGHmVlN5LEcvPGdsb2JhbABZgwaIbqJwmnwXAwEBAQE4NYIlAQEFVjMIGDE5AwcUGYhAzkmOc4QiBK8FKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PL-DU for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000oC-Ci for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] generic: cleanup space after test in TESTDIR Date: Wed, 23 Apr 2014 08:04:32 +1000 X-ASG-Orig-Subj: [PATCH 4/6] generic: cleanup space after test in TESTDIR Message-Id: <1398204274-2113-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398204274-2113-1-git-send-email-david@fromorbit.com> References: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204282 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5164 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner A couple of tests leave behind large files or directory structures when they complete, which leads to small TEST_DEVs running out of space during other tests. Make those space hogs clean up after themselves so that random tests don't fail with ENOSPC errors. Signed-off-by: Dave Chinner --- tests/generic/070 | 1 + tests/xfs/292 | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tests/generic/070 b/tests/generic/070 index 3c88df0..f593d84 100755 --- a/tests/generic/070 +++ b/tests/generic/070 @@ -34,6 +34,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { cd / + rm -rf $TEST_DIR/fsstress rm -f $tmp.* } diff --git a/tests/xfs/292 b/tests/xfs/292 index d67db47..2910118 100755 --- a/tests/xfs/292 +++ b/tests/xfs/292 @@ -57,6 +57,8 @@ mkfs.xfs -f $fsfile 2>&1 | sed -e "s:$fsfile:FILENAME:g" | grep meta-data echo "mkfs.xfs with cmdline geometry" mkfs.xfs -f -d su=16k,sw=5 $fsfile 2>&1 | sed -e "s:$fsfile:FILENAME:g" | grep meta-data +rm -f $fsfile + # success, all done status=0 exit -- 1.9.0 From dave@fromorbit.com Tue Apr 22 17:04:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1FF8D7F51 for ; Tue, 22 Apr 2014 17:04:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E472F8F8066 for ; Tue, 22 Apr 2014 15:04:44 -0700 (PDT) X-ASG-Debug-ID: 1398204280-04bdf0455427bbc0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id AzsiNhuPmbGeHo4r for ; Tue, 22 Apr 2014 15:04:43 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AphxAGHmVlN5LEcvPGdsb2JhbABZgwaIbqJwmnwXAwEBAQE4NYIlAQEFVjMIGDE5AwcUGYhAzkmOc4QiBKNbiyor Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PN-Ea for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000oM-Du for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] filter: xfs_repair emits new corruption messagse Date: Wed, 23 Apr 2014 08:04:34 +1000 X-ASG-Orig-Subj: [PATCH 6/6] filter: xfs_repair emits new corruption messagse Message-Id: <1398204274-2113-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398204274-2113-1-git-send-email-david@fromorbit.com> References: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204282 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_repair now dumps metadata and CRC corruption information to the output from the verifier infrastrcuture. Filter this out so that it doesn't cause spurious test failures such as in xfs/030 and xfs/033. Signed-off-by: Dave Chinner --- common/repair | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/repair b/common/repair index db160bb..3e73c1d 100644 --- a/common/repair +++ b/common/repair @@ -80,6 +80,9 @@ s/\s+- \d+:\d\d:\d\d:.*\n//g; # crc enabled filesystem output /XFS_CORRUPTION_ERROR/ && next; /^bad uuid/ && next; +/^Metadata corruption detected/ && next; +/^Metadata CRC error detected/ && next; +/^agfl has bad CRC/ && next; print;' } -- 1.9.0 From dave@fromorbit.com Tue Apr 22 17:04:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 08B847F3F for ; Tue, 22 Apr 2014 17:04:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D420D304032 for ; Tue, 22 Apr 2014 15:04:42 -0700 (PDT) X-ASG-Debug-ID: 1398204280-04bdf0455427bbc0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id CfZQ0jHRSjglvx0v for ; Tue, 22 Apr 2014 15:04:41 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoxxAGHmVlN5LEcvPGdsb2JhbABZgwaIbqJwmnwXAwEBAQE4NYMCO4ECAweIbZ0RsTiOc4QiBK0BggQr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PH-BG for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000nu-AE for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6] xfstests: fixes and new tests Date: Wed, 23 Apr 2014 08:04:28 +1000 X-ASG-Orig-Subj: [PATCH 0/6] xfstests: fixes and new tests Message-Id: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204280 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, In this series, there are a some cleanup patches related to running small TEST_DEV filesystems out of space on repeated runs. There are some tests that leave large files lying around that consume space, so when you have a 4GB TEST_DEV soem of the tests will fail because they need 3GB of free space. There is a new test for maximum ACL count support in XFS - I've removed the ACL count subtest from shared/051 and created a new XFS specific test that uses the maximum supported number of ACLs for the given filesystem configuration rather than 25. This new test is what exposed the transaction overrun when replacing a remote attribute with an inline attribute. There is also a patch to remove the DMAPI tests from the auto group - almost nobody has an XFS/DMAPI enabled kernel that can run these tests, so they can add "-g dmapi" to their tests runs rather than have everyone else have to run "-x dmapi" to avoid the "notrun" noise that is generated. Finally, there is a xfs_repair filter patch that chops out the new CRC/corruption detection messages that are emitted when verifiers detect problems. This makes xfs/030 and xfs/033 pass.... Cheers, Dave. From dave@fromorbit.com Tue Apr 22 17:04:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D83C7F3F for ; Tue, 22 Apr 2014 17:04:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15ED6304032 for ; Tue, 22 Apr 2014 15:04:46 -0700 (PDT) X-ASG-Debug-ID: 1398204282-04cb6c243626aef0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GsqFHAsXDilcrBp8 for ; Tue, 22 Apr 2014 15:04:44 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AphxAGHmVlN5LEcvPGdsb2JhbABZgwaIbqJwmnwXAwEBAQE4NYIlAQEFVjMIGDE5AwcUGYhAzjIXkxUElQKaAys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PJ-CE for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000o2-BY for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] shared/051: remove ACL count subtest Date: Wed, 23 Apr 2014 08:04:30 +1000 X-ASG-Orig-Subj: [PATCH 2/6] shared/051: remove ACL count subtest Message-Id: <1398204274-2113-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398204274-2113-1-git-send-email-david@fromorbit.com> References: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204283 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5164 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Different versions of XFS support different numbers of ACLs on disk. Remove that subtest from this shared test to prevent it form causing spurious failures on filesystems that support more than 25 ACLs. Signed-off-by: Dave Chinner --- tests/shared/051 | 45 ----------------- tests/shared/051.out | 135 --------------------------------------------------- 2 files changed, 180 deletions(-) diff --git a/tests/shared/051 b/tests/shared/051 index 39fdad4..2b61f45 100755 --- a/tests/shared/051 +++ b/tests/shared/051 @@ -318,51 +318,6 @@ chacl m:user1:rwx file1 chacl a::rwx file1 set +x -# we return E2BIG if hit the max acl limits on new kernel, but EINVAL -# on old kernel. So we need to filter out the error message in order -# to make the updated golden output works for both old and new kernels. -_filter_largeacl() -{ - sed -e "s/Invalid argument/Argument list too long/" -} - -#------------------------------------------------------- - -echo "" -echo "=== Test out large ACLs ===" -touch largeaclfile -XFS_ACL_MAX_ENTRIES=25 -num_aces_pre=`expr $XFS_ACL_MAX_ENTRIES - 1` -num_aces_post=`expr $XFS_ACL_MAX_ENTRIES + 1` - -acl1=`_create_n_aces $num_aces_pre` -acl2=`_create_n_aces $XFS_ACL_MAX_ENTRIES` -acl3=`_create_n_aces $num_aces_post` -acl4=`_create_n_aces 16` # Andreas G. libacl size for initial get -acl5=`_create_n_aces 17` # 1 over A.G. libacl initial size - -echo "1 below xfs acl max" -chacl $acl1 largeaclfile -getfacl --numeric largeaclfile | _filter_aces - -echo "xfs acl max" -chacl $acl2 largeaclfile -getfacl --numeric largeaclfile | _filter_aces - -echo "1 above xfs acl max" -chacl $acl3 largeaclfile 2>&1 | _filter_largeacl -getfacl --numeric largeaclfile | _filter_aces - -echo "use 16 aces" -chacl $acl4 largeaclfile -getfacl --numeric largeaclfile | _filter_aces - -echo "use 17 aces" -chacl $acl5 largeaclfile -getfacl --numeric largeaclfile | _filter_aces - -#------------------------------------------------------- - # success, all done status=0 exit diff --git a/tests/shared/051.out b/tests/shared/051.out index 354ec6a..2b5220f 100644 --- a/tests/shared/051.out +++ b/tests/shared/051.out @@ -218,138 +218,3 @@ chacl: m:user1:rwx - Invalid argument + chacl a::rwx file1 chacl: a::rwx - Invalid argument + set +x - -=== Test out large ACLs === -1 below xfs acl max -# file: largeaclfile -# owner: 0 -# group: 0 -user::rwx -user:1:rwx -user:2:rwx -user:3:rwx -user:4:rwx -user:5:rwx -user:6:rwx -user:7:rwx -user:8:rwx -user:9:rwx -user:10:rwx -user:11:rwx -user:12:rwx -user:13:rwx -user:14:rwx -user:15:rwx -user:16:rwx -user:17:rwx -user:18:rwx -user:19:rwx -user:20:rwx -group::rwx -mask::rwx -other::rwx - -xfs acl max -# file: largeaclfile -# owner: 0 -# group: 0 -user::rwx -user:1:rwx -user:2:rwx -user:3:rwx -user:4:rwx -user:5:rwx -user:6:rwx -user:7:rwx -user:8:rwx -user:9:rwx -user:10:rwx -user:11:rwx -user:12:rwx -user:13:rwx -user:14:rwx -user:15:rwx -user:16:rwx -user:17:rwx -user:18:rwx -user:19:rwx -user:20:rwx -user:21:rwx -group::rwx -mask::rwx -other::rwx - -1 above xfs acl max -chacl: cannot set access acl on "largeaclfile": Argument list too long -# file: largeaclfile -# owner: 0 -# group: 0 -user::rwx -user:1:rwx -user:2:rwx -user:3:rwx -user:4:rwx -user:5:rwx -user:6:rwx -user:7:rwx -user:8:rwx -user:9:rwx -user:10:rwx -user:11:rwx -user:12:rwx -user:13:rwx -user:14:rwx -user:15:rwx -user:16:rwx -user:17:rwx -user:18:rwx -user:19:rwx -user:20:rwx -user:21:rwx -group::rwx -mask::rwx -other::rwx - -use 16 aces -# file: largeaclfile -# owner: 0 -# group: 0 -user::rwx -user:1:rwx -user:2:rwx -user:3:rwx -user:4:rwx -user:5:rwx -user:6:rwx -user:7:rwx -user:8:rwx -user:9:rwx -user:10:rwx -user:11:rwx -user:12:rwx -group::rwx -mask::rwx -other::rwx - -use 17 aces -# file: largeaclfile -# owner: 0 -# group: 0 -user::rwx -user:1:rwx -user:2:rwx -user:3:rwx -user:4:rwx -user:5:rwx -user:6:rwx -user:7:rwx -user:8:rwx -user:9:rwx -user:10:rwx -user:11:rwx -user:12:rwx -user:13:rwx -group::rwx -mask::rwx -other::rwx - -- 1.9.0 From dave@fromorbit.com Tue Apr 22 17:04:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9EA87F52 for ; Tue, 22 Apr 2014 17:04:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3CBB304032 for ; Tue, 22 Apr 2014 15:04:46 -0700 (PDT) X-ASG-Debug-ID: 1398204280-04bdf0455427bbc0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id THRy8OiSxsOLvVcY for ; Tue, 22 Apr 2014 15:04:44 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao5yAGHmVlN5LEcvPGdsb2JhbABZgwZPiB+iagaafBcDAQEBATg1giUBAQVWMwgYMTkDBxQZiEDOSYxagSUKhQwEjmuGF5oDK4Et Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PK-Cx for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000o7-C1 for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: introduce new large ACL test Date: Wed, 23 Apr 2014 08:04:31 +1000 X-ASG-Orig-Subj: [PATCH 3/6] xfs: introduce new large ACL test Message-Id: <1398204274-2113-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398204274-2113-1-git-send-email-david@fromorbit.com> References: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204284 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=INFO_TLD X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain From: Dave Chinner Having just removed the largeacl test from the shared ACL test, reintroduce the same test as an XFS specific test so that we can handle the different limits in supported ACL count appropriately. Signed-off-by: Dave Chinner --- tests/xfs/010 | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/010.out | 9 ++++ tests/xfs/group | 1 + 3 files changed, 157 insertions(+) create mode 100644 tests/xfs/010 create mode 100644 tests/xfs/010.out diff --git a/tests/xfs/010 b/tests/xfs/010 new file mode 100644 index 0000000..4f75d26 --- /dev/null +++ b/tests/xfs/010 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. xfs/010 +# +# Test out ACL count limits +# +#----------------------------------------------------------------------- +# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. +# Copyright (c) 2014 Red hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq + +here=`pwd` +tmp=/tmp/$$ +runas=$here/src/runas +status=1 # FAILure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +_cleanup() +{ + cd / + rm -f $tmp.* + [ -n "$TEST_DIR" ] && rm -rf $TEST_DIR/$seq.dir1 +} + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_scratch + +[ -x $runas ] || _notrun "$runas executable not found" + +rm -f $seqres.full + +_need_to_be_root +_acl_setup_ids +_require_acls + +# get dir +cd $TEST_DIR +rm -rf $seq.dir1 +mkdir $seq.dir1 +cd $seq.dir1 + +echo "QA output created by $seq" + +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL +# on old kernel. So we need to filter out the error message in order +# to make the updated golden output works for both old and new kernels. +_filter_largeacl() +{ + sed -e "s/Invalid argument/Argument list too long/" +} + +# filter all the non-ace stuff from the acl output so the count is +# correct. Note that this assumes that _create_n_aces always creates rwx acls. +_filter_acls() +{ + _filter_aces | grep ':rwx' +} + +# CRC format filesystems have much larger ACL counts. The actual number is into +# the thousands, but testing that meany takes too long, so just test well past +# the old limit of 25. +get_max_acls() +{ + xfs_info $TEST_DIR | _filter_mkfs > /dev/null 2> $tmp.info + . $tmp.info + if [ $_fs_has_crcs -eq 0 ]; then + echo 25 + else + echo 5461 + fi +} + +# store the output in seqres.full, then run again an count and filter the +# output. +check_acls() +{ + _acl=$1 + _count=$2 + + chacl $_acl largeaclfile 2>&1 | _filter_largeacl + getfacl --numeric largeaclfile | _filter_aces \ + >> $seqres.full 2> /dev/null + nacls=`getfacl --numeric largeaclfile | _filter_acls | wc -l` + if [ $nacls -ne $_count ]; then + echo Wrong ACL count - $nacls != $_count + fi +} + + +echo "" +echo "=== Test out large ACLs ===" +touch largeaclfile + +XFS_ACL_MAX_ENTRIES=$(get_max_acls) +num_aces_pre=$((XFS_ACL_MAX_ENTRIES - 1)) +num_aces_post=$((XFS_ACL_MAX_ENTRIES + 1)) + +acl1=`_create_n_aces $num_aces_pre` +acl2=`_create_n_aces $XFS_ACL_MAX_ENTRIES` +acl3=`_create_n_aces $num_aces_post` +acl4=`_create_n_aces 16` # Andreas G. libacl size for initial get +acl5=`_create_n_aces 17` # 1 over A.G. libacl initial size + +echo "1 below xfs acl max" +check_acls $acl1 $num_aces_pre + +echo "xfs acl max" +check_acls $acl2 $XFS_ACL_MAX_ENTRIES + +# we expect the ACL change to fail, so the old ACLs should remain on the +# file. Hence the expected ACL count is XFS_ACL_MAX_ENTRIES, not num_aces_post. +echo "1 above xfs acl max" +check_acls $acl3 $XFS_ACL_MAX_ENTRIES + +echo "use 16 aces" +check_acls $acl4 16 + +echo "use 17 aces" +check_acls $acl5 17 + +# success, all done +status=0 +exit diff --git a/tests/xfs/010.out b/tests/xfs/010.out new file mode 100644 index 0000000..5f7f428 --- /dev/null +++ b/tests/xfs/010.out @@ -0,0 +1,9 @@ +QA output created by 010 + +=== Test out large ACLs === +1 below xfs acl max +xfs acl max +1 above xfs acl max +chacl: cannot set access acl on "largeaclfile": Argument list too long +use 16 aces +use 17 aces diff --git a/tests/xfs/group b/tests/xfs/group index 445783e..f907d9b 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -7,6 +7,7 @@ 007 auto quota quick 008 rw ioctl auto quick 009 rw ioctl auto prealloc quick +010 acl quick auto 012 rw auto quick 016 rw auto quick 017 mount auto quick stress -- 1.9.0 From dave@fromorbit.com Tue Apr 22 17:04:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C6977F57 for ; Tue, 22 Apr 2014 17:04:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 029218F8049 for ; Tue, 22 Apr 2014 15:04:43 -0700 (PDT) X-ASG-Debug-ID: 1398204280-04bdf0455427bbc0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IAEN1Y79KHWFoIEK for ; Tue, 22 Apr 2014 15:04:42 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AphxAGHmVlN5LEcvPGdsb2JhbABZgwaIbqJwmnwXAwEBAQE4NYIlAQEFVjMIGDE5AwcUGYhAzkmOc4QiBK8FKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PI-Bm for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000nx-B4 for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] generic/204: tweak reserve pool size Date: Wed, 23 Apr 2014 08:04:29 +1000 X-ASG-Orig-Subj: [PATCH 1/6] generic/204: tweak reserve pool size Message-Id: <1398204274-2113-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398204274-2113-1-git-send-email-david@fromorbit.com> References: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204281 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner On small block size filesystems, the reserve pool size is kept constant at 4MB. filesystems with smaller blocks use comparitively more blocks for indexing metadata (e.g. in the inode and extent btrees) and so having a higher indirect block usage. Hence we need to leave the reserve pool at 1024 block and not scale it for a constant size. This makes the test pass on a filesystem made with MKFS_OPTIONS="-b size=1024 -m crc=1". Signed-off-by: Dave Chinner --- tests/generic/204 | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/generic/204 b/tests/generic/204 index 4ebab26..de029c6 100755 --- a/tests/generic/204 +++ b/tests/generic/204 @@ -74,7 +74,6 @@ space=97920000 # files = (97920000 / (isize + bsize)) files=$((space / (isize + dbsize))) -resv_blks=$((resv_blks * (4096 / dbsize))) echo files $files, resvblks $resv_blks >> $seqres.full _scratch_resvblks $resv_blks >> $seqres.full 2>&1 @@ -88,5 +87,4 @@ _check_scratch_fs # success, all done echo "*** done" -rm -f $seqres.full status=0 -- 1.9.0 From dave@fromorbit.com Tue Apr 22 17:04:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 421637F5D for ; Tue, 22 Apr 2014 17:04:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6B0EAC00E for ; Tue, 22 Apr 2014 15:04:45 -0700 (PDT) X-ASG-Debug-ID: 1398204283-04cbb06e9b26af40001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HFVRRcF0LhF4vn2v for ; Tue, 22 Apr 2014 15:04:44 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AphxAGHmVlN5LEcvPGdsb2JhbABZgwaIbqJwmnwXAwEBAQE4NYIlAQEFVjMIGDE5AwcUGYhAzkmOc4QiBK8FKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 07:34:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wcinv-0002PM-E9 for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wcinv-0000oH-D5 for xfs@oss.sgi.com; Wed, 23 Apr 2014 08:04:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: remove dmapi tests from the auto group Date: Wed, 23 Apr 2014 08:04:33 +1000 X-ASG-Orig-Subj: [PATCH 5/6] xfs: remove dmapi tests from the auto group Message-Id: <1398204274-2113-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398204274-2113-1-git-send-email-david@fromorbit.com> References: <1398204274-2113-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398204283 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is no mainline kernel support for DMAPI in XFS, and so every time the xfstests auto group is run it throws a large number of "[not run] Assuming DMAPI modules are not loaded". I've noted that people are excluding the dmapi group to avoid this, so rather than inflict pain on everyone, make hose few that need to do dmapi testing include it specifically. IOWs, remove the DMAPI tests from the auto group. Signed-off-by: Dave Chinner --- tests/xfs/group | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/xfs/group b/tests/xfs/group index f907d9b..426dd58 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -93,48 +93,48 @@ 138 metadata log auto 139 metadata log auto 140 metadata log auto -142 dmapi auto -143 dmapi auto -144 dmapi auto -145 dmapi auto -146 dmapi auto -147 dmapi auto +142 dmapi +143 dmapi +144 dmapi +145 dmapi +146 dmapi +147 dmapi 148 repair auto 149 repair auto -150 dmapi auto -151 dmapi auto -152 dmapi auto -153 dmapi auto -154 dmapi auto -155 dmapi auto -156 dmapi auto -157 dmapi auto -158 dmapi auto -159 dmapi auto -160 dmapi auto -161 dmapi auto -162 dmapi auto -163 dmapi auto +150 dmapi +151 dmapi +152 dmapi +153 dmapi +154 dmapi +155 dmapi +156 dmapi +157 dmapi +158 dmapi +159 dmapi +160 dmapi +161 dmapi +162 dmapi +163 dmapi 164 rw pattern auto prealloc quick 165 rw pattern auto prealloc quick 166 rw metadata auto quick 167 rw metadata auto stress -168 dmapi auto +168 dmapi 170 rw filestreams auto quick 171 rw filestreams 172 rw filestreams 173 rw filestreams 174 rw filestreams auto -175 dmapi auto -176 dmapi auto -177 rw other auto +175 dmapi +176 dmapi +177 dmapi 178 mkfs other auto 179 metadata rw auto 180 metadata rw auto 181 log auto quick 182 metadata rw auto 183 rw other auto quick -185 dmapi auto +185 dmapi 186 attr auto quick 187 attr auto quick 188 ci dir auto -- 1.9.0 From dgc@oss.sgi.com Tue Apr 22 17:29:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 53BF17F4E; Tue, 22 Apr 2014 17:29:17 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-unused-args-cleanup, created. xfs-for-linus-3.15-rc1-14846-g5e06d14 X-Git-Refname: refs/heads/xfs-unused-args-cleanup X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 5e06d148949bb79af429c46afb4b81bc31308f6e Message-Id: <20140422222917.53BF17F4E@oss.sgi.com> Date: Tue, 22 Apr 2014 17:29:16 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-unused-args-cleanup has been created at 5e06d148949bb79af429c46afb4b81bc31308f6e (commit) - Log ----------------------------------------------------------------- commit 5e06d148949bb79af429c46afb4b81bc31308f6e Author: Eric Sandeen Date: Mon Apr 14 19:07:23 2014 +1000 xfs: remove unused calculation in xfs_dir2_sf_addname() The "add_entsize" calculated here is never used. "incr_isize" accounts for the inode expansion of the old entries + parent + new entry all by itself. Once we've removed add_entsize there, it's just a pointless intermediate variable elsewhere, so remove it. For that matter, old_isize is gratuitous too, so nuke that. And add a few comments so the magic "+1's" and "+2's" make a bit more sense. Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit e5e98bc64df122c3c0fb562c53dac5c5dfc64975 Author: Eric Sandeen Date: Mon Apr 14 19:06:46 2014 +1000 xfs: remove pointless pointer increment in xfs_dir2_block_compact() xfs_dir2_block_compact() is passed a pointer to *blp, and advances it locally - but nobody uses the pointer (locally) after that. This behavior came about as part of prior refactoring, 20f7e9f xfs: factor dir2 block read operations and looking at the code as it was before, it seems quite clear that this change introduced a bug; the pre-refactoring code expects blp to be modified after compaction. And indeed it did; see this commit which fixed it: 37f1356 xfs: recalculate leaf entry pointer after compacting a dir2 block So the bug was introduced & resolved in the 3.8 cycle. Whoops. Well, it's fixed now, and mystery solved; just remove the now-pointless local increment of the blp pointer. (I guess we should have run clang earlier!) Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit bbe4c668694cb22a6016d3845c9b362c44e8341f Author: Eric Sandeen Date: Mon Apr 14 19:06:25 2014 +1000 xfs: remove unused trans pointer arg from xlog_recover_unmount_trans() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit e4a1e29cb0ace3a322c5c07d33dd1f4ab50dbbb8 Author: Eric Sandeen Date: Mon Apr 14 19:06:05 2014 +1000 xfs: remove unused ail pointer arg from xfs_trans_ail_cursor_done() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit bda65ef8a8ab8944628b7ff1182902612efd8bc3 Author: Eric Sandeen Date: Mon Apr 14 19:05:43 2014 +1000 xfs: remove unused xfs_mount arg from xfs_symlink_hdr_ok() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit fd9fdba6c366f6a1606572e46eebf770462ff484 Author: Eric Sandeen Date: Mon Apr 14 19:04:46 2014 +1000 xfs: remove unused bp arg from xfs_iflush_fork() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit e009400870c16c2003b2183b2daa9f1e80ff516b Author: Eric Sandeen Date: Mon Apr 14 19:04:19 2014 +1000 xfs: remove unused pag ptr arg from iterator execute functions Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 6f8950cd731432508859ef0c054b026270095b2e Author: Eric Sandeen Date: Mon Apr 14 19:03:53 2014 +1000 xfs: remove unused length arg from alloc_block ops Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 6ea94bb5b30f14717e349f4e3ea4a6df03e1ee67 Author: Eric Sandeen Date: Mon Apr 14 19:03:34 2014 +1000 xfs: remove unused mp arg from xfs_calc_dquots_per_chunk() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 25994053745be958aa8455a753a5c965a9006ba4 Author: Eric Sandeen Date: Mon Apr 14 19:02:30 2014 +1000 xfs: remove unused mp arg from xfs_dir2 dataptr/byte functions Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 9df2dd0b0d2aad3ce2480e0618bfe14d37c017a3 Author: Eric Sandeen Date: Mon Apr 14 19:01:59 2014 +1000 xfs: remove unused tp arg from xfs_da_reada_buf & callers This one hits a few functions as we unravel the unused arg up through the callers. Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 72b0636bb7aca50978da60dfbaefc44020e1600e Author: Eric Sandeen Date: Mon Apr 14 19:01:34 2014 +1000 xfs: remove unused bip arg from xfs_buf_item_log_segment() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 87937bf8cae495d4eafdae226e0726c25c3ff9f9 Author: Eric Sandeen Date: Mon Apr 14 19:01:20 2014 +1000 xfs: remove unused flags arg from _xfs_buf_get_pages() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 34dcefd717dea161182c18e2622cd9bed4bb4835 Author: Eric Sandeen Date: Mon Apr 14 19:01:00 2014 +1000 xfs: remove unused args from xfs_alloc_buftarg() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit a96c41519ac95bd7e8c798d235d6c98ca846090a Author: Eric Sandeen Date: Mon Apr 14 19:00:29 2014 +1000 xfs: remove unused blocksize arg from xfs_setsize_buftarg() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 0d7409b142472dda73939add752e0815900b3df9 Author: Eric Sandeen Date: Mon Apr 14 18:59:56 2014 +1000 xfs: remove unused level arg from xfs_btree_read_buf_block() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 6a9edd3d548f074c484802134e719390d9585ed6 Author: Eric Sandeen Date: Mon Apr 14 18:59:26 2014 +1000 xfs: remove unused mp arg from xfs_bmap_forkoff_reset() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 152d93b732d4d15a10db03b660b07ed5c44b4e0d Author: Eric Sandeen Date: Mon Apr 14 18:58:51 2014 +1000 xfs: remove unused mp arg from xfs_bmdr_maxrecs() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 6d0081a3da32c9a9e480ae2796588508347bdb9e Author: Eric Sandeen Date: Mon Apr 14 18:58:29 2014 +1000 xfs: remove unused mp arg from xfs_attr3_rmt_hdr_ok() Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 7fb2cd4d32fed48d5fd88e0e922f162c182f5f8c Author: Eric Sandeen Date: Mon Apr 14 18:58:05 2014 +1000 xfs: remove unused tp arg from xfs_bmap_last_offset() and callers remove unused transaction pointer from various callchains leading to xfs_bmap_last_offset(). Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Tue Apr 22 17:29:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id B180B7F52; Tue, 22 Apr 2014 17:29:35 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-filestreams-lookup, created. xfs-for-linus-3.15-rc1-14835-gb94acd4 X-Git-Refname: refs/heads/xfs-filestreams-lookup X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: b94acd4786dce4379e986e6d58bdd74f8986af2f Message-Id: <20140422222935.B180B7F52@oss.sgi.com> Date: Tue, 22 Apr 2014 17:29:35 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-filestreams-lookup has been created at b94acd4786dce4379e986e6d58bdd74f8986af2f (commit) - Log ----------------------------------------------------------------- commit b94acd4786dce4379e986e6d58bdd74f8986af2f Author: Christoph Hellwig Date: Wed Apr 23 07:11:52 2014 +1000 xfs: add filestream allocator tracepoints Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 3b8d90766a85e079fefaee74ca9dde43ce75edea Author: Christoph Hellwig Date: Wed Apr 23 07:11:52 2014 +1000 xfs: remove xfs_filestream_associate There is no good reason to create a filestream when a directory entry is created. Delay it until the first allocation happens to simply the code and reduce the amount of mru cache lookups we do. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 1919adda0732e661c6163a6505dddb0bc423b8d8 Author: Christoph Hellwig Date: Wed Apr 23 07:11:51 2014 +1000 xfs: don't create a slab cache for filestream items We only have very few of these around, and allocation isn't that much of a hot path. Remove the slab cache to simplify the code, and to not waste any resources for the usual case of not having any inodes that use the filestream allocator. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 2cd2ef6a300b1ac912bb515b75451585c3d33ea9 Author: Christoph Hellwig Date: Wed Apr 23 07:11:51 2014 +1000 xfs: rewrite the filestream allocator using the dentry cache In Linux we will always be able to find a parent inode for file that are undergoing I/O. Use this to simply the file stream allocator by only keeping track of parent inodes. Signed-off-by: Christoph Hellwig commit f37211c336d722805493aec8b13afdbb92bbfd98 Author: Christoph Hellwig Date: Wed Apr 23 07:11:51 2014 +1000 xfs: remove XFS_IFILESTREAM We never test the flag except in xfs_inode_is_filestream, but that function already tests the on-disk flag or filesystem wide flags, and is used to decide if we want to set XFS_IFILESTREAM in the first place. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 22328d712dd7fdc984d17da2121be840d1f844cd Author: Christoph Hellwig Date: Wed Apr 23 07:11:51 2014 +1000 xfs: embedd mru_elem into parent structure There is no need to do a separate allocation for each mru element, just embedd the structure into the parent one in the user. Besides saving a memory allocation and the infrastructure required for it this also simplifies the API. While we do major surgery on xfs_mru_cache.c also de-typedef it and make struct mru_cache private to the implementation file. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit ce695c6551f9488e75247ac1eefcd173fda0c029 Author: Christoph Hellwig Date: Wed Apr 23 07:11:50 2014 +1000 xfs: handle duplicate entries in xfs_mru_cache_insert The radix tree code can detect and reject duplicate keys at insert time. Make xfs_mru_cache_insert handle this case so that future changes to the filestream allocator can take advantage of this. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit c977eb1065612bf64e18c61437e290c22183add8 Author: Christoph Hellwig Date: Wed Apr 23 07:11:41 2014 +1000 xfs: split xfs_bmap_btalloc_nullfb Split xfs_bmap_btalloc_nullfb into one function for filestream allocations and one for everything else that share a few helpers. This dramatically simplifies the control flow. Signed-off-by: Christoph Hellwig commit 8b90a33f476436ad6a49b7138d8a00ecbc62f9a6 Author: Christoph Hellwig Date: Mon Apr 14 19:37:42 2014 +1000 xfs: don't try to use the filestream allocator for metadata allocations xfs_bmap_btalloc_nullfb has two entirely different control flows when using the filestream allocator vs the regular one, but it get the conditionals wrong and ends up mixing the two for metadata allocations. Fix this by adding a missing userdata check and slight refactoring. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Tue Apr 22 17:30:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id B50D67F51; Tue, 22 Apr 2014 17:30:50 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc2-31-g7043507 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 330033d697ed8d296fa52b5303db9d802ad901cc X-Git-Newrev: 7043507bfa1af648512e36d95cca484757df0b64 Message-Id: <20140422223050.B50D67F51@oss.sgi.com> Date: Tue, 22 Apr 2014 17:30:50 -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 7043507 Merge branch 'xfs-filestreams-lookup' into for-next b94acd4 xfs: add filestream allocator tracepoints 3b8d907 xfs: remove xfs_filestream_associate 1919add xfs: don't create a slab cache for filestream items 2cd2ef6 xfs: rewrite the filestream allocator using the dentry cache f37211c xfs: remove XFS_IFILESTREAM 22328d7 xfs: embedd mru_elem into parent structure ce695c6 xfs: handle duplicate entries in xfs_mru_cache_insert c977eb1 xfs: split xfs_bmap_btalloc_nullfb c24c775 Merge branch 'xfs-unused-args-cleanup' into for-next 8b90a33 xfs: don't try to use the filestream allocator for metadata allocations 5e06d14 xfs: remove unused calculation in xfs_dir2_sf_addname() e5e98bc xfs: remove pointless pointer increment in xfs_dir2_block_compact() bbe4c66 xfs: remove unused trans pointer arg from xlog_recover_unmount_trans() e4a1e29 xfs: remove unused ail pointer arg from xfs_trans_ail_cursor_done() bda65ef xfs: remove unused xfs_mount arg from xfs_symlink_hdr_ok() fd9fdba xfs: remove unused bp arg from xfs_iflush_fork() e009400 xfs: remove unused pag ptr arg from iterator execute functions 6f8950c xfs: remove unused length arg from alloc_block ops 6ea94bb xfs: remove unused mp arg from xfs_calc_dquots_per_chunk() 2599405 xfs: remove unused mp arg from xfs_dir2 dataptr/byte functions 9df2dd0 xfs: remove unused tp arg from xfs_da_reada_buf & callers 72b0636 xfs: remove unused bip arg from xfs_buf_item_log_segment() 87937bf xfs: remove unused flags arg from _xfs_buf_get_pages() 34dcefd xfs: remove unused args from xfs_alloc_buftarg() a96c415 xfs: remove unused blocksize arg from xfs_setsize_buftarg() 0d7409b xfs: remove unused level arg from xfs_btree_read_buf_block() 6a9edd3 xfs: remove unused mp arg from xfs_bmap_forkoff_reset() 152d93b xfs: remove unused mp arg from xfs_bmdr_maxrecs() 6d0081a xfs: remove unused mp arg from xfs_attr3_rmt_hdr_ok() 7fb2cd4 xfs: remove unused tp arg from xfs_bmap_last_offset() and callers from 330033d697ed8d296fa52b5303db9d802ad901cc (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 7043507bfa1af648512e36d95cca484757df0b64 Merge: c24c775 b94acd4 Author: Dave Chinner Date: Wed Apr 23 07:12:35 2014 +1000 Merge branch 'xfs-filestreams-lookup' into for-next commit c24c775c5e3657d329ede70f744ba075095bb53d Merge: 330033d 5e06d14 Author: Dave Chinner Date: Tue Apr 22 19:21:42 2014 +1000 Merge branch 'xfs-unused-args-cleanup' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_alloc_btree.c | 1 - fs/xfs/xfs_attr_remote.c | 3 +- fs/xfs/xfs_bmap.c | 208 ++++++++------ fs/xfs/xfs_bmap.h | 4 +- fs/xfs/xfs_bmap_btree.c | 9 +- fs/xfs/xfs_bmap_btree.h | 2 +- fs/xfs/xfs_btree.c | 38 ++- fs/xfs/xfs_btree.h | 2 +- fs/xfs/xfs_buf.c | 17 +- fs/xfs/xfs_buf.h | 4 +- fs/xfs/xfs_buf_item.c | 3 +- fs/xfs/xfs_da_btree.c | 8 +- fs/xfs/xfs_da_btree.h | 6 +- fs/xfs/xfs_da_format.h | 10 +- fs/xfs/xfs_dir2.c | 26 +- fs/xfs/xfs_dir2.h | 4 +- fs/xfs/xfs_dir2_block.c | 9 +- fs/xfs/xfs_dir2_data.c | 3 +- fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_priv.h | 4 +- fs/xfs/xfs_dir2_readdir.c | 14 +- fs/xfs/xfs_dir2_sf.c | 21 +- fs/xfs/xfs_dquot_buf.c | 5 +- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_filestream.c | 684 ++++++++++---------------------------------- fs/xfs/xfs_filestream.h | 34 +-- fs/xfs/xfs_ialloc_btree.c | 1 - fs/xfs/xfs_icache.c | 12 +- fs/xfs/xfs_icache.h | 6 +- fs/xfs/xfs_inode.c | 39 +-- fs/xfs/xfs_inode.h | 4 +- fs/xfs/xfs_inode_fork.c | 3 +- fs/xfs/xfs_inode_fork.h | 3 +- fs/xfs/xfs_iomap.c | 2 +- fs/xfs/xfs_log_recover.c | 9 +- fs/xfs/xfs_mru_cache.c | 151 ++++------ fs/xfs/xfs_mru_cache.h | 31 +- fs/xfs/xfs_qm.c | 3 +- fs/xfs/xfs_qm_syscalls.c | 1 - fs/xfs/xfs_quota_defs.h | 2 +- fs/xfs/xfs_shared.h | 2 +- fs/xfs/xfs_super.c | 22 +- fs/xfs/xfs_symlink.c | 2 +- fs/xfs/xfs_symlink_remote.c | 1 - fs/xfs/xfs_trace.c | 1 + fs/xfs/xfs_trace.h | 58 ++++ fs/xfs/xfs_trans.c | 2 +- fs/xfs/xfs_trans_ail.c | 5 +- fs/xfs/xfs_trans_priv.h | 3 +- 50 files changed, 516 insertions(+), 972 deletions(-) hooks/post-receive -- XFS development tree From keyurgovande@gmail.com Tue Apr 22 18:35:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 04D3B7F3F for ; Tue, 22 Apr 2014 18:35:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A88768F8040 for ; Tue, 22 Apr 2014 16:35:39 -0700 (PDT) X-ASG-Debug-ID: 1398209734-04bdf0455527dd30001-NocioJ Received: from mail-wi0-f169.google.com (mail-wi0-f169.google.com [209.85.212.169]) by cuda.sgi.com with ESMTP id b5waheKB8q33ryGs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 22 Apr 2014 16:35:37 -0700 (PDT) X-Barracuda-Envelope-From: keyurgovande@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.169] Received: by mail-wi0-f169.google.com with SMTP id hm4so3794979wib.0 for ; Tue, 22 Apr 2014 16:35:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=B0vvi8rzCrNqcyTPz/k6myeLMaFs+EmaVZcsC3C7/V4=; b=Lm8dBU/c8bnp/krW2vSKD/Z4kkq7Q5+0nKVRDMDqdM0BfLdIHfgS1HHlhUdu34lBDv ZcrmUmXdjeaM4idK/4kzTdh4Dt/kOo1GzwGd7IgGriR9Xlm1a+/2lC2swdOcRt76Jn2R BIRHvhXsw8PQ3xm1sQL75jOiLpXvJpLRHoe9IJedDF6QLPD5ADqPzQTvNt7oarY72ppA CwvBNsaV8kECXpqKfio+LZ5+SmKWtDHXq7gD40/85E5GDNOGgzmMGbiwKhlxTOjhlOhM 0k28N0xKENaYCl2/YC7fhxCcI+OkjkCml6pKmFN07iXJQxfK/7ZQzazKL7vk3lUutA2V 1PRg== MIME-Version: 1.0 X-Received: by 10.180.78.5 with SMTP id x5mr570526wiw.12.1398209734368; Tue, 22 Apr 2014 16:35:34 -0700 (PDT) Received: by 10.227.97.136 with HTTP; Tue, 22 Apr 2014 16:35:34 -0700 (PDT) In-Reply-To: <20140408053117.GJ27017@dastard> References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> Date: Tue, 22 Apr 2014 19:35:34 -0400 Message-ID: Subject: Re: XFS fragmentation on file append From: Keyur Govande X-ASG-Orig-Subj: Re: XFS fragmentation on file append To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f169.google.com[209.85.212.169] X-Barracuda-Start-Time: 1398209736 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Apr 8, 2014 at 1:31 AM, Dave Chinner wrote: > On Mon, Apr 07, 2014 at 11:42:02PM -0400, Keyur Govande wrote: >> On Mon, Apr 7, 2014 at 9:50 PM, Dave Chinner wrote: >> > [cc the XFS mailing list ] >> > >> > On Mon, Apr 07, 2014 at 06:53:46PM -0400, Keyur Govande wrote: >> >> Hello, >> >> >> >> I'm currently investigating a MySQL performance degradation on XFS due >> >> to file fragmentation. >> >> >> >> The box has a 16 drive RAID 10 array with a 1GB battery backed cache >> >> running on a 12 core box. >> >> >> >> xfs_info shows: >> >> meta-data=/dev/sda4 isize=256 agcount=24, agsize=24024992 blks >> >> = sectsz=512 attr=2, projid32bit=0 >> >> data = bsize=4096 blocks=576599552, imaxpct=5 >> >> = sunit=16 swidth=512 blks >> >> naming = version 2 bsize=4096 ascii-ci=0 >> >> log = internal bsize=4096 blocks=281552, version=2 >> >> = sectsz=512 sunit=16 blks, lazy-count=1 >> >> realtime = none extsz=4096 blocks=0, rtextents=0 >> >> >> >> The kernel version is: 3.14.0-1.el6.elrepo.x86_64 and the XFS >> >> partition is mounted with: rw,noatime,allocsize=128m,inode64,swalloc. >> >> The partition is 2TB in size and 40% full to simulate production. >> >> >> >> Here's a test program that appends 512KB like MySQL does (write and >> >> then fsync). To exacerbate the issue, it loops a bunch of times: >> >> https://gist.github.com/keyurdg/961c19175b81c73fdaa3 >> >> >> >> When run, this creates ~9500 extents most of length 1024. >> > >> > 1024 of what? Most likely it is 1024 basic blocks, which is 512KB, >> > the size of your writes. >> >> Yeah, 1024 basic blocks of 512 bytes each. >> >> > >> > Could you post the output of the xfs_bmap commands you are using to >> > get this information? >> >> I'm getting the extent information via xfs_bmap -v . Here's >> a sample: https://gist.github.com/keyurdg/291b2a429f03c9a649ad > > Yup, looks like fragmented free space so it's only finding islands > of 512kb of freespace near to the inode to allocate out of. > > Can you post the output of /proc/mounts so I can check what the > allocator behaviour is being used? > >> >> cat'ing the >> >> file to /dev/null after dropping the caches reads at an average of 75 >> >> MBps, way less than the hardware is capable of. >> > >> > What you are doing is "open-seekend-write-fsync-close". You haven't >> > told the filesystem you are doing append writes (O_APPEND, or the >> > append inode flag) so it can't optimise for them. >> >> I tried this; adding O_APPEND the the open() in the pathological >> pwrite.c makes no difference to the extent allocation and hence the >> read performance. > > Yeah, I had a look at what XFS does and in the close path it doesn't > know that the FD was O_APPEND because that state is available to the > ->release path. > >> > You are also cleaning the file before closing it, so you are >> > defeating the current heuristics that XFS uses to determine whether >> > to remove speculative preallocation on close() - if the inode is >> > dirty at close(), then it won't be removed. Hence speculative >> > preallocation does nothing for your IO pattern (i.e. the allocsize >> > mount option is completely useless). Remove the fsync and you'll >> > see your fragmentation problem go away completely. >> >> I agree, but the MySQL data files (*.ibd) on our production cluster >> are appended to in bursts and they have thousands of tiny (512KB) >> extents. Getting rid of fsync is not possible given the use case. > > Sure - just demonstrating that it's the fsync that is causing the > problems. i.e. it's application driven behaviour that the filesystem > can't easily detect and optimise... > >> Arguably, MySQL does not close the files, but it writes out >> infrequently enough that I couldn't make a good and small test case >> for it. But the output of xfs_bmap is exactly the same as that of >> pwrite.c > > Once you've fragmented free space, the only way to defrag it is to > remove whatever is using the space between the small freespace > extents. Usually the condition occurs when you intermix long lived > files with short lived files - removing the short lived files > results in fragmented free space that cannot be made contiguous > until both the short lived and long lived data has been removed. > > If you want an idea of whether you've fragmented free space, use > the xfs_db freespace command. To see what each ag looks like > (change it to iterate all the ags in your fs): > > $ for i in 0 1 2 3; do echo "*** AG $i:" ; sudo xfs_db -c "freesp -a $i -s" /dev/vda; done > *** AG 0: > from to extents blocks pct > 1 1 129 129 0.02 > 2 3 119 283 0.05 > 4 7 125 641 0.11 > 8 15 93 944 0.16 > 16 31 64 1368 0.23 > 32 63 53 2300 0.39 > 64 127 21 1942 0.33 > 128 255 16 3145 0.53 > 256 511 6 1678 0.28 > 512 1023 1 680 0.11 > 16384 32767 1 23032 3.87 > 524288 1048576 1 558825 93.93 > total free extents 629 > total free blocks 594967 > average free extent size 945.893 > *** AG 1: > from to extents blocks pct > 1 1 123 123 0.01 > 2 3 125 305 0.04 > 4 7 79 418 0.05 > ...... > > And that will tell us what state your filesystem is in w.r.t. > freespace fragmentation... > >> >> When I add a posix_fallocate before calling pwrite() as shown here >> >> https://gist.github.com/keyurdg/eb504864d27ebfe7b40a the file >> >> fragments an order of magnitude less (~30 extents), and cat'ing to >> >> /dev/null proceeds at ~1GBps. >> > >> > That should make no difference on XFS as you are only preallocating >> > the 512KB region beyond EOF that you are about to write into and >> > hence both delayed allocation and preallocation have the same >> > allocation target (the current EOF block). Hence in both cases the >> > allocation patterns should be identical if the freespace extent they >> > are being allocated out of are identical. >> > >> > Did you remove the previous test files and sync the filesystem >> > between test runs so that the available freespace was identical for >> > the different test runs? If you didn't then the filesystem allocated >> > the files out of different free space extents and hence you'll get >> > different allocation patterns... >> >> I do clear everything and sync the FS before every run, and this is >> reproducible across multiple machines in our cluster. > > Which indicates that you've probably already completely fragmented > free space in the filesystems. > >> I've re-run the >> programs at least a 1000 times now, and every time get the same >> results. For some reason even the tiny 512KB fallocate() seems to be >> triggering some form of extent "merging" and placement. > > Both methods of allocation shoul dbe doing the same thing - they use > exactly the same algorithm to select the next extent to allocate. > Can you tell me the: > > a) inode number of each of the target files that show > different output > b) the xfs_bmap output of the different files. > >> > Alternatively, set an extent size hint on the log files to define >> > the minimum sized allocation (e.g. 32MB) and this will limit >> > fragmentation without you having to modify the MySQL code at all... >> > >> >> I tried enabling extsize to 32MB, but it seems to make no difference. >> [kgovande@host]# xfs_io -c "extsize" /var/lib/mysql/xfs/plain_pwrite.werr >> [33554432] /var/lib/mysql/xfs/plain_pwrite.werr >> [kgovande@host]# xfs_bmap -v /var/lib/mysql/xfs/*.werr | wc -l >> 20001 >> [kgovande@host]# sync; echo 3 > /proc/sys/vm/drop_caches; pv >> plain_pwrite.werr > /dev/null >> 9.77GB 0:02:41 [61.7MB/s] [========================================>] 100% > > Ah, extent size hints are not being considered in > xfs_can_free_eofblocks(). I suspect they should be, and that would > fix the problem. > > Can you add this to xfs_can_free_eofblocks() in your kernel and see > what happens? > > > /* prealloc/delalloc exists only on regular files */ > if (!S_ISREG(ip->i_d.di_mode)) > return false; > > + if (xfs_get_extsz_hint(ip)) > + return false; > + > /* > * Zero sized files with no cached pages and delalloc blocks will not > * have speculative prealloc/delalloc blocks to remove. > */ > > If that solves the problem, then I suspect that we might need to > modify this code to take into account the allocsize mount option as > well... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com Hey Dave, I spent some more time figuring out the MySQL write semantics and it doesn't open/close files often and initial test script was incorrect. It uses O_DIRECT and appends to the file; I modified my test binary to take this into account here: https://gist.github.com/keyurdg/54e0613e27dbe7946035 I've been testing on the 3.10 kernel. The set up is a empty 2 TB XFS partition. [root@dbtest09 linux-3.10.37]# xfs_info /dev/sda4 meta-data=/dev/sda4 isize=256 agcount=24, agsize=24024992 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=576599552, imaxpct=5 = sunit=16 swidth=512 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=281552, version=2 = sectsz=512 sunit=16 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@dbtest09 linux-3.10.37]# cat /proc/mounts rootfs / rootfs rw 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 devtmpfs /dev devtmpfs rw,relatime,size=49573060k,nr_inodes=12393265,mode=755 0 0 devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 /dev/sda2 / ext3 rw,noatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0 /dev/sda1 /boot ext3 rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 /dev/sda4 /var/lib/mysql xfs rw,noatime,swalloc,attr2,inode64,logbsize=64k,sunit=128,swidth=4096,noquota 0 0 [root@dbtest09 linux-3.10.37]# xfs_io -c "extsize " /var/lib/mysql/xfs/ [0] /var/lib/mysql/xfs/ Here's how the first 3 AG's look like: https://gist.github.com/keyurdg/82b955fb96b003930e4f After a run of the dpwrite program, here's how the bmap looks like: https://gist.github.com/keyurdg/11196897 The files have nicely interleaved with each other, mostly XFS_IEXT_BUFSZ size extents. The average read speed is 724 MBps. After defragmenting the file to 1 extent, the speed improves 30% to 1.09 GBps. I noticed that XFS chooses the AG based on the parent directory's AG and only the next sequential one if there's no space available. A small patch that chooses the AG randomly fixes the fragmentation issue very nicely. All of the MySQL data files are in a single directory and we see this in Production where a parent inode AG is filled, then the sequential next, and so on. diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index c8f5ae1..7841509 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -517,7 +517,7 @@ xfs_ialloc_ag_select( * to mean that blocks must be allocated for them, * if none are currently free. */ - agno = pagno; + agno = ((xfs_agnumber_t) prandom_u32()) % agcount; flags = XFS_ALLOC_FLAG_TRYLOCK; for (;;) { pag = xfs_perag_get(mp, agno); I couldn't find guidance on the internet on how many allocation groups to use for a 2 TB partition, but this random selection won't scale for many hundreds of concurrently written files, but for a few heavily writtent-to files it works nicely. I noticed that for non-DIRECT_IO + every write fsync'd, XFS would cleverly keep doubling the allocation block size as the file kept growing. The "extsize" option seems to me a bit too static because the size of tables we use varies widely and large new tables come and go. Could the same doubling logic be applied for DIRECT_IO writes as well? I tried out this extremely rough patch based on the delayed write code; if you think this is reasonable I can try to make it more acceptable. It provides very nice performance indeed, for a 2GB file, here's how the bmap looks like: https://gist.github.com/keyurdg/ac6ed8536f864c8fffc8 diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 8f8aaee..2682f53 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -118,6 +118,16 @@ xfs_alert_fsblock_zero( return EFSCORRUPTED; } +STATIC int +xfs_iomap_eof_want_preallocate( + xfs_mount_t *mp, + xfs_inode_t *ip, + xfs_off_t offset, + size_t count, + xfs_bmbt_irec_t *imap, + int nimaps, + int *prealloc); + int xfs_iomap_write_direct( xfs_inode_t *ip, @@ -152,7 +162,32 @@ xfs_iomap_write_direct( offset_fsb = XFS_B_TO_FSBT(mp, offset); last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); if ((offset + count) > XFS_ISIZE(ip)) { - error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb); + xfs_extlen_t new_extsz = extsz; + + if (!extsz) { + int prealloc; + xfs_bmbt_irec_t prealloc_imap[XFS_WRITE_IMAPS]; + + error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, + prealloc_imap, XFS_WRITE_IMAPS, &prealloc); + + if (prealloc) { + xfs_fileoff_t temp_start_fsb; + int temp_imaps = 1; + + temp_start_fsb = XFS_B_TO_FSB(mp, offset); + if (temp_start_fsb) + temp_start_fsb--; + + error = xfs_bmapi_read(ip, temp_start_fsb, 1, prealloc_imap, &temp_imaps, XFS_BMAPI_ENTIRE); + if (error) + return XFS_ERROR(error); + + new_extsz = prealloc_imap[0].br_blockcount << 1; + } + } + + error = xfs_iomap_eof_align_last_fsb(mp, ip, new_extsz, &last_fsb); if (error) return XFS_ERROR(error); } else { Cheers, Keyur. From david@fromorbit.com Tue Apr 22 18:46:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6DBB47F3F for ; Tue, 22 Apr 2014 18:46:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4170F304032 for ; Tue, 22 Apr 2014 16:46:34 -0700 (PDT) X-ASG-Debug-ID: 1398210391-04bdf0455327e240001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Omu147G3ENjE88p5 for ; Tue, 22 Apr 2014 16:46:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArBxAOP9VlN5LEcvPGdsb2JhbABZgwaIbqJ3mWeBEhcDAQEBATg1giUBAQUnCwEjIxAIAxUDCSUPBSUDBxoTiEDPOxcWjkAHhDgEmG+WFis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 09:16:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WckOS-0002ci-Pc; Wed, 23 Apr 2014 09:46:28 +1000 Date: Wed, 23 Apr 2014 09:46:28 +1000 From: Dave Chinner To: Jeff Liu Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun Message-ID: <20140422234628.GN18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> <535659F7.4060702@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <535659F7.4060702@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398210391 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 08:00:55PM +0800, Jeff Liu wrote: > > On 04/22 2014 14:59 PM, Dave Chinner wrote: > > From: Dave Chinner > > > > Commit e461fcb ("xfs: remote attribute lookups require the value > > length") passes the remote attribute length in the xfs_da_args > > structure on lookup so that CRC calculations and validity checking > > can be performed correctly by related code. This, unfortunately has > > the side effect of changing the args->valuelen parameter in cases > > where it shouldn't. > > > > That is, when we replace a remote attribute, the incoming > > replacement stores the value and length in args->value and > > args->valuelen, but then the lookup which finds the existing remote > > attribute overwrites args->valuelen with the length of the remote > > attribute being replaced. Hence when we go to create the new > > attribute, we create it of the size of the existing remote > > attribute, not the size it is supposed to be. When the new attribute > > is much smaller than the old attribute, this results in a > > transaction overrun and an ASSERT() failure on a debug kernel: > > > > XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 > > > > Fix this by keeping the remote attribute value length separate to > > the attribute value length in the xfs_da_args structure. The enables > > us to pass the length of the remote attribute to be removed without > > overwriting the new attribute's length. > > > > Signed-off-by: Dave Chinner .... > > @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( > > > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > > > > + /* remote value might be different size to the buffer supplied. */ > > + if (args->rmtvaluelen = args->valuelen) > ^^^ > Here is a typo... Oh, well spotted. But, hold on a minute, shouldn't gcc be catching those sorts of typos? /me groans $ gcc t.c $ gcc -Wall t.c t.c: In function ¿main¿: t.c:10:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (foo = bar) ^ $ Only if -Wparentheses is specified. Why the hell are we suppressing useful warnings on the kernel build? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 22 19:00:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A89917F3F for ; Tue, 22 Apr 2014 19:00:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 750DB304043 for ; Tue, 22 Apr 2014 17:00:46 -0700 (PDT) X-ASG-Debug-ID: 1398211243-04bdf0455227e7f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EtonF7RZIV5mx8Q1 for ; Tue, 22 Apr 2014 17:00:43 -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: ArBxAGgBV1N5LEcvPGdsb2JhbABZgwaIbqJ3mWeBEhcDAQEBATg1giUBAQUnCwEjIxAIAxUDCSUPBSUDBxoTiEDPPRcWjkAHhDgEmG+WFis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 09:30:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WckcE-0002eu-4C; Wed, 23 Apr 2014 10:00:42 +1000 Date: Wed, 23 Apr 2014 10:00:42 +1000 From: Dave Chinner To: Jeff Liu Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun Message-ID: <20140423000042.GO18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> <535659F7.4060702@oracle.com> <20140422234628.GN18672@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140422234628.GN18672@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398211243 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 09:46:28AM +1000, Dave Chinner wrote: > On Tue, Apr 22, 2014 at 08:00:55PM +0800, Jeff Liu wrote: > > > > On 04/22 2014 14:59 PM, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Commit e461fcb ("xfs: remote attribute lookups require the value > > > length") passes the remote attribute length in the xfs_da_args > > > structure on lookup so that CRC calculations and validity checking > > > can be performed correctly by related code. This, unfortunately has > > > the side effect of changing the args->valuelen parameter in cases > > > where it shouldn't. > > > > > > That is, when we replace a remote attribute, the incoming > > > replacement stores the value and length in args->value and > > > args->valuelen, but then the lookup which finds the existing remote > > > attribute overwrites args->valuelen with the length of the remote > > > attribute being replaced. Hence when we go to create the new > > > attribute, we create it of the size of the existing remote > > > attribute, not the size it is supposed to be. When the new attribute > > > is much smaller than the old attribute, this results in a > > > transaction overrun and an ASSERT() failure on a debug kernel: > > > > > > XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 > > > > > > Fix this by keeping the remote attribute value length separate to > > > the attribute value length in the xfs_da_args structure. The enables > > > us to pass the length of the remote attribute to be removed without > > > overwriting the new attribute's length. > > > > > > Signed-off-by: Dave Chinner > .... > > > @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( > > > > > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > > > > > > + /* remote value might be different size to the buffer supplied. */ > > > + if (args->rmtvaluelen = args->valuelen) > > ^^^ > > Here is a typo... > > Oh, well spotted. > > But, hold on a minute, shouldn't gcc be catching those sorts of > typos? > > /me groans > > $ gcc t.c > $ gcc -Wall t.c > t.c: In function ¿main¿: > t.c:10:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses] > if (foo = bar) > ^ > $ > > Only if -Wparentheses is specified. > > Why the hell are we suppressing useful warnings on the kernel build? Hmmm - looks like I missed the output of the warning when I built against 3.15-rc2 because it was a rebuild the world and there's tons of output when that happens... Time to add ccflags-y += -Werror to the makefile.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 22 19:30:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9DECF7F3F for ; Tue, 22 Apr 2014 19:30:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 82306304032 for ; Tue, 22 Apr 2014 17:30:03 -0700 (PDT) X-ASG-Debug-ID: 1398212997-04cbb06e9d26e450001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id n7aT9Ma1QP6FCXtS for ; Tue, 22 Apr 2014 17:29:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArNxAJ4IV1N5LEcvPGdsb2JhbABZgwaIbqJ9mWeBEhcDAQEBATg1giUBAQQBJxMcIwULCAMOBwMJJQ8FJQMHGhOIOQfPMxcWjkAHhDgEmG+WFis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 09:59:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wcl4T-0002i6-4D; Wed, 23 Apr 2014 10:29:53 +1000 Date: Wed, 23 Apr 2014 10:29:53 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun Message-ID: <20140423002953.GP18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> <20140422141743.GA55823@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422141743.GA55823@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398212997 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 10:17:44AM -0400, Brian Foster wrote: > On Tue, Apr 22, 2014 at 04:59:09PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Commit e461fcb ("xfs: remote attribute lookups require the value > > length") passes the remote attribute length in the xfs_da_args > > structure on lookup so that CRC calculations and validity checking > > can be performed correctly by related code. This, unfortunately has > > the side effect of changing the args->valuelen parameter in cases > > where it shouldn't. > > > > That is, when we replace a remote attribute, the incoming > > replacement stores the value and length in args->value and > > args->valuelen, but then the lookup which finds the existing remote > > attribute overwrites args->valuelen with the length of the remote > > attribute being replaced. Hence when we go to create the new > > attribute, we create it of the size of the existing remote > > attribute, not the size it is supposed to be. When the new attribute > > is much smaller than the old attribute, this results in a > > transaction overrun and an ASSERT() failure on a debug kernel: > > > > XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 > > > > Fix this by keeping the remote attribute value length separate to > > the attribute value length in the xfs_da_args structure. The enables > > us to pass the length of the remote attribute to be removed without > > overwriting the new attribute's length. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_attr.c | 7 ++++++- > > fs/xfs/xfs_attr_leaf.c | 21 +++++++++++---------- > > fs/xfs/xfs_attr_remote.c | 11 ++++++++--- > > fs/xfs/xfs_da_btree.h | 2 ++ > > 4 files changed, 27 insertions(+), 14 deletions(-) > > > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > > index 01b6a01..dbaa674 100644 > > --- a/fs/xfs/xfs_attr.c > > +++ b/fs/xfs/xfs_attr.c > > @@ -213,7 +213,7 @@ xfs_attr_calc_size( > > * Out of line attribute, cannot double split, but > > * make room for the attribute value itself. > > */ > > - uint dblocks = XFS_B_TO_FSB(mp, valuelen); > > + uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); > > nblks += dblocks; > > nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); > > } > > @@ -703,6 +703,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > > args->index2 = args->index; > > args->rmtblkno2 = args->rmtblkno; > > args->rmtblkcnt2 = args->rmtblkcnt; > > + args->rmtvaluelen2 = args->rmtvaluelen; > > } > > Why don't we zero out the first set of values here similar to the node > case? I hadn't looked. I was just doing what was consistent with the current code. /me looks. xfs_attr3_leaf_add -> xfs_attr3_leaf_add_work overwrites the rmt* variables with new values if the newly added attribute needs to be made remote. But, if it is local, it doesn't zero them. So, yes, there is potential for the wrong thing to be done later in this same function as it checks args->rmtblkno assuming that it is only set when the new attribute is remote. Different bug, well spotted. :/ I'll add zeroing here. [FWIW, I've always disliked and been confused by the set of rmtblkno/rmtblkno2 variables in the xfs_da_args. Mainly their naming is horrible. Some day I'll write a patch to make it clear what the two sets of variables are actually for, and maybe write helper functions for switching between the two sets... ] > > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > > index 6e37823..2324c66 100644 > > --- a/fs/xfs/xfs_attr_remote.c > > +++ b/fs/xfs/xfs_attr_remote.c > > @@ -337,7 +337,7 @@ xfs_attr_rmtval_get( > > struct xfs_buf *bp; > > xfs_dablk_t lblkno = args->rmtblkno; > > __uint8_t *dst = args->value; > > - int valuelen = args->valuelen; > > + int valuelen; > > int nmap; > > int error; > > int blkcnt = args->rmtblkcnt; > > @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( > > > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > > > > + /* remote value might be different size to the buffer supplied. */ > > + if (args->rmtvaluelen = args->valuelen) > > + args->valuelen = args->rmtvaluelen; > > + valuelen = args->valuelen; > > + > > Jeff already called this out as a potential typo... > > I'm guessing the intent is to handle the case where we call from > xfs_attr3_leaf_list_int(). Not really, it was just defensive to ensure that if args->valuelen and args->rmtvaluelen are different we don't overrun the buffer supplied by the caller, which is only args->valuelen in size... > The other callers call > xfs_attr3_leaf_getvalue() first, which sets rmtvaluelen and fixes up > valuelen or returns an error (if short). The list_int() case looks like > it queries the remote length just the same, but only sets valuelen... > Why not just set both valuelen and rmtvaluelen there? Seems reasonable. I'll replace the above check with an ASSERT so that we catch any future mismatches.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Apr 22 21:13:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F03B7F3F for ; Tue, 22 Apr 2014 21:13:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7106C8F8054 for ; Tue, 22 Apr 2014 19:13:50 -0700 (PDT) X-ASG-Debug-ID: 1398219227-04bdf04555282140001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id bf4cwmhB26IsKmmg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 22 Apr 2014 19:13:48 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3N2DdgZ011901 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 23 Apr 2014 02:13:40 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3N2DcZe008806 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 23 Apr 2014 02:13:38 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3N2DboT007717; Wed, 23 Apr 2014 02:13:37 GMT Received: from [10.191.14.122] (/10.191.14.122) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 22 Apr 2014 19:13:37 -0700 Message-ID: <535721C4.3040902@oracle.com> Date: Wed, 23 Apr 2014 10:13:24 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> <535659F7.4060702@oracle.com> <20140422234628.GN18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun In-Reply-To: <20140422234628.GN18672@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1398219228 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5170 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/23 2014 07:46 AM, Dave Chinner wrote: > On Tue, Apr 22, 2014 at 08:00:55PM +0800, Jeff Liu wrote: >> >> On 04/22 2014 14:59 PM, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> Commit e461fcb ("xfs: remote attribute lookups require the value >>> length") passes the remote attribute length in the xfs_da_args >>> structure on lookup so that CRC calculations and validity checking >>> can be performed correctly by related code. This, unfortunately has >>> the side effect of changing the args->valuelen parameter in cases >>> where it shouldn't. >>> >>> That is, when we replace a remote attribute, the incoming >>> replacement stores the value and length in args->value and >>> args->valuelen, but then the lookup which finds the existing remote >>> attribute overwrites args->valuelen with the length of the remote >>> attribute being replaced. Hence when we go to create the new >>> attribute, we create it of the size of the existing remote >>> attribute, not the size it is supposed to be. When the new attribute >>> is much smaller than the old attribute, this results in a >>> transaction overrun and an ASSERT() failure on a debug kernel: >>> >>> XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 >>> >>> Fix this by keeping the remote attribute value length separate to >>> the attribute value length in the xfs_da_args structure. The enables >>> us to pass the length of the remote attribute to be removed without >>> overwriting the new attribute's length. >>> >>> Signed-off-by: Dave Chinner > .... >>> @@ -348,6 +348,11 @@ xfs_attr_rmtval_get( >>> >>> ASSERT(!(args->flags & ATTR_KERNOVAL)); >>> >>> + /* remote value might be different size to the buffer supplied. */ >>> + if (args->rmtvaluelen = args->valuelen) >> ^^^ >> Here is a typo... > > Oh, well spotted. > > But, hold on a minute, shouldn't gcc be catching those sorts of > typos? > > /me groans > > $ gcc t.c > $ gcc -Wall t.c > t.c: In function ¿main¿: > t.c:10:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses] > if (foo = bar) > ^ > $ > > Only if -Wparentheses is specified. > > Why the hell are we suppressing useful warnings on the kernel build? > Well, maybe it's due to the different gcc release? I can hit this warning via gcc-4.8.1 which is the default version on Ubuntu 13.10 as below: # make SUBDIRS=fs/xfs -j4 ... fs/xfs/xfs_attr_remote.c: In function ‘xfs_attr_rmtval_get’: fs/xfs/xfs_attr_remote.c:352:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if (args->rmtvaluelen = args->valuelen) ^ CC [M] fs/xfs/xfs_bmap_btree.o CC [M] fs/xfs/xfs_btree.o ... Thanks, -Jeff From david@fromorbit.com Tue Apr 22 21:18:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5A7BA7F3F for ; Tue, 22 Apr 2014 21:18:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50187304059 for ; Tue, 22 Apr 2014 19:18:42 -0700 (PDT) X-ASG-Debug-ID: 1398219516-04cb6c24382713d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id SEx1V2TF5H3ECdi0 for ; Tue, 22 Apr 2014 19:18:37 -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: Aq9xAKUiV1N5LEcvPGdsb2JhbABYgwaIbqMFmWeBExcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOQfPQxcWjVwiQgeEOASYb5RFgVErgSwCHg Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 23 Apr 2014 11:48:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wcmlf-00030Y-7J; Wed, 23 Apr 2014 12:18:35 +1000 Date: Wed, 23 Apr 2014 12:18:35 +1000 From: Dave Chinner To: Speedy Milan Cc: linux-kernel@vger.kernel.org, Ivan Pantovic , xfs@oss.sgi.com Subject: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) Message-ID: <20140423021835.GI15995@dastard> X-ASG-Orig-Subj: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1398219516 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5170 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [cc xfs@oss.sgi.com] On Mon, Apr 21, 2014 at 10:58:53PM +0200, Speedy Milan wrote: > I want to report very slow deletion of 24 50GB files (in total 12 TB), > all present in the same folder. total = 1.2TB? > OS is CentOS 6.4, with upgraded kernel 3.13.1. > > The hardware is a Supermicro server with 15x 4TB WD Se drives in MD > RAID 6, totalling 52TB of free space. > > XFS is formated directly on the RAID volume, without LVM layers. > > Deletion was done with rm -f * command, and it took upwards of 1 hour > to delete the files. > > File system was filled completely prior to deletion. Oh, that's bad. it's likely you fragmented the files into millions of extents? > rm was mostly waiting (D state), probably for kworker threads, and No, waiting for IO. > iostat was showing big HDD utilization numbers and very low throughput > so it looked like a random HDD workload was in effect. Yup, smells like file fragmentation. Non-fragmented 50GB files should be removed in a few milliseconds. but if you've badly fragmented the files, there could be 10 million extents in a 50GB file. A few milliseconds per extent removal gives you.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Apr 22 22:05:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C3DEA7F3F for ; Tue, 22 Apr 2014 22:05:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66F63AC00A for ; Tue, 22 Apr 2014 20:05:04 -0700 (PDT) X-ASG-Debug-ID: 1398222299-04bdf04555283630001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZGGpZTJgLq8PZsYA for ; Tue, 22 Apr 2014 20:04: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3611863C5FF0; Tue, 22 Apr 2014 22:04:59 -0500 (CDT) Message-ID: <53572DDA.8080302@sandeen.net> Date: Tue, 22 Apr 2014 22:04:58 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Jeff Liu CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> <535659F7.4060702@oracle.com> <20140422234628.GN18672@dastard> <20140423000042.GO18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun In-Reply-To: <20140423000042.GO18672@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398222299 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5171 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/22/14, 7:00 PM, Dave Chinner wrote: > On Wed, Apr 23, 2014 at 09:46:28AM +1000, Dave Chinner wrote: >> On Tue, Apr 22, 2014 at 08:00:55PM +0800, Jeff Liu wrote: >>> >>> On 04/22 2014 14:59 PM, Dave Chinner wrote: ... >>>> + /* remote value might be different size to the buffer supplied. */ >>>> + if (args->rmtvaluelen = args->valuelen) >>> ^^^ >>> Here is a typo... >> >> Oh, well spotted. >> >> But, hold on a minute, shouldn't gcc be catching those sorts of >> typos? >> >> /me groans >> >> $ gcc t.c >> $ gcc -Wall t.c >> t.c: In function ¿main¿: >> t.c:10:2: warning: suggest parentheses around assignment used as truth value [-Wparentheses] >> if (foo = bar) >> ^ >> $ >> >> Only if -Wparentheses is specified. >> >> Why the hell are we suppressing useful warnings on the kernel build? > > Hmmm - looks like I missed the output of the warning when I built > against 3.15-rc2 because it was a rebuild the world and there's tons > of output when that happens... > > > > Time to add ccflags-y += -Werror to the makefile.... Probably only under a couple specific arches...? How are we for i.e. stupid printf format warnings about long vs. longlong on 32/64 arches...? Or maybe you can -Werror, -Wno$FOO? -Eric > Cheers, > > Dave. > From david@fromorbit.com Wed Apr 23 00:47:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 76BE77F3F for ; Wed, 23 Apr 2014 00:47:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6244F8F8064 for ; Tue, 22 Apr 2014 22:47:25 -0700 (PDT) X-ASG-Debug-ID: 1398232042-04cb6c24362766c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id w8Y6CbhgLGjQo56q for ; Tue, 22 Apr 2014 22:47:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak92APBSV1N5LEcvPGdsb2JhbABZgwZPgxWoE5QJhWKBFhcDAQEBATg1giUBAQQBOhwYCwULCAMYCSUPBSUDBxoTiDkHDs85EwQWjWtXB4Q5BJh0hiOPdiuBLQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:17:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wcq1f-0003RV-3d; Wed, 23 Apr 2014 15:47:19 +1000 Date: Wed, 23 Apr 2014 15:47:19 +1000 From: Dave Chinner To: Keyur Govande Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS fragmentation on file append Message-ID: <20140423054719.GJ15995@dastard> X-ASG-Orig-Subj: Re: XFS fragmentation on file append References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398232042 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5174 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 07:35:34PM -0400, Keyur Govande wrote: > On Tue, Apr 8, 2014 at 1:31 AM, Dave Chinner wrote: > > On Mon, Apr 07, 2014 at 11:42:02PM -0400, Keyur Govande wrote: > >> On Mon, Apr 7, 2014 at 9:50 PM, Dave Chinner wrote: > >> > [cc the XFS mailing list ] > >> > > >> > On Mon, Apr 07, 2014 at 06:53:46PM -0400, Keyur Govande wrote: > >> >> Hello, > >> >> > >> >> I'm currently investigating a MySQL performance degradation on XFS due > >> >> to file fragmentation. ..... > >> > Alternatively, set an extent size hint on the log files to define > >> > the minimum sized allocation (e.g. 32MB) and this will limit > >> > fragmentation without you having to modify the MySQL code at all... ..... > I spent some more time figuring out the MySQL write semantics and it > doesn't open/close files often and initial test script was incorrect. > > It uses O_DIRECT and appends to the file; I modified my test binary to ..... > [root@dbtest09 linux-3.10.37]# xfs_io -c "extsize " /var/lib/mysql/xfs/ > [0] /var/lib/mysql/xfs/ So you aren't using extent size hints.... > > Here's how the first 3 AG's look like: > https://gist.github.com/keyurdg/82b955fb96b003930e4f > > After a run of the dpwrite program, here's how the bmap looks like: > https://gist.github.com/keyurdg/11196897 > > The files have nicely interleaved with each other, mostly > XFS_IEXT_BUFSZ size extents. XFS_IEXT_BUFSZ Has nothing to do with the size of allocations. It's the size of the in memory array buffer used to hold extent records. What you are seeing is allocation interleaving according to the pattern and size of the direct IOs being done by the application. Which happen to be 512KB (1024 basic blocks) and the file being written to is randomly selected. > The average read speed is 724 MBps. After > defragmenting the file to 1 extent, the speed improves 30% to 1.09 > GBps. Sure. Now set an extent size hint of 32MB and try again. > I noticed that XFS chooses the AG based on the parent directory's AG > and only the next sequential one if there's no space available. Yes, that's what the inode64 allocator does. It tries to keep files in the same directory close together. > A > small patch that chooses the AG randomly fixes the fragmentation issue > very nicely. All of the MySQL data files are in a single directory and > we see this in Production where a parent inode AG is filled, then the > sequential next, and so on. > > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index c8f5ae1..7841509 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -517,7 +517,7 @@ xfs_ialloc_ag_select( > * to mean that blocks must be allocated for them, > * if none are currently free. > */ > - agno = pagno; > + agno = ((xfs_agnumber_t) prandom_u32()) % agcount; > flags = XFS_ALLOC_FLAG_TRYLOCK; > for (;;) { > pag = xfs_perag_get(mp, agno); Ugh. That might fix the interleaving, but it randomly distributes related files over the entire filesystem. Hence if you have random access to the files (like a database does) you now have random seeks across the entire filesystem rather than within AGs. You basically destroy any concept of data locality that the filesystem has. > I couldn't find guidance on the internet on how many allocation groups > to use for a 2 TB partition, I've already given guidance on that. Choose to ignore it if you will... > but this random selection won't scale for > many hundreds of concurrently written files, but for a few heavily > writtent-to files it works nicely. > > I noticed that for non-DIRECT_IO + every write fsync'd, XFS would > cleverly keep doubling the allocation block size as the file kept > growing. That's the behaviour of delayed allocation. By using buffered IO, the application has delegated all responisbility of optimal layout of the file to the filesystem, and this is the method XFS uses to minimise fragmentation in that case. Direct IO does not have delayed allocation - it allocates for the current IO according to the bounds given by the IO, inode extent size hints and alignment characteristic of the filesystem. It does not do specualtive allocation at all. The principle of direct IO to do exactly what the application asked, not to second guess what the application *might* need. Either the application delegates everything to the filesystem (i.e. buffered IO) or it assumes full responsibility for allocation behaviour and IO coherency (i.e. direct IO). IOWs, If you need to preallocate space beyond EOF that doubles in size as the file grows to prevent fragmentation, then the application should be calling fallocate(FALLOC_FL_KEEP_SIZE) at the appropriate times or using extent size hints to define the minimum allocation sizes for the direct IO. > The "extsize" option seems to me a bit too static because the size of > tables we use varies widely and large new tables come and goe You can set the extsize per file at create time, but really, you only need to set the extent size just large enough to obtain maximal read speeds. > Could the same doubling logic be applied for DIRECT_IO writes as well? I don't think so. It would break many carefully tuned production systems out there that rely directly on the fact that XFS does exactly what the application asks it to do when using direct IO. IOWs, I think you are trying to optimise the wrong layer - put your effort into making fallocate() do what the application needs to prevent fragmentation rather trying to hack the filesystem to do it for you. Not only will that improve performance on XFS, but it will also improve performance on ext4 and any other filesystem that supports fallocate and direct IO. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 00:54:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C447F7F3F for ; Wed, 23 Apr 2014 00: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 4C489AC00A for ; Tue, 22 Apr 2014 22:54:22 -0700 (PDT) X-ASG-Debug-ID: 1398232459-04cb6c24362769a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id iBCspkjgM1fEbpW8 for ; Tue, 22 Apr 2014 22:54:19 -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: Aid5AE1UV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRYXAwEBAQE4NYIlAQEFJxMcIxAIAxgJJQ8FJQMHGhOIQM9IFxaOQgeEOQSYdJYZKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:24:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wcq8P-0003SQ-9a; Wed, 23 Apr 2014 15:54:17 +1000 Date: Wed, 23 Apr 2014 15:54:17 +1000 From: Dave Chinner To: Eric Sandeen Cc: Jeff Liu , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun Message-ID: <20140423055417.GK15995@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remote attribute overwrite causes transaction overrun References: <1398149949-11324-1-git-send-email-david@fromorbit.com> <535659F7.4060702@oracle.com> <20140422234628.GN18672@dastard> <20140423000042.GO18672@dastard> <53572DDA.8080302@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53572DDA.8080302@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: 1398232459 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5174 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 10:04:58PM -0500, Eric Sandeen wrote: > On 4/22/14, 7:00 PM, Dave Chinner wrote: > > On Wed, Apr 23, 2014 at 09:46:28AM +1000, Dave Chinner wrote: > >> On Tue, Apr 22, 2014 at 08:00:55PM +0800, Jeff Liu wrote: > >>> > >>> On 04/22 2014 14:59 PM, Dave Chinner wrote: .... > >>>> + /* remote value might be different size to the buffer supplied. */ > >>>> + if (args->rmtvaluelen = args->valuelen) > >>> ^^^ > >>> Here is a typo... > >> > >> Oh, well spotted. > >> > >> But, hold on a minute, shouldn't gcc be catching those sorts of > >> typos? .... > > Time to add ccflags-y += -Werror to the makefile.... > > Probably only under a couple specific arches...? How are we for i.e. > stupid printf format warnings about long vs. longlong on 32/64 arches...? > > Or maybe you can -Werror, -Wno$FOO? Personally, if other arches are throwing warnings that we don't know about, they need to be fixed. The only way I'll get to know about them is to have somebody else's build break, because nobody is reporting warnings to us right now.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 01:04:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E23BE7F3F for ; Wed, 23 Apr 2014 01:04:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C62C0304043 for ; Tue, 22 Apr 2014 23:03:58 -0700 (PDT) X-ASG-Debug-ID: 1398233036-04bdf04554287ee0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id RvA7pvTML2RHQtbh for ; Tue, 22 Apr 2014 23:03: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: Aid5AKhWV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRUXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQM9HFxaOQgeEOQSYdJYZKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:33:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcqHh-0003US-27; Wed, 23 Apr 2014 16:03:53 +1000 Date: Wed, 23 Apr 2014 16:03:53 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support Message-ID: <20140423060352.GL15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-12-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146270-42993-12-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: 1398233036 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 12:11:01PM -0400, Brian Foster wrote: > Add the 'finobt' metadata option to mkfs to format an fs with free > inode btree support. If enabled, initialize the associated AGI > header fields and btree root block. > > Also, do the initialization of the superblock version and feature > bits (including the new finobt flag) a bit earlier. These fields > must now be initialized prior to the use of XFS_PREALLOC_BLOCKS(), > as the latter returns a value that depends on whether a finobt root > btree block is reserved. > > Signed-off-by: Brian Foster $ sudo mkfs.xfs -f -mcrc=1,finobt=1 -m crc=0 -d size=128m /dev/ram1 meta-data=/dev/ram1 isize=256 agcount=4, agsize=8192 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=1 ^^^^^ ^^^^^^^^ ..... $ mount /dev/ram1 /mnt/scratch [ 4727.269080] XFS (ram1): Mounting Filesystem [ 4727.270077] XFS (ram1): Log inconsistent or not a log (last==0, first!=1) [ 4727.271227] XFS (ram1): empty log check failed [ 4727.271970] XFS (ram1): log mount/recovery failed: error 22 [ 4727.273097] XFS (ram1): log mount failed If "-mcrc=0" is seen on the command line, it needs to turn off finobt.... xfs/001 and xfs/002 trip over this when run like: $ MKFS_OPTIONS="-mcrc=1,finobt=1" ./check xfs/00[12] Otherwise, everything seems to be working ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 01:10:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0596C7F3F for ; Wed, 23 Apr 2014 01:10:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EAEAE304051 for ; Tue, 22 Apr 2014 23:10:44 -0700 (PDT) X-ASG-Debug-ID: 1398233442-04cb6c24362771d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id gGohZRlQnBbEBnAD for ; Tue, 22 Apr 2014 23:10: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: Ail5AP5YV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRUXAwEBAQE4NYIlAQEFJxMcIxAIAw4KCSUPBSUDBxoTiEDPMxcWjkIHhDkEmHSWGSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:40:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcqOF-0003VW-Tu; Wed, 23 Apr 2014 16:10:39 +1000 Date: Wed, 23 Apr 2014 16:10:39 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Message-ID: <20140423061039.GM15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-15-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146270-42993-15-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: 1398233442 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5174 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 12:11:04PM -0400, Brian Foster wrote: > If one exists, scan the free inode btree in phase 2 of xfs_repair. > We use the same general infrastructure as for the inobt scan, but > trigger finobt chunk scan logic in in scan_inobt() via the magic > value. > > The new scan_single_finobt_chunk() function is similar to the inobt > equivalent with some finobt specific logic. We can expect that > underlying inode chunk blocks are already marked used due to the > previous inobt scan. We can also expect to find every record > tracked by the finobt already accounted for in the in-core tree > with equivalent (and internally consistent) inobt record data. > > Spit out a warning on any divergences from the above and add the > inodes referenced by the current finobt record to the appropriate > in-core tree. > > Signed-off-by: Brian Foster ..... > + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { > + bno = be32_to_cpu(agi->agi_free_root); > + if (bno != 0 && verify_agbno(mp, agno, bno)) { > + magic = xfs_sb_version_hascrc(&mp->m_sb) ? > + XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC; > + scan_sbtree(bno, be32_to_cpu(agi->agi_free_level), > + agno, 0, scan_inobt, 1, magic, agcnts, > + &xfs_inobt_buf_ops); > + } else { > + do_warn(_("bad agbno %u for finobt root, agno %d\n"), > + be32_to_cpu(agi->agi_free_root), agno); > + } > + } > + This generates a new repair output in xfs/030, so the xfstests repair filter will need to be updated. --- tests/xfs/030.out 2014-01-20 16:57:33.000000000 +1100 +++ results//xfs/030.out.bad 2014-04-23 15:28:29.000000000 +1000 @@ -82,6 +82,7 @@ bad length # 0 for agi 0, should be LENGTH reset bad agi for ag 0 bad agbno AGBNO for inobt root, agno 0 +bad agbno AGBNO for finobt root, agno 0 root inode chunk not found Phase 3 - for each AG... - scan and clear agi unlinked lists... @@ -204,6 +205,7 @@ bad length # -1 for agi 0, should be LENGTH reset bad agi for ag 0 bad agbno AGBNO for inobt root, agno 0 +bad agbno AGBNO for finobt root, agno 0 root inode chunk not found Phase 3 - for each AG... - scan and clear agi unlinked lists... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 01:12:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 31A737F3F for ; Wed, 23 Apr 2014 01:12:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14A9B304043 for ; Tue, 22 Apr 2014 23:12:37 -0700 (PDT) X-ASG-Debug-ID: 1398233554-04bdf04555288220001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id SjTIStehSUuiGWXR for ; Tue, 22 Apr 2014 23:12:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aip5AP5YV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRUXAwEBAQE4NYIlAQEFJxMcIxAIAw4KCQwZDwUlAwcaE4hAzzMXFo5CBwqELwEDmHSUSIFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:42:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcqQ6-0003WL-0W; Wed, 23 Apr 2014 16:12:34 +1000 Date: Wed, 23 Apr 2014 16:12:33 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Message-ID: <20140423061233.GN15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-14-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146270-42993-14-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: 1398233554 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 12:11:03PM -0400, Brian Foster wrote: > Account for the finobt in calc_mkfs(). > > Signed-off-by: Brian Foster > --- > repair/xfs_repair.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > index 08b25f0..356125b 100644 > --- a/repair/xfs_repair.c > +++ b/repair/xfs_repair.c > @@ -407,6 +407,8 @@ calc_mkfs(xfs_mount_t *mp) > bcntbt_root = bnobt_root + 1; > inobt_root = bnobt_root + 2; > fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; > + if (xfs_sb_version_hasfinobt(&mp->m_sb)) > + fino_bno++; The comment about this code needs updating, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 01:20:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7B82C7F3F for ; Wed, 23 Apr 2014 01:20:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67F7F8F8064 for ; Tue, 22 Apr 2014 23:20:50 -0700 (PDT) X-ASG-Debug-ID: 1398234044-04cbb06e9c277130001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 7FUQJx5LAxrWHlDI for ; Tue, 22 Apr 2014 23:20:45 -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: Ail5AGFbV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRUXAwEBAQE4NYIlAQEFJxMcIxAIAw4KCSUPBSUDBxoTiEDPNhcWjkIHhDkEmHSWGSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:50:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcqX3-0003XS-G6; Wed, 23 Apr 2014 16:19:45 +1000 Date: Wed, 23 Apr 2014 16:19:45 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Message-ID: <20140423061945.GO15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-15-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146270-42993-15-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: 1398234044 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 12:11:04PM -0400, Brian Foster wrote: > If one exists, scan the free inode btree in phase 2 of xfs_repair. > We use the same general infrastructure as for the inobt scan, but > trigger finobt chunk scan logic in in scan_inobt() via the magic > value. > > The new scan_single_finobt_chunk() function is similar to the inobt > equivalent with some finobt specific logic. We can expect that > underlying inode chunk blocks are already marked used due to the > previous inobt scan. We can also expect to find every record > tracked by the finobt already accounted for in the in-core tree > with equivalent (and internally consistent) inobt record data. > > Spit out a warning on any divergences from the above and add the > inodes referenced by the current finobt record to the appropriate > in-core tree. > > Signed-off-by: Brian Foster .... > + /* > + * on multi-block block chunks, all chunks start > + * at the beginning of the block. with multi-chunk > + * blocks, all chunks must start on 64-inode boundaries > + * since each block can hold N complete chunks. if > + * fs has aligned inodes, all chunks must start > + * at a fs_ino_alignment*N'th agbno. skip recs > + * with badly aligned starting inodes. > + */ Use all 80 columns for the comment ;) > + if (ino == 0 || > + (inodes_per_block <= XFS_INODES_PER_CHUNK && off != 0) || > + (inodes_per_block > XFS_INODES_PER_CHUNK && > + off % XFS_INODES_PER_CHUNK != 0) || > + (fs_aligned_inodes && agbno % fs_ino_alignment != 0)) { > + do_warn( > + _("badly aligned finobt inode rec (starting inode = %" PRIu64 ")\n"), > + lino); > + suspect++; > + } > + > + /* > + * verify numeric validity of inode chunk first > + * before inserting into a tree. don't have to > + * worry about the overflow case because the > + * starting ino number of a chunk can only get > + * within 255 inodes of max (NULLAGINO). if it > + * gets closer, the agino number will be illegal > + * as the agbno will be too large. > + */ Same. > + > + /* > + * the finobt contains a record that the previous alloc inobt scan never > + * found. insert the inodes into the appropriate tree. > + */ > + > + do_warn( > + _("undiscovered finobt record, ino %" PRIu64 " (%d/%u)\n"), > + lino, agno, ino); No need for the new line for the _("...") there, nor the whitespace before it. > + > + if (!suspect) { > + /* > + * inodes previously inserted into the uncertain tree should be > + * superceded by these when the uncertain tree is processed > + */ > + nfree = 0; > + if (XFS_INOBT_IS_FREE_DISK(rp, 0)) { > + nfree++; > + ino_rec = set_inode_free_alloc(mp, agno, ino); > + } else { > + ino_rec = set_inode_used_alloc(mp, agno, ino); > + } > + for (j = 1; j < XFS_INODES_PER_CHUNK; j++) { > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > + nfree++; > + set_inode_free(ino_rec, j); > + } else { > + set_inode_used(ino_rec, j); > + } > + } > + } else { > + /* > + * this should handle the case where the inobt scan may have > + * already added uncertain inodes > + */ > + nfree = 0; > + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > + add_aginode_uncertain(mp, agno, ino + j, 1); > + nfree++; > + } else { > + add_aginode_uncertain(mp, agno, ino + j, 0); > + } > + } > + } > + > +check_freecount: > + > + if (nfree != be32_to_cpu(rp->ir_freecount)) { > + do_warn( > +_("finobt ir_freecount/free mismatch, inode chunk %d/%u, freecount %d nfree %d\n"), > + agno, ino, be32_to_cpu(rp->ir_freecount), nfree); > + } > + > + if (!nfree) { > + do_warn( > +_("finobt record with no free inodes, inode chunk %d/%u\n"), agno, ino); > + } Shouldn't both of these increment suspect? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 01:25:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7574E7F3F for ; Wed, 23 Apr 2014 01:25:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 590E330405F for ; Tue, 22 Apr 2014 23:25:19 -0700 (PDT) X-ASG-Debug-ID: 1398234317-04cbb06e9d2772a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id sSaeXiynC1hOAsmx for ; Tue, 22 Apr 2014 23:25: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: Ail5AIRcV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRUXAwEBAQE4NYIlAQEFJxMcIxAIAw4KCSUPBSUDBxoTiEDPOhcWjkIHhDkEmHSUSIFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 15:54:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wcqbr-0003YA-Rp; Wed, 23 Apr 2014 16:24:43 +1000 Date: Wed, 23 Apr 2014 16:24:43 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Message-ID: <20140423062443.GP15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-18-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146270-42993-18-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: 1398234317 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 10, 2014 at 12:11:07PM -0400, Brian Foster wrote: > Add the findfirst_free_inode_rec() and next_free_ino_rec() helpers > to assist scanning the in-core inode records for records with at > least one free inode. These will be used to determine what records > are included in the free inode btree. > > Signed-off-by: Brian Foster > --- > repair/incore.h | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/repair/incore.h b/repair/incore.h > index 5419884..5f8c188 100644 > --- a/repair/incore.h > +++ b/repair/incore.h > @@ -381,6 +381,33 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); > ((ino_tree_node_t *) ((ino_node_ptr)->avl_node.avl_forw)) > > /* > + * finobt helpers > + */ > +static inline ino_tree_node_t * > +findfirst_free_inode_rec(xfs_agnumber_t agno) > +{ > + ino_tree_node_t *ino_rec; > + > + ino_rec = findfirst_inode_rec(agno); > + > + while (ino_rec && !ino_rec->ir_free) > + ino_rec = next_ino_rec(ino_rec); > + > + return ino_rec; > +} > + > +static inline ino_tree_node_t * > +next_free_ino_rec(ino_tree_node_t *ino_rec) > +{ > + ino_rec = next_ino_rec(ino_rec); > + > + while (ino_rec && !ino_rec->ir_free) > + ino_rec = next_ino_rec(ino_rec); > + > + return ino_rec; > +} That looks a bit inefficient - walking the list of inode records to find the next one with free inodes. Perhaps we woul dbe better served by adding a new list for inode records with free entries and walking that instead? Iknow, it's a memory vs speed tradeoff, but if we've got millions of inodes and very few free, the difference could be very significant. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 01:36:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 40B337F3F for ; Wed, 23 Apr 2014 01:36:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 23639304051 for ; Tue, 22 Apr 2014 23:36:03 -0700 (PDT) X-ASG-Debug-ID: 1398234961-04cbb06e9a277840001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id E6qUAVgLFVeWxKCr for ; Tue, 22 Apr 2014 23:36: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: Aip5AONeV1N5LEcvPGdsb2JhbABZgwaDZIUKowmUCYVigRUXAwEBAQE4NYIlAQEEATocIwULCAMOCgklDwUlAwcaE4g5B88/FxaOQgeEOQSYdJYZKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 16:06:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wcqml-0003Ze-WB; Wed, 23 Apr 2014 16:36:00 +1000 Date: Wed, 23 Apr 2014 16:35:59 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 00/20] xfsprogs: introduce the free inode btree Message-ID: <20140423063559.GQ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 00/20] xfsprogs: introduce the free inode btree References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146270-42993-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: 1398234961 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 10, 2014 at 12:10:50PM -0400, Brian Foster wrote: > Hi all, > > This is the v3 userspace portion of finobt support corresponding to v5 > of the kernel series. > > Patches 1-10 are straight application of the corresponding kernel patches > with omissions where appropriate. I haven't done anything more than passed a quick eye over them and tested them. I'll review them fully in the kernel context, and we can apply any changes to the kernel code directly to them... > Patch 11 adds mkfs support. Patches 12 and 13 provide a couple minor db > and repair fixes to support the new agi fields and calculate the fs > format respectively. Patches 14-18 add real repair support for the > finobt. Patch 19 adds support to report finobt state in xfs_info. Patch > 20 adds support for metadump. > > Thoughts, reviews, flames appreciated. I've made comments on the patches that i think need a bit of work, but all the remainder (11-20) I haven't made any direct comment on you can consider: Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From gyro.ivan@gmail.com Wed Apr 23 02:23:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 2D4597F3F for ; Wed, 23 Apr 2014 02:23:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DFB5D8F804B for ; Wed, 23 Apr 2014 00:23:47 -0700 (PDT) X-ASG-Debug-ID: 1398237825-04bdf0455428a410001-NocioJ Received: from mail-ee0-f46.google.com (mail-ee0-f46.google.com [74.125.83.46]) by cuda.sgi.com with ESMTP id DmBzMKhHRNx8JAXm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 23 Apr 2014 00:23:46 -0700 (PDT) X-Barracuda-Envelope-From: gyro.ivan@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.46 Received: by mail-ee0-f46.google.com with SMTP id t10so400610eei.19 for ; Wed, 23 Apr 2014 00:23:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=OZaLEPx4RF454N3jMOd7Un3e9Uonu7voW0vIEgg8jxM=; b=Jese46ZANXycqSAW3s/KvyxX5dx3YC+Enw3aVtbnlPzGMHgzS6Sh8o9nO0qGNOE3CO XNpec+grD6AX6cr/X+dtQ6OSoYGpuCogABRId57rUf7KSWZM5YT9bN2WMVMslmNf1df0 zjQmLMAXNlwYAkIBK/m/EKHaMxgnQuVJbDWutI1tacgMUm4gKP5Qw870b/cJljeVgT1t 7EtFJRc8ZMADtFretC5sObuTXMGG+OS6XOx3Q0meud3KXeJtx/YvEImpAEF97lNAgplA N9wDMOQS9d7/Ne/IQL8UMIFhOn8m2PPl06B72slnuXqJaliV+39BccyNI551OPNdZpD7 /z/w== X-Received: by 10.14.180.2 with SMTP id i2mr61315093eem.53.1398237824684; Wed, 23 Apr 2014 00:23:44 -0700 (PDT) Received: from [194.247.192.17] (ivan.eunet.rs. [194.247.192.17]) by mx.google.com with ESMTPSA id 44sm3667052eek.30.2014.04.23.00.23.42 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 23 Apr 2014 00:23:43 -0700 (PDT) Message-ID: <53576A7D.9020303@gmail.com> Date: Wed, 23 Apr 2014 09:23:41 +0200 From: Ivan Pantovic User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130215 Thunderbird/17.0.3 MIME-Version: 1.0 To: Dave Chinner CC: Speedy Milan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) References: <20140423021835.GI15995@dastard> X-ASG-Orig-Subj: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) In-Reply-To: <20140423021835.GI15995@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f46.google.com[74.125.83.46] X-Barracuda-Start-Time: 1398237825 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5176 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature > [root@drive-b ~]# xfs_db -r /dev/md0 > xfs_db> frag > actual 11157932, ideal 11015175, fragmentation factor 1.28% > xfs_db> this is current level of fragmentation ... is it bad? some say over 1% is candidate for defrag? ... we can leave it like this and wait for a next full backup and then check on the fragmentation of that file. On 04/23/2014 04:18 AM, Dave Chinner wrote: > [cc xfs@oss.sgi.com] > > On Mon, Apr 21, 2014 at 10:58:53PM +0200, Speedy Milan wrote: >> I want to report very slow deletion of 24 50GB files (in total 12 TB), >> all present in the same folder. > total = 1.2TB? > >> OS is CentOS 6.4, with upgraded kernel 3.13.1. >> >> The hardware is a Supermicro server with 15x 4TB WD Se drives in MD >> RAID 6, totalling 52TB of free space. >> >> XFS is formated directly on the RAID volume, without LVM layers. >> >> Deletion was done with rm -f * command, and it took upwards of 1 hour >> to delete the files. >> >> File system was filled completely prior to deletion. > Oh, that's bad. it's likely you fragmented the files into > millions of extents? > >> rm was mostly waiting (D state), probably for kworker threads, and > No, waiting for IO. > >> iostat was showing big HDD utilization numbers and very low throughput >> so it looked like a random HDD workload was in effect. > Yup, smells like file fragmentation. Non-fragmented 50GB files > should be removed in a few milliseconds. but if you've badly > fragmented the files, there could be 10 million extents in a 50GB > file. A few milliseconds per extent removal gives you.... > > Cheers, > > Dave. From david@fromorbit.com Wed Apr 23 03:11:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8222C7F3F for ; Wed, 23 Apr 2014 03:11:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 743E2304051 for ; Wed, 23 Apr 2014 01:11:55 -0700 (PDT) X-ASG-Debug-ID: 1398240712-04cb6c243627ade0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cI0iBQP0XFvfgFMG for ; Wed, 23 Apr 2014 01:11:53 -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: AiZ5ACV1V1N5LEcvPGdsb2JhbABZgwaDZIUKon+UCYVigRYXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hAzzsXFo5CB4Q5BJh0lhkr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 17:41:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcsHW-0003ob-VV; Wed, 23 Apr 2014 18:11:50 +1000 Date: Wed, 23 Apr 2014 18:11:50 +1000 From: Dave Chinner To: Keyur Govande Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS fragmentation on file append Message-ID: <20140423081150.GQ18672@dastard> X-ASG-Orig-Subj: Re: XFS fragmentation on file append References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> <20140423054719.GJ15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423054719.GJ15995@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: 1398240712 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5176 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 03:47:19PM +1000, Dave Chinner wrote: > On Tue, Apr 22, 2014 at 07:35:34PM -0400, Keyur Govande wrote: > > I noticed that XFS chooses the AG based on the parent directory's AG > > and only the next sequential one if there's no space available. > > Yes, that's what the inode64 allocator does. It tries to keep files > in the same directory close together. > > @@ -517,7 +517,7 @@ xfs_ialloc_ag_select( > > * to mean that blocks must be allocated for them, > > * if none are currently free. > > */ > > - agno = pagno; > > + agno = ((xfs_agnumber_t) prandom_u32()) % agcount; > > flags = XFS_ALLOC_FLAG_TRYLOCK; > > for (;;) { > > pag = xfs_perag_get(mp, agno); > > Ugh. That might fix the interleaving, but it randomly distributes > related files over the entire filesystem. Hence if you have random > access to the files (like a database does) you now have random seeks > across the entire filesystem rather than within AGs. You basically > destroy any concept of data locality that the filesystem has. BTW, the inode32 allocator (it's a mount option) does this. it's no longer the default because a) it's always had terrible behaviour for general workloads compared to inode64 and b) we don't care enough about 32 bit applications failing to use stat64() anymore to stay with inode32 by default... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 03:26:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F147C7F3F for ; Wed, 23 Apr 2014 03: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 B77EA8F8039 for ; Wed, 23 Apr 2014 01:26:08 -0700 (PDT) X-ASG-Debug-ID: 1398241565-04bdf0455328c320001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id UhqPQnWWDWGf1TyJ for ; Wed, 23 Apr 2014 01:26: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: Ao94AOF4V1N5LEcvPGdsb2JhbAA/GoMGT4MVqAMGlAmFYoEWFwMBAQEBODWCJQEBBAE6HCMFCwgDDgoJJQ8FJQMHGhMJiDAHDjbPDxaOQgeEOQSYdJRIgVEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Apr 2014 17:55:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WcsUs-0003qg-IV; Wed, 23 Apr 2014 18:25:38 +1000 Date: Wed, 23 Apr 2014 18:25:38 +1000 From: Dave Chinner To: Ivan Pantovic Cc: Speedy Milan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) Message-ID: <20140423082538.GR18672@dastard> X-ASG-Orig-Subj: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) References: <20140423021835.GI15995@dastard> <53576A7D.9020303@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53576A7D.9020303@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: 1398241565 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5177 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Apr 23, 2014 at 09:23:41AM +0200, Ivan Pantovic wrote: > > >[root@drive-b ~]# xfs_db -r /dev/md0 > >xfs_db> frag > >actual 11157932, ideal 11015175, fragmentation factor 1.28% > >xfs_db> > > this is current level of fragmentation ... is it bad? http://xfs.org/index.php/XFS_FAQ#Q:_The_xfs_db_.22frag.22_command_says_I.27m_over_50.25._Is_that_bad.3F > some say over 1% is candidate for defrag? ... Some say that over 70% is usually not a problem: http://www.mythtv.org/wiki/XFS_Filesystem#Defragmenting_XFS_Partitions i.e. the level that becomes are problem is highly workload specific. So, you can't read *anything* in that number without know exactly what is in your filesystem, how the application(s) interact with it and so on. Besides, I was asking specifically about the files you removed, not the files that remain in the filesystem. Given that you have 11 million inodes in the filesystem, you probably removed the only significantly large files in the filesystem.... So, the files your removed are now free space, so free space fragmentation is what we need to look at. i.e. use the freesp command to dump the histogram and summary of the free space... Cheers, Dave. -- Dave Chinner david@fromorbit.com From gyro.ivan@gmail.com Wed Apr 23 04:22:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 F41BB7F3F for ; Wed, 23 Apr 2014 04:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 854ADAC00A for ; Wed, 23 Apr 2014 02:22:00 -0700 (PDT) X-ASG-Debug-ID: 1398244917-04bdf0455528df20001-NocioJ Received: from mail-we0-f171.google.com (mail-we0-f171.google.com [74.125.82.171]) by cuda.sgi.com with ESMTP id Nyj2DUAxlz2LBL42 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 23 Apr 2014 02:21:58 -0700 (PDT) X-Barracuda-Envelope-From: gyro.ivan@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.171 Received: by mail-we0-f171.google.com with SMTP id t61so573851wes.2 for ; Wed, 23 Apr 2014 02:21:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=Luz99g+H7B4DhfbjyygVlsHrkzdAZ0Is1LHIhNtkezA=; b=YfV+5smtDJ3eCAvEsg2D5+aPFEZqNEM6iqYKkn+zy+CP3uqywvtbpkNnru6dOUEtuS AF7XixI568i3oEbiwF6V4FN5TR3KzvcxOM5PE78y8O9qnuysGSAFxc9K0+NswwfWnX8N rCh4MSNRnnumR2zH9zOfBU49GHdm6OpbIGk9VcKq5pTukAayhvgmYLVIEzyrZPS1lXtq Fw9LmygOeFAL1Ny9lHssRMjGew+ru/CE/r6uwx3JYvbFhSQ5sttbFrY0jbHkbBBrPQsl cqT1wNZtnY0E/vDUFercK8tVbADHzAaZJTgG7tmqklrGaYQv5TpY5HnyVD/OtBAlEzMl u9yQ== X-Received: by 10.180.211.207 with SMTP id ne15mr872974wic.31.1398244916726; Wed, 23 Apr 2014 02:21:56 -0700 (PDT) Received: from [194.247.192.17] (ivan.eunet.rs. [194.247.192.17]) by mx.google.com with ESMTPSA id ga10sm639810wjb.23.2014.04.23.02.21.55 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 23 Apr 2014 02:21:55 -0700 (PDT) Message-ID: <53578632.1060005@gmail.com> Date: Wed, 23 Apr 2014 11:21:54 +0200 From: Ivan Pantovic User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130215 Thunderbird/17.0.3 MIME-Version: 1.0 To: Dave Chinner CC: Speedy Milan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) References: <20140423021835.GI15995@dastard> <53576A7D.9020303@gmail.com> <20140423082538.GR18672@dastard> X-ASG-Orig-Subj: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) In-Reply-To: <20140423082538.GR18672@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-we0-f171.google.com[74.125.82.171] X-Barracuda-Start-Time: 1398244918 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.10 BSF_SC0_SA085 Custom Rule SA085 Hi Dave, > xfs_db> freesp > from to extents blocks pct > 1 1 52463 52463 0.00 > 2 3 73270 181394 0.01 > 4 7 134526 739592 0.03 > 8 15 250469 2870193 0.12 > 16 31 581572 13465403 0.58 > 32 63 692386 32096932 1.37 > 64 127 1234204 119157757 5.09 > 128 255 91015 16690243 0.71 > 256 511 18977 6703895 0.29 > 512 1023 12821 8611576 0.37 > 1024 2047 23209 33177541 1.42 > 2048 4095 43282 101126831 4.32 > 4096 8191 12726 55814285 2.39 > 8192 16383 2138 22750157 0.97 > 16384 32767 1033 21790120 0.93 > 32768 65535 433 19852497 0.85 > 65536 131071 254 23052185 0.99 > 131072 262143 204 37833000 1.62 > 262144 524287 229 89970969 3.85 > 524288 1048575 164 124210580 5.31 > 1048576 2097151 130 173193687 7.40 > 2097152 4194303 22 61297862 2.62 > 4194304 8388607 16 97070435 4.15 > 8388608 16777215 26 320475332 13.70 > 16777216 33554431 6 133282461 5.70 > 33554432 67108863 12 616939026 26.37 > 134217728 268435328 1 207504563 8.87 > xfs_db> well now it is quite obvious that file fragmentation was actually the issue. this is what munin has to say about that time frame when files were deleted. http://picpaste.com/df_inode-pinpoint_1397768678_1397876678-kpwd9loR.png http://picpaste.com/df-pinpoint_1397768678_1397876678-pQ7ZCTPu.png although the drives were "only" 50% busy while deleting all those inodes. it's quite interesting how we got there in the first place thanks to bacula backup and some other hardware failure not related to the backup server. On 04/23/2014 10:25 AM, Dave Chinner wrote: > On Wed, Apr 23, 2014 at 09:23:41AM +0200, Ivan Pantovic wrote: >>> [root@drive-b ~]# xfs_db -r /dev/md0 >>> xfs_db> frag >>> actual 11157932, ideal 11015175, fragmentation factor 1.28% >>> xfs_db> >> this is current level of fragmentation ... is it bad? > http://xfs.org/index.php/XFS_FAQ#Q:_The_xfs_db_.22frag.22_command_says_I.27m_over_50.25._Is_that_bad.3F > >> some say over 1% is candidate for defrag? ... > Some say that over 70% is usually not a problem: > > http://www.mythtv.org/wiki/XFS_Filesystem#Defragmenting_XFS_Partitions > > i.e. the level that becomes are problem is highly workload specific. > So, you can't read *anything* in that number without know exactly > what is in your filesystem, how the application(s) interact with it > and so on. > > Besides, I was asking specifically about the files you removed, not > the files that remain in the filesystem. Given that you have 11 > million inodes in the filesystem, you probably removed the only > significantly large files in the filesystem.... > > So, the files your removed are now free space, so free space > fragmentation is what we need to look at. i.e. use the freesp > command to dump the histogram and summary of the free space... > > Cheers, > > Dave. From stewart@flamingspork.com Wed Apr 23 06:49:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B31257F3F for ; Wed, 23 Apr 2014 06: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 A35938F8039 for ; Wed, 23 Apr 2014 04:49:01 -0700 (PDT) X-ASG-Debug-ID: 1398253736-04cbb06e9a2812f0001-NocioJ Received: from kaylee.flamingspork.com (kaylee.flamingspork.com [74.207.245.61]) by cuda.sgi.com with ESMTP id pDWE5oUvrhpA061O for ; Wed, 23 Apr 2014 04:48:57 -0700 (PDT) X-Barracuda-Envelope-From: stewart@flamingspork.com X-Barracuda-Apparent-Source-IP: 74.207.245.61 Received: from willster.flamingspork.com (localhost [127.0.0.1]) by kaylee.flamingspork.com (Postfix) with ESMTPS id 4743E6053; Wed, 23 Apr 2014 12:04:47 +0000 (UTC) Received: by willster.flamingspork.com (Postfix, from userid 1000) id 92E8433E20F; Wed, 23 Apr 2014 21:48:54 +1000 (EST) From: Stewart Smith To: Keyur Govande , Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS fragmentation on file append In-Reply-To: X-ASG-Orig-Subj: Re: XFS fragmentation on file append References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> User-Agent: Notmuch/0.16 (http://notmuchmail.org) Emacs/24.3.1 (x86_64-redhat-linux-gnu) Date: Wed, 23 Apr 2014 21:48:54 +1000 Message-ID: <874n1k466x.fsf@flamingspork.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" X-Barracuda-Connect: kaylee.flamingspork.com[74.207.245.61] X-Barracuda-Start-Time: 1398253736 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5181 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Keyur Govande writes: > I spent some more time figuring out the MySQL write semantics and it > doesn't open/close files often and initial test script was incorrect. MySQL will open/close files depending on some configuration parameters and the number of tables that exist/are open/are in the working set. If InnoDB tables, it's innodb_max_open_files (IIRC it's named that, or something similar). If you have less than that number of tables and innodb_file_per_table=3Dtrue, then you'll never close. If you have the max set to 10 times the working set of active tables, you're going to be opening and closing files a lot - it's basically a LRU of unused tables (open files). > It uses O_DIRECT and appends to the file; I modified my test binary to > take this into account here: > https://gist.github.com/keyurdg/54e0613e27dbe7946035 You can also make it not use O_DIRECT, but that's generally a bad idea :) =2D-=20 Stewart Smith --=-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJTV6imAAoJEP08notdpDyvZ1QP/iYNntG9pkpy+gSuAvh+HG8f LwjaHSHAgUAggm15pU0IZxGg4ycaIZROxDtgaycdMSdlQymLj5DdalbJCZvgSrz8 GIUq8IWGQFTeGfTaRuqTzckP00dtRXNrmD+6E+kBWPfqJ7QFg7BG3dlbMD3+bL1n Xz3CnoVMZAPV+R+gI5TBO7N6WEa1F2JeHuFHc/9Jsr0NOc+DJwIGCp4GTz2W3szS zkQDL+qdMR2yfoFXpuU/3ND9gP/Y+sRAvLmSPQ6K7JEoeXqqs6JLyQ+RnOPzudFc VWJZAEAf32252bSXaf1KbKUBu+hozUY2SDxnD/iLFKft47JJx0J/oluBqiwAXyRg MfN398fxRSGS4TxttR8WFuLZAC1mc5SIUvoZPyLmCTxV+OJcDaOPRfBPYcqOEF4I 9joqEubyJpx0BPmDHbFASIAqyIr2+9XczbDqAFte94A3TEqUuCR0FRoKp7WYyucy fnFC7RyODUm4u6kmjQf+y0B+XfqrvTILiGF0daj167RkrBpjgeR66EZGr0WCmWr7 lusFOLWBsYCEXQWGeCAK/B5LETWaN0DlweM5W/0TmOmdL5DBX2k5/LGX4KpHI6RJ U6sTGZxqlH53bD6q9/80H1AHMpMJGdybWm+JntB36hx/N+WIFO+j5LD35ixUGRFP zCr24FeQYG3iqo9eeGP4 =G4dl -----END PGP SIGNATURE----- --=-=-=-- From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:21:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF89D7F52 for ; Wed, 23 Apr 2014 10:21:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B254F304051 for ; Wed, 23 Apr 2014 08:21:48 -0700 (PDT) X-ASG-Debug-ID: 1398266507-04bdf0455229dc90001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id fNvh4jCSQ8AGpuXR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:21:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcyza-0006xq-O0; Wed, 23 Apr 2014 15:21:46 +0000 Date: Wed, 23 Apr 2014 08:21:46 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] generic/204: tweak reserve pool size Message-ID: <20140423152146.GA26128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] generic/204: tweak reserve pool size References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398204274-2113-2-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398266507 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=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Apr 23, 2014 at 08:04:29AM +1000, Dave Chinner wrote: > From: Dave Chinner > > On small block size filesystems, the reserve pool size is kept > constant at 4MB. filesystems with smaller blocks use comparitively > more blocks for indexing metadata (e.g. in the inode and extent > btrees) and so having a higher indirect block usage. Hence we need > to leave the reserve pool at 1024 block and not scale it for a > constant size. > > This makes the test pass on a filesystem made with MKFS_OPTIONS="-b > size=1024 -m crc=1". Looks good, Reviewed-by: Christoph Hellwig From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:22:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1BB497F52 for ; Wed, 23 Apr 2014 10:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D74698F8066 for ; Wed, 23 Apr 2014 08:21:59 -0700 (PDT) X-ASG-Debug-ID: 1398266518-04bdf0455429dcd0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id nCQnOZ3vfqtiABUh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:21:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcyzm-000709-JR; Wed, 23 Apr 2014 15:21:58 +0000 Date: Wed, 23 Apr 2014 08:21:58 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] shared/051: remove ACL count subtest Message-ID: <20140423152158.GB26128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] shared/051: remove ACL count subtest References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398204274-2113-3-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398266518 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 08:04:30AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Different versions of XFS support different numbers of ACLs on disk. > Remove that subtest from this shared test to prevent it form causing > spurious failures on filesystems that support more than 25 ACLs. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:23:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A6BE77F52 for ; Wed, 23 Apr 2014 10:23:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4183EAC001 for ; Wed, 23 Apr 2014 08:23:15 -0700 (PDT) X-ASG-Debug-ID: 1398266593-04cbb06e9d28a520001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WS0UEyLFjS507UEa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:23:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcz0z-0007J2-6R; Wed, 23 Apr 2014 15:23:13 +0000 Date: Wed, 23 Apr 2014 08:23:13 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: introduce new large ACL test Message-ID: <20140423152313.GC26128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: introduce new large ACL test References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398204274-2113-4-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398266593 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 23, 2014 at 08:04:31AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Having just removed the largeacl test from the shared ACL test, > reintroduce the same test as an XFS specific test so that we can > handle the different limits in supported ACL count appropriately. I'd prefer to have this as a shared test, and define a _max_acl_size function in common.acl that does a switch for the fs type. Only start with XFS for now, but if the maintainers of other filesystems care enough they could add their limits. From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:23:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AACAD7F52 for ; Wed, 23 Apr 2014 10:23:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8F1D08F804B for ; Wed, 23 Apr 2014 08:23:37 -0700 (PDT) X-ASG-Debug-ID: 1398266616-04cb6c243728c730001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 97h6qumpBGKwAE4N (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:23:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcz1M-0007PO-FN; Wed, 23 Apr 2014 15:23:36 +0000 Date: Wed, 23 Apr 2014 08:23:36 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] generic: cleanup space after test in TESTDIR Message-ID: <20140423152336.GD26128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/6] generic: cleanup space after test in TESTDIR References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398204274-2113-5-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398266616 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Apr 23, 2014 at 08:04:32AM +1000, Dave Chinner wrote: > From: Dave Chinner > > A couple of tests leave behind large files or directory structures > when they complete, which leads to small TEST_DEVs running out of > space during other tests. Make those space hogs clean up after > themselves so that random tests don't fail with ENOSPC errors. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:24:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B33E87F52 for ; Wed, 23 Apr 2014 10:24:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 976548F8066 for ; Wed, 23 Apr 2014 08:24:45 -0700 (PDT) X-ASG-Debug-ID: 1398266684-04cbb06e9a28a6c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OrcBy48rZ3xlQZiB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:24:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcz2S-0007pe-74; Wed, 23 Apr 2014 15:24:44 +0000 Date: Wed, 23 Apr 2014 08:24:44 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: remove dmapi tests from the auto group Message-ID: <20140423152444.GE26128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: remove dmapi tests from the auto group References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398204274-2113-6-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398266684 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 23, 2014 at 08:04:33AM +1000, Dave Chinner wrote: > From: Dave Chinner > > There is no mainline kernel support for DMAPI in XFS, and so every > time the xfstests auto group is run it throws a large number of > "[not run] Assuming DMAPI modules are not loaded". I've noted that > people are excluding the dmapi group to avoid this, so rather than > inflict pain on everyone, make hose few that need to do dmapi > testing include it specifically. > > IOWs, remove the DMAPI tests from the auto group. > > Signed-off-by: Dave Chinner Yes, we shouldn't run them by default. They also probably should move from the tests/xfs/ dir to a new tests/dmapi one as they aren't really XFS specific, they are specific to the out of tree dmapi code which at one point could also support JFS. Reviewed-by: Christoph Hellwig From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:24:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C6797F52 for ; Wed, 23 Apr 2014 10:24:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 230AE8F804B for ; Wed, 23 Apr 2014 08:24:59 -0700 (PDT) X-ASG-Debug-ID: 1398266698-04cb6c243828c8d0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id ETl7iuHRKlGGwkvJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:24:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcz2f-0007va-Va; Wed, 23 Apr 2014 15:24:57 +0000 Date: Wed, 23 Apr 2014 08:24:57 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] filter: xfs_repair emits new corruption messagse Message-ID: <20140423152457.GF26128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] filter: xfs_repair emits new corruption messagse References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398204274-2113-7-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398266698 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 08:04:34AM +1000, Dave Chinner wrote: > From: Dave Chinner > > xfs_repair now dumps metadata and CRC corruption information to the > output from the verifier infrastrcuture. Filter this out so that it > doesn't cause spurious test failures such as in xfs/030 and xfs/033. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:27:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C17DB7F52 for ; Wed, 23 Apr 2014 10:27:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4BC19AC001 for ; Wed, 23 Apr 2014 08:27:11 -0700 (PDT) X-ASG-Debug-ID: 1398266830-04bdf0455429e440001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id R6f4RFXDA0Zwx8cn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:27:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wcz4m-0001M6-AR; Wed, 23 Apr 2014 15:27:08 +0000 Date: Wed, 23 Apr 2014 08:27:08 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs-oss , Jan Kara Subject: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140423152708.GA3326@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <5356B986.2060906@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5356B986.2060906@sandeen.net> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398266830 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 22, 2014 at 01:48:38PM -0500, Eric Sandeen wrote: > The Q_XQUOTARM quotactl was not working properly, because > we weren't passing around proper flags. The xfs_fs_set_xstate() > ioctl handler used the same flags for Q_XQUOTAON/OFF as > well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for > XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, > i.e. quota type + state, while Q_XQUOTARM looks only for > the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. > > Unfortunately these flag spaces overlap a bit, so we > got semi-random results for Q_XQUOTARM; i.e. the value > for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. > > Add a new quotactl op vector specifically for the QUOTARM > operation, since it operates with a different flag space. > > This has been broken more or less forever, AFAICT. > > Signed-off-by: Eric Sandeen Looks good for now: Reviewed-by: Christoph Hellwig If you have a spare cycle or two I think splitting quotaon and quotaoff might not be an all that bad idea either. From sandeen@sandeen.net Wed Apr 23 10:28:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1E5FD7F52 for ; Wed, 23 Apr 2014 10:28:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 041968F8066 for ; Wed, 23 Apr 2014 08:28:58 -0700 (PDT) X-ASG-Debug-ID: 1398266937-04cb6c243728cdc0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yyjIwkG7txczCVSG for ; Wed, 23 Apr 2014 08:28:57 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E607F63C5FF0; Wed, 23 Apr 2014 10:28:56 -0500 (CDT) Message-ID: <5357DC3A.6060702@sandeen.net> Date: Wed, 23 Apr 2014 10:28:58 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , Jan Kara , xfs-oss Subject: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <5356B986.2060906@sandeen.net> <20140423152708.GA3326@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl In-Reply-To: <20140423152708.GA3326@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398266937 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/23/14, 10:27 AM, Christoph Hellwig wrote: > On Tue, Apr 22, 2014 at 01:48:38PM -0500, Eric Sandeen wrote: >> The Q_XQUOTARM quotactl was not working properly, because >> we weren't passing around proper flags. The xfs_fs_set_xstate() >> ioctl handler used the same flags for Q_XQUOTAON/OFF as >> well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for >> XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, >> i.e. quota type + state, while Q_XQUOTARM looks only for >> the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. >> >> Unfortunately these flag spaces overlap a bit, so we >> got semi-random results for Q_XQUOTARM; i.e. the value >> for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. >> >> Add a new quotactl op vector specifically for the QUOTARM >> operation, since it operates with a different flag space. >> >> This has been broken more or less forever, AFAICT. >> >> Signed-off-by: Eric Sandeen > > Looks good for now: > > Reviewed-by: Christoph Hellwig > > If you have a spare cycle or two I think splitting quotaon and quotaoff might > not be an all that bad idea either. Just out of curiousity, for what reason - just parity w/ the non-xfs ops? -Eric From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:36:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2DB057F52 for ; Wed, 23 Apr 2014 10:36:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2F55304043 for ; Wed, 23 Apr 2014 08:36:40 -0700 (PDT) X-ASG-Debug-ID: 1398267399-04cb6c243728d8c0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id R7yIKy0lBlsZQf52 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:36:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WczDz-0001Fo-E4; Wed, 23 Apr 2014 15:36:39 +0000 Date: Wed, 23 Apr 2014 08:36:39 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 03/10] xfs: consolidate xfs_inumbers Message-ID: <20140423153639.GB3326@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 03/10] xfs: consolidate xfs_inumbers References: <535078B2.8010601@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078B2.8010601@oracle.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398267399 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 18, 2014 at 08:58:26AM +0800, Jeff Liu wrote: > From: Jie Liu > > To fetch the file system number tables, we currently just ignore the > errors and proceed to loop over the next AG or bump agino to the next > chunk in case of btree operations failed, that is not properly because > those errors might hint us potential file system problems. > > This patch rework xfs_inumbers() to handle the btree operation errors > as well as the loop conditions. Also, add pre-checkups for the given > inode, we can save alloc/free the format buffer once against an invalid > inode number. The patch looks mostly good to me, but I really think it should be split into two patches: one to do the formatting changes and code consolidation, and then one that does the actual logic changes for better error handling. It's not easy to understand and verify with these two different changes combined. > xfs_inumbers_fmt( > void __user *ubuffer, /* buffer to write to */ > - const xfs_inogrp_t *buffer, /* buffer to read from */ > + const struct xfs_inogrp *buffer, /* buffer to read from */ > long count, /* # of elements to read */ > long *written) /* # of bytes written */ > { > if (copy_to_user(ubuffer, buffer, count * sizeof(*buffer))) > - return -EFAULT; > + return XFS_ERROR(EFAULT); xfs_inumbers_fmt_compat will need the same treatment. > *count = 0; > + if (agno >= mp->m_sb.sb_agcount || > + *lastino != XFS_AGINO_TO_INO(mp, agno, agino)) > + return 0; Where is the lastino check coming from? > buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); > + bufidx = error = 0; Why not initialize bufidx and error at declaration time? > + error = xfs_inobt_get_rec(cur, &r, &stat); > + if (error || !stat) > + break; The old code moved on to the next AG here, why has this changed? From BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 23 10:39:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8A857F52 for ; Wed, 23 Apr 2014 10:39:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8E7738F8049 for ; Wed, 23 Apr 2014 08:39:59 -0700 (PDT) X-ASG-Debug-ID: 1398267598-04cb6c243728dd30001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id UsYC4dUNd7R4UTJW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 23 Apr 2014 08:39:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5d7459ea5c48f730247a+3895+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WczHA-0003bz-Ov; Wed, 23 Apr 2014 15:39:56 +0000 Date: Wed, 23 Apr 2014 08:39:56 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , Eric Sandeen , Jan Kara , xfs-oss Subject: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140423153956.GA11809@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <5356B986.2060906@sandeen.net> <20140423152708.GA3326@infradead.org> <5357DC3A.6060702@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5357DC3A.6060702@sandeen.net> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398267598 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 10:28:58AM -0500, Eric Sandeen wrote: > Just out of curiousity, for what reason - just parity w/ the non-xfs > ops? Because it's just cleaner to have one methods for one operation instead of overloading them with different opts like an ioctl. From keyurgovande@gmail.com Wed Apr 23 14:05:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A19F77F52 for ; Wed, 23 Apr 2014 14:05:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 158C1AC004 for ; Wed, 23 Apr 2014 12:05:09 -0700 (PDT) X-ASG-Debug-ID: 1398279901-04cbb06e9a299e70001-NocioJ Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id LT7vvgvSVrDrIQZh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 23 Apr 2014 12:05:02 -0700 (PDT) X-Barracuda-Envelope-From: keyurgovande@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.181 Received: by mail-we0-f181.google.com with SMTP id q58so1237222wes.26 for ; Wed, 23 Apr 2014 12:05:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=PcS1RxDCiSgeOHmZpKrWKW3gyaM8uDR68xqd3ydMd24=; b=h/nMsM7pvouOtWd3ElX5b/eQZeUYNT/cvOYZ/KZhehod+TgS5fJcSDicdKxLD/U5q+ pSYCHQlAaJtb37T6xkh99uvkGej/DpelTd24h6OoJCRvze1QYr9NeYx3mn2BcEMK/bJq JKiBx9gOY7UiBgNgSmEH0DJ6Qof2fjwFqiDvG0GS2geVAikMt77MD2qnASqkFlqYhdL4 jkwU1HRNTuzqnrKNloo/6yrEl1ZILsKFeuP7+4qnomFuk8AFydiWg9Z3OVy93jO+tF5d U0jEAbu8z1QBD1hH5yis5Df2BjfPpvxHL02EWd22Q/mkEsuwI9NO9sfKAhNOQ6BKLTqe zRJg== MIME-Version: 1.0 X-Received: by 10.194.59.226 with SMTP id c2mr40089411wjr.6.1398279900968; Wed, 23 Apr 2014 12:05:00 -0700 (PDT) Received: by 10.227.97.136 with HTTP; Wed, 23 Apr 2014 12:05:00 -0700 (PDT) In-Reply-To: <20140423054719.GJ15995@dastard> References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> <20140423054719.GJ15995@dastard> Date: Wed, 23 Apr 2014 15:05:00 -0400 Message-ID: Subject: Re: XFS fragmentation on file append From: Keyur Govande X-ASG-Orig-Subj: Re: XFS fragmentation on file append To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-we0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1398279902 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-BRTS-Evidence: tsunanet.net X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5192 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature < re-sending to the distribution list for future reference > On Wed, Apr 23, 2014 at 1:47 AM, Dave Chinner wrote: > On Tue, Apr 22, 2014 at 07:35:34PM -0400, Keyur Govande wrote: >> On Tue, Apr 8, 2014 at 1:31 AM, Dave Chinner wrote: >> > On Mon, Apr 07, 2014 at 11:42:02PM -0400, Keyur Govande wrote: >> >> On Mon, Apr 7, 2014 at 9:50 PM, Dave Chinner wrote: >> >> > [cc the XFS mailing list ] >> >> > >> >> > On Mon, Apr 07, 2014 at 06:53:46PM -0400, Keyur Govande wrote: >> >> >> Hello, >> >> >> >> >> >> I'm currently investigating a MySQL performance degradation on XFS due >> >> >> to file fragmentation. > ..... >> >> > Alternatively, set an extent size hint on the log files to define >> >> > the minimum sized allocation (e.g. 32MB) and this will limit >> >> > fragmentation without you having to modify the MySQL code at all... > ..... >> I spent some more time figuring out the MySQL write semantics and it >> doesn't open/close files often and initial test script was incorrect. >> >> It uses O_DIRECT and appends to the file; I modified my test binary to > ..... >> [root@dbtest09 linux-3.10.37]# xfs_io -c "extsize " /var/lib/mysql/xfs/ >> [0] /var/lib/mysql/xfs/ > > So you aren't using extent size hints.... > >> >> Here's how the first 3 AG's look like: >> https://gist.github.com/keyurdg/82b955fb96b003930e4f >> >> After a run of the dpwrite program, here's how the bmap looks like: >> https://gist.github.com/keyurdg/11196897 >> >> The files have nicely interleaved with each other, mostly >> XFS_IEXT_BUFSZ size extents. > > XFS_IEXT_BUFSZ Has nothing to do with the size of allocations. It's > the size of the in memory array buffer used to hold extent records. > > What you are seeing is allocation interleaving according to the > pattern and size of the direct IOs being done by the application. > Which happen to be 512KB (1024 basic blocks) and the file being > written to is randomly selected. > I misspoke; I meant to say XFS_IEXT_BUFSZ (4096) blocks per extent. As long as each pwrite is less than 2 MB, the extents do lay out in 4096 blocks every time. >> The average read speed is 724 MBps. After >> defragmenting the file to 1 extent, the speed improves 30% to 1.09 >> GBps. > > Sure. Now set an extent size hint of 32MB and try again. I did these runs as well going by your last email suggestion, but I was more interested in what you thought about the other ideas so didn't include the results. 32MB gives 850 MBps and 64MB hits 980MBps. The peak read rate from the hardware for a contiguous file is 1.45 GBps. I could keep on increasing it until I hit a number I like, but I was looking to see if it could be globally optimized. > >> I noticed that XFS chooses the AG based on the parent directory's AG >> and only the next sequential one if there's no space available. > > Yes, that's what the inode64 allocator does. It tries to keep files > in the same directory close together. > >> A >> small patch that chooses the AG randomly fixes the fragmentation issue >> very nicely. All of the MySQL data files are in a single directory and >> we see this in Production where a parent inode AG is filled, then the >> sequential next, and so on. >> >> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c >> index c8f5ae1..7841509 100644 >> --- a/fs/xfs/xfs_ialloc.c >> +++ b/fs/xfs/xfs_ialloc.c >> @@ -517,7 +517,7 @@ xfs_ialloc_ag_select( >> * to mean that blocks must be allocated for them, >> * if none are currently free. >> */ >> - agno = pagno; >> + agno = ((xfs_agnumber_t) prandom_u32()) % agcount; >> flags = XFS_ALLOC_FLAG_TRYLOCK; >> for (;;) { >> pag = xfs_perag_get(mp, agno); > > Ugh. That might fix the interleaving, but it randomly distributes > related files over the entire filesystem. Hence if you have random > access to the files (like a database does) you now have random seeks > across the entire filesystem rather than within AGs. You basically > destroy any concept of data locality that the filesystem has. I realize this is terrible for small files like a source code tree, but for a database which usually has a many large files in the same directory the seek cost is amortized by the benefit from a large contiguous read. Would it be terrible to have this modifiable as a setting (like extsize is) with the default being the inode64 behavior? > >> I couldn't find guidance on the internet on how many allocation groups >> to use for a 2 TB partition, > > I've already given guidance on that. Choose to ignore it if you > will... > Could you repeat it or post a link? The only relevant info I found via Google is using as many AGs as hardware threads (http://blog.tsunanet.net/2011/08/mkfsxfs-raid10-optimal-performance.html). >> but this random selection won't scale for >> many hundreds of concurrently written files, but for a few heavily >> writtent-to files it works nicely. >> >> I noticed that for non-DIRECT_IO + every write fsync'd, XFS would >> cleverly keep doubling the allocation block size as the file kept >> growing. > > That's the behaviour of delayed allocation. By using buffered IO, > the application has delegated all responisbility of optimal layout > of the file to the filesystem, and this is the method XFS uses to > minimise fragmentation in that case. > > Direct IO does not have delayed allocation - it allocates for the > current IO according to the bounds given by the IO, inode extent size > hints and alignment characteristic of the filesystem. It does not do > specualtive allocation at all. > > The principle of direct IO to do exactly what the application asked, > not to second guess what the application *might* need. Either the > application delegates everything to the filesystem (i.e. buffered > IO) or it assumes full responsibility for allocation behaviour and > IO coherency (i.e. direct IO). > > IOWs, If you need to preallocate space beyond EOF that doubles in > size as the file grows to prevent fragmentation, then the > application should be calling fallocate(FALLOC_FL_KEEP_SIZE) at > the appropriate times or using extent size hints to define the > minimum allocation sizes for the direct IO. > >> The "extsize" option seems to me a bit too static because the size of >> tables we use varies widely and large new tables come and goe > > You can set the extsize per file at create time, but really, you > only need to set the extent size just large enough to obtain maximal > read speeds. > >> Could the same doubling logic be applied for DIRECT_IO writes as well? > > I don't think so. It would break many carefully tuned production > systems out there that rely directly on the fact that XFS does > exactly what the application asks it to do when using direct IO. > > IOWs, I think you are trying to optimise the wrong layer - put your > effort into making fallocate() do what the application needs to > prevent fragmentation rather trying to hack the filesystem to do it > for you. Not only will that improve performance on XFS, but it will > also improve performance on ext4 and any other filesystem that > supports fallocate and direct IO. > I've been experimenting with patches to MySQL to use fallocate with FALLOC_FL_KEEP_SIZE and measuring the performance and fragmentation. I also poked at the kernel because I assumed other DBs may also benefit from the heuristic (speculative) allocation. Point taken about doing the optimization in the application layer. > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Wed Apr 23 15:02:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1FDB97F52 for ; Wed, 23 Apr 2014 15:02:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 93DDAAC015 for ; Wed, 23 Apr 2014 13:01:56 -0700 (PDT) X-ASG-Debug-ID: 1398283314-04cbb04b9000940001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KIZOy7ZCrziHI7pu for ; Wed, 23 Apr 2014 13:01:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK1rPL022780 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 16:01:54 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK1rSs019823; Wed, 23 Apr 2014 16:01:53 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 165E512573F; Wed, 23 Apr 2014 16:01:52 -0400 (EDT) Date: Wed, 23 Apr 2014 16:01:52 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Message-ID: <20140423200151.GD5225@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-15-git-send-email-bfoster@redhat.com> <20140423061945.GO15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423061945.GO15995@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: 1398283315 X-Barracuda-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, Apr 23, 2014 at 04:19:45PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:11:04PM -0400, Brian Foster wrote: > > If one exists, scan the free inode btree in phase 2 of xfs_repair. > > We use the same general infrastructure as for the inobt scan, but > > trigger finobt chunk scan logic in in scan_inobt() via the magic > > value. > > > > The new scan_single_finobt_chunk() function is similar to the inobt > > equivalent with some finobt specific logic. We can expect that > > underlying inode chunk blocks are already marked used due to the > > previous inobt scan. We can also expect to find every record > > tracked by the finobt already accounted for in the in-core tree > > with equivalent (and internally consistent) inobt record data. > > > > Spit out a warning on any divergences from the above and add the > > inodes referenced by the current finobt record to the appropriate > > in-core tree. > > > > Signed-off-by: Brian Foster > .... > > + /* > > + * on multi-block block chunks, all chunks start > > + * at the beginning of the block. with multi-chunk > > + * blocks, all chunks must start on 64-inode boundaries > > + * since each block can hold N complete chunks. if > > + * fs has aligned inodes, all chunks must start > > + * at a fs_ino_alignment*N'th agbno. skip recs > > + * with badly aligned starting inodes. > > + */ > > Use all 80 columns for the comment ;) > Yep, I'll fix this and the others... ... > > + > > + if (!suspect) { > > + /* > > + * inodes previously inserted into the uncertain tree should be > > + * superceded by these when the uncertain tree is processed > > + */ > > + nfree = 0; > > + if (XFS_INOBT_IS_FREE_DISK(rp, 0)) { > > + nfree++; > > + ino_rec = set_inode_free_alloc(mp, agno, ino); > > + } else { > > + ino_rec = set_inode_used_alloc(mp, agno, ino); > > + } > > + for (j = 1; j < XFS_INODES_PER_CHUNK; j++) { > > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > + nfree++; > > + set_inode_free(ino_rec, j); > > + } else { > > + set_inode_used(ino_rec, j); > > + } > > + } > > + } else { > > + /* > > + * this should handle the case where the inobt scan may have > > + * already added uncertain inodes > > + */ > > + nfree = 0; > > + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > + add_aginode_uncertain(mp, agno, ino + j, 1); > > + nfree++; > > + } else { > > + add_aginode_uncertain(mp, agno, ino + j, 0); > > + } > > + } > > + } > > + > > +check_freecount: > > + > > + if (nfree != be32_to_cpu(rp->ir_freecount)) { > > + do_warn( > > +_("finobt ir_freecount/free mismatch, inode chunk %d/%u, freecount %d nfree %d\n"), > > + agno, ino, be32_to_cpu(rp->ir_freecount), nfree); > > + } > > + > > + if (!nfree) { > > + do_warn( > > +_("finobt record with no free inodes, inode chunk %d/%u\n"), agno, ino); > > + } > > Shouldn't both of these increment suspect? > So at this point of the scan, we're processing through finobt leaf blocks. Setting suspect has two side effects that I can see: 1.) Suppressing the additional, more granular checks for the records/inodes that make up the remainder of the block. 2.) Setting bad_ino_btree, which causes us to skip phases 6 and 7. I think my thought process was that side effect #2 was generally too heavy handed for a scenario where the freecount doesn't happen to match or we've failed to remove a fully allocated record from the finobt. Furthermore, we already increment suspect in this function if either the allocation state of the inode chunk blocks or the allocation state of any individual inode is unexpected based on the inobt state. The additional value of the freecount checks is to catch any kind of intra-record corruption or inter-freecount corruption across the trees, which IIUC would be fixed naturally provided nothing else is wrong (e.g., suspect remains 0) when the trees are regenerated. In other words, if inode allocation state does differ between the trees, we already do set suspect. If these warnings fire without suspect being set, it means we just need to fix up the freecount and there is no broader tree corruption. Thoughts? NOTE: When looking through this again, I think there is a hole in the allocation state logic in that we don't catch a case where the finobt inode could be allocated and the inobt inode marked as free: if (first_rec) { ... nfree = 0; for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { if (XFS_INOBT_IS_FREE_DISK(rp, j)) { nfree++; if (!suspect && !is_inode_free(first_rec, j)) suspect++; } /* * XXX: else if the finobt inode is allocated, confirm * here that the inobt inode is allocated as well! */ } goto check_freecount; } I think something like this might work: if (first_rec) { ... nfree = 0; for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { int isfree = XFS_INOBT_IS_FREE_DISK(rp, j); if (isfree) nfree++; if (!suspect && isfree != is_inode_free(first_rec, j)) suspect++; } goto check_freecount; } Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Wed Apr 23 15:02:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 950A37F52 for ; Wed, 23 Apr 2014 15:02:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 692138F8052 for ; Wed, 23 Apr 2014 13:01:57 -0700 (PDT) X-ASG-Debug-ID: 1398283305-04bdf05c7500860001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Yb1SgYVicTC9CONI for ; Wed, 23 Apr 2014 13:01:45 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK1cwI022656 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 16:01:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK1b39019905; Wed, 23 Apr 2014 16:01:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45D1712573F; Wed, 23 Apr 2014 16:01:36 -0400 (EDT) Date: Wed, 23 Apr 2014 16:01:36 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support Message-ID: <20140423200135.GC5225@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 11/20] xfsprogs/mkfs: finobt mkfs support References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-12-git-send-email-bfoster@redhat.com> <20140423060352.GL15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423060352.GL15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398283305 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 23, 2014 at 04:03:53PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:11:01PM -0400, Brian Foster wrote: > > Add the 'finobt' metadata option to mkfs to format an fs with free > > inode btree support. If enabled, initialize the associated AGI > > header fields and btree root block. > > > > Also, do the initialization of the superblock version and feature > > bits (including the new finobt flag) a bit earlier. These fields > > must now be initialized prior to the use of XFS_PREALLOC_BLOCKS(), > > as the latter returns a value that depends on whether a finobt root > > btree block is reserved. > > > > Signed-off-by: Brian Foster > > $ sudo mkfs.xfs -f -mcrc=1,finobt=1 -m crc=0 -d size=128m /dev/ram1 > meta-data=/dev/ram1 isize=256 agcount=4, agsize=8192 blks > = sectsz=512 attr=2, projid32bit=1 > = crc=0 finobt=1 > ^^^^^ ^^^^^^^^ > ..... > $ mount /dev/ram1 /mnt/scratch > [ 4727.269080] XFS (ram1): Mounting Filesystem > [ 4727.270077] XFS (ram1): Log inconsistent or not a log (last==0, first!=1) > [ 4727.271227] XFS (ram1): empty log check failed > [ 4727.271970] XFS (ram1): log mount/recovery failed: error 22 > [ 4727.273097] XFS (ram1): log mount failed > > If "-mcrc=0" is seen on the command line, it needs to turn off > finobt.... > > xfs/001 and xfs/002 trip over this when run like: > > $ MKFS_OPTIONS="-mcrc=1,finobt=1" ./check xfs/00[12] > > Otherwise, everything seems to be working ;) > Yeah, I've hit this. Which reminds me... I should probably detect this and fail outright in mkfs as well. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Wed Apr 23 15:02:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFBE07F52 for ; Wed, 23 Apr 2014 15:02:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8338330405F for ; Wed, 23 Apr 2014 13:02:11 -0700 (PDT) X-ASG-Debug-ID: 1398283329-04bdf05c7200920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cjAKK8o5Sz9R0cV5 for ; Wed, 23 Apr 2014 13:02:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK28ib022854 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 16:02:08 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK27lV020079; Wed, 23 Apr 2014 16:02:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5E42612573F; Wed, 23 Apr 2014 16:02:06 -0400 (EDT) Date: Wed, 23 Apr 2014 16:02:06 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Message-ID: <20140423200205.GE5225@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-14-git-send-email-bfoster@redhat.com> <20140423061233.GN15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423061233.GN15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398283329 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 23, 2014 at 04:12:33PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:11:03PM -0400, Brian Foster wrote: > > Account for the finobt in calc_mkfs(). > > > > Signed-off-by: Brian Foster > > --- > > repair/xfs_repair.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > > index 08b25f0..356125b 100644 > > --- a/repair/xfs_repair.c > > +++ b/repair/xfs_repair.c > > @@ -407,6 +407,8 @@ calc_mkfs(xfs_mount_t *mp) > > bcntbt_root = bnobt_root + 1; > > inobt_root = bnobt_root + 2; > > fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; > > + if (xfs_sb_version_hasfinobt(&mp->m_sb)) > > + fino_bno++; > > The comment about this code needs updating, too. > Oops, indeed. How about the following (also fixed the line length)? /* * Pre-calculate the geometry of ag 0. We know what it looks like * because we know what mkfs does: 2 allocation btree roots (by block * and by size), the inode allocation btree root, the free inode * allocation btree root (if enabled) and some number of blocks to * prefill the agfl. */ Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Wed Apr 23 15:02:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9969A7F52 for ; Wed, 23 Apr 2014 15:02:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0ECD7AC013 for ; Wed, 23 Apr 2014 13:02:20 -0700 (PDT) X-ASG-Debug-ID: 1398283339-04cb6c2b7d00850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cxc3xctNkopby5HR for ; Wed, 23 Apr 2014 13:02:20 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK2I2H031529 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 16:02:18 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK2H78032746; Wed, 23 Apr 2014 16:02:18 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 838F812573F; Wed, 23 Apr 2014 16:02:16 -0400 (EDT) Date: Wed, 23 Apr 2014 16:02:16 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Message-ID: <20140423200216.GF5225@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-18-git-send-email-bfoster@redhat.com> <20140423062443.GP15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423062443.GP15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398283339 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 23, 2014 at 04:24:43PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:11:07PM -0400, Brian Foster wrote: > > Add the findfirst_free_inode_rec() and next_free_ino_rec() helpers > > to assist scanning the in-core inode records for records with at > > least one free inode. These will be used to determine what records > > are included in the free inode btree. > > > > Signed-off-by: Brian Foster > > --- > > repair/incore.h | 27 +++++++++++++++++++++++++++ > > 1 file changed, 27 insertions(+) > > > > diff --git a/repair/incore.h b/repair/incore.h > > index 5419884..5f8c188 100644 > > --- a/repair/incore.h > > +++ b/repair/incore.h > > @@ -381,6 +381,33 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); > > ((ino_tree_node_t *) ((ino_node_ptr)->avl_node.avl_forw)) > > > > /* > > + * finobt helpers > > + */ > > +static inline ino_tree_node_t * > > +findfirst_free_inode_rec(xfs_agnumber_t agno) > > +{ > > + ino_tree_node_t *ino_rec; > > + > > + ino_rec = findfirst_inode_rec(agno); > > + > > + while (ino_rec && !ino_rec->ir_free) > > + ino_rec = next_ino_rec(ino_rec); > > + > > + return ino_rec; > > +} > > + > > +static inline ino_tree_node_t * > > +next_free_ino_rec(ino_tree_node_t *ino_rec) > > +{ > > + ino_rec = next_ino_rec(ino_rec); > > + > > + while (ino_rec && !ino_rec->ir_free) > > + ino_rec = next_ino_rec(ino_rec); > > + > > + return ino_rec; > > +} > > That looks a bit inefficient - walking the list of inode records to > find the next one with free inodes. Perhaps we woul dbe better > served by adding a new list for inode records with free entries and > walking that instead? > > Iknow, it's a memory vs speed tradeoff, but if we've got millions of > inodes and very few free, the difference could be very significant. > Hmm, perhaps. The ino_tree_node_t structure is 104 bytes according to pahole. With 64 inodes per node, 1 billion inodes would turn into around 15 million of these structures. If I write a dumb little program to allocate, initialize and iterate 15 million ~100 byte structures (accessing the structure beginning and end), it uses ~1.8GB RAM and runs in under 5 seconds. If I increase that to 30 million, it allocates ~3.5GB RAM, triggers kswapd (4GB RAM VM) and seems to run anywhere from 30s to 1m30s. All of that probably doesn't mean that much in the context of repair, I guess. ;) I'll have to experiment a bit more with this and, at minimum, I'll include some data in my next rev. FWIW, if it is a problem I'd probably approach this as an additional optimization patch rather than rework this one. I also note that we already do multiple scans of the inode record list (e.g., cursor initialization), so we might be able to buy back some of whatever the finobt degradation is by condensing the cursor initialization scans. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Wed Apr 23 15:02:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6A62F29DFD for ; Wed, 23 Apr 2014 15:02:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3F3968F8040 for ; Wed, 23 Apr 2014 13:02:37 -0700 (PDT) X-ASG-Debug-ID: 1398283356-04cb6c2b7b00890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RYkwj9BQTTSuHrtp for ; Wed, 23 Apr 2014 13:02:36 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3NK2Yx2031739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 16:02:35 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3NK2Ypx020086; Wed, 23 Apr 2014 16:02:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DE0C712573F; Wed, 23 Apr 2014 16:02:32 -0400 (EDT) Date: Wed, 23 Apr 2014 16:02:32 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 00/20] xfsprogs: introduce the free inode btree Message-ID: <20140423200232.GG5225@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 00/20] xfsprogs: introduce the free inode btree References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <20140423063559.GQ15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423063559.GQ15995@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: 1398283356 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Apr 23, 2014 at 04:35:59PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:10:50PM -0400, Brian Foster wrote: > > Hi all, > > > > This is the v3 userspace portion of finobt support corresponding to v5 > > of the kernel series. > > > > Patches 1-10 are straight application of the corresponding kernel patches > > with omissions where appropriate. > > I haven't done anything more than passed a quick eye over them and > tested them. I'll review them fully in the kernel context, and we > can apply any changes to the kernel code directly to them... > Ok... > > Patch 11 adds mkfs support. Patches 12 and 13 provide a couple minor db > > and repair fixes to support the new agi fields and calculate the fs > > format respectively. Patches 14-18 add real repair support for the > > finobt. Patch 19 adds support to report finobt state in xfs_info. Patch > > 20 adds support for metadump. > > > > Thoughts, reviews, flames appreciated. > > I've made comments on the patches that i think need a bit of work, > but all the remainder (11-20) I haven't made any direct comment on > you can consider: > > Reviewed-by: Dave Chinner > Sounds good. Thanks for the reviews! :) Brian > -- > Dave Chinner > david@fromorbit.com From tinguely@eagdhcp-232-128.americas.sgi.com Wed Apr 23 16:05:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C5E937F59 for ; Wed, 23 Apr 2014 16:05:27 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay1.corp.sgi.com (Postfix) with ESMTP id 965E48F8049 for ; Wed, 23 Apr 2014 14:05:24 -0700 (PDT) Received: from eagdhcp-232-128.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s3NL5PGa002939 for ; Wed, 23 Apr 2014 16:05:25 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-128.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5/Submit) id s3NL5P6a002938; Wed, 23 Apr 2014 16:05:25 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140423210445.700477624@sgi.com> User-Agent: quilt/0.48-20.3.1 Date: Wed, 23 Apr 2014 16:04:35 -0500 From: Mark Tinguely To: XFS Mailing List Subject: [RFC] libxfs: adding attribute fork frees xfs_inode ptr References: <20140423210034.892939354@sgi.com> Content-Disposition: inline; filename=xfsprogs-fix-dp-release-when-adding-attr-fork.patch User space does not currently perform any attribute adding/deleting, but if we do want to fix attributes or use them for parent inode pointers, user space should support attributes. The adding an attribute fork is done in an embedded transaction inside xfs_attr_set_int(). The xfs_trans_commit in xfs_bmap_add_attrfork() will free the xfs_inode pointer causing xfs_attr_calc_size() in xfs_attr_set_int() to fail. I don't see that we have any hold counts on the xfs_inode, so this is a dirty FYI/RFC of a work around for this problem by calling xfs_iget() to read back in the just freed inode. --- libxfs/xfs_attr.c | 4 ++++ 1 file changed, 4 insertions(+) Index: b/libxfs/xfs_attr.c =================================================================== --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -223,11 +223,15 @@ xfs_attr_set_int( * (inode must not be locked when we call this routine) */ if (XFS_IFORK_Q(dp) == 0) { + xfs_ino_t ino = dp->i_ino; int sf_size = sizeof(xfs_attr_sf_hdr_t) + XFS_ATTR_SF_ENTSIZE_BYNAME(name->len, valuelen); if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) return(error); + error = libxfs_iget(mp, NULL, ino, 0, &dp, 0); + if (error) + return(error); } /* From david@fromorbit.com Wed Apr 23 17:12:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A28DD7F5D for ; Wed, 23 Apr 2014 17:12:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 756188F8040 for ; Wed, 23 Apr 2014 15:12:40 -0700 (PDT) X-ASG-Debug-ID: 1398291154-04cb6c2b7a09ad0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id h6YEurmgMgkoYjFe for ; Wed, 23 Apr 2014 15:12: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: ArNfAEM6WFN5LEcvPGdsb2JhbABagwaDZIUKowKZboEbFwMBAQEBODWCJQEBBAE6HCMQCAMOCgklDwUlAwcaE4g5B81oFxaOQgeEOQSYdJRIgVEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 07:42:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd5P3-00067E-Um; Thu, 24 Apr 2014 08:12:29 +1000 Date: Thu, 24 Apr 2014 08:12:29 +1000 From: Dave Chinner To: Ivan Pantovic Cc: Speedy Milan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) Message-ID: <20140423221229.GS18672@dastard> X-ASG-Orig-Subj: Re: rm -f * on large files very slow on XFS + MD RAID 6 volume of 15x 4TB of HDDs (52TB) References: <20140423021835.GI15995@dastard> <53576A7D.9020303@gmail.com> <20140423082538.GR18672@dastard> <53578632.1060005@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53578632.1060005@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: 1398291154 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5197 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 11:21:54AM +0200, Ivan Pantovic wrote: > Hi Dave, > > >xfs_db> freesp > > from to extents blocks pct > > 1 1 52463 52463 0.00 > > 2 3 73270 181394 0.01 > > 4 7 134526 739592 0.03 > > 8 15 250469 2870193 0.12 > > 16 31 581572 13465403 0.58 > > 32 63 692386 32096932 1.37 > > 64 127 1234204 119157757 5.09 So these are the small free spaces that lead to problems. There's around 3 million small free space extents in the filesystems, totalling 7% of the free space. That's quite a lot, and it means that there is a good chance that small allocations will find these small free spaces rather than find a large extent and start from there. > > 128 255 91015 16690243 0.71 > > 256 511 18977 6703895 0.29 > > 512 1023 12821 8611576 0.37 > > 1024 2047 23209 33177541 1.42 > > 2048 4095 43282 101126831 4.32 > > 4096 8191 12726 55814285 2.39 > > 8192 16383 2138 22750157 0.97 > > 16384 32767 1033 21790120 0.93 > > 32768 65535 433 19852497 0.85 > > 65536 131071 254 23052185 0.99 > > 131072 262143 204 37833000 1.62 > > 262144 524287 229 89970969 3.85 > > 524288 1048575 164 124210580 5.31 > >1048576 2097151 130 173193687 7.40 > >2097152 4194303 22 61297862 2.62 > >4194304 8388607 16 97070435 4.15 > >8388608 16777215 26 320475332 13.70 > >16777216 33554431 6 133282461 5.70 > >33554432 67108863 12 616939026 26.37 > >134217728 268435328 1 207504563 8.87 There are some large free spaces still, so your filesystem is still in fairly good shape from that perspective. You can get a better idea of whether the fragmentation is isolated to specific AGs by using the freesp -a command to dump each individual freespace index. You can then use the xfs_bmap command to find files that are located in those fragmented AGs. The only way to fix freespace fragmentation right now is to remove the extents that are chopping up the freespace. Moving data around on a per-directory basis (e.g. cp the regular files to a temp directory, rename them back over the original) is one way of acheiving this, though you have to carefully control the destination AG and make sure it is an AG that is made up mostly of contiguous freespace to begin with.... But you only really need to do this if you are seeing ongoing problems. Often just freeing up space in the filesystem will fix the problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 17:22:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 73D357F5F for ; Wed, 23 Apr 2014 17:22:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E67DFAC015 for ; Wed, 23 Apr 2014 15:22:24 -0700 (PDT) X-ASG-Debug-ID: 1398291742-04cb6c2b7c0a490001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id N2fq8Uzw0WGAYDKT for ; Wed, 23 Apr 2014 15:22:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArJfANw8WFN5LEcvPGdsb2JhbABagwaDZIUKowKZboEbFwMBAQEBODWCJQEBBScTHCMQCAMYCSUPBSUDBxoTiEDNbRcWjkIHhDkEjQuLaYdYgxWLLCs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 07:52:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd5YV-00068I-OO; Thu, 24 Apr 2014 08:22:15 +1000 Date: Thu, 24 Apr 2014 08:22:15 +1000 From: Dave Chinner To: Mark Tinguely Cc: XFS Mailing List Subject: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr Message-ID: <20140423222215.GT18672@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr References: <20140423210034.892939354@sgi.com> <20140423210445.700477624@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423210445.700477624@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: 1398291742 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 04:04:35PM -0500, Mark Tinguely wrote: > User space does not currently perform any attribute adding/deleting, > but if we do want to fix attributes or use them for parent inode > pointers, user space should support attributes. > > The adding an attribute fork is done in an embedded transaction > inside xfs_attr_set_int(). The xfs_trans_commit in xfs_bmap_add_attrfork() > will free the xfs_inode pointer causing xfs_attr_calc_size() in > xfs_attr_set_int() to fail. It shouldn't. xfs_bmap_add_attrfork() does: xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); which in the kernel code sets: iip->ili_lock_flags = lock_flags; The libxfs code doesn't do that, so when xfs_trans_commit() gets to inode_item_unlock(): if (!iip->ili_lock_flags) libxfs_iput(ip, 0); else iip->ili_lock_flags = 0; It frees the inode rather than just returning it with the lock flags cleared. Note that libxfs still has libxfs_trans_ijoin_ref() which sets the lock flags, but this has been removed from the kernel code. IOWs, this is a libxfs/trans.c::xfs_trans_ijoin() bug, not something that needs fixing in the shared kernel/user libxfs code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 17:52:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0DE317F51 for ; Wed, 23 Apr 2014 17:52:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9919304048 for ; Wed, 23 Apr 2014 15:52:18 -0700 (PDT) X-ASG-Debug-ID: 1398293535-04bdf05c750d1a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 42h87ocMhfB11kPM for ; Wed, 23 Apr 2014 15:52: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: AmFdALZDWFN5LEcvPGdsb2JhbABagwZPgxWoDJlugRsXAwEBAQE4NYIlAQEBAwE6HBUDCwULCAMYCSUPBSUDBxoThyOBFgcOzXcWiSCDJoEaEQFQB4Q5BJh0gTiEa492K4E1 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 08:22:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd61M-0006Cc-Fi; Thu, 24 Apr 2014 08:52:04 +1000 Date: Thu, 24 Apr 2014 08:52:04 +1000 From: Dave Chinner To: Keyur Govande Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: XFS fragmentation on file append Message-ID: <20140423225204.GR15995@dastard> X-ASG-Orig-Subj: Re: XFS fragmentation on file append References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> <20140423054719.GJ15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398293535 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: tsunanet.net X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5199 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 03:05:00PM -0400, Keyur Govande wrote: > On Wed, Apr 23, 2014 at 1:47 AM, Dave Chinner wrote: > > On Tue, Apr 22, 2014 at 07:35:34PM -0400, Keyur Govande wrote: > >> Here's how the first 3 AG's look like: > >> https://gist.github.com/keyurdg/82b955fb96b003930e4f > >> > >> After a run of the dpwrite program, here's how the bmap looks like: > >> https://gist.github.com/keyurdg/11196897 > >> > >> The files have nicely interleaved with each other, mostly > >> XFS_IEXT_BUFSZ size extents. > > > > XFS_IEXT_BUFSZ Has nothing to do with the size of allocations. It's > > the size of the in memory array buffer used to hold extent records. > > > > What you are seeing is allocation interleaving according to the > > pattern and size of the direct IOs being done by the application. > > Which happen to be 512KB (1024 basic blocks) and the file being > > written to is randomly selected. > > I misspoke; I meant to say XFS_IEXT_BUFSZ (4096) blocks per extent. As > long as each pwrite is less than 2 MB, the extents do lay out in 4096 > blocks every time. Sure, 4096 basic blocks per extent, but that has nothing to do with XFS_IEXT_BUFSZ. All you've done is pick a random #define out of the source code that matches the number you are seeing from xfs_bmap. They are *completely unrelated*. If your extents are laying out in 2MB chunks, then perhaps that's because of allocation alignment being driven by stripe unit/stripe width configuration, or maybe freespace is simply fragmented into chunks that size. > >> The average read speed is 724 MBps. After > >> defragmenting the file to 1 extent, the speed improves 30% to 1.09 > >> GBps. > > > > Sure. Now set an extent size hint of 32MB and try again. > > I did these runs as well going by your last email suggestion, but I > was more interested in what you thought about the other ideas so > didn't include the results. > > 32MB gives 850 MBps and 64MB hits 980MBps. The peak read rate from the > hardware for a contiguous file is 1.45 GBps. I could keep on > increasing it until I hit a number I like, but I was looking to see if > it could be globally optimized. IOWs, if you hit the RAID controller readahead cache, it does 1.45GB/s. If you don't hit it, you see sustainable, real world disk speeds you can get from the array. > I realize this is terrible for small files like a source code tree, > but for a database which usually has a many large files in the same > directory the seek cost is amortized by the benefit from a large > contiguous read. Would it be terrible to have this modifiable as a > setting (like extsize is) with the default being the inode64 behavior? We do have that behaviour configurable. Like I said, use the inode32 allocator (mount option). > >> I couldn't find guidance on the internet on how many allocation groups > >> to use for a 2 TB partition, > > > > I've already given guidance on that. Choose to ignore it if you > > will... > > Could you repeat it or post a link? The only relevant info I found via > Google is using as many AGs as hardware threads Sorry, I mixed you up with someone else asking about XFS optimisation for database workloads a couple of days ago. http://oss.sgi.com/archives/xfs/2014-04/msg00384.html > (http://blog.tsunanet.net/2011/08/mkfsxfs-raid10-optimal-performance.html). That's one of the better blog posts I've seen, but it's still got quite a few subtle errors in it. As it is, this shows why google is a *terrible source* of technical information - google considers crappy blog posts to be more authorative than the mailing list posts written by subject matter experts.... Indeed, this is where I'm trying to document all this sort of stuff in a semi-official manner so as to avoid this "he said, she said" sort of problem: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs-documentation.git;a=blob_plain;f=admin/XFS_Performance_Tuning/filesystem_tunables.asciidoc;hb=HEAD > >> Could the same doubling logic be applied for DIRECT_IO writes as well? > > > > I don't think so. It would break many carefully tuned production > > systems out there that rely directly on the fact that XFS does > > exactly what the application asks it to do when using direct IO. > > > > IOWs, I think you are trying to optimise the wrong layer - put your > > effort into making fallocate() do what the application needs to > > prevent fragmentation rather trying to hack the filesystem to do it > > for you. Not only will that improve performance on XFS, but it will > > also improve performance on ext4 and any other filesystem that > > supports fallocate and direct IO. > > I've been experimenting with patches to MySQL to use fallocate with > FALLOC_FL_KEEP_SIZE and measuring the performance and fragmentation. Great - I'm interested to know what your results are :) > I also poked at the kernel because I assumed other DBs may also > benefit from the heuristic (speculative) allocation. Point taken about > doing the optimization in the application layer. Postgres uses buffered IO (so can make use of speculative allocation for it's files. However, that has it's own share of problems that direct IO doesn't have, so they aren't really in a better position as a result of making that choice... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 17:53:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9637E7F51 for ; Wed, 23 Apr 2014 17:53:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A946AC014 for ; Wed, 23 Apr 2014 15:53:04 -0700 (PDT) X-ASG-Debug-ID: 1398293581-04bdf05c730d270001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Lq8JMVqR5ZlEQOoU for ; Wed, 23 Apr 2014 15:53:02 -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: ArRfALZDWFN5LEcvPGdsb2JhbABagwaDZIUKowKZboEbFwMBAQEBODWCJQEBBScTHCMQCAMOCgkMGQ8FJQMHGhOIQM1uFxaOQgcKhC8EmHSUSIFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 08:23:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd62G-0006Cp-F3; Thu, 24 Apr 2014 08:53:00 +1000 Date: Thu, 24 Apr 2014 08:53:00 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Message-ID: <20140423225300.GS15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-14-git-send-email-bfoster@redhat.com> <20140423061233.GN15995@dastard> <20140423200205.GE5225@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423200205.GE5225@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398293581 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5199 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 04:02:06PM -0400, Brian Foster wrote: > On Wed, Apr 23, 2014 at 04:12:33PM +1000, Dave Chinner wrote: > > On Thu, Apr 10, 2014 at 12:11:03PM -0400, Brian Foster wrote: > > > Account for the finobt in calc_mkfs(). > > > > > > Signed-off-by: Brian Foster > > > --- > > > repair/xfs_repair.c | 2 ++ > > > 1 file changed, 2 insertions(+) > > > > > > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > > > index 08b25f0..356125b 100644 > > > --- a/repair/xfs_repair.c > > > +++ b/repair/xfs_repair.c > > > @@ -407,6 +407,8 @@ calc_mkfs(xfs_mount_t *mp) > > > bcntbt_root = bnobt_root + 1; > > > inobt_root = bnobt_root + 2; > > > fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; > > > + if (xfs_sb_version_hasfinobt(&mp->m_sb)) > > > + fino_bno++; > > > > The comment about this code needs updating, too. > > > > Oops, indeed. How about the following (also fixed the line length)? > > /* > * Pre-calculate the geometry of ag 0. We know what it looks like > * because we know what mkfs does: 2 allocation btree roots (by block > * and by size), the inode allocation btree root, the free inode > * allocation btree root (if enabled) and some number of blocks to > * prefill the agfl. > */ Apart from the whitespace damage, it looks good ;) Cheers Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 18:03:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A56AB7F59 for ; Wed, 23 Apr 2014 18:03:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D430AC014 for ; Wed, 23 Apr 2014 16:03:46 -0700 (PDT) X-ASG-Debug-ID: 1398294223-04cb6c2b7c0deb0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id fpx1C09lJGv0X3l7 for ; Wed, 23 Apr 2014 16:03:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArZfAApFWFN5LEcvPGdsb2JhbABagwaDZIUKowKZboEbFwMBAQEBODWCJQEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDkHzWkXFo1WbAeEOQSYdJRIgVErgTU Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 08:28:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd67c-0006EA-GA; Thu, 24 Apr 2014 08:58:32 +1000 Date: Thu, 24 Apr 2014 08:58:32 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Message-ID: <20140423225832.GT15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-18-git-send-email-bfoster@redhat.com> <20140423062443.GP15995@dastard> <20140423200216.GF5225@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423200216.GF5225@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398294223 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Apr 23, 2014 at 04:02:16PM -0400, Brian Foster wrote: > On Wed, Apr 23, 2014 at 04:24:43PM +1000, Dave Chinner wrote: > > On Thu, Apr 10, 2014 at 12:11:07PM -0400, Brian Foster wrote: > > > Add the findfirst_free_inode_rec() and next_free_ino_rec() helpers > > > to assist scanning the in-core inode records for records with at > > > least one free inode. These will be used to determine what records > > > are included in the free inode btree. > > > > > > Signed-off-by: Brian Foster > > > --- > > > repair/incore.h | 27 +++++++++++++++++++++++++++ > > > 1 file changed, 27 insertions(+) > > > > > > diff --git a/repair/incore.h b/repair/incore.h > > > index 5419884..5f8c188 100644 > > > --- a/repair/incore.h > > > +++ b/repair/incore.h > > > @@ -381,6 +381,33 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); > > > ((ino_tree_node_t *) ((ino_node_ptr)->avl_node.avl_forw)) > > > > > > /* > > > + * finobt helpers > > > + */ > > > +static inline ino_tree_node_t * > > > +findfirst_free_inode_rec(xfs_agnumber_t agno) > > > +{ > > > + ino_tree_node_t *ino_rec; > > > + > > > + ino_rec = findfirst_inode_rec(agno); > > > + > > > + while (ino_rec && !ino_rec->ir_free) > > > + ino_rec = next_ino_rec(ino_rec); > > > + > > > + return ino_rec; > > > +} > > > + > > > +static inline ino_tree_node_t * > > > +next_free_ino_rec(ino_tree_node_t *ino_rec) > > > +{ > > > + ino_rec = next_ino_rec(ino_rec); > > > + > > > + while (ino_rec && !ino_rec->ir_free) > > > + ino_rec = next_ino_rec(ino_rec); > > > + > > > + return ino_rec; > > > +} > > > > That looks a bit inefficient - walking the list of inode records to > > find the next one with free inodes. Perhaps we woul dbe better > > served by adding a new list for inode records with free entries and > > walking that instead? > > > > Iknow, it's a memory vs speed tradeoff, but if we've got millions of > > inodes and very few free, the difference could be very significant. > > > > Hmm, perhaps. The ino_tree_node_t structure is 104 bytes according to > pahole. With 64 inodes per node, 1 billion inodes would turn into around > 15 million of these structures. If I write a dumb little program to > allocate, initialize and iterate 15 million ~100 byte structures > (accessing the structure beginning and end), it uses ~1.8GB RAM and runs > in under 5 seconds. If I increase that to 30 million, it allocates > ~3.5GB RAM, triggers kswapd (4GB RAM VM) and seems to run anywhere from > 30s to 1m30s. > > All of that probably doesn't mean that much in the context of repair, I > guess. ;) *nod* Repair does more than this between searches (so TLB pressure will be different), some CPUs have prefetchers that detect pointer chasing like this, some systems have remote (hence slower) memory. Hence testing in isolation doesn't necessarily give an accurate picture... > I'll have to experiment a bit more with this and, at minimum, > I'll include some data in my next rev. FWIW, if it is a problem I'd > probably approach this as an additional optimization patch rather than > rework this one. I also note that we already do multiple scans of the > inode record list (e.g., cursor initialization), so we might be able to > buy back some of whatever the finobt degradation is by condensing the > cursor initialization scans. Yup, doing it as an additional patch if it is necessary sounds like a good plan to me. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 18:07:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10D547F52 for ; Wed, 23 Apr 2014 18:07:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9D6B8F804B for ; Wed, 23 Apr 2014 16:07:35 -0700 (PDT) X-ASG-Debug-ID: 1398294453-04cb6c2b7d0e8a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id gQd8ca2v0qZxw1JY for ; Wed, 23 Apr 2014 16:07:34 -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: ArZfAEJHWFN5LEcvPGdsb2JhbABagwaDZIUKowKZboEbFwMBAQEBODWCJQEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDkHzWMXFo5CB4Q5BJh0lhkrgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 08:36:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd6FX-0006GJ-Ln; Thu, 24 Apr 2014 09:06:43 +1000 Date: Thu, 24 Apr 2014 09:06:43 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Message-ID: <20140423230643.GU15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-15-git-send-email-bfoster@redhat.com> <20140423061945.GO15995@dastard> <20140423200151.GD5225@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423200151.GD5225@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398294453 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 04:01:52PM -0400, Brian Foster wrote: > On Wed, Apr 23, 2014 at 04:19:45PM +1000, Dave Chinner wrote: > > On Thu, Apr 10, 2014 at 12:11:04PM -0400, Brian Foster wrote: > > > If one exists, scan the free inode btree in phase 2 of xfs_repair. > > > We use the same general infrastructure as for the inobt scan, but > > > trigger finobt chunk scan logic in in scan_inobt() via the magic > > > value. > > > > > > The new scan_single_finobt_chunk() function is similar to the inobt > > > equivalent with some finobt specific logic. We can expect that > > > underlying inode chunk blocks are already marked used due to the > > > previous inobt scan. We can also expect to find every record > > > tracked by the finobt already accounted for in the in-core tree > > > with equivalent (and internally consistent) inobt record data. > > > > > > Spit out a warning on any divergences from the above and add the > > > inodes referenced by the current finobt record to the appropriate > > > in-core tree. > > > > > > Signed-off-by: Brian Foster > > .... > > > + > > > + if (!suspect) { > > > + /* > > > + * inodes previously inserted into the uncertain tree should be > > > + * superceded by these when the uncertain tree is processed > > > + */ > > > + nfree = 0; > > > + if (XFS_INOBT_IS_FREE_DISK(rp, 0)) { > > > + nfree++; > > > + ino_rec = set_inode_free_alloc(mp, agno, ino); > > > + } else { > > > + ino_rec = set_inode_used_alloc(mp, agno, ino); > > > + } > > > + for (j = 1; j < XFS_INODES_PER_CHUNK; j++) { > > > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > > + nfree++; > > > + set_inode_free(ino_rec, j); > > > + } else { > > > + set_inode_used(ino_rec, j); > > > + } > > > + } > > > + } else { > > > + /* > > > + * this should handle the case where the inobt scan may have > > > + * already added uncertain inodes > > > + */ > > > + nfree = 0; > > > + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > > > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > > + add_aginode_uncertain(mp, agno, ino + j, 1); > > > + nfree++; > > > + } else { > > > + add_aginode_uncertain(mp, agno, ino + j, 0); > > > + } > > > + } > > > + } > > > + > > > +check_freecount: > > > + > > > + if (nfree != be32_to_cpu(rp->ir_freecount)) { > > > + do_warn( > > > +_("finobt ir_freecount/free mismatch, inode chunk %d/%u, freecount %d nfree %d\n"), > > > + agno, ino, be32_to_cpu(rp->ir_freecount), nfree); > > > + } > > > + > > > + if (!nfree) { > > > + do_warn( > > > +_("finobt record with no free inodes, inode chunk %d/%u\n"), agno, ino); > > > + } > > > > Shouldn't both of these increment suspect? > > > > So at this point of the scan, we're processing through finobt leaf > blocks. Setting suspect has two side effects that I can see: > > 1.) Suppressing the additional, more granular checks for the > records/inodes that make up the remainder of the block. > > 2.) Setting bad_ino_btree, which causes us to skip phases 6 and 7. > > I think my thought process was that side effect #2 was generally too > heavy handed for a scenario where the freecount doesn't happen to match > or we've failed to remove a fully allocated record from the finobt. Yes, that's true. > Furthermore, we already increment suspect in this function if either the > allocation state of the inode chunk blocks or the allocation state of > any individual inode is unexpected based on the inobt state. The > additional value of the freecount checks is to catch any kind of > intra-record corruption or inter-freecount corruption across the trees, > which IIUC would be fixed naturally provided nothing else is wrong > (e.g., suspect remains 0) when the trees are regenerated. > > In other words, if inode allocation state does differ between the trees, > we already do set suspect. If these warnings fire without suspect being > set, it means we just need to fix up the freecount and there is no > broader tree corruption. Thoughts? Seems reasonable. Perhaps a comment explaining this would be a good idea - we dont have nearly enough comments in repair explaining how it is cross-validating different pieces of metadata... > NOTE: > > When looking through this again, I think there is a hole in the > allocation state logic in that we don't catch a case where the finobt > inode could be allocated and the inobt inode marked as free: > > if (first_rec) { > ... > > nfree = 0; > for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > nfree++; > if (!suspect && !is_inode_free(first_rec, j)) > suspect++; > } > /* > * XXX: else if the finobt inode is allocated, confirm > * here that the inobt inode is allocated as well! > */ > } > goto check_freecount; > } > > I think something like this might work: > > if (first_rec) { > ... > > nfree = 0; > for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > int isfree = XFS_INOBT_IS_FREE_DISK(rp, j); > > if (isfree) > nfree++; > > if (!suspect && > isfree != is_inode_free(first_rec, j)) > suspect++; > } > goto check_freecount; > } Yes, that makes sense - we need to validate in both directions. Again, a comment would be a useful reminder here. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 18:09:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BADFF7F53 for ; Wed, 23 Apr 2014 18:09:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F06C8F804B for ; Wed, 23 Apr 2014 16:09:18 -0700 (PDT) X-ASG-Debug-ID: 1398294556-04cb6c2b7a0ea70001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id u3K0wQYlC2ZCAVqj for ; Wed, 23 Apr 2014 16:09: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: ArNfAEJHWFN5LEcvPGdsb2JhbABagwaDZIUKowKZboEbFwMBAQEBODWCJQEBBTocIxAIAw4HAwklDwUlAwcaE4hAzWMXFo5CB4Q5BJh0lhkr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 08:39:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd6Hz-0006GZ-Ee; Thu, 24 Apr 2014 09:09:15 +1000 Date: Thu, 24 Apr 2014 09:09:15 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: introduce new large ACL test Message-ID: <20140423230915.GV15995@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: introduce new large ACL test References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-4-git-send-email-david@fromorbit.com> <20140423152313.GC26128@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423152313.GC26128@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398294556 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 23, 2014 at 08:23:13AM -0700, Christoph Hellwig wrote: > On Wed, Apr 23, 2014 at 08:04:31AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Having just removed the largeacl test from the shared ACL test, > > reintroduce the same test as an XFS specific test so that we can > > handle the different limits in supported ACL count appropriately. > > I'd prefer to have this as a shared test, and define a _max_acl_size > function in common.acl that does a switch for the fs type. Only > start with XFS for now, but if the maintainers of other filesystems > care enough they could add their limits. Ok, I'll add it as a generic test, along with a _max_acl_size function and a _requires_max_acl_size helper.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Apr 23 18:44:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D32E97F52 for ; Wed, 23 Apr 2014 18:44:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 852578F8049 for ; Wed, 23 Apr 2014 16:44:59 -0700 (PDT) X-ASG-Debug-ID: 1398296696-04bdf05c7310400001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 1Z5eU2jXxNC7NY0Q for ; Wed, 23 Apr 2014 16:44:56 -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: Ar1fAJVPWFN5LEcvPGdsb2JhbABagwZPgxWFCqMCmW6BGxcDAQEBATg1giUBAQU6HCMQCBEHDCUPBSUDBxoTiEDNVxcWjEaBJVcHhDkEjmyGGINwlhkrgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 24 Apr 2014 09:14:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wd6qT-0006L6-4i; Thu, 24 Apr 2014 09:44:53 +1000 Date: Thu, 24 Apr 2014 09:44:53 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: [PATCH 3/6 v2] generic: introduce new large ACL test Message-ID: <20140423234452.GW15995@dastard> X-ASG-Orig-Subj: [PATCH 3/6 v2] generic: introduce new large ACL test References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-4-git-send-email-david@fromorbit.com> <20140423152313.GC26128@infradead.org> <20140423230915.GV15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423230915.GV15995@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: 1398296696 X-Barracuda-URL: http://192.48.157.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=INFO_TLD, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5199 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain From: Dave Chinner Having just removed the largeacl test from the shared ACL test, reintroduce the same test as an generic test so that we can handle the different limits in supported ACL count appropriately across different filesystems and different configurations within filesystem types. Filesystems have to add support to _acl_get_max to run this test - the default behaviour right now is to throw a notrun error like this: generic/026 14s ... [not run] ext4 does not define maximum ACL count Signed-off-by: Dave Chinner --- common/attr | 31 ++++++++++++ tests/generic/026 | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/026.out | 9 ++++ tests/generic/group | 1 + 4 files changed, 173 insertions(+) diff --git a/common/attr b/common/attr index 83bf9d1..6fdcbf2 100644 --- a/common/attr +++ b/common/attr @@ -21,6 +21,37 @@ #----------------------------------------------------------------------- # common extended attribute and ACL support +# filesystems that want to test maximum supported acl counts need to +# add support in here +_acl_get_max() +{ + case $FSTYP in + xfs) + # CRC format filesystems have much larger ACL counts. The actual + # number is into the thousands, but testing that meany takes too + # long, so just test well past the old limit of 25. + xfs_info $TEST_DIR | _filter_mkfs > /dev/null 2> $tmp.info + . $tmp.info + rm $tmp.info + if [ $_fs_has_crcs -eq 0 ]; then + echo 25 + else + echo 5461 + fi + ;; + *) + echo 0 + ;; + esac +} + +_require_acl_get_max() +{ + if [ $(_acl_get_max) -eq 0 ]; then + _notrun "$FSTYP does not define maximum ACL count" + fi +} + # pick three unused user/group ids, store them as $acl[1-3] # _acl_setup_ids() diff --git a/tests/generic/026 b/tests/generic/026 new file mode 100644 index 0000000..6dae966 --- /dev/null +++ b/tests/generic/026 @@ -0,0 +1,132 @@ +#! /bin/bash +# FS QA Test No. generic/026 +# +# Test out ACL count limits +# +#----------------------------------------------------------------------- +# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. +# Copyright (c) 2014 Red hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +runas=$here/src/runas +status=1 # FAILure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +_cleanup() +{ + cd / + rm -f $tmp.* + [ -n "$TEST_DIR" ] && rm -rf $TEST_DIR/$seq.dir1 +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_need_to_be_root +_acl_setup_ids +_require_acls +_require_acl_get_max + +[ -x $runas ] || _notrun "$runas executable not found" + +rm -f $seqres.full + +# get dir +cd $TEST_DIR +rm -rf $seq.dir1 +mkdir $seq.dir1 +cd $seq.dir1 + +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL +# on old kernel. So we need to filter out the error message in order +# to make the updated golden output works for both old and new kernels. +_filter_largeacl() +{ + sed -e "s/Invalid argument/Argument list too long/" +} + +# filter all the non-ace stuff from the acl output so the count is +# correct. Note that this assumes that _create_n_aces always creates rwx acls. +_filter_acls() +{ + _filter_aces | grep ':rwx' +} + +# store the output in seqres.full, then run again an count and filter the +# output. +check_acls() +{ + _acl=$1 + _count=$2 + + chacl $_acl largeaclfile 2>&1 | _filter_largeacl + getfacl --numeric largeaclfile | _filter_aces \ + >> $seqres.full 2> /dev/null + nacls=`getfacl --numeric largeaclfile | _filter_acls | wc -l` + if [ $nacls -ne $_count ]; then + echo Wrong ACL count - $nacls != $_count + fi +} + + +echo "" +echo "=== Test out large ACLs ===" +touch largeaclfile + +ACL_MAX_ENTRIES=$(_acl_get_max) +num_aces_pre=$((ACL_MAX_ENTRIES - 1)) +num_aces_post=$((ACL_MAX_ENTRIES + 1)) + +acl1=`_create_n_aces $num_aces_pre` +acl2=`_create_n_aces $ACL_MAX_ENTRIES` +acl3=`_create_n_aces $num_aces_post` +acl4=`_create_n_aces 16` # Andreas G. libacl size for initial get +acl5=`_create_n_aces 17` # 1 over A.G. libacl initial size + +echo "1 below acl max" +check_acls $acl1 $num_aces_pre + +echo "acl max" +check_acls $acl2 $ACL_MAX_ENTRIES + +# we expect the ACL change to fail, so the old ACLs should remain on the +# file. Hence the expected ACL count is XFS_ACL_MAX_ENTRIES, not num_aces_post. +echo "1 above acl max" +check_acls $acl3 $ACL_MAX_ENTRIES + +echo "use 16 aces" +check_acls $acl4 16 + +echo "use 17 aces" +check_acls $acl5 17 + +# success, all done +status=0 +exit diff --git a/tests/generic/026.out b/tests/generic/026.out new file mode 100644 index 0000000..c36b7f0 --- /dev/null +++ b/tests/generic/026.out @@ -0,0 +1,9 @@ +QA output created by 026 + +=== Test out large ACLs === +1 below acl max +acl max +1 above acl max +chacl: cannot set access acl on "largeaclfile": Argument list too long +use 16 aces +use 17 aces diff --git a/tests/generic/group b/tests/generic/group index 60d6066..961f4e5 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -28,6 +28,7 @@ 023 auto quick 024 auto quick 025 auto quick +026 acl quick auto 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress From bfoster@redhat.com Wed Apr 23 19:39:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B86D7F52 for ; Wed, 23 Apr 2014 19:39:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE337AC00E for ; Wed, 23 Apr 2014 17:39:15 -0700 (PDT) X-ASG-Debug-ID: 1398299951-04bdf05c74134b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Y9R8HGyOw41syAor for ; Wed, 23 Apr 2014 17:39: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3O0d9sY023996 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 23 Apr 2014 20:39:09 -0400 Received: from laptop.bfoster (vpn-227-80.phx2.redhat.com [10.3.227.80]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3O0d8Pm023887; Wed, 23 Apr 2014 20:39:09 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 63899120AC3; Wed, 23 Apr 2014 20:39:08 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s3O0d6vQ003711; Wed, 23 Apr 2014 20:39:06 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 23 Apr 2014 20:39:05 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan Message-ID: <20140424003905.GA3435@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 14/20] xfsprogs/repair: phase 2 finobt scan References: <1397146270-42993-1-git-send-email-bfoster@redhat.com> <1397146270-42993-15-git-send-email-bfoster@redhat.com> <20140423061945.GO15995@dastard> <20140423200151.GD5225@bfoster.bfoster> <20140423230643.GU15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423230643.GU15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398299951 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 24, 2014 at 09:06:43AM +1000, Dave Chinner wrote: > On Wed, Apr 23, 2014 at 04:01:52PM -0400, Brian Foster wrote: > > On Wed, Apr 23, 2014 at 04:19:45PM +1000, Dave Chinner wrote: > > > On Thu, Apr 10, 2014 at 12:11:04PM -0400, Brian Foster wrote: > > > > If one exists, scan the free inode btree in phase 2 of xfs_repair. > > > > We use the same general infrastructure as for the inobt scan, but > > > > trigger finobt chunk scan logic in in scan_inobt() via the magic > > > > value. > > > > > > > > The new scan_single_finobt_chunk() function is similar to the inobt > > > > equivalent with some finobt specific logic. We can expect that > > > > underlying inode chunk blocks are already marked used due to the > > > > previous inobt scan. We can also expect to find every record > > > > tracked by the finobt already accounted for in the in-core tree > > > > with equivalent (and internally consistent) inobt record data. > > > > > > > > Spit out a warning on any divergences from the above and add the > > > > inodes referenced by the current finobt record to the appropriate > > > > in-core tree. > > > > > > > > Signed-off-by: Brian Foster > > > .... > > > > + > > > > + if (!suspect) { > > > > + /* > > > > + * inodes previously inserted into the uncertain tree should be > > > > + * superceded by these when the uncertain tree is processed > > > > + */ > > > > + nfree = 0; > > > > + if (XFS_INOBT_IS_FREE_DISK(rp, 0)) { > > > > + nfree++; > > > > + ino_rec = set_inode_free_alloc(mp, agno, ino); > > > > + } else { > > > > + ino_rec = set_inode_used_alloc(mp, agno, ino); > > > > + } > > > > + for (j = 1; j < XFS_INODES_PER_CHUNK; j++) { > > > > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > > > + nfree++; > > > > + set_inode_free(ino_rec, j); > > > > + } else { > > > > + set_inode_used(ino_rec, j); > > > > + } > > > > + } > > > > + } else { > > > > + /* > > > > + * this should handle the case where the inobt scan may have > > > > + * already added uncertain inodes > > > > + */ > > > > + nfree = 0; > > > > + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > > > > + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > > > + add_aginode_uncertain(mp, agno, ino + j, 1); > > > > + nfree++; > > > > + } else { > > > > + add_aginode_uncertain(mp, agno, ino + j, 0); > > > > + } > > > > + } > > > > + } > > > > + > > > > +check_freecount: > > > > + > > > > + if (nfree != be32_to_cpu(rp->ir_freecount)) { > > > > + do_warn( > > > > +_("finobt ir_freecount/free mismatch, inode chunk %d/%u, freecount %d nfree %d\n"), > > > > + agno, ino, be32_to_cpu(rp->ir_freecount), nfree); > > > > + } > > > > + > > > > + if (!nfree) { > > > > + do_warn( > > > > +_("finobt record with no free inodes, inode chunk %d/%u\n"), agno, ino); > > > > + } > > > > > > Shouldn't both of these increment suspect? > > > > > > > So at this point of the scan, we're processing through finobt leaf > > blocks. Setting suspect has two side effects that I can see: > > > > 1.) Suppressing the additional, more granular checks for the > > records/inodes that make up the remainder of the block. > > > > 2.) Setting bad_ino_btree, which causes us to skip phases 6 and 7. > > > > I think my thought process was that side effect #2 was generally too > > heavy handed for a scenario where the freecount doesn't happen to match > > or we've failed to remove a fully allocated record from the finobt. > > Yes, that's true. > > > Furthermore, we already increment suspect in this function if either the > > allocation state of the inode chunk blocks or the allocation state of > > any individual inode is unexpected based on the inobt state. The > > additional value of the freecount checks is to catch any kind of > > intra-record corruption or inter-freecount corruption across the trees, > > which IIUC would be fixed naturally provided nothing else is wrong > > (e.g., suspect remains 0) when the trees are regenerated. > > > > In other words, if inode allocation state does differ between the trees, > > we already do set suspect. If these warnings fire without suspect being > > set, it means we just need to fix up the freecount and there is no > > broader tree corruption. Thoughts? > > Seems reasonable. Perhaps a comment explaining this would be a good > idea - we dont have nearly enough comments in repair explaining how > it is cross-validating different pieces of metadata... > Indeed. I had to rethink through that a bit myself, and I wrote the code. ;) So it's not really clear in and of itself. The assumptions being documented also helps clarify the correctness of the previous checks, as demonstrated by the bug below. I'll add some comments to help clear this up. Brian > > NOTE: > > > > When looking through this again, I think there is a hole in the > > allocation state logic in that we don't catch a case where the finobt > > inode could be allocated and the inobt inode marked as free: > > > > if (first_rec) { > > ... > > > > nfree = 0; > > for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > > if (XFS_INOBT_IS_FREE_DISK(rp, j)) { > > nfree++; > > if (!suspect && !is_inode_free(first_rec, j)) > > suspect++; > > } > > /* > > * XXX: else if the finobt inode is allocated, confirm > > * here that the inobt inode is allocated as well! > > */ > > } > > goto check_freecount; > > } > > > > I think something like this might work: > > > > if (first_rec) { > > ... > > > > nfree = 0; > > for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { > > int isfree = XFS_INOBT_IS_FREE_DISK(rp, j); > > > > if (isfree) > > nfree++; > > > > if (!suspect && > > isfree != is_inode_free(first_rec, j)) > > suspect++; > > } > > goto check_freecount; > > } > > Yes, that makes sense - we need to validate in both directions. > Again, a comment would be a useful reminder here. ;) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From dave@fromorbit.com Thu Apr 24 00:02:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE3DA7F52 for ; Thu, 24 Apr 2014 00:02:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AEB378F8052 for ; Wed, 23 Apr 2014 22:02:49 -0700 (PDT) X-ASG-Debug-ID: 1398315767-04bdf05c7522120001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Fz0JikWvYG29eCc1 for ; Wed, 23 Apr 2014 22:02: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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxejXSBAYQjBK8OK4Es Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xx-Rb for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005gM-QV for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/9] repair: report AG btree verifier errors Date: Thu, 24 Apr 2014 15:01:59 +1000 X-ASG-Orig-Subj: [PATCH 6/9] repair: report AG btree verifier errors Message-Id: <1398315722-20870-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315767 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we scan the filesystem freespace and inode maps in phase 2, we don't report CRC errors that are found. We don't really care from a repair perspective, because the trees are completely rebuilt from the ground up in phase 5, but froma checking perspective we need to inform the user that we found inconsistencies. Signed-off-by: Dave Chinner --- repair/scan.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/repair/scan.c b/repair/scan.c index d022723..9cd0e7d 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -82,6 +82,12 @@ scan_sbtree( do_error(_("can't read btree block %d/%d\n"), agno, root); return; } + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + do_warn(_("btree block %d/%d is suspect, error %d\n"), + agno, root, bp->b_error); + suspect = 1; + } + (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, isroot, magic, priv); libxfs_putbuf(bp); @@ -123,6 +129,7 @@ scan_lbtree( xfs_buf_t *bp; int err; int dirty = 0; + bool badcrc = false; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), XFS_FSB_TO_BB(mp, 1), 0, ops); @@ -132,6 +139,19 @@ scan_lbtree( XFS_FSB_TO_AGBNO(mp, root)); return(1); } + + /* + * only check for bad CRC here - caller will determine if there + * is a corruption or not and whether it got corrected and so needs + * writing back. CRC errors always imply we need to write the block. + */ + if (bp->b_error == EFSBADCRC) { + do_warn(_("btree block %d/%d is suspect, error %d\n"), + XFS_FSB_TO_AGNO(mp, root), + XFS_FSB_TO_AGBNO(mp, root), bp->b_error); + badcrc = true; + } + err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, type, whichfork, root, ino, tot, nex, blkmapp, bm_cursor, isroot, check_dups, &dirty, @@ -139,7 +159,7 @@ scan_lbtree( ASSERT(dirty == 0 || (dirty && !no_modify)); - if (dirty && !no_modify) + if ((dirty || badcrc) && !no_modify) libxfs_writebuf(bp, 0); else libxfs_putbuf(bp); @@ -1066,6 +1086,9 @@ scan_freelist( do_abort(_("can't read agfl block for ag %d\n"), agno); return; } + if (agflbuf->b_error == EFSBADCRC) + do_warn(_("agfl has bad CRC for ag %d\n"), agno); + freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); i = be32_to_cpu(agf->agf_flfirst); -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E9C6D7F52 for ; Thu, 24 Apr 2014 00:02:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D71A28F8052 for ; Wed, 23 Apr 2014 22:02:50 -0700 (PDT) X-ASG-Debug-ID: 1398315766-04cb6c2b7c22a50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id KgdaDUaW1myTotNf for ; Wed, 23 Apr 2014 22:02: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: AsCWAGiaWFN5LEcvPGdsb2JhbABagwZPqwwCEJsGFwMBAQEBODWDAjuBAgMHiG0Omg6yQoxcghmEIwSjYokoggQr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xr-OJ for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005fu-NS for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/9 V2] xfs_db, xfs_repair: improve CRC error detection Date: Thu, 24 Apr 2014 15:01:53 +1000 X-ASG-Orig-Subj: [PATCH 0/9 V2] xfs_db, xfs_repair: improve CRC error detection Message-Id: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315766 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is version 2 of the patchset first posted here: http://oss.sgi.com/archives/xfs/2014-04/msg00374.html The version corrects all the issues mentioned in the first review. It doesn't try to rework the directory buffer read issue that Christoph was concerned about - API changes are necessary so we'll do that through the kernel first in a separate patchset. Version 2: - move LIBXFS_B_UNCHECKED to the correct patch (patch 1) - set_cur_iotype assumes a valid type (patch 2) - comments added to explain the way LIBXFS_B_UNCHECKED and dirty buffers are supposed to interact (patch 3) - fixed comment flow and added separate "crc_error" return variable to dir_read_buf() (patch 4) - reworked CRC error handling of AG headers (patch 5) - readded missing dirty/no_modify assert (patch 6) - fixed typos (patch 8) - fixed "repair" variable initialisation flow (patch 9) - fixed dirty buffer accounting on the cursor to dirty the correct buffer on CRC errors, added some clarifying comments (patch 9) Comments and testing welcome! -Dave. From dave@fromorbit.com Thu Apr 24 00:02:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EDAA97F53 for ; Thu, 24 Apr 2014 00:02:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2CF9304059 for ; Wed, 23 Apr 2014 22:02:50 -0700 (PDT) X-ASG-Debug-ID: 1398315767-04bdf05c7522120002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id wsHmqozpYcp8YKju for ; Wed, 23 Apr 2014 22:02: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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxekxgErw4rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006y0-TA for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005gb-SB for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Date: Thu, 24 Apr 2014 15:02:02 +1000 X-ASG-Orig-Subj: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-Id: <1398315722-20870-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315768 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently the attribute code will not detect and correct errors in the attribute tree. It also fails to validate the CRCs and headers on remote attribute blocks. Ensure that all the attribute blocks are CRC checked and that the processing functions understand the correct block formats for decoding. Signed-off-by: Dave Chinner --- repair/attr_repair.c | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index ba85ac2..9b57960 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -604,6 +604,7 @@ verify_da_path(xfs_mount_t *mp, libxfs_putbuf(bp); return(1); } + /* * update cursor, write out the *current* level if * required. don't write out the descendant level @@ -615,6 +616,8 @@ verify_da_path(xfs_mount_t *mp, libxfs_writebuf(cursor->level[this_level].bp, 0); else libxfs_putbuf(cursor->level[this_level].bp); + + /* switch cursor to point at the new buffer we just read */ cursor->level[this_level].bp = bp; cursor->level[this_level].dirty = 0; cursor->level[this_level].bno = dabno; @@ -624,6 +627,14 @@ verify_da_path(xfs_mount_t *mp, cursor->level[this_level].n = newnode; #endif entry = cursor->level[this_level].index = 0; + + /* + * We want to rewrite the buffer a CRC error seeing as it + * contains what appears to be a valid node block, but only if + * we are fixing errors. + */ + if (bp->b_error == EFSBADCRC && !no_modify) + cursor->level[this_level].dirty++; } /* * ditto for block numbers @@ -974,6 +985,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, xfs_dfsbno_t bno; xfs_buf_t *bp; int clearit = 0, i = 0, length = 0, amountdone = 0; + int hdrsize = 0; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + hdrsize = sizeof(struct xfs_attr3_rmt_hdr); /* ASSUMPTION: valuelen is a valid number, so use it for looping */ /* Note that valuelen is not a multiple of blocksize */ @@ -986,16 +1001,26 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, break; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_attr3_rmt_buf_ops); if (!bp) { do_warn( _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); clearit = 1; break; } + + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + do_warn( + _("Corrupt remote block for attributes of inode %" PRIu64 "\n"), ino); + clearit = 1; + break; + } + ASSERT(mp->m_sb.sb_blocksize == XFS_BUF_COUNT(bp)); - length = MIN(XFS_BUF_COUNT(bp), valuelen - amountdone); - memmove(value, XFS_BUF_PTR(bp), length); + + length = MIN(XFS_BUF_COUNT(bp) - hdrsize, valuelen - amountdone); + memmove(value, XFS_BUF_PTR(bp) + hdrsize, length); amountdone += length; value += length; i++; @@ -1143,7 +1168,6 @@ process_leaf_attr_block( xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); clearit = usedbs = 0; - *repair = 0; firstb = mp->m_sb.sb_blocksize; stop = xfs_attr3_leaf_hdr_size(leaf); @@ -1320,13 +1344,16 @@ process_leaf_attr_level(xfs_mount_t *mp, } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_attr3_leaf_buf_ops); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), da_bno, dev_bno, ino); goto error_out; } + if (bp->b_error == EFSBADCRC) + repair++; leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); @@ -1382,9 +1409,9 @@ process_leaf_attr_level(xfs_mount_t *mp, current_hashval = greatest_hashval; - if (repair && !no_modify) + if (repair && !no_modify) libxfs_writebuf(bp, 0); - else + else libxfs_putbuf(bp); } while (da_bno != 0); @@ -1512,6 +1539,8 @@ process_longform_attr( ino); return(1); } + if (bp->b_error == EFSBADCRC) + (*repair)++; /* verify leaf block */ leaf = (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); @@ -1555,7 +1584,7 @@ process_longform_attr( 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) { + if (*repair || repairlinks) { *repair = 1; libxfs_writebuf(bp, 0); } else -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0FE877F56 for ; Thu, 24 Apr 2014 00:02:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D8CFE304059 for ; Wed, 23 Apr 2014 22:02:51 -0700 (PDT) X-ASG-Debug-ID: 1398315767-04bdf05c7522120003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZPrFrQOdiO4IuAll for ; Wed, 23 Apr 2014 22:02: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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxejnWEIwSvDis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xt-P3 for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005g2-ON for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/9] db: verify buffer on type change Date: Thu, 24 Apr 2014 15:01:55 +1000 X-ASG-Orig-Subj: [PATCH 2/9] db: verify buffer on type change Message-Id: <1398315722-20870-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315769 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently when the type command is run, we simply change the type associated with the buffer, but don't verify it. This results in unchecked CRCs being displayed. Hence when changing the type, run the verifier associated with the type to determine if the buffer contents is valid or not. Signed-off-by: Dave Chinner --- db/io.c | 24 ++++++++++++++++++++++++ db/io.h | 1 + db/type.c | 9 +++++---- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/db/io.c b/db/io.c index 387f171..7f1b76a 100644 --- a/db/io.c +++ b/db/io.c @@ -552,6 +552,30 @@ set_cur( ring_add(); } +void +set_iocur_type( + const typ_t *t) +{ + struct xfs_buf *bp = iocur_top->bp; + + iocur_top->typ = t; + + /* verify the buffer if the type has one. */ + if (!bp) + return; + if (!t->bops) { + bp->b_ops = NULL; + bp->b_flags |= LIBXFS_B_UNCHECKED; + return; + } + if (!(bp->b_flags & LIBXFS_B_UPTODATE)) + return; + bp->b_error = 0; + bp->b_ops = t->bops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; +} + static void stack_help(void) { diff --git a/db/io.h b/db/io.h index 7875119..71082e6 100644 --- a/db/io.h +++ b/db/io.h @@ -62,6 +62,7 @@ extern void write_cur(void); extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); extern void ring_add(void); +extern void set_iocur_type(const struct typ *t); /* * returns -1 for unchecked, 0 for bad and 1 for good diff --git a/db/type.c b/db/type.c index 04d0d56..b29f2a4 100644 --- a/db/type.c +++ b/db/type.c @@ -162,10 +162,11 @@ type_f( if (tt == NULL) { dbprintf(_("no such type %s\n"), argv[1]); } else { - if (iocur_top->typ == NULL) { - dbprintf(_("no current object\n")); - } else { - iocur_top->typ = cur_typ = tt; + if (iocur_top->typ == NULL) + dbprintf(_("no current object\n")); + else { + cur_typ = tt; + set_iocur_type(tt); } } } -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C34887F56 for ; Thu, 24 Apr 2014 00:02:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 49AF7AC007 for ; Wed, 23 Apr 2014 22:02:52 -0700 (PDT) X-ASG-Debug-ID: 1398315764-04cbb04b9222ce0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id LPnn50XjDHNdPChz for ; Wed, 23 Apr 2014 22:02: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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxekxgErw4rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xu-PQ for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005g7-Om for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Date: Thu, 24 Apr 2014 15:01:56 +1000 X-ASG-Orig-Subj: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-Id: <1398315722-20870-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315769 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Prefetch currently does not do CRC validation when the IO completes due to the optimisation it performs and the fact that it does not know what the type of metadata into the buffer is supposed to be. Hence, mark all prefetched buffers as "suspect" so that when the end user tries to read it with a supplied validation function the validation is run even though the buffer was already in the cache. Signed-off-by: Dave Chinner --- libxfs/rdwr.c | 43 ++++++++++++++++++++++++++++++++++++++----- repair/prefetch.c | 3 +++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 7208a2f..92b1182 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -718,12 +718,32 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, bp = libxfs_getbuf(btp, blkno, len); if (!bp) return NULL; - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + + /* + * if the buffer was prefetched, it is likely that it was not validated. + * Hence if we are supplied an ops function and the buffer is marked as + * unchecked, we need to validate it now. + * + * We do this verification even if the buffer is dirty - the + * verification is almost certainly going to fail the CRC check in this + * case as a dirty buffer has not had the CRC recalculated. However, we + * should not be dirtying unchecked buffers and therefore failing it + * here because it's dirty and unchecked indicates we've screwed up + * somewhere else. + */ + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { + bp->b_error = 0; + bp->b_ops = ops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } 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. + * Set the ops on a cache miss (i.e. first physical read) as the + * verifier may change the ops to match the type of 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*. @@ -733,8 +753,10 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, error = libxfs_readbufr(btp, blkno, bp, len, flags); if (error) bp->b_error = error; - else if (bp->b_ops) + else if (bp->b_ops) { bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } return bp; } @@ -786,6 +808,14 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, return NULL; bp->b_error = 0; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { + bp->b_ops = ops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } + return bp; + } bp->b_ops = ops; if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) return bp; @@ -793,8 +823,10 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, error = libxfs_readbufr_map(btp, bp, flags); if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; - if (bp->b_ops) + if (bp->b_ops) { bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + } } #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", @@ -889,6 +921,7 @@ libxfs_writebufr(xfs_buf_t *bp) if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; } return error; } diff --git a/repair/prefetch.c b/repair/prefetch.c index 6d6d344..d794ba3 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -389,6 +389,7 @@ pf_read_inode_dirs( bp->b_ops = &xfs_inode_buf_ops; bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; if (bp->b_error) return; @@ -460,6 +461,7 @@ pf_read_discontig( pthread_mutex_unlock(&args->lock); libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); + bp->b_flags |= LIBXFS_B_UNCHECKED; libxfs_putbuf(bp); pthread_mutex_lock(&args->lock); } @@ -583,6 +585,7 @@ pf_batch_read( break; memcpy(XFS_BUF_PTR(bplist[i]), pbuf, size); bplist[i]->b_flags |= LIBXFS_B_UPTODATE; + bplist[i]->b_flags |= LIBXFS_B_UNCHECKED; len -= size; if (B_IS_INODE(XFS_BUF_PRIORITY(bplist[i]))) pf_read_inode_dirs(args, bplist[i]); -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA0B37F5F for ; Thu, 24 Apr 2014 00:02:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D85F304062 for ; Wed, 23 Apr 2014 22:02:53 -0700 (PDT) X-ASG-Debug-ID: 1398315767-04bdf05c7522120004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id x7W5o2odI5G5NexA for ; Wed, 23 Apr 2014 22:02:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxekxgErw4rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xv-QM for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005gC-PC for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Date: Thu, 24 Apr 2014 15:01:57 +1000 X-ASG-Orig-Subj: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Message-Id: <1398315722-20870-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315771 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner repair doesn't currently verifier errors in directory blocks - they cause repair to ignore blocks and hence fail because it can't read critical blocks from the directory. Fix this by having the directory buffer read code detect a verifier error and retry the read without the verifier if the verifier has detected an error. Then pass the verifer error with the successfully read buffer back to the caller, so the caller can handle the error appropriately. In most cases, this is simply marking the directory as needing a rebuild, so once the directory entries have been checked and repaired, it will rewrite all the directory buffers (including the clean ones) and in the process recalculate all the the CRC on the directory blocks. Hence pure CRC errors in directory blocks are now handled correctly by xfs_repair. Signed-off-by: Dave Chinner --- libxfs/rdwr.c | 3 +- repair/phase6.c | 94 +++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 76 insertions(+), 21 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 92b1182..f0bc040 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -731,9 +731,9 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, * here because it's dirty and unchecked indicates we've screwed up * somewhere else. */ + bp->b_error = 0; if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { - bp->b_error = 0; bp->b_ops = ops; bp->b_ops->verify_read(bp); bp->b_flags &= ~LIBXFS_B_UNCHECKED; @@ -748,7 +748,6 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, * 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_error = 0; bp->b_ops = ops; error = libxfs_readbufr(btp, blkno, bp, len, flags); if (error) diff --git a/repair/phase6.c b/repair/phase6.c index 0c35e1c..5ae6a3d 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -125,6 +125,45 @@ typedef struct freetab { #define DIR_HASH_CK_TOTAL 6 /* + * Need to handle CRC and validation errors specially here. If there is a + * validator error, re-read without the verifier so that we get a buffer we can + * check and repair. Re-attach the ops to the buffer after the read so that when + * it is rewritten the CRC is recalculated. + * + * If the buffer was not read, we return an error. If the buffer was read but + * had a CRC or corruption error, we reread it without the verifier and if it is + * read successfully we increment *crc_error and return 0. Otherwise we + * return the read error. + */ +static int +dir_read_buf( + struct xfs_inode *ip, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops, + int *crc_error) +{ + int error; + int error2; + + error = libxfs_da_read_buf(NULL, ip, bno, mappedbno, bpp, + XFS_DATA_FORK, ops); + + if (error != EFSBADCRC && error != EFSCORRUPTED) + return error; + + error2 = libxfs_da_read_buf(NULL, ip, bno, mappedbno, bpp, + XFS_DATA_FORK, NULL); + if (error2) + return error2; + + (*crc_error)++; + (*bpp)->b_ops = ops; + return 0; +} + +/* * Returns 0 if the name already exists (ie. a duplicate) */ static int @@ -1906,15 +1945,19 @@ longform_dir2_check_leaf( int seeval; struct xfs_dir2_leaf_entry *ents; struct xfs_dir3_icleaf_hdr leafhdr; + int error; + int fixit = 0; da_bno = mp->m_dirleafblk; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, - &xfs_dir3_leaf1_buf_ops)) { + error = dir_read_buf(ip, da_bno, -1, &bp, &xfs_dir3_leaf1_buf_ops, + &fixit); + if (error) { do_error( - _("can't read block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); /* NOTREACHED */ } + leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents = xfs_dir3_leaf_ents_p(leaf); @@ -1951,7 +1994,7 @@ longform_dir2_check_leaf( return 1; } libxfs_putbuf(bp); - return 0; + return fixit; } /* @@ -1978,6 +2021,8 @@ longform_dir2_check_node( struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir3_icfree_hdr freehdr; __be16 *bests; + int error; + int fixit = 0; for (da_bno = mp->m_dirleafblk, next_da_bno = 0; next_da_bno != NULLFILEOFF && da_bno < mp->m_dirfreeblk; @@ -1993,11 +2038,12 @@ longform_dir2_check_node( * a node block, then we'll skip it below based on a magic * number check. */ - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK, &xfs_da3_node_buf_ops)) { + error = dir_read_buf(ip, da_bno, -1, &bp, + &xfs_da3_node_buf_ops, &fixit); + if (error) { do_warn( - _("can't read leaf block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read leaf block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); return 1; } leaf = bp->b_addr; @@ -2016,6 +2062,12 @@ longform_dir2_check_node( libxfs_putbuf(bp); return 1; } + + /* + * If there's a validator error, we need to ensure that we got + * the right ops on the buffer for when we write it back out. + */ + bp->b_ops = &xfs_dir3_leafn_buf_ops; if (leafhdr.count > xfs_dir3_max_leaf_ents(mp, leaf) || leafhdr.count < leafhdr.stale) { do_warn( @@ -2039,11 +2091,13 @@ longform_dir2_check_node( next_da_bno = da_bno + mp->m_dirblkfsbs - 1; 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, &xfs_dir3_free_buf_ops)) { + + error = dir_read_buf(ip, da_bno, -1, &bp, + &xfs_dir3_free_buf_ops, &fixit); + if (error) { do_warn( - _("can't read freespace block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read freespace block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); return 1; } free = bp->b_addr; @@ -2093,7 +2147,7 @@ longform_dir2_check_node( return 1; } } - return 0; + return fixit; } /* @@ -2148,6 +2202,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, next_da_bno != NULLFILEOFF && da_bno < mp->m_dirleafblk; da_bno = (xfs_dablk_t)next_da_bno) { const struct xfs_buf_ops *ops; + int error; next_da_bno = da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) @@ -2167,11 +2222,12 @@ longform_dir2_entry_check(xfs_mount_t *mp, ops = &xfs_dir3_block_buf_ops; else ops = &xfs_dir3_data_buf_ops; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bplist[db], - XFS_DATA_FORK, ops)) { + + error = dir_read_buf(ip, da_bno, -1, &bplist[db], ops, &fixit); + if (error) { do_warn( - _("can't read data block %u for directory inode %" PRIu64 "\n"), - da_bno, ino); + _("can't read data block %u for directory inode %" PRIu64 " error %d\n"), + da_bno, ino, error); *num_illegal += 1; /* @@ -2189,7 +2245,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, irec, ino_offset, &bplist[db], hashtab, &freetab, da_bno, isblock); } - fixit = (*num_illegal != 0) || dir2_is_badino(ino) || *need_dot; + fixit |= (*num_illegal != 0) || dir2_is_badino(ino) || *need_dot; if (!dotdot_update) { /* check btree and freespace */ -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FB3E7F69 for ; Thu, 24 Apr 2014 00:02:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAD13AC015 for ; Wed, 23 Apr 2014 22:02:50 -0700 (PDT) X-ASG-Debug-ID: 1398315764-04cbb04b9222ce0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lEpSFm32zSf6Dwhg for ; Wed, 23 Apr 2014 22:02:45 -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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxekxgErw4rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xw-Qm for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005gH-Q3 for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/9] repair: detect CRC errors in AG headers Date: Thu, 24 Apr 2014 15:01:58 +1000 X-ASG-Orig-Subj: [PATCH 5/9] repair: detect CRC errors in AG headers Message-Id: <1398315722-20870-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315764 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner repair doesn't currently detect verifier errors in AG header blocks - apart from the primary superblock they are not detected. They are, fortunately, corrected in the important cases (AGF, AGI and AGFL) because these structures are rebuilt in phase 5, but if you run xfs_repair in checking mode it won't report them as bad. Signed-off-by: Dave Chinner --- repair/scan.c | 81 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 1744c32..d022723 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1207,28 +1207,29 @@ scan_ag( void *arg) { struct aghdr_cnts *agcnts = arg; - xfs_agf_t *agf; - xfs_buf_t *agfbuf; + struct xfs_agf *agf; + struct xfs_buf *agfbuf = NULL; int agf_dirty = 0; - xfs_agi_t *agi; - xfs_buf_t *agibuf; + struct xfs_agi *agi; + struct xfs_buf *agibuf = NULL; int agi_dirty = 0; - xfs_sb_t *sb; - xfs_buf_t *sbbuf; + struct xfs_sb *sb = NULL; + struct xfs_buf *sbbuf = NULL; int sb_dirty = 0; int status; + char *objname = NULL; sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), 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; + objname = _("root superblock"); + goto out_free; } + sb = (xfs_sb_t *)calloc(BBSIZE, 1); if (!sb) { do_error(_("can't allocate memory for superblock\n")); - libxfs_putbuf(sbbuf); - return; + goto out_free; } libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); @@ -1236,10 +1237,8 @@ scan_ag( XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), 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); - free(sb); - return; + objname = _("agf block"); + goto out_free; } agf = XFS_BUF_TO_AGF(agfbuf); @@ -1247,11 +1246,8 @@ scan_ag( XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), 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); - libxfs_putbuf(sbbuf); - free(sb); - return; + objname = _("agi block"); + goto out_free; } agi = XFS_BUF_TO_AGI(agibuf); @@ -1277,7 +1273,7 @@ scan_ag( do_warn(_("would reset bad sb for ag %d\n"), agno); } } - if (status & XR_AG_AGF) { + if (agf_dirty || status & XR_AG_AGF) { if (!no_modify) { do_warn(_("reset bad agf for ag %d\n"), agno); agf_dirty = 1; @@ -1285,7 +1281,7 @@ scan_ag( do_warn(_("would reset bad agf for ag %d\n"), agno); } } - if (status & XR_AG_AGI) { + if (agi_dirty || status & XR_AG_AGI) { if (!no_modify) { do_warn(_("reset bad agi for ag %d\n"), agno); agi_dirty = 1; @@ -1295,15 +1291,9 @@ scan_ag( } if (status && no_modify) { - libxfs_putbuf(agibuf); - libxfs_putbuf(agfbuf); - libxfs_putbuf(sbbuf); - free(sb); - do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), agno); - - return; + goto out_free; } scan_freelist(agf, agcnts); @@ -1312,21 +1302,34 @@ scan_ag( validate_agi(agi, agno, agcnts); ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); + ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); + ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); + + /* + * Only pay attention to CRC/verifier errors if we can correct them. + * While there, ensure that we corrected a corruption error if the + * verifier detected one. + */ + if (!no_modify) { + ASSERT(agi_dirty || agibuf->b_error != EFSCORRUPTED); + ASSERT(agf_dirty || agfbuf->b_error != EFSCORRUPTED); + ASSERT(sb_dirty || sbbuf->b_error != EFSCORRUPTED); + + agi_dirty += (agibuf->b_error == EFSBADCRC); + agf_dirty += (agfbuf->b_error == EFSBADCRC); + sb_dirty += (sbbuf->b_error == EFSBADCRC); + } if (agi_dirty && !no_modify) libxfs_writebuf(agibuf, 0); else libxfs_putbuf(agibuf); - ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); - if (agf_dirty && !no_modify) libxfs_writebuf(agfbuf, 0); else libxfs_putbuf(agfbuf); - ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); - if (sb_dirty && !no_modify) { if (agno == 0) memcpy(&mp->m_sb, sb, sizeof(xfs_sb_t)); @@ -1341,6 +1344,20 @@ scan_ag( print_inode_list(i); #endif return; + +out_free: + if (sb) + free(sb); + if (agibuf) + libxfs_putbuf(agibuf); + if (agfbuf) + libxfs_putbuf(agfbuf); + if (sbbuf) + libxfs_putbuf(sbbuf); + if (objname) + do_error(_("can't get %s for ag %d\n"), objname, agno); + return; + } #define SCAN_THREADS 32 -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 03B617F5F for ; Thu, 24 Apr 2014 00:02:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6F78AAC014 for ; Wed, 23 Apr 2014 22:02:54 -0700 (PDT) X-ASG-Debug-ID: 1398315766-04cb6c2b7c22a50002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id B6hSo7MFmUdSMVIk for ; Wed, 23 Apr 2014 22:02: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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxejnWEIwSvDiuBLiQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xs-Of for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005fx-O2 for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/9] db: don't claim unchecked CRCs are correct Date: Thu, 24 Apr 2014 15:01:54 +1000 X-ASG-Orig-Subj: [PATCH 1/9] db: don't claim unchecked CRCs are correct Message-Id: <1398315722-20870-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315770 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently xfs_db will claim the CRC on a structure is correct if the buffer is not marked with an error. However, buffers may have been read without a verifier, and hence have not had their CRCs validated. in this case, we shoul dreport "unchecked" rather than "correct". For example: xfs_db> fsb 0x6003f xfs_db> type dir3 xfs_db> p dhdr.hdr.magic = 0x58444433 dhdr.hdr.crc = 0x2d0f9c9d (unchecked) .... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- db/fprint.c | 15 ++++++++++++++- db/io.c | 2 ++ db/io.h | 12 +++++++++--- include/libxfs.h | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/db/fprint.c b/db/fprint.c index 435d984..52782e2 100644 --- a/db/fprint.c +++ b/db/fprint.c @@ -206,7 +206,20 @@ fp_crc( __int64_t val; char *ok; - ok = iocur_crc_valid() ? "correct" : "bad"; + switch (iocur_crc_valid()) { + case -1: + ok = "unchecked"; + break; + case 0: + ok = "bad"; + break; + case 1: + ok = "correct"; + break; + default: + ok = "unknown state"; + break; + } for (i = 0, bitpos = bit; i < count && !seenint(); diff --git a/db/io.c b/db/io.c index 5eb61d9..387f171 100644 --- a/db/io.c +++ b/db/io.c @@ -531,6 +531,8 @@ set_cur( return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; + if (!ops) + bp->b_flags |= LIBXFS_B_UNCHECKED; iocur_top->bb = d; iocur_top->blen = c; diff --git a/db/io.h b/db/io.h index ad39bee..7875119 100644 --- a/db/io.h +++ b/db/io.h @@ -63,10 +63,16 @@ extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); extern void ring_add(void); -static inline bool +/* + * returns -1 for unchecked, 0 for bad and 1 for good + */ +static inline int iocur_crc_valid() { - return (iocur_top->bp && - iocur_top->bp->b_error != EFSBADCRC && + if (!iocur_top->bp) + return -1; + if (iocur_top->bp->b_flags & LIBXFS_B_UNCHECKED) + return -1; + return (iocur_top->bp->b_error != EFSBADCRC && (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } diff --git a/include/libxfs.h b/include/libxfs.h index 6bc6c94..6b1e276 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -333,6 +333,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ + LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */ }; #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DFE5B7F67 for ; Thu, 24 Apr 2014 00:02:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73A80AC007 for ; Wed, 23 Apr 2014 22:02:53 -0700 (PDT) X-ASG-Debug-ID: 1398315764-04cbb04b9222ce0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5zlLcsWeIcT1CT9a for ; Wed, 23 Apr 2014 22:02:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxejXSBAYQjBK8OK4Es Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xz-SU for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005gW-Rk for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 8/9] repair: handle remote symlink CRC errors Date: Thu, 24 Apr 2014 15:02:01 +1000 X-ASG-Orig-Subj: [PATCH 8/9] repair: handle remote symlink CRC errors Message-Id: <1398315722-20870-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315771 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We can't really repair broken symlink buffer contents, but we can at least warn about it and correct the CRC error so the symlink is again readable. Signed-off-by: Dave Chinner --- repair/dinode.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index b086bec..6360dba 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1254,6 +1254,7 @@ process_symlink_remote( while (pathlen > 0) { int blk_cnt = 1; int byte_cnt; + int dirty = 0; fsbno = blkmap_get(blkmap, i); if (fsbno == NULLDFSBNO) { @@ -1284,6 +1285,12 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), lino, i, fsbno); return 1; } + if (bp->b_error == EFSBADCRC) { + do_warn( +_("Bad symlink buffer CRC, block %" PRIu64 ", inode %" PRIu64 ".\n" + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); + dirty = 1; + } byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); byte_cnt = MIN(pathlen, byte_cnt); @@ -1307,7 +1314,10 @@ _("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n") offset += byte_cnt; i++; - libxfs_putbuf(bp); + if (dirty) + libxfs_writebuf(bp, 0); + else + libxfs_putbuf(bp); } return 0; } -- 1.9.0 From dave@fromorbit.com Thu Apr 24 00:02:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 422C07F69 for ; Thu, 24 Apr 2014 00:02:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 162E2304059 for ; Wed, 23 Apr 2014 22:02:54 -0700 (PDT) X-ASG-Debug-ID: 1398315767-04bdf05c7522120005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id r8t6gECfLmHEkFf0 for ; Wed, 23 Apr 2014 22:02: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: AjxdAGiaWFN5LEcvPGdsb2JhbABagwaIbqJ/mwYXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQMxekxgErw4r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:32:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdBnQ-0006xy-S0 for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdBnQ-0005gR-RL for xfs@oss.sgi.com; Thu, 24 Apr 2014 15:02:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/9] repair: remove more dirv1 leftovers Date: Thu, 24 Apr 2014 15:02:00 +1000 X-ASG-Orig-Subj: [PATCH 7/9] repair: remove more dirv1 leftovers Message-Id: <1398315722-20870-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398315722-20870-1-git-send-email-david@fromorbit.com> References: <1398315722-20870-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398315772 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner get_bmapi() and it's children were only called by dirv1 code. There are no current callers, so remove them. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- repair/dinode.c | 239 -------------------------------------------------------- repair/dinode.h | 6 -- 2 files changed, 245 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 48f17ac..b086bec 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -870,245 +870,6 @@ get_agino_buf(xfs_mount_t *mp, } /* - * these next routines return the filesystem blockno of the - * block containing the block "bno" in the file whose bmap - * tree (or extent list) is rooted by "rootblock". - * - * the next routines are utility routines for the third - * routine, get_bmapi(). - * - * NOTE: getfunc_extlist only used by dirv1 checking code - */ -static xfs_dfsbno_t -getfunc_extlist(xfs_mount_t *mp, - xfs_ino_t ino, - xfs_dinode_t *dip, - xfs_dfiloff_t bno, - int whichfork) -{ - xfs_bmbt_irec_t irec; - xfs_dfsbno_t final_fsbno = NULLDFSBNO; - xfs_bmbt_rec_t *rootblock = (xfs_bmbt_rec_t *) - XFS_DFORK_PTR(dip, whichfork); - xfs_extnum_t nextents = XFS_DFORK_NEXTENTS(dip, whichfork); - int i; - - for (i = 0; i < nextents; i++) { - libxfs_bmbt_disk_get_all(rootblock + i, &irec); - if (irec.br_startoff <= bno && - bno < irec.br_startoff + irec.br_blockcount) { - final_fsbno = bno - irec.br_startoff + irec.br_startblock; - break; - } - } - - return(final_fsbno); -} - -/* - * NOTE: getfunc_btree only used by dirv1 checking code... - */ -static xfs_dfsbno_t -getfunc_btree(xfs_mount_t *mp, - xfs_ino_t ino, - xfs_dinode_t *dip, - xfs_dfiloff_t bno, - int whichfork) -{ - int i; -#ifdef DEBUG - int prev_level; -#endif - int found; - int numrecs; - xfs_bmbt_rec_t *rec; - xfs_bmbt_irec_t irec; - xfs_bmbt_ptr_t *pp; - xfs_bmbt_key_t *key; - xfs_bmdr_key_t *rkey; - xfs_bmdr_ptr_t *rp; - xfs_dfsbno_t fsbno; - xfs_buf_t *bp; - xfs_dfsbno_t final_fsbno = NULLDFSBNO; - struct xfs_btree_block *block; - xfs_bmdr_block_t *rootblock = (xfs_bmdr_block_t *) - XFS_DFORK_PTR(dip, whichfork); - - ASSERT(rootblock->bb_level != 0); - /* - * deal with root block, it's got a slightly different - * header structure than interior nodes. We know that - * a btree should have at least 2 levels otherwise it - * would be an extent list. - */ - rkey = XFS_BMDR_KEY_ADDR(rootblock, 1); - rp = XFS_BMDR_PTR_ADDR(rootblock, 1, - xfs_bmdr_maxrecs(mp, XFS_DFORK_SIZE(dip, mp, whichfork), 1)); - found = -1; - for (i = 0; i < be16_to_cpu(rootblock->bb_numrecs) - 1; i++) { - if (be64_to_cpu(rkey[i].br_startoff) <= bno && - bno < be64_to_cpu(rkey[i + 1].br_startoff)) { - found = i; - break; - } - } - if (i == be16_to_cpu(rootblock->bb_numrecs) - 1 && - bno >= be64_to_cpu(rkey[i].br_startoff)) - found = i; - - ASSERT(found != -1); - - fsbno = be64_to_cpu(rp[found]); - - ASSERT(verify_dfsbno(mp, fsbno)); - - bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); - return(NULLDFSBNO); - } - block = XFS_BUF_TO_BLOCK(bp); - numrecs = be16_to_cpu(block->bb_numrecs); - - /* - * ok, now traverse any interior btree nodes - */ -#ifdef DEBUG - prev_level = be16_to_cpu(block->bb_level); -#endif - - while (be16_to_cpu(block->bb_level) > 0) { -#ifdef DEBUG - ASSERT(be16_to_cpu(block->bb_level) < prev_level); - - prev_level = be16_to_cpu(block->bb_level); -#endif - if (numrecs > mp->m_bmap_dmxr[1]) { - do_warn( -_("# of bmap records in inode %" PRIu64 " exceeds max (%u, max - %u)\n"), - ino, numrecs, - mp->m_bmap_dmxr[1]); - libxfs_putbuf(bp); - return(NULLDFSBNO); - } - if (verbose && numrecs < mp->m_bmap_dmnr[1]) { - do_warn( -_("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), proceeding ...\n"), - ino, numrecs, mp->m_bmap_dmnr[1]); - } - key = XFS_BMBT_KEY_ADDR(mp, block, 1); - pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - for (found = -1, i = 0; i < numrecs - 1; i++) { - if (be64_to_cpu(key[i].br_startoff) <= bno && bno < - be64_to_cpu(key[i + 1].br_startoff)) { - found = i; - break; - } - } - if (i == numrecs - 1 && bno >= be64_to_cpu(key[i].br_startoff)) - found = i; - - ASSERT(found != -1); - fsbno = be64_to_cpu(pp[found]); - - ASSERT(verify_dfsbno(mp, fsbno)); - - /* - * release current btree block and read in the - * next btree block to be traversed - */ - libxfs_putbuf(bp); - bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - do_error(_("cannot read bmap block %" PRIu64 "\n"), - fsbno); - return(NULLDFSBNO); - } - block = XFS_BUF_TO_BLOCK(bp); - numrecs = be16_to_cpu(block->bb_numrecs); - } - - /* - * current block must be a leaf block - */ - ASSERT(be16_to_cpu(block->bb_level) == 0); - if (numrecs > mp->m_bmap_dmxr[0]) { - do_warn( -_("# of bmap records in inode %" PRIu64 " greater than maximum (%u, max - %u)\n"), - ino, numrecs, mp->m_bmap_dmxr[0]); - libxfs_putbuf(bp); - return(NULLDFSBNO); - } - if (verbose && numrecs < mp->m_bmap_dmnr[0]) - do_warn( -_("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), continuing...\n"), - ino, numrecs, mp->m_bmap_dmnr[0]); - - rec = XFS_BMBT_REC_ADDR(mp, block, 1); - for (i = 0; i < numrecs; i++) { - libxfs_bmbt_disk_get_all(rec + i, &irec); - if (irec.br_startoff <= bno && - bno < irec.br_startoff + irec.br_blockcount) { - final_fsbno = bno - irec.br_startoff + - irec.br_startblock; - break; - } - } - libxfs_putbuf(bp); - - if (final_fsbno == NULLDFSBNO) - do_warn(_("could not map block %" PRIu64 "\n"), bno); - - return(final_fsbno); -} - -/* - * this could be smarter. maybe we should have an open inode - * routine that would get the inode buffer and return back - * an inode handle. I'm betting for the moment that this - * is used only by the directory and attribute checking code - * and that the avl tree find and buffer cache search are - * relatively cheap. If they're too expensive, we'll just - * have to fix this and add an inode handle to the da btree - * cursor. - * - * caller is responsible for checking doubly referenced blocks - * and references to holes - * - * NOTE: get_bmapi only used by dirv1 checking code - */ -xfs_dfsbno_t -get_bmapi(xfs_mount_t *mp, xfs_dinode_t *dino_p, - xfs_ino_t ino_num, xfs_dfiloff_t bno, int whichfork) -{ - xfs_dfsbno_t fsbno; - - switch (XFS_DFORK_FORMAT(dino_p, whichfork)) { - case XFS_DINODE_FMT_EXTENTS: - fsbno = getfunc_extlist(mp, ino_num, dino_p, bno, whichfork); - break; - case XFS_DINODE_FMT_BTREE: - fsbno = getfunc_btree(mp, ino_num, dino_p, bno, whichfork); - break; - case XFS_DINODE_FMT_LOCAL: - do_error(_("get_bmapi() called for local inode %" PRIu64 "\n"), - ino_num); - fsbno = NULLDFSBNO; - break; - default: - /* - * shouldn't happen - */ - do_error(_("bad inode format for inode %" PRIu64 "\n"), ino_num); - fsbno = NULLDFSBNO; - } - - return(fsbno); -} - -/* * higher level inode processing stuff starts here: * first, one utility routine for each type of inode */ diff --git a/repair/dinode.h b/repair/dinode.h index 5ee51ca..80f3e4e 100644 --- a/repair/dinode.h +++ b/repair/dinode.h @@ -119,12 +119,6 @@ get_agino_buf(xfs_mount_t *mp, xfs_agino_t agino, xfs_dinode_t **dipp); -xfs_dfsbno_t -get_bmapi(xfs_mount_t *mp, - xfs_dinode_t *dip, - xfs_ino_t ino_num, - xfs_dfiloff_t bno, - int whichfork ); void dinode_bmbt_translation_init(void); char * get_forkname(int whichfork); -- 1.9.0 From david@fromorbit.com Thu Apr 24 00:27:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB5CD7F52 for ; Thu, 24 Apr 2014 00:27:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 44000AC007 for ; Wed, 23 Apr 2014 22:27:42 -0700 (PDT) X-ASG-Debug-ID: 1398317249-04cb6c2b7c23590001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Mjyselrq4GczF79E for ; Wed, 23 Apr 2014 22:27:29 -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: AlxdAHOgWFN5LEcvPGdsb2JhbABagwaDZIUKon+ZboEXFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDMLRcWjkIHhDkEmHSKbossKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 14:57:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WdCBu-00072h-Ph; Thu, 24 Apr 2014 15:27:22 +1000 Date: Thu, 24 Apr 2014 15:27:22 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-ID: <20140424052722.GZ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <1397146116-42546-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146116-42546-4-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: 1398317249 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: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 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 Thu, Apr 10, 2014 at 12:08:28PM -0400, Brian Foster wrote: > Define the AGI fields for the finobt root/level and add magic > numbers. Update the btree code to add support for the new > XFS_BTNUM_FINOBT inode btree. > > The finobt root block is reserved immediately following the inobt > root block in the AG. Update XFS_PREALLOC_BLOCKS() to determine the > starting AG data block based on whether finobt support is enabled. > > Signed-off-by: Brian Foster Looks good. Reviewed-by: Dave Chinner FWIW, xfstests doesn't give us particularly good coverage of all the finobt operations: $ $ grep fibt /proc/fs/xfs/stat fibt2 43617 50359 338 336 0 0 0 0 0 0 0 0 0 0 136 So perhaps we want to look at improving that over time. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 24 00:33:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B39457F52 for ; Thu, 24 Apr 2014 00:33:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E3B5AC007 for ; Wed, 23 Apr 2014 22:33:20 -0700 (PDT) X-ASG-Debug-ID: 1398317598-04cb6c2b7a23940001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id jhjE3M5cNeULCQBX for ; Wed, 23 Apr 2014 22:33:19 -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: Al1dAKChWFN5LEcvPGdsb2JhbABagwaDZIUKon+ZboEXFwMBAQEBODWCJQEBBScTHCMQCAMOCgklDwUlAwcaE4hAzC4XFo5CB4MkgRUEmHSUSYFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 15:03:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WdCHL-00073s-Na; Thu, 24 Apr 2014 15:32:59 +1000 Date: Thu, 24 Apr 2014 15:32:59 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 04/11] xfs: update inode allocation/free transaction reservations for finobt Message-ID: <20140424053259.GA15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 04/11] xfs: update inode allocation/free transaction reservations for finobt References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <1397146116-42546-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146116-42546-5-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: 1398317598 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 10, 2014 at 12:08:29PM -0400, Brian Foster wrote: > Create the xfs_calc_finobt_res() helper to calculate the finobt log > reservation for inode allocation and free. Update > XFS_IALLOC_SPACE_RES() to reserve blocks for the additional finobt > insertion on inode allocation. Create XFS_IFREE_SPACE_RES() to > reserve blocks for the potential finobt record insertion on inode > free (i.e., if an inode chunk was previously fully allocated). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 25 ++++++++++++++++++++++- > fs/xfs/xfs_trans_resv.c | 53 +++++++++++++++++++++++++++++++++++++++++++++--- > fs/xfs/xfs_trans_space.h | 7 ++++++- > 3 files changed, 80 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 5e7a38f..8576892 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1837,8 +1837,31 @@ xfs_inactive_ifree( > int error; > > tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); > + > + /* > + * The ifree transaction might need to allocate blocks for record > + * insertion to the finobt. We don't want to fail here at ENOSPC, so > + * allow ifree to dip into the reserved block pool if necessary. > + * > + * Freeing large sets of inodes generally means freeing inode chunks, > + * directory and file data blocks, so this should be relatively safe. > + * Only under severe circumstances should it be possible to free enough > + * inodes to exhaust the reserve block pool via finobt expansion while > + * at the same time not creating free space in the filesystem. > + * > + * Send a warning if the reservation does happen to fail, as the inode > + * now remains allocated and sits on the unlinked list until the fs is > + * repaired. > + */ > + tp->t_flags |= XFS_TRANS_RESERVE; > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, > + XFS_IFREE_SPACE_RES(mp), 0); > if (error) { > + if (error == ENOSPC) > + xfs_warn_ratelimited(mp, > + "Failed to remove inode(s) from unlinked list. " > + "Please free space, unmount and run xfs_repair."); > + > ASSERT(XFS_FORCED_SHUTDOWN(mp)); > xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); > return error; Comment is good, but if we get an ENOSPC error here we won't be in a shutdown state, hence the assert needs fixing (i.e. else {assert}) Otherwise this looks good. Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 24 00:44:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B01E7F52 for ; Thu, 24 Apr 2014 00:44:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33CBEAC00E for ; Wed, 23 Apr 2014 22:44:31 -0700 (PDT) X-ASG-Debug-ID: 1398318269-04cb6c2b7b23f10001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cueQEQ6CGQ3MZCJ8 for ; Wed, 23 Apr 2014 22:44:30 -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: AlxdAMSjWFN5LEcvPGdsb2JhbABagwaDZIUKon+ZboEXFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDMLhcWjkIHgySBFQSYdJYaKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 15:14:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WdCSS-00075e-4I; Thu, 24 Apr 2014 15:44:28 +1000 Date: Thu, 24 Apr 2014 15:44:28 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 06/11] xfs: use and update the finobt on inode allocation Message-ID: <20140424054428.GB15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 06/11] xfs: use and update the finobt on inode allocation References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <1397146116-42546-7-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146116-42546-7-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: 1398318269 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 10, 2014 at 12:08:31PM -0400, Brian Foster wrote: > Replace xfs_dialloc_ag() with an implementation that looks for a > record in the finobt. The finobt only tracks records with at least > one free inode. This eliminates the need for the intra-ag scan in > the original algorithm. Once the inode is allocated, update the > finobt appropriately (possibly removing the record) as well as the > inobt. > > Move the original xfs_dialloc_ag() algorithm to > xfs_dialloc_ag_inobt() and fall back as such if finobt support is > not enabled. Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 24 00:47:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB1817F52 for ; Thu, 24 Apr 2014 00:47:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61A1FAC00E for ; Wed, 23 Apr 2014 22:47:54 -0700 (PDT) X-ASG-Debug-ID: 1398318472-04bdf05c72234e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id kNzNAfb2T6kZ4Erl for ; Wed, 23 Apr 2014 22:47: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: Al1dABylWFN5LEcvPGdsb2JhbABQCoMGg2SFCqJ/mW6BFxcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hAzCoXFo1mXAeDJIEVBJh0lhor Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 15:17:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WdCVi-00076E-Vw; Thu, 24 Apr 2014 15:47:51 +1000 Date: Thu, 24 Apr 2014 15:47:50 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 08/11] xfs: update the finobt on inode free Message-ID: <20140424054750.GC15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 08/11] xfs: update the finobt on inode free References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <1397146116-42546-9-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397146116-42546-9-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: 1398318472 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Apr 10, 2014 at 12:08:33PM -0400, Brian Foster wrote: > An inode free operation can have several effects on the finobt. If > all inodes have been freed and the chunk deallocated, we remove the > finobt record. If the inode chunk was previously full, we must > insert a new record based on the existing inobt record. Otherwise, > we modify the record in place. > > Create the xfs_difree_finobt() function to identify the potential > scenarios and update the finobt appropriately. > > Signed-off-by: Brian Foster No problems there that I can see. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Apr 24 00:51:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B18BE7F52 for ; Thu, 24 Apr 2014 00:51:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A01398F8039 for ; Wed, 23 Apr 2014 22:51:04 -0700 (PDT) X-ASG-Debug-ID: 1398318662-04cbb04b9224360001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id gvz8H4XY0ggNZa7t for ; Wed, 23 Apr 2014 22:51: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: AhhbABylWFN5LEcvPGdsb2JhbABagwZPgxWoCZlugRcXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQA7MHBcWjEaBfAeDJIEVBJh0lhor Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 15:21:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WdCYn-00076W-Bp; Thu, 24 Apr 2014 15:51:01 +1000 Date: Thu, 24 Apr 2014 15:51:01 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/11] xfs: introduce the free inode btree Message-ID: <20140424055101.GD15995@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 00/11] xfs: introduce the free inode btree References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <20140414094632.GC31578@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140414094632.GC31578@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: 1398318662 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Apr 14, 2014 at 07:46:32PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:08:25PM -0400, Brian Foster wrote: > > Hi all, > > > > This is a minor rebase of the finobt series on the latest for-next > > branch. The previous version (v4) is here: > > > > http://oss.sgi.com/archives/xfs/2014-02/msg00763.html > > > > The most recent series with review feedback is v3: > > > > http://oss.sgi.com/archives/xfs/2014-02/msg00121.html > > > > Brian > > I've just had a look at this series, and I haven't found anything to > complain about apart from a couple of stray whitespaces that I > fixed. I'm going to run it through some finobt=0 test runs until i > get a chance to look at the userspace patches. If I don't notice > anything in the next couple of days, I'll merge the topic branch > into the main tree.... All looks pretty good. I can fix the one little problem I noticed myself, and so I think this is ready for merging. The userspace stuff isn't directly necessary right away - that won't get merged until 3.2 is released, but I don't see that as a problem for merging the kernel code... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Thu Apr 24 01:15:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 0FF037F53; Thu, 24 Apr 2014 01:15:09 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-free-inode-btree, created. xfs-for-linus-3.15-rc1-14837-g53801fd X-Git-Refname: refs/heads/xfs-free-inode-btree X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 53801fd97ae000793f51187b122b9475102199a8 Message-Id: <20140424061509.0FF037F53@oss.sgi.com> Date: Thu, 24 Apr 2014 01:15:08 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-free-inode-btree has been created at 53801fd97ae000793f51187b122b9475102199a8 (commit) - Log ----------------------------------------------------------------- commit 53801fd97ae000793f51187b122b9475102199a8 Author: Brian Foster Date: Thu Apr 24 16:01:42 2014 +1000 xfs: enable the finobt feature on v5 superblocks Add the finobt feature bit to the list of known features. As of this point, the kernel code knows how to mount and manage both finobt and non-finobt formatted filesystems. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 0c153c1e4326725e9d5e9de6a25fe8ec2353d5ee Author: Brian Foster Date: Thu Apr 24 16:01:41 2014 +1000 xfs: report finobt status in fs geometry Define the XFS_FSOP_GEOM_FLAGS_FINOBT fs geometry flag and set the associated bit if the filesystem supports the free inode btree. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit a3fa516dd81c49d9c276f59d57ed6e36aaefbe1d Author: Brian Foster Date: Thu Apr 24 16:01:39 2014 +1000 xfs: add finobt support to growfs Add finobt support to growfs. Initialize the agi root/level fields and the root finobt block. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 3efa4ffd58a04f859713daaf910f1f1ff8ef647f Author: Brian Foster Date: Thu Apr 24 16:00:53 2014 +1000 xfs: update the finobt on inode free An inode free operation can have several effects on the finobt. If all inodes have been freed and the chunk deallocated, we remove the finobt record. If the inode chunk was previously full, we must insert a new record based on the existing inobt record. Otherwise, we modify the record in place. Create the xfs_difree_finobt() function to identify the potential scenarios and update the finobt appropriately. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 2b64ee5cdc106704b5c0f8954a52aa598eee25eb Author: Brian Foster Date: Thu Apr 24 16:00:53 2014 +1000 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Refactor xfs_difree() in preparation for the finobt. xfs_difree() performs the validity checks against the ag and reads the agi header. The work of physically updating the inode allocation btree is pushed down into the new xfs_difree_inobt() helper. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 6dd8638e4e8764e0d6557fc62840a815a99c136d Author: Brian Foster Date: Thu Apr 24 16:00:53 2014 +1000 xfs: use and update the finobt on inode allocation Replace xfs_dialloc_ag() with an implementation that looks for a record in the finobt. The finobt only tracks records with at least one free inode. This eliminates the need for the intra-ag scan in the original algorithm. Once the inode is allocated, update the finobt appropriately (possibly removing the record) as well as the inobt. Move the original xfs_dialloc_ag() algorithm to xfs_dialloc_ag_inobt() and fall back as such if finobt support is not enabled. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 0aa0a756ec255cfc8b733fe0d8993c1758b1240c Author: Brian Foster Date: Thu Apr 24 16:00:53 2014 +1000 xfs: insert newly allocated inode chunks into the finobt A newly allocated inode chunk, by definition, has at least one free inode, so a record is always inserted into the finobt. Create the xfs_inobt_insert() helper from existing code to insert a record in an inobt based on the provided BTNUM. Update xfs_ialloc_ag_alloc() to invoke the helper for the existing XFS_BTNUM_INO tree and XFS_BTNUM_FINO tree, if enabled. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 9d43b180af67cccd4bd1342f7f54f8131515b0a1 Author: Brian Foster Date: Thu Apr 24 16:00:52 2014 +1000 xfs: update inode allocation/free transaction reservations for finobt Create the xfs_calc_finobt_res() helper to calculate the finobt log reservation for inode allocation and free. Update XFS_IALLOC_SPACE_RES() to reserve blocks for the additional finobt insertion on inode allocation. Create XFS_IFREE_SPACE_RES() to reserve blocks for the potential finobt record insertion on inode free (i.e., if an inode chunk was previously fully allocated). Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit aafc3c24652924ea951d215d04a3f42e832e9d7d Author: Brian Foster Date: Thu Apr 24 16:00:52 2014 +1000 xfs: support the XFS_BTNUM_FINOBT free inode btree type Define the AGI fields for the finobt root/level and add magic numbers. Update the btree code to add support for the new XFS_BTNUM_FINOBT inode btree. The finobt root block is reserved immediately following the inobt root block in the AG. Update XFS_PREALLOC_BLOCKS() to determine the starting AG data block based on whether finobt support is enabled. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 8e2c84df20aa66ae9a6ee32831a9c622f4823118 Author: Brian Foster Date: Thu Apr 24 16:00:52 2014 +1000 xfs: reserve v5 superblock read-only compat. feature bit for finobt Reserve a v5 read-only compatibility feature bit for the finobt and create the xfs_sb_version_hasfinobt() helper to determine whether an fs has the feature enabled. The finobt does not change existing on-disk structures, but must remain consistent with the ialloc btree. Modifications from older kernels would violate that constrant. Therefore, we restrict older kernels to read-only mounts of finobt-enabled filesystems. Note that this does not yet enable the ability to rw mount a finobt fs (by setting the feature bit in the XFS_SB_FEAT_RO_COMPAT_ALL mask). Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 57bd3dbe4059c6fff7e39927e5aa789dfb2585b9 Author: Brian Foster Date: Thu Apr 24 16:00:50 2014 +1000 xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers The introduction of the free inode btree (finobt) requires that xfs_ialloc_btree.c handle multiple trees. Refactor xfs_ialloc_btree.c so the caller specifies the btree type on cursor initialization to prepare for addition of the finobt. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Apr 24 01:16:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 8B9BC7F53; Thu, 24 Apr 2014 01:16:24 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc2-43-gb8b39d3 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 7043507bfa1af648512e36d95cca484757df0b64 X-Git-Newrev: b8b39d39f94c0d3ea5771d1df3151c569599c20a Message-Id: <20140424061624.8B9BC7F53@oss.sgi.com> Date: Thu, 24 Apr 2014 01:16:24 -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 b8b39d3 Merge branch 'xfs-free-inode-btree' into for-next 53801fd xfs: enable the finobt feature on v5 superblocks 0c153c1 xfs: report finobt status in fs geometry a3fa516 xfs: add finobt support to growfs 3efa4ff xfs: update the finobt on inode free 2b64ee5 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper 6dd8638 xfs: use and update the finobt on inode allocation 0aa0a75 xfs: insert newly allocated inode chunks into the finobt 9d43b18 xfs: update inode allocation/free transaction reservations for finobt aafc3c2 xfs: support the XFS_BTNUM_FINOBT free inode btree type 8e2c84d xfs: reserve v5 superblock read-only compat. feature bit for finobt 57bd3db xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers from 7043507bfa1af648512e36d95cca484757df0b64 (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 b8b39d39f94c0d3ea5771d1df3151c569599c20a Merge: 7043507 53801fd Author: Dave Chinner Date: Thu Apr 24 16:11:57 2014 +1000 Merge branch 'xfs-free-inode-btree' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_ag.h | 36 ++- fs/xfs/xfs_btree.c | 6 +- fs/xfs/xfs_btree.h | 3 + fs/xfs/xfs_format.h | 14 +- fs/xfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 36 ++- fs/xfs/xfs_ialloc.c | 695 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_ialloc_btree.c | 68 ++++- fs/xfs/xfs_ialloc_btree.h | 3 +- fs/xfs/xfs_inode.c | 28 +- fs/xfs/xfs_itable.c | 6 +- fs/xfs/xfs_log_recover.c | 2 + fs/xfs/xfs_sb.h | 10 +- fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +- fs/xfs/xfs_trans_resv.c | 53 +++- fs/xfs/xfs_trans_space.h | 7 +- fs/xfs/xfs_types.h | 2 +- 18 files changed, 852 insertions(+), 137 deletions(-) hooks/post-receive -- XFS development tree From stefanrin@gmail.com Thu Apr 24 01:55:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D79127F52 for ; Thu, 24 Apr 2014 01:55:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 56A1BAC007 for ; Wed, 23 Apr 2014 23:54:57 -0700 (PDT) X-ASG-Debug-ID: 1398322494-04cbb04b9325e60001-NocioJ Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by cuda.sgi.com with ESMTP id EW8q4vsMy1135TuL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 23 Apr 2014 23:54:55 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@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 d1so540421wiv.9 for ; Wed, 23 Apr 2014 23:54:54 -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=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=Q6/OaUvjh+PU82VFapk4Gd0UyseIRWMvD4GwZPC9Vnw=; b=xlITyB+3xDzLMSdgJrlx46R6aB3NysaQBWoSULrhWKxBMOrSTASWoSxFNwNatFKLCR yFyUa5YgbT+IWJ8uPAZMoZmJ3EE61tqtzLbED52WgF81on19WOE6hup+ecy+GUWu5N8t rRlOf9tw+LOezdD8NpLgbwdCO9qRHUXmasW+bhVB+zGK0vcmM+UTlq00ou25xMxnmbGA z/+dcL2XuIUiBnjoizKWeCk6NA2uFyWj0sfczSWmhXdp7c1jBkfhFW755M+hI66aFn37 FlCnJv2U50LkjxlmOhDsZENGUxNZPwNRh48V8eKQD8jIcPbrnVS4KmuQssLyBfWYWyY3 6vyw== MIME-Version: 1.0 X-Received: by 10.180.8.40 with SMTP id o8mr4957085wia.25.1398322494540; Wed, 23 Apr 2014 23:54:54 -0700 (PDT) Received: by 10.194.169.7 with HTTP; Wed, 23 Apr 2014 23:54:54 -0700 (PDT) In-Reply-To: References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> Date: Thu, 24 Apr 2014 08:54:54 +0200 Message-ID: Subject: Re: XFS fragmentation on file append From: Stefan Ring X-ASG-Orig-Subj: Re: XFS fragmentation on file append To: Keyur Govande Cc: linux-fsdevel@vger.kernel.org, Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f182.google.com[209.85.212.182] X-Barracuda-Start-Time: 1398322495 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.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.3.5207 Rule breakdown below pts rule name 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 I've become interested in this topic, as I'm also running MySQL with O_DIRECT and innodb_file_per_table. Out of curiosity, I immediately ran xfs_bmap on a moderately sized table space (34GB). It listed around 30000 fragments, on average one for every MB. I want to report what happened then: A flurry of activity started on both disks (root/swap lives on one of them, the data volume containing the MySQL files on another) and lasted for about two minutes. Afterwards, all memory previously allocated to the file cache has become free, and also everything XFS seems to keep buffered internally (I think it's called SReclaimable) was released. Swap usage increased only slightly. dmesg was silent during that time. This is a 2.6.32-358.2.1.el6.x86_64 kernel with xfsprogs 3.1.1 (CentOS 6.4). The machine has 64GB of RAM (2 NUMA nodes) and 24 (virtual) cores. Is this known behavior of xfs_bmap? From dave@fromorbit.com Thu Apr 24 02:36:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 727547F52 for ; Thu, 24 Apr 2014 02:36:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 60A0F304051 for ; Thu, 24 Apr 2014 00:36:46 -0700 (PDT) X-ASG-Debug-ID: 1398325000-04cbb04b9227130001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id iZrBFSdbXWoGzniR for ; Thu, 24 Apr 2014 00:36:41 -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: AjZdAMO9WFN5LEcvPGdsb2JhbABagwaIbqMAmwUXAwEBAQE4NYIlAS0vOxhqAwctiECZU7I9jnWEIwSvDiuBLAIeBAI Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Apr 2014 17:06:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WdED0-0007M8-7f for xfs@oss.sgi.com; Thu, 24 Apr 2014 17:36:38 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WdED0-0000gQ-6T for xfs@oss.sgi.com; Thu, 24 Apr 2014 17:36:38 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems Date: Thu, 24 Apr 2014 17:36:38 +1000 X-ASG-Orig-Subj: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems Message-Id: <1398324998-2592-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398325000 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5207 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We have had this code in the kernel for over a year now and have shaken all the known issues out of the code over the past few releases. It's now time to remove the experimental warnings during mount and fully support the new filesystem format in production systems. Remove the experimental warning, and add a version number to the initial "mounting filesystem" message to tell use what type of filesystem is being mounted. Also, remove the temporary inode cluster size output at mount time now we know that this code works fine. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 10 ++++++---- fs/xfs/xfs_mount.c | 2 -- fs/xfs/xfs_sb.c | 4 ---- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 08624dc..a5f8bd9 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -616,11 +616,13 @@ xfs_log_mount( int error = 0; int min_logfsbs; - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) - xfs_notice(mp, "Mounting Filesystem"); - else { + if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { + xfs_notice(mp, "Mounting V%d Filesystem", + XFS_SB_VERSION_NUM(&mp->m_sb)); + } else { xfs_notice(mp, -"Mounting filesystem in no-recovery mode. Filesystem will be inconsistent."); +"Mounting V%d filesystem in no-recovery mode. Filesystem will be inconsistent.", + XFS_SB_VERSION_NUM(&mp->m_sb)); ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 993cb19..944f3d9 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -743,8 +743,6 @@ xfs_mountfs( new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE; if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size)) mp->m_inode_cluster_size = new_size; - xfs_info(mp, "Using inode cluster size of %d bytes", - mp->m_inode_cluster_size); } /* diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index 0c0e41b..8baf61a 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -201,10 +201,6 @@ xfs_mount_validate_sb( * write validation, we don't need to check feature masks. */ if (check_version && XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { - xfs_alert(mp, -"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, -- 1.9.0 From bfoster@redhat.com Thu Apr 24 06:28:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3BBEE7F52 for ; Thu, 24 Apr 2014 06:28:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 23275304048 for ; Thu, 24 Apr 2014 04:28:26 -0700 (PDT) X-ASG-Debug-ID: 1398338905-04cb6c2b7c2fe20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HW192qtFAUGujHjC for ; Thu, 24 Apr 2014 04:28: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3OBSNxg024710 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2014 07:28:24 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3OBSNIW024673; Thu, 24 Apr 2014 07:28:23 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 41E3F12573F; Thu, 24 Apr 2014 07:28:22 -0400 (EDT) Date: Thu, 24 Apr 2014 07:28:22 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-ID: <20140424112820.GA51140@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v5 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <1397146116-42546-4-git-send-email-bfoster@redhat.com> <20140424052722.GZ15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140424052722.GZ15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398338905 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 24, 2014 at 03:27:22PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:08:28PM -0400, Brian Foster wrote: > > Define the AGI fields for the finobt root/level and add magic > > numbers. Update the btree code to add support for the new > > XFS_BTNUM_FINOBT inode btree. > > > > The finobt root block is reserved immediately following the inobt > > root block in the AG. Update XFS_PREALLOC_BLOCKS() to determine the > > starting AG data block based on whether finobt support is enabled. > > > > Signed-off-by: Brian Foster > > Looks good. > > Reviewed-by: Dave Chinner > > FWIW, xfstests doesn't give us particularly good coverage of all > the finobt operations: > > $ $ grep fibt /proc/fs/xfs/stat > fibt2 43617 50359 338 336 0 0 0 0 0 0 0 0 0 0 136 > > So perhaps we want to look at improving that over time. > Ok, noted. I'll have to think about some tests tailored to exercise the finobt. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Thu Apr 24 06:29:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CFA4A7F52 for ; Thu, 24 Apr 2014 06:29:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A42E8F8040 for ; Thu, 24 Apr 2014 04:29:51 -0700 (PDT) X-ASG-Debug-ID: 1398338990-04bdf05c732ed70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T4kWFBc9AGxegz2L for ; Thu, 24 Apr 2014 04:29:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3OBTnuI024967 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2014 07:29:49 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3OBTnXe014376; Thu, 24 Apr 2014 07:29:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8610312573F; Thu, 24 Apr 2014 07:29:48 -0400 (EDT) Date: Thu, 24 Apr 2014 07:29:48 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 04/11] xfs: update inode allocation/free transaction reservations for finobt Message-ID: <20140424112948.GB51140@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v5 04/11] xfs: update inode allocation/free transaction reservations for finobt References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <1397146116-42546-5-git-send-email-bfoster@redhat.com> <20140424053259.GA15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140424053259.GA15995@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398338990 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 24, 2014 at 03:32:59PM +1000, Dave Chinner wrote: > On Thu, Apr 10, 2014 at 12:08:29PM -0400, Brian Foster wrote: > > Create the xfs_calc_finobt_res() helper to calculate the finobt log > > reservation for inode allocation and free. Update > > XFS_IALLOC_SPACE_RES() to reserve blocks for the additional finobt > > insertion on inode allocation. Create XFS_IFREE_SPACE_RES() to > > reserve blocks for the potential finobt record insertion on inode > > free (i.e., if an inode chunk was previously fully allocated). > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_inode.c | 25 ++++++++++++++++++++++- > > fs/xfs/xfs_trans_resv.c | 53 +++++++++++++++++++++++++++++++++++++++++++++--- > > fs/xfs/xfs_trans_space.h | 7 ++++++- > > 3 files changed, 80 insertions(+), 5 deletions(-) > > > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > > index 5e7a38f..8576892 100644 > > --- a/fs/xfs/xfs_inode.c > > +++ b/fs/xfs/xfs_inode.c > > @@ -1837,8 +1837,31 @@ xfs_inactive_ifree( > > int error; > > > > tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); > > + > > + /* > > + * The ifree transaction might need to allocate blocks for record > > + * insertion to the finobt. We don't want to fail here at ENOSPC, so > > + * allow ifree to dip into the reserved block pool if necessary. > > + * > > + * Freeing large sets of inodes generally means freeing inode chunks, > > + * directory and file data blocks, so this should be relatively safe. > > + * Only under severe circumstances should it be possible to free enough > > + * inodes to exhaust the reserve block pool via finobt expansion while > > + * at the same time not creating free space in the filesystem. > > + * > > + * Send a warning if the reservation does happen to fail, as the inode > > + * now remains allocated and sits on the unlinked list until the fs is > > + * repaired. > > + */ > > + tp->t_flags |= XFS_TRANS_RESERVE; > > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, > > + XFS_IFREE_SPACE_RES(mp), 0); > > if (error) { > > + if (error == ENOSPC) > > + xfs_warn_ratelimited(mp, > > + "Failed to remove inode(s) from unlinked list. " > > + "Please free space, unmount and run xfs_repair."); > > + > > ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); > > return error; > > Comment is good, but if we get an ENOSPC error here we won't be in a > shutdown state, hence the assert needs fixing (i.e. else {assert}) > Yeah, good catch. Brian > Otherwise this looks good. > > Reviewed-by: Dave Chinner > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Thu Apr 24 06:56:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3BFD07F52 for ; Thu, 24 Apr 2014 06:56:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB984AC007 for ; Thu, 24 Apr 2014 04:56:35 -0700 (PDT) X-ASG-Debug-ID: 1398340594-04cbb04b9132330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rvy3tyBjyiXo6fvb for ; Thu, 24 Apr 2014 04:56:34 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3OBuWPD012691 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2014 07:56:33 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3OBUQli011782; Thu, 24 Apr 2014 07:30:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 277E212573F; Thu, 24 Apr 2014 07:30:26 -0400 (EDT) Date: Thu, 24 Apr 2014 07:30:26 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/11] xfs: introduce the free inode btree Message-ID: <20140424113025.GC51140@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v5 00/11] xfs: introduce the free inode btree References: <1397146116-42546-1-git-send-email-bfoster@redhat.com> <20140414094632.GC31578@dastard> <20140424055101.GD15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140424055101.GD15995@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: 1398340594 X-Barracuda-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, Apr 24, 2014 at 03:51:01PM +1000, Dave Chinner wrote: > On Mon, Apr 14, 2014 at 07:46:32PM +1000, Dave Chinner wrote: > > On Thu, Apr 10, 2014 at 12:08:25PM -0400, Brian Foster wrote: > > > Hi all, > > > > > > This is a minor rebase of the finobt series on the latest for-next > > > branch. The previous version (v4) is here: > > > > > > http://oss.sgi.com/archives/xfs/2014-02/msg00763.html > > > > > > The most recent series with review feedback is v3: > > > > > > http://oss.sgi.com/archives/xfs/2014-02/msg00121.html > > > > > > Brian > > > > I've just had a look at this series, and I haven't found anything to > > complain about apart from a couple of stray whitespaces that I > > fixed. I'm going to run it through some finobt=0 test runs until i > > get a chance to look at the userspace patches. If I don't notice > > anything in the next couple of days, I'll merge the topic branch > > into the main tree.... > > All looks pretty good. I can fix the one little problem I noticed > myself, and so I think this is ready for merging. The userspace > stuff isn't directly necessary right away - that won't get merged > until 3.2 is released, but I don't see that as a problem for merging > the kernel code... > Ok, thanks. At this point then I'll plan to keep the first 10 or 11 or so patches of the userspace series (that are based on these) equivalent. If any fixes creep in before that happens to be merged, those can just get appended to the series. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Thu Apr 24 07:54:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 774227F52 for ; Thu, 24 Apr 2014 07:54:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4289E8F804B for ; Thu, 24 Apr 2014 05:53:59 -0700 (PDT) X-ASG-Debug-ID: 1398344037-04bdf05c74350a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rKzP6EmoUGXwMC13 for ; Thu, 24 Apr 2014 05:53:58 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3OCruQN030862 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2014 08:53:56 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3OCru3S018605; Thu, 24 Apr 2014 08:53:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1D52912573F; Thu, 24 Apr 2014 08:53:55 -0400 (EDT) Date: Thu, 24 Apr 2014 08:53:55 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems Message-ID: <20140424125354.GD51140@bfoster.bfoster> X-ASG-Orig-Subj: Re: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems References: <1398324998-2592-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398324998-2592-1-git-send-email-david@fromorbit.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: 1398344037 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Apr 24, 2014 at 05:36:38PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We have had this code in the kernel for over a year now and have > shaken all the known issues out of the code over the past few > releases. It's now time to remove the experimental warnings during > mount and fully support the new filesystem format in production > systems. > > Remove the experimental warning, and add a version number to the > initial "mounting filesystem" message to tell use what type of > filesystem is being mounted. Also, remove the temporary inode > cluster size output at mount time now we know that this code works > fine. > > Signed-off-by: Dave Chinner > --- Seems reasonable to me at this point. Reviewed-by: Brian Foster > fs/xfs/xfs_log.c | 10 ++++++---- > fs/xfs/xfs_mount.c | 2 -- > fs/xfs/xfs_sb.c | 4 ---- > 3 files changed, 6 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 08624dc..a5f8bd9 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -616,11 +616,13 @@ xfs_log_mount( > int error = 0; > int min_logfsbs; > > - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) > - xfs_notice(mp, "Mounting Filesystem"); > - else { > + if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { > + xfs_notice(mp, "Mounting V%d Filesystem", > + XFS_SB_VERSION_NUM(&mp->m_sb)); > + } else { > xfs_notice(mp, > -"Mounting filesystem in no-recovery mode. Filesystem will be inconsistent."); > +"Mounting V%d filesystem in no-recovery mode. Filesystem will be inconsistent.", > + XFS_SB_VERSION_NUM(&mp->m_sb)); > ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > } > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 993cb19..944f3d9 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -743,8 +743,6 @@ xfs_mountfs( > new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE; > if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size)) > mp->m_inode_cluster_size = new_size; > - xfs_info(mp, "Using inode cluster size of %d bytes", > - mp->m_inode_cluster_size); > } > > /* > diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c > index 0c0e41b..8baf61a 100644 > --- a/fs/xfs/xfs_sb.c > +++ b/fs/xfs/xfs_sb.c > @@ -201,10 +201,6 @@ xfs_mount_validate_sb( > * write validation, we don't need to check feature masks. > */ > if (check_version && XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { > - xfs_alert(mp, > -"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, > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From lczerner@redhat.com Thu Apr 24 11:01:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03F0B7F52 for ; Thu, 24 Apr 2014 11:01:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D368E304051 for ; Thu, 24 Apr 2014 09:01:53 -0700 (PDT) X-ASG-Debug-ID: 1398355308-04cbb04b9145a70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iVc9KpV5dyoiuO0Y for ; Thu, 24 Apr 2014 09:01: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3OG1l8U020513 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 24 Apr 2014 12:01:48 -0400 Received: from localhost.localdomain.com (dhcp-1-119.brq.redhat.com [10.34.1.119]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3OG1kmD016543; Thu, 24 Apr 2014 12:01:46 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH] xfstests: Use _require_xfs_io_command() instead of helpers Date: Thu, 24 Apr 2014 18:01:43 +0200 X-ASG-Orig-Subj: [PATCH] xfstests: Use _require_xfs_io_command() instead of helpers Message-Id: <1398355303-29348-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398355308 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Number of helpers for checking xfs_io functionality is slowly growing. But it's as easy to simply use _require_xfs_io_command() directly and just specify the command we want to check. It will also avoid the need to create helper every time we need to check a new command in xfs_io. Remove all the helpers and use _require_xfs_io_command() in the tests. Signed-off-by: Lukas Czerner --- common/defrag | 2 +- common/rc | 41 ----------------------------------------- tests/btrfs/026 | 2 +- tests/btrfs/027 | 2 +- tests/btrfs/028 | 2 +- tests/btrfs/047 | 2 +- tests/ext4/001 | 2 +- tests/ext4/002 | 2 +- tests/generic/009 | 2 +- tests/generic/012 | 8 ++++---- tests/generic/016 | 8 ++++---- tests/generic/017 | 4 ++-- tests/generic/021 | 8 ++++---- tests/generic/022 | 8 ++++---- tests/generic/213 | 2 +- tests/generic/214 | 2 +- tests/generic/223 | 2 +- tests/generic/228 | 2 +- tests/generic/255 | 6 +++--- tests/generic/256 | 2 +- tests/generic/274 | 2 +- tests/generic/300 | 4 ++-- tests/generic/311 | 2 +- tests/generic/312 | 2 +- tests/generic/316 | 4 ++-- tests/shared/298 | 2 +- tests/xfs/252 | 4 ++-- tests/xfs/290 | 2 +- 28 files changed, 45 insertions(+), 86 deletions(-) diff --git a/common/defrag b/common/defrag index a4bc976..732cd64 100644 --- a/common/defrag +++ b/common/defrag @@ -38,7 +38,7 @@ _require_defrag() esac _require_command $DEFRAG_PROG - _require_xfs_io_fiemap + _require_xfs_io_command "fiemap" } _extent_count() diff --git a/common/rc b/common/rc index 07acbc5..5c13db5 100644 --- a/common/rc +++ b/common/rc @@ -1260,47 +1260,6 @@ _require_xfs_io_command() _notrun "xfs_io $command failed (old kernel/wrong fs?)" } -# check that xfs_io, kernel, and filesystem all support zero -_require_xfs_io_zero() -{ - _require_xfs_io_command "zero" -} - -# check that xfs_io, glibc, kernel, and filesystem all (!) support -# fallocate -# -_require_xfs_io_falloc() -{ - _require_xfs_io_command "falloc" -} - -# check that xfs_io, kernel and filesystem all support fallocate with hole -# punching -_require_xfs_io_falloc_punch() -{ - _require_xfs_io_command "fpunch" -} - -# check that xfs_io, kernel and filesystem all support fallocate with collapse -# range -_require_xfs_io_falloc_collapse() -{ - _require_xfs_io_command "fcollapse" -} - -# check that xfs_io, kernel, and filesystem all support fallocate with zero -# range -_require_xfs_io_falloc_zero() -{ - _require_xfs_io_command "fzero" -} - -# check that xfs_io, kernel and filesystem support fiemap -_require_xfs_io_fiemap() -{ - _require_xfs_io_command "fiemap" -} - # Check that a fs has enough free space (in 1024b blocks) # _require_fs_space() diff --git a/tests/btrfs/026 b/tests/btrfs/026 index 6c54590..c2ac561 100644 --- a/tests/btrfs/026 +++ b/tests/btrfs/026 @@ -48,7 +48,7 @@ _cleanup() _supported_fs btrfs _supported_os Linux -_require_xfs_io_fiemap +_require_xfs_io_command "fiemap" _require_cp_reflink TESTDIR1=$TEST_DIR/test-$seq diff --git a/tests/btrfs/027 b/tests/btrfs/027 index b2dff1c..d615efd 100644 --- a/tests/btrfs/027 +++ b/tests/btrfs/027 @@ -48,7 +48,7 @@ _cleanup() _supported_fs btrfs _supported_os Linux -_require_xfs_io_fiemap +_require_xfs_io_command "fiemap" _require_cp_reflink TESTDIR1=$TEST_DIR/test-$seq diff --git a/tests/btrfs/028 b/tests/btrfs/028 index f17f102..50cffd3 100644 --- a/tests/btrfs/028 +++ b/tests/btrfs/028 @@ -46,7 +46,7 @@ _cleanup() _supported_fs btrfs _supported_os Linux -_require_xfs_io_fiemap +_require_xfs_io_command "fiemap" _require_cp_reflink rm -f $seqres.full diff --git a/tests/btrfs/047 b/tests/btrfs/047 index cc1936d..2dc6499 100755 --- a/tests/btrfs/047 +++ b/tests/btrfs/047 @@ -59,7 +59,7 @@ _supported_fs btrfs _supported_os Linux _require_scratch _require_fssum -_require_xfs_io_fiemap +_require_xfs_io_command "fiemap" _require_btrfs_send_stream_version _need_to_be_root diff --git a/tests/ext4/001 b/tests/ext4/001 index 8239f0e..827d806 100755 --- a/tests/ext4/001 +++ b/tests/ext4/001 @@ -45,7 +45,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_fs ext4 _supported_os Linux -_require_xfs_io_falloc_zero +_require_xfs_io_command "fzero" testfile=$TEST_DIR/001.$$ diff --git a/tests/ext4/002 b/tests/ext4/002 index 12be253..8cb3fd1 100755 --- a/tests/ext4/002 +++ b/tests/ext4/002 @@ -119,7 +119,7 @@ _check_ext4_eof_flag() # Prerequisites for the test run. _supported_fs ext4 _supported_os Linux -_require_xfs_io_falloc +_require_xfs_io_command "falloc" # Real QA test starts here. rm -f $seqres.full diff --git a/tests/generic/009 b/tests/generic/009 index b4d3e4b..65abe3c 100644 --- a/tests/generic/009 +++ b/tests/generic/009 @@ -44,7 +44,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_os Linux -_require_xfs_io_falloc_zero +_require_xfs_io_command "fzero" testfile=$TEST_DIR/009.$$ diff --git a/tests/generic/012 b/tests/generic/012 index e689299..730625b 100755 --- a/tests/generic/012 +++ b/tests/generic/012 @@ -51,10 +51,10 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "fcollapse" testfile=$TEST_DIR/$seq.$$ diff --git a/tests/generic/016 b/tests/generic/016 index 13a4488..15a2551 100755 --- a/tests/generic/016 +++ b/tests/generic/016 @@ -51,10 +51,10 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "fcollapse" testfile=$TEST_DIR/$seq.$$ diff --git a/tests/generic/017 b/tests/generic/017 index 93a4045..13b7254 100755 --- a/tests/generic/017 +++ b/tests/generic/017 @@ -43,8 +43,8 @@ _supported_fs generic _supported_os Linux _require_scratch -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse +_require_xfs_io_command "fiemap" +_require_xfs_io_command "fcollapse" _do_die_on_error=y testfile=$SCRATCH_MNT/$seq.$$ BLOCKS=10240 diff --git a/tests/generic/021 b/tests/generic/021 index 7f3753a..eb88e01 100755 --- a/tests/generic/021 +++ b/tests/generic/021 @@ -51,10 +51,10 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "fcollapse" testfile=$TEST_DIR/$seq.$$ diff --git a/tests/generic/022 b/tests/generic/022 index 55e7206..55bf8c5 100755 --- a/tests/generic/022 +++ b/tests/generic/022 @@ -51,10 +51,10 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "fcollapse" testfile=$TEST_DIR/$seq.$$ diff --git a/tests/generic/213 b/tests/generic/213 index 3c8a304..c99520f 100755 --- a/tests/generic/213 +++ b/tests/generic/213 @@ -54,7 +54,7 @@ _supported_os Linux rm -f $seqres.full -_require_xfs_io_falloc +_require_xfs_io_command "falloc" # check there's enough freespace on $TEST_DIR ... (1GiB + 1MiB) avail=`df -P $TEST_DIR | awk 'END {print $4}'` diff --git a/tests/generic/214 b/tests/generic/214 index 1885534..444c1fe 100755 --- a/tests/generic/214 +++ b/tests/generic/214 @@ -53,7 +53,7 @@ _supported_os Linux rm -f $seqres.full rm -f $TEST_DIR/ouch* -_require_xfs_io_falloc +_require_xfs_io_command "falloc" # Ok, off we go. diff --git a/tests/generic/223 b/tests/generic/223 index 7b0e584..a67b8d5 100755 --- a/tests/generic/223 +++ b/tests/generic/223 @@ -46,7 +46,7 @@ _supported_fs generic _supported_os Linux _require_scratch -_require_xfs_io_falloc +_require_xfs_io_command "falloc" rm -f $seqres.full diff --git a/tests/generic/228 b/tests/generic/228 index 03d4491..7ac0872 100755 --- a/tests/generic/228 +++ b/tests/generic/228 @@ -53,7 +53,7 @@ _supported_os Linux rm -f $seqres.full # Sanity check to see if fallocate works -_require_xfs_io_falloc +_require_xfs_io_command "falloc" # Check if we have good enough space available avail=`df -P $TEST_DIR | awk 'END {print $4}'` diff --git a/tests/generic/255 b/tests/generic/255 index dd329b4..8419065 100755 --- a/tests/generic/255 +++ b/tests/generic/255 @@ -46,9 +46,9 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" testfile=$TEST_DIR/255.$$ diff --git a/tests/generic/256 b/tests/generic/256 index cfe7237..e6cc7dc 100755 --- a/tests/generic/256 +++ b/tests/generic/256 @@ -46,7 +46,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch +_require_xfs_io_command "fpunch" _require_scratch _require_user diff --git a/tests/generic/274 b/tests/generic/274 index 7c4887f..2d8d496 100755 --- a/tests/generic/274 +++ b/tests/generic/274 @@ -48,7 +48,7 @@ _cleanup() _supported_fs generic _supported_os IRIX Linux _require_scratch -_require_xfs_io_falloc +_require_xfs_io_command "falloc" echo "------------------------------" echo "preallocation test" diff --git a/tests/generic/300 b/tests/generic/300 index 4e07f8a..01d4600 100755 --- a/tests/generic/300 +++ b/tests/generic/300 @@ -46,8 +46,8 @@ _require_scratch # xfs_io is not required for this test, but it's the best way to verify # the test system supports fallocate() for allocation and hole punching -_require_xfs_io_falloc -_require_xfs_io_falloc_punch +_require_xfs_io_command "falloc" +_require_xfs_io_command "fpunch" rm -f $seqres.full diff --git a/tests/generic/311 b/tests/generic/311 index 284b59d..e389049 100755 --- a/tests/generic/311 +++ b/tests/generic/311 @@ -59,7 +59,7 @@ _require_dm_flakey # xfs_io is not required for this test, but it's the best way to verify # the test system supports fallocate() for allocation -_require_xfs_io_falloc +_require_xfs_io_command "falloc" [ -x $here/src/fsync-tester ] || _notrun "fsync-tester not built" diff --git a/tests/generic/312 b/tests/generic/312 index eaec43c..1ed4962 100755 --- a/tests/generic/312 +++ b/tests/generic/312 @@ -46,7 +46,7 @@ _cleanup() # real QA test starts here _supported_fs generic _supported_os Linux -_require_xfs_io_falloc +_require_xfs_io_command "falloc" _require_scratch # 5G in byte diff --git a/tests/generic/316 b/tests/generic/316 index 8cb2975..29a4331 100755 --- a/tests/generic/316 +++ b/tests/generic/316 @@ -45,8 +45,8 @@ _cleanup() _supported_fs generic _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_fiemap +_require_xfs_io_command "fpunch" +_require_xfs_io_command "fiemap" testfile=$TEST_DIR/$seq.$$ diff --git a/tests/shared/298 b/tests/shared/298 index 6b5402c..f13c14b 100755 --- a/tests/shared/298 +++ b/tests/shared/298 @@ -33,7 +33,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _supported_fs ext4 xfs _supported_os Linux _require_fstrim -_require_xfs_io_fiemap +_require_xfs_io_command "fiemap" _require_fs_space $TEST_DIR 307200 [ "$FSTYP" = "ext4" ] && _require_dumpe2fs diff --git a/tests/xfs/252 b/tests/xfs/252 index 00be41a..b2c4c08 100755 --- a/tests/xfs/252 +++ b/tests/xfs/252 @@ -46,8 +46,8 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 _supported_fs xfs _supported_os Linux -_require_xfs_io_falloc_punch -_require_xfs_io_fiemap +_require_xfs_io_command "fpunch" +_require_xfs_io_command "fiemap" testfile=$TEST_DIR/252.$$ diff --git a/tests/xfs/290 b/tests/xfs/290 index cbe7108..55322ec 100755 --- a/tests/xfs/290 +++ b/tests/xfs/290 @@ -46,7 +46,7 @@ trap "exit \$status" 0 1 2 3 15 _supported_fs xfs _supported_os Linux -_require_xfs_io_zero +_require_xfs_io_command "zero" testfile=$TEST_DIR/290.$$ -- 1.8.3.1 From sandeen@sandeen.net Thu Apr 24 11:55:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 330847F52 for ; Thu, 24 Apr 2014 11:55:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1AE42304043 for ; Thu, 24 Apr 2014 09:55:43 -0700 (PDT) X-ASG-Debug-ID: 1398358542-04cbb04b934a920001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DHXhQVBqqpoWEHZP for ; Thu, 24 Apr 2014 09:55:42 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2259D63C5FF1; Thu, 24 Apr 2014 11:55:42 -0500 (CDT) Message-ID: <5359420F.3020406@sandeen.net> Date: Thu, 24 Apr 2014 11:55:43 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Lukas Czerner , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: Use _require_xfs_io_command() instead of helpers References: <1398355303-29348-1-git-send-email-lczerner@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: Use _require_xfs_io_command() instead of helpers In-Reply-To: <1398355303-29348-1-git-send-email-lczerner@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398358542 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/24/14, 11:01 AM, Lukas Czerner wrote: > Number of helpers for checking xfs_io functionality is slowly growing. > But it's as easy to simply use _require_xfs_io_command() directly and > just specify the command we want to check. It will also avoid the need > to create helper every time we need to check a new command in xfs_io. > > Remove all the helpers and use _require_xfs_io_command() in the tests. > > Signed-off-by: Lukas Czerner I like it. Reviewed-by: Eric Sandeen From tinguely@sgi.com Thu Apr 24 12:11:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 301E17F53 for ; Thu, 24 Apr 2014 12:11:59 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03AA3304048; Thu, 24 Apr 2014 10:11:55 -0700 (PDT) Message-ID: <535945DC.6010108@sgi.com> Date: Thu, 24 Apr 2014 12:11:56 -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 Mailing List Subject: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr References: <20140423210034.892939354@sgi.com> <20140423210445.700477624@sgi.com> <20140423222215.GT18672@dastard> In-Reply-To: <20140423222215.GT18672@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/23/14 17:22, Dave Chinner wrote: > On Wed, Apr 23, 2014 at 04:04:35PM -0500, Mark Tinguely wrote: >> User space does not currently perform any attribute adding/deleting, >> but if we do want to fix attributes or use them for parent inode >> pointers, user space should support attributes. >> >> The adding an attribute fork is done in an embedded transaction >> inside xfs_attr_set_int(). The xfs_trans_commit in xfs_bmap_add_attrfork() >> will free the xfs_inode pointer causing xfs_attr_calc_size() in >> xfs_attr_set_int() to fail. > > It shouldn't. xfs_bmap_add_attrfork() does: > > xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > which in the kernel code sets: > > iip->ili_lock_flags = lock_flags; > > > The libxfs code doesn't do that, so when xfs_trans_commit() gets > to inode_item_unlock(): > > > if (!iip->ili_lock_flags) > libxfs_iput(ip, 0); > else > iip->ili_lock_flags = 0; > > It frees the inode rather than just returning it with the lock > flags cleared. > > Note that libxfs still has libxfs_trans_ijoin_ref() which sets the > lock flags, but this has been removed from the kernel code. IOWs, > this is a libxfs/trans.c::xfs_trans_ijoin() bug, not something that > needs fixing in the shared kernel/user libxfs code. > > Cheers, > > Dave. nod. That is the correct thing to do. Since the shared user/kernel code will no longer do a xfs_trans_ihold(), the libxfs_iput() should be factored out out of inode_item_unlock() and have the creator release the inode pointer when it is appropriate. No one besides me is using this so it can go into the next release of xfs_progs. --Mark. From sandeen@redhat.com Thu Apr 24 14:13:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8FD677F52 for ; Thu, 24 Apr 2014 14:13:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 415D18F8040 for ; Thu, 24 Apr 2014 12:13:35 -0700 (PDT) X-ASG-Debug-ID: 1398366813-04bdf05c74597c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6xISJferKAGAx7Bb for ; Thu, 24 Apr 2014 12:13:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3OJDVoO014135 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2014 15:13:33 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3OJDTE7026118 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 24 Apr 2014 15:13:30 -0400 Message-ID: <5359625B.3090001@redhat.com> Date: Thu, 24 Apr 2014 14:13:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss CC: Miklos Szeredi Subject: [PATCH] xfstests: test pipe resizing X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: test pipe resizing Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398366813 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 Add a simple test to exercise the pipe resize fcntls, F_SETPIPE_SZ and F_GETPIPE_SZ. This doesn't do a whole lot, but does some pipe reading and writing, some pipe resizing and checking, validates that we get EBUSY if we try to resize below the current size of buffers in the pipe, that the minimum is limited to PAGE_SIZE, etc. The piperesize.c is based on an old test written by Miklos which used to be at http://www.kernel.org/pub/linux/kernel/people/mszeredi/piperesize/piperesize.c Signed-off-by: Eric Sandeen Cc: Miklos Szeredi --- diff --git a/src/Makefile b/src/Makefile index d754048..7f403d8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,7 +19,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ 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 fsync-tester nsexec cloner \ - renameat2 + renameat2 piperesize SUBDIRS = diff --git a/src/piperesize.c b/src/piperesize.c new file mode 100644 index 0000000..f292db1 --- /dev/null +++ b/src/piperesize.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include +#include + +#ifndef F_LINUX_SPECIFIC_BASE +#define F_LINUX_SPECIFIC_BASE 1024 +#endif +#ifndef F_SETPIPE_SZ +#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7) +#endif +#ifndef F_GETPIPE_SZ +#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8) +#endif + +#define WRITE_PIPE 1 +#define READ_PIPE 2 + +#define NONFATAL 0 +#define FATAL 1 + +int i; +int outstanding; +int pip[2]; + +void writeread_pipe(int count, int flags) +{ + int res = 0; + char buf[4096]; + + if (!flags) + return; + + for (; i < count; i++) { + printf("Iter %d - ", i); + if (flags & WRITE_PIPE) { + sprintf(buf, "buffer #%i", i); + res = write(pip[1], buf, sizeof(buf)); + if (res == -1) + err(1, "write"); + printf("Wrote: %s ", buf); + outstanding++; + } + + if (flags & READ_PIPE) { + res = read(pip[0], buf, sizeof(buf)); + if (res == -1) + err(1, "read"); + printf("Read: %s ", buf); + outstanding--; + } + printf("\n"); + } + printf("%d buffers left in pipe\n", outstanding); + +} + +void resize_pipe(int size, int fatal) +{ + int res; + long page_size = sysconf(_SC_PAGESIZE); + + printf("Attempting to resize pipe to %d\n", size); + res = fcntl(pip[0], F_SETPIPE_SZ, size); + if (res == -1) { + if (fatal || (errno != EBUSY)) + err(1, "F_SETPIPE_SZ"); + else if (errno) + printf("F_SETPIPE_SZ: %s\n", strerror(errno)); + } + + res = fcntl(pip[1], F_GETPIPE_SZ); + if (res == -1) + err(1, "F_GETPIPE_SZ"); + + /* if we try to go below system page size, it's limited to that */ + if (size < page_size && res == page_size) + printf("now pipe size is: PAGE_SIZE\n"); + else + printf("now pipe size is: %i\n", res); + + if (fatal) { + if (res != (size < page_size ? page_size : size)) + err(1, "Resize failed"); + } +} + +int main(void) +{ + int res; + + res = pipe(pip); + if (res == -1) + err(1, "pipe"); + + /* + * Write 7 x 4k buffers to the pipe; these linger + */ + writeread_pipe(7, WRITE_PIPE); + + /* + * Do a handful of new writes followed by reads + */ + writeread_pipe(21, WRITE_PIPE|READ_PIPE); + + /* Resize pipe to 8k; should fail EBUSY & print that */ + resize_pipe(8192, NONFATAL); + + /* Resize pipe to 128k */ + resize_pipe(131072, FATAL); + + /* A bunch more writes & reads */ + writeread_pipe(70, WRITE_PIPE|READ_PIPE); + + /* resize pipe back down to 32k */ + resize_pipe(32768, FATAL); + + /* even more writes & reads */ + writeread_pipe(100, WRITE_PIPE|READ_PIPE); + + /* empty the pipe */ + writeread_pipe(107, READ_PIPE); + + /* resizing pipe to 0 should be limited to 4k (?) */ + resize_pipe(0, FATAL); + + close(pip[0]); + close(pip[1]); + return 0; +} + diff --git a/tests/generic/026 b/tests/generic/026 new file mode 100755 index 0000000..4f462a8 --- /dev/null +++ b/tests/generic/026 @@ -0,0 +1,55 @@ +#! /bin/bash +# FS QA Test No. 026 +# +# Test pipe resizing +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +tmp=/tmp/$$ +here=`pwd` +status=1 +done_cleanup=false +trap "_cleanup; rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +test -f /proc/sys/fs/pipe-max-size || _notrun "Dynamic pipe resizing unsupported" + +[ -x $here/src/piperesize ] || _notrun "piperesize not built" +$here/src/piperesize + +status=0 +exit diff --git a/tests/generic/026.out b/tests/generic/026.out new file mode 100755 index 0000000..e2a9a33 --- /dev/null +++ b/tests/generic/026.out @@ -0,0 +1,122 @@ +QA output created by 026 +Iter 0 - Wrote: buffer #0 +Iter 1 - Wrote: buffer #1 +Iter 2 - Wrote: buffer #2 +Iter 3 - Wrote: buffer #3 +Iter 4 - Wrote: buffer #4 +Iter 5 - Wrote: buffer #5 +Iter 6 - Wrote: buffer #6 +7 buffers left in pipe +Iter 7 - Wrote: buffer #7 Read: buffer #0 +Iter 8 - Wrote: buffer #8 Read: buffer #1 +Iter 9 - Wrote: buffer #9 Read: buffer #2 +Iter 10 - Wrote: buffer #10 Read: buffer #3 +Iter 11 - Wrote: buffer #11 Read: buffer #4 +Iter 12 - Wrote: buffer #12 Read: buffer #5 +Iter 13 - Wrote: buffer #13 Read: buffer #6 +Iter 14 - Wrote: buffer #14 Read: buffer #7 +Iter 15 - Wrote: buffer #15 Read: buffer #8 +Iter 16 - Wrote: buffer #16 Read: buffer #9 +Iter 17 - Wrote: buffer #17 Read: buffer #10 +Iter 18 - Wrote: buffer #18 Read: buffer #11 +Iter 19 - Wrote: buffer #19 Read: buffer #12 +Iter 20 - Wrote: buffer #20 Read: buffer #13 +7 buffers left in pipe +Attempting to resize pipe to 8192 +F_SETPIPE_SZ: Device or resource busy +now pipe size is: 65536 +Attempting to resize pipe to 131072 +now pipe size is: 131072 +Iter 21 - Wrote: buffer #21 Read: buffer #14 +Iter 22 - Wrote: buffer #22 Read: buffer #15 +Iter 23 - Wrote: buffer #23 Read: buffer #16 +Iter 24 - Wrote: buffer #24 Read: buffer #17 +Iter 25 - Wrote: buffer #25 Read: buffer #18 +Iter 26 - Wrote: buffer #26 Read: buffer #19 +Iter 27 - Wrote: buffer #27 Read: buffer #20 +Iter 28 - Wrote: buffer #28 Read: buffer #21 +Iter 29 - Wrote: buffer #29 Read: buffer #22 +Iter 30 - Wrote: buffer #30 Read: buffer #23 +Iter 31 - Wrote: buffer #31 Read: buffer #24 +Iter 32 - Wrote: buffer #32 Read: buffer #25 +Iter 33 - Wrote: buffer #33 Read: buffer #26 +Iter 34 - Wrote: buffer #34 Read: buffer #27 +Iter 35 - Wrote: buffer #35 Read: buffer #28 +Iter 36 - Wrote: buffer #36 Read: buffer #29 +Iter 37 - Wrote: buffer #37 Read: buffer #30 +Iter 38 - Wrote: buffer #38 Read: buffer #31 +Iter 39 - Wrote: buffer #39 Read: buffer #32 +Iter 40 - Wrote: buffer #40 Read: buffer #33 +Iter 41 - Wrote: buffer #41 Read: buffer #34 +Iter 42 - Wrote: buffer #42 Read: buffer #35 +Iter 43 - Wrote: buffer #43 Read: buffer #36 +Iter 44 - Wrote: buffer #44 Read: buffer #37 +Iter 45 - Wrote: buffer #45 Read: buffer #38 +Iter 46 - Wrote: buffer #46 Read: buffer #39 +Iter 47 - Wrote: buffer #47 Read: buffer #40 +Iter 48 - Wrote: buffer #48 Read: buffer #41 +Iter 49 - Wrote: buffer #49 Read: buffer #42 +Iter 50 - Wrote: buffer #50 Read: buffer #43 +Iter 51 - Wrote: buffer #51 Read: buffer #44 +Iter 52 - Wrote: buffer #52 Read: buffer #45 +Iter 53 - Wrote: buffer #53 Read: buffer #46 +Iter 54 - Wrote: buffer #54 Read: buffer #47 +Iter 55 - Wrote: buffer #55 Read: buffer #48 +Iter 56 - Wrote: buffer #56 Read: buffer #49 +Iter 57 - Wrote: buffer #57 Read: buffer #50 +Iter 58 - Wrote: buffer #58 Read: buffer #51 +Iter 59 - Wrote: buffer #59 Read: buffer #52 +Iter 60 - Wrote: buffer #60 Read: buffer #53 +Iter 61 - Wrote: buffer #61 Read: buffer #54 +Iter 62 - Wrote: buffer #62 Read: buffer #55 +Iter 63 - Wrote: buffer #63 Read: buffer #56 +Iter 64 - Wrote: buffer #64 Read: buffer #57 +Iter 65 - Wrote: buffer #65 Read: buffer #58 +Iter 66 - Wrote: buffer #66 Read: buffer #59 +Iter 67 - Wrote: buffer #67 Read: buffer #60 +Iter 68 - Wrote: buffer #68 Read: buffer #61 +Iter 69 - Wrote: buffer #69 Read: buffer #62 +7 buffers left in pipe +Attempting to resize pipe to 32768 +now pipe size is: 32768 +Iter 70 - Wrote: buffer #70 Read: buffer #63 +Iter 71 - Wrote: buffer #71 Read: buffer #64 +Iter 72 - Wrote: buffer #72 Read: buffer #65 +Iter 73 - Wrote: buffer #73 Read: buffer #66 +Iter 74 - Wrote: buffer #74 Read: buffer #67 +Iter 75 - Wrote: buffer #75 Read: buffer #68 +Iter 76 - Wrote: buffer #76 Read: buffer #69 +Iter 77 - Wrote: buffer #77 Read: buffer #70 +Iter 78 - Wrote: buffer #78 Read: buffer #71 +Iter 79 - Wrote: buffer #79 Read: buffer #72 +Iter 80 - Wrote: buffer #80 Read: buffer #73 +Iter 81 - Wrote: buffer #81 Read: buffer #74 +Iter 82 - Wrote: buffer #82 Read: buffer #75 +Iter 83 - Wrote: buffer #83 Read: buffer #76 +Iter 84 - Wrote: buffer #84 Read: buffer #77 +Iter 85 - Wrote: buffer #85 Read: buffer #78 +Iter 86 - Wrote: buffer #86 Read: buffer #79 +Iter 87 - Wrote: buffer #87 Read: buffer #80 +Iter 88 - Wrote: buffer #88 Read: buffer #81 +Iter 89 - Wrote: buffer #89 Read: buffer #82 +Iter 90 - Wrote: buffer #90 Read: buffer #83 +Iter 91 - Wrote: buffer #91 Read: buffer #84 +Iter 92 - Wrote: buffer #92 Read: buffer #85 +Iter 93 - Wrote: buffer #93 Read: buffer #86 +Iter 94 - Wrote: buffer #94 Read: buffer #87 +Iter 95 - Wrote: buffer #95 Read: buffer #88 +Iter 96 - Wrote: buffer #96 Read: buffer #89 +Iter 97 - Wrote: buffer #97 Read: buffer #90 +Iter 98 - Wrote: buffer #98 Read: buffer #91 +Iter 99 - Wrote: buffer #99 Read: buffer #92 +7 buffers left in pipe +Iter 100 - Read: buffer #93 +Iter 101 - Read: buffer #94 +Iter 102 - Read: buffer #95 +Iter 103 - Read: buffer #96 +Iter 104 - Read: buffer #97 +Iter 105 - Read: buffer #98 +Iter 106 - Read: buffer #99 +0 buffers left in pipe +Attempting to resize pipe to 0 +now pipe size is: PAGE_SIZE diff --git a/tests/generic/group b/tests/generic/group index 60d6066..a6eabbf 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -28,6 +28,7 @@ 023 auto quick 024 auto quick 025 auto quick +026 auto quick 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress From BATV+679c7f1dfbddab2d98a1+3896+infradead.org+hch@bombadil.srs.infradead.org Thu Apr 24 14:20:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 84CB07F52 for ; Thu, 24 Apr 2014 14: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 517E28F8040 for ; Thu, 24 Apr 2014 12:20:55 -0700 (PDT) X-ASG-Debug-ID: 1398367253-04cbb04b9057b10001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id gcYKKQDRPYS1eAw8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 12:20:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+679c7f1dfbddab2d98a1+3896+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdPCW-0001j3-Su; Thu, 24 Apr 2014 19:20:52 +0000 Date: Thu, 24 Apr 2014 12:20:52 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Miklos Szeredi Subject: Re: [PATCH] xfstests: test pipe resizing Message-ID: <20140424192052.GA32696@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: test pipe resizing References: <5359625B.3090001@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5359625B.3090001@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398367253 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 24, 2014 at 02:13:31PM -0500, Eric Sandeen wrote: > Add a simple test to exercise the pipe resize fcntls, > F_SETPIPE_SZ and F_GETPIPE_SZ. > > This doesn't do a whole lot, but does some pipe reading > and writing, some pipe resizing and checking, validates > that we get EBUSY if we try to resize below the current > size of buffers in the pipe, that the minimum is limited > to PAGE_SIZE, etc. How is this a filesystem issue? I think this belongs into ltp. From tinguely@sgi.com Thu Apr 24 15:59:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 083087F52 for ; Thu, 24 Apr 2014 15:59:32 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay1.corp.sgi.com (Postfix) with ESMTP id BAAB98F8035; Thu, 24 Apr 2014 13:59:31 -0700 (PDT) Message-ID: <53597B34.9050407@sgi.com> Date: Thu, 24 Apr 2014 15:59:32 -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 Mailing List Subject: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr References: <20140423210034.892939354@sgi.com> <20140423210445.700477624@sgi.com> <20140423222215.GT18672@dastard> <535945DC.6010108@sgi.com> In-Reply-To: <535945DC.6010108@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/24/14 12:11, Mark Tinguely wrote: > On 04/23/14 17:22, Dave Chinner wrote: >> On Wed, Apr 23, 2014 at 04:04:35PM -0500, Mark Tinguely wrote: ... Note that libxfs still has libxfs_trans_ijoin_ref() which sets the >> lock flags, but this has been removed from the kernel code. IOWs, >> this is a libxfs/trans.c::xfs_trans_ijoin() bug, not something that >> needs fixing in the shared kernel/user libxfs code. >> >> Cheers, >> >> Dave. > > nod. That is the correct thing to do. > > Since the shared user/kernel code will no longer do a xfs_trans_ihold(), > the libxfs_iput() should be factored out out of inode_item_unlock() and > have the creator release the inode pointer when it is appropriate. > > No one besides me is using this so it can go into the next release of > xfs_progs. > > --Mark. PS. I may not have been very clear, the libxfs_trans_roll() and inode_item_done() also cause a premature libxfs_iput(). Let me do more testing making any changes and target this for xfsprogs-3.2.1. --Mark. From keyurgovande@gmail.com Thu Apr 24 16:49:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 526A87F52 for ; Thu, 24 Apr 2014 16:49:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EFCEBAC009 for ; Thu, 24 Apr 2014 14:49:16 -0700 (PDT) X-ASG-Debug-ID: 1398376154-04bdf05c7464780001-NocioJ Received: from mail-we0-f174.google.com (mail-we0-f174.google.com [74.125.82.174]) by cuda.sgi.com with ESMTP id 3AOFRfZP9rkRaq5q (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Apr 2014 14:49:15 -0700 (PDT) X-Barracuda-Envelope-From: keyurgovande@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.174 Received: by mail-we0-f174.google.com with SMTP id w62so1578697wes.19 for ; Thu, 24 Apr 2014 14:49:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=MqBOoX53J+UlHGfir0l7MJjNfKwGkizv2+4cWUX27Js=; b=xNj5TxusCwovahPHTHGYHh1zdoBPOCjfqg1CcOXocnLp/LX/qk1fCMnI2s3CTLG0t3 GkiaXqeGmiYawpmQVOyQl4Xg9H9heoNDDF8VGAUzR+63CVawJmbazwRHTqslyNVvVThM xaOREFdIPJ9Idd8SWsA+PvNuun94YNn8yjqSTXzPAXo9pGd0+68/0M1vyIbWU5TRottR yDQC2dsHsGdDGCTAQ7ORbcgf1SXPvEEU6Tvb0U90Qw26uCYIMUu4S4XUuOcfTL3KxEco jcDlqa7fJGlZv1JWFiusKE5LAJEpob8FuUFiYOFW7EGxvIpjwf2rLHPhf8lol2UT1tgu Kftg== MIME-Version: 1.0 X-Received: by 10.194.9.36 with SMTP id w4mr17302wja.79.1398376154123; Thu, 24 Apr 2014 14:49:14 -0700 (PDT) Received: by 10.227.97.136 with HTTP; Thu, 24 Apr 2014 14:49:14 -0700 (PDT) In-Reply-To: References: <20140408015012.GB22917@dastard> <20140408053117.GJ27017@dastard> Date: Thu, 24 Apr 2014 17:49:14 -0400 Message-ID: Subject: Re: XFS fragmentation on file append From: Keyur Govande X-ASG-Orig-Subj: Re: XFS fragmentation on file append To: Stefan Ring Cc: linux-fsdevel@vger.kernel.org, Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-we0-f174.google.com[74.125.82.174] X-Barracuda-Start-Time: 1398376155 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.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.3.5224 Rule breakdown below pts rule name 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 On Thu, Apr 24, 2014 at 2:54 AM, Stefan Ring wrote: > I've become interested in this topic, as I'm also running MySQL with > O_DIRECT and innodb_file_per_table. Out of curiosity, I immediately > ran xfs_bmap on a moderately sized table space (34GB). It listed > around 30000 fragments, on average one for every MB. > > I want to report what happened then: A flurry of activity started on > both disks (root/swap lives on one of them, the data volume containing > the MySQL files on another) and lasted for about two minutes. > Afterwards, all memory previously allocated to the file cache has > become free, and also everything XFS seems to keep buffered internally > (I think it's called SReclaimable) was released. Swap usage increased > only slightly. dmesg was silent during that time. > > This is a 2.6.32-358.2.1.el6.x86_64 kernel with xfsprogs 3.1.1 (CentOS > 6.4). The machine has 64GB of RAM (2 NUMA nodes) and 24 (virtual) > cores. Is this known behavior of xfs_bmap? Interesting...it looks like your box flushed all of the OS buffer cache. I am unable to reproduce this behavior on my test box with the 3.10.37 kernel. I also tried with 2.6.32-358.18.1.el6.x86_64 and didn't hit the issue, but obviously our access patterns differ wildly. From felipemonteiro.carvalho@gmail.com Thu Apr 24 17:09:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4EA8D7F52 for ; Thu, 24 Apr 2014 17:09:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D0B08F8052 for ; Thu, 24 Apr 2014 15:09:10 -0700 (PDT) X-ASG-Debug-ID: 1398377348-04cb6c2b7a65200001-NocioJ Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com [209.85.216.43]) by cuda.sgi.com with ESMTP id QUaMKiMAleSG3MP7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 24 Apr 2014 15:09:09 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.43] Received: by mail-qa0-f43.google.com with SMTP id ih12so1037930qab.30 for ; Thu, 24 Apr 2014 15:09:08 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.43] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=v3mclePX4YW9daqsYEKq/SbM/uk6r+/T4b6Cix0lTQY=; b=F+Caxw+yYmH4vWc5oU7uHP92bgwXteZ2ZhSzRVa5ruJZQu4dEYd3K/daLKnspMK60v PG3SjreO7i9AMujWW4BPTVt2eU9foA4hLU49LiZF7H3wtXihiafXlMYyH0zsDCuUcTO7 05RH8omrJJrY/Gv5uUkbrCCXmyWhB2r6cRvYo5csKm54zj/T7Y43Hm8PrO0EbH74rdVe +E8VQ6WATf8OAPqy+EOhqcJzbc6LKySxEJ+b/XAFqrK+v6QeDXKYYfNp5joJxvABCKGU TWIIWzJSrbIwxfdjHSkZRWNomyC5rZoUNT47yh2uySylC6FzhMeBoDib+3i1bM41zngr EhPQ== MIME-Version: 1.0 X-Received: by 10.229.65.138 with SMTP id j10mr6787567qci.10.1398377348456; Thu, 24 Apr 2014 15:09:08 -0700 (PDT) Received: by 10.140.84.203 with HTTP; Thu, 24 Apr 2014 15:09:08 -0700 (PDT) Date: Thu, 24 Apr 2014 19:09:08 -0300 Message-ID: Subject: How to find the inodes in XFS From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: How to find the inodes in XFS To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f43.google.com[209.85.216.43] X-Barracuda-Start-Time: 1398377349 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: dubeyko.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, I am writing an application which reads XFS partitions, so I am trying to understand the internal working of XFS. I read the documentation here: http://www.dubeyko.com/development/FileSystems/XFS/xfs_filesystem_structure.pdf But I am stuck at a particular point. To get to the inodes I see that I should first read xfs_agi_t, no problem here, then its root field points to a block which contains xfs_inobt_block_t + a sequence of xfs_inobt_rec_t records and those records are supposed to show me where the inodes are, but there is no field in xfs_inobt_rec_t such as a block number =( Any idea how to get then the physical position in the disk where the inodes are from xfs_inobt_block_t + a sequence of xfs_inobt_rec_t? thanks, -- Felipe Monteiro de Carvalho From sandeen@sandeen.net Thu Apr 24 17:33:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D47C77F52 for ; Thu, 24 Apr 2014 17:33:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D49DAC007 for ; Thu, 24 Apr 2014 15:33:14 -0700 (PDT) X-ASG-Debug-ID: 1398378792-04bdf05c7566c80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id r2B7mshIeiivP6yy for ; Thu, 24 Apr 2014 15:33: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3D60363C5FF0; Thu, 24 Apr 2014 17:33:12 -0500 (CDT) Message-ID: <5359912A.70603@sandeen.net> Date: Thu, 24 Apr 2014 17:33:14 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Felipe Monteiro de Carvalho , xfs@oss.sgi.com Subject: Re: How to find the inodes in XFS References: X-ASG-Orig-Subj: Re: How to find the inodes in XFS In-Reply-To: X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398378792 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: dubeyko.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/24/14, 5:09 PM, Felipe Monteiro de Carvalho wrote: > Hello, > > I am writing an application which reads XFS partitions, so I am trying > to understand the internal working of XFS. I read the documentation > here: http://www.dubeyko.com/development/FileSystems/XFS/xfs_filesystem_structure.pdf > > But I am stuck at a particular point. To get to the inodes I see that > I should first read xfs_agi_t, no problem here, then its root field > points to a block which contains xfs_inobt_block_t + a sequence of > xfs_inobt_rec_t records and those records are supposed to show me > where the inodes are, but there is no field in xfs_inobt_rec_t such as > a block number =( Any idea how to get then the physical position in > the disk where the inodes are from xfs_inobt_block_t + a sequence of > xfs_inobt_rec_t? The inode's location is encoded in its inode number. See for example: /* * Inode number format: * low inopblog bits - offset in block * next agblklog bits - block number in ag * next agno_log bits - ag number * high agno_log-agblklog-inopblog bits - 0 */ #define XFS_INO_TO_FSB(mp,i) \ XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) -Eric > thanks, > From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:36:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 848DA7F52 for ; Fri, 25 Apr 2014 00:36:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A907304051 for ; Thu, 24 Apr 2014 22:36:50 -0700 (PDT) X-ASG-Debug-ID: 1398404209-04bdf05c747c2c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ETZYqd2DDeTZDaXX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 22:36:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdYoa-0003Bz-RJ; Fri, 25 Apr 2014 05:36:48 +0000 Date: Thu, 24 Apr 2014 22:36:48 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/6 v2] generic: introduce new large ACL test Message-ID: <20140425053648.GA9435@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/6 v2] generic: introduce new large ACL test References: <1398204274-2113-1-git-send-email-david@fromorbit.com> <1398204274-2113-4-git-send-email-david@fromorbit.com> <20140423152313.GC26128@infradead.org> <20140423230915.GV15995@dastard> <20140423234452.GW15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140423234452.GW15995@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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398404209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Apr 24, 2014 at 09:44:53AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Having just removed the largeacl test from the shared ACL test, > reintroduce the same test as an generic test so that we can > handle the different limits in supported ACL count appropriately > across different filesystems and different configurations within > filesystem types. > > Filesystems have to add support to _acl_get_max to run > this test - the default behaviour right now is to throw a > notrun error like this: > > generic/026 14s ... [not run] ext4 does not define maximum ACL count > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:40:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E5507F52 for ; Fri, 25 Apr 2014 00:40:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6C39304048 for ; Thu, 24 Apr 2014 22:40:22 -0700 (PDT) X-ASG-Debug-ID: 1398404421-04bdf05c737c4f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LwAKkENlAJkJg59C (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 24 Apr 2014 22:40:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdYs1-0005aT-RT; Fri, 25 Apr 2014 05:40:21 +0000 Date: Thu, 24 Apr 2014 22:40:21 -0700 From: Christoph Hellwig To: Mark Tinguely Cc: Dave Chinner , XFS Mailing List Subject: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr Message-ID: <20140425054021.GA16132@infradead.org> X-ASG-Orig-Subj: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr References: <20140423210034.892939354@sgi.com> <20140423210445.700477624@sgi.com> <20140423222215.GT18672@dastard> <535945DC.6010108@sgi.com> <53597B34.9050407@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53597B34.9050407@sgi.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398404421 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Apr 24, 2014 at 03:59:32PM -0500, Mark Tinguely wrote: > PS. I may not have been very clear, the libxfs_trans_roll() and > inode_item_done() also cause a premature libxfs_iput(). > Let me do more testing making any changes and target this for > xfsprogs-3.2.1. You mean you've fixed the way we handle the attachement of inodes to transaction in userspace to mirror what we do in kernelspace? I'd love to review this if you have patches as it's a somewhat of a pain point to have these work so different in kernel and userspace. From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:41:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8FFC07F52 for ; Fri, 25 Apr 2014 00:41:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B0718F8039 for ; Thu, 24 Apr 2014 22:41:30 -0700 (PDT) X-ASG-Debug-ID: 1398404487-04cb6c58bc43230001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id qG8hA2CfjWuAXvtE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 22:41:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdYt5-0005on-Mf; Fri, 25 Apr 2014 05:41:27 +0000 Date: Thu, 24 Apr 2014 22:41:27 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] db: verify buffer on type change Message-ID: <20140425054127.GB16132@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/9] db: verify buffer on type change References: <1398315722-20870-1-git-send-email-david@fromorbit.com> <1398315722-20870-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398315722-20870-3-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398404488 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:47:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 13FB67F52 for ; Fri, 25 Apr 2014 00:47:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 969D0AC007 for ; Thu, 24 Apr 2014 22:47:07 -0700 (PDT) X-ASG-Debug-ID: 1398404826-04cbb04b9279600001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id SGgNwEWrko6KK3n5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 22:47:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdYyX-0008EN-NN; Fri, 25 Apr 2014 05:47:05 +0000 Date: Thu, 24 Apr 2014 22:47:05 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140425054705.GA30118@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1398315722-20870-1-git-send-email-david@fromorbit.com> <1398315722-20870-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398315722-20870-4-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398404826 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Apr 24, 2014 at 03:01:56PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Prefetch currently does not do CRC validation when the IO completes > due to the optimisation it performs and the fact that it does not > know what the type of metadata into the buffer is supposed to be. > Hence, mark all prefetched buffers as "suspect" so that when the > end user tries to read it with a supplied validation function the > validation is run even though the buffer was already in the cache. > > Signed-off-by: Dave Chinner Looks good, but a few minor nitpicks below: > + if (ops && (bp->b_flags & LIBXFS_B_UNCHECKED)) { > + bp->b_error = 0; > + bp->b_ops = ops; > + bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > + } There's three copies of code in the previous and this patch, it probably should go into a helper function. > + else if (bp->b_ops) { > bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > + } Same with this. > bp->b_flags |= LIBXFS_B_UPTODATE; > bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; Any reason not to clear all three flags in a single line? From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:47:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 78F557F4E for ; Fri, 25 Apr 2014 00:47:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6466E8F8039 for ; Thu, 24 Apr 2014 22:47:35 -0700 (PDT) X-ASG-Debug-ID: 1398404854-04cb6c2b7d7b810001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id evdIeAM0BwaDqd5M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 22:47:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdYz0-0008Kz-5k; Fri, 25 Apr 2014 05:47:34 +0000 Date: Thu, 24 Apr 2014 22:47:34 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Message-ID: <20140425054734.GB30118@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks References: <1398315722-20870-1-git-send-email-david@fromorbit.com> <1398315722-20870-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398315722-20870-5-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398404854 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:55:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BA9E7F52 for ; Fri, 25 Apr 2014 00:55:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2EA8304043 for ; Thu, 24 Apr 2014 22:55:17 -0700 (PDT) X-ASG-Debug-ID: 1398405316-04bdf05c757cb80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rPtrWnEbKma1WCO7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 22:55:16 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZ6S-0003xl-EH; Fri, 25 Apr 2014 05:55:16 +0000 Date: Thu, 24 Apr 2014 22:55:16 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140425055516.GC30118@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1398315722-20870-1-git-send-email-david@fromorbit.com> <1398315722-20870-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398315722-20870-6-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398405316 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > sb = (xfs_sb_t *)calloc(BBSIZE, 1); If you already do various cosmetic changes I'd recommend removing the useles case here as well. > - if (status & XR_AG_AGF) { > + if (agf_dirty || status & XR_AG_AGF) { > - if (status & XR_AG_AGI) { > + if (agi_dirty || status & XR_AG_AGI) { I can't see how agf_dirty and agi_dirty would ever be set at this point. > +out_free: > + if (sb) > + free(sb); > + if (agibuf) > + libxfs_putbuf(agibuf); > + if (agfbuf) > + libxfs_putbuf(agfbuf); > + if (sbbuf) > + libxfs_putbuf(sbbuf); > + if (objname) > + do_error(_("can't get %s for ag %d\n"), objname, agno); > + return; No need for a return statement at the end of a void returning function. Also any reason for not using one goto for each unwind step like we do elsewhere instead of the if (!NULL) checks? From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 00:55:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 741907F52 for ; Fri, 25 Apr 2014 00:55:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 585E3304051 for ; Thu, 24 Apr 2014 22:55:47 -0700 (PDT) X-ASG-Debug-ID: 1398405346-04cb6c2b7d7bb20001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id lcQExF3BIBEWzeRz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 22:55:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZ6w-0004J4-Cz; Fri, 25 Apr 2014 05:55:46 +0000 Date: Thu, 24 Apr 2014 22:55:46 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/9] repair: report AG btree verifier errors Message-ID: <20140425055546.GD30118@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/9] repair: report AG btree verifier errors References: <1398315722-20870-1-git-send-email-david@fromorbit.com> <1398315722-20870-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398315722-20870-7-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398405346 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:01:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5DA3B29DF8 for ; Fri, 25 Apr 2014 01:01:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38C8F8F8039 for ; Thu, 24 Apr 2014 23:01:21 -0700 (PDT) X-ASG-Debug-ID: 1398405679-04cb6c2b7a7bd90001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id jmerhn9Ns7rXKwAa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:01:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZCJ-0006kS-Iz; Fri, 25 Apr 2014 06:01:19 +0000 Date: Thu, 24 Apr 2014 23:01:19 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] repair: handle remote symlink CRC errors Message-ID: <20140425060119.GE30118@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 8/9] repair: handle remote symlink CRC errors References: <1398315722-20870-1-git-send-email-david@fromorbit.com> <1398315722-20870-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398315722-20870-9-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398405680 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 24, 2014 at 03:02:01PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We can't really repair broken symlink buffer contents, but we can at > least warn about it and correct the CRC error so the symlink is > again readable. > + do_warn( > +_("Bad symlink buffer CRC, block %" PRIu64 ", inode %" PRIu64 ".\n" > + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); > + dirty = 1; Can you use the badcrc variable name here like in a few other places? > + if (dirty) > + libxfs_writebuf(bp, 0); > + else > + libxfs_putbuf(bp); This needs a no_modify check. Hmm, given how often we have this pattern and how easy it is do get wrong, maybe libxfs_writebuf should do the no_modify check for us can we can get rid of all this code? Or maybe at least in a repair_writebuf wrapper? Not saying it should go into this series of course. From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:30:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 061807F52 for ; Fri, 25 Apr 2014 01:30:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E473E8F8049 for ; Thu, 24 Apr 2014 23:30:01 -0700 (PDT) X-ASG-Debug-ID: 1398407400-04cb6c2b7b7ce00001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 8jh6QGTKRpNozyYc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:30:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZe4-0007LG-AN; Fri, 25 Apr 2014 06:30:00 +0000 Date: Thu, 24 Apr 2014 23:30:00 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems Message-ID: <20140425063000.GA27527@infradead.org> X-ASG-Orig-Subj: Re: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems References: <1398324998-2592-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398324998-2592-1-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398407400 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 24, 2014 at 05:36:38PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We have had this code in the kernel for over a year now and have > shaken all the known issues out of the code over the past few > releases. It's now time to remove the experimental warnings during > mount and fully support the new filesystem format in production > systems. Shouldn't we wait until the xfsprogs 3.2.0 release before this? From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:30:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1275C7F52 for ; Fri, 25 Apr 2014 01:30:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E19C18F804B for ; Thu, 24 Apr 2014 23:30:54 -0700 (PDT) X-ASG-Debug-ID: 1398407453-04cbb04b917abc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OzooJdp1B21SJyZv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:30:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZev-00009v-FT; Fri, 25 Apr 2014 06:30:53 +0000 Date: Thu, 24 Apr 2014 23:30:53 -0700 From: Christoph Hellwig To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] common: new function to get real device path name and basename Message-ID: <20140425063053.GB27527@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] common: new function to get real device path name and basename References: <20140422051051.GI18672@dastard> <1398149833-9761-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398149833-9761-1-git-send-email-eguan@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398407453 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:31:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4BFBA7F52 for ; Fri, 25 Apr 2014 01:31:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2722F8F8054 for ; Thu, 24 Apr 2014 23:31:55 -0700 (PDT) X-ASG-Debug-ID: 1398407513-04cbb04b907aca0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id lrOx5bVOxEpHqX2q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:31:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZft-0000Ou-Lu; Fri, 25 Apr 2014 06:31:53 +0000 Date: Thu, 24 Apr 2014 23:31:53 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , ext4 development , Theodore Tso Subject: Re: [PATCH] xfstests: introduce FSX_AVOID env var Message-ID: <20140425063153.GC27527@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: introduce FSX_AVOID env var References: <5355478C.8070905@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5355478C.8070905@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398407514 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 21, 2014 at 11:30:04AM -0500, Eric Sandeen wrote: > Just like FSSTRESS_AVOID, FSX_AVOID can be used to add > options at the end of the default fsx runs in each test. > i.e. FSX_AVOID="-H -z -C" will disable punch hole, zero range, > and collapse range calls in all tests which run fsx. > > This should handle Ted's concerns about buggy ext4 fallocate > code without needing to add tunables to the kernel to reject > these operations during xfstests runs. I would much prefer to add a little _run_fsx helper to encapsulate this. From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:43:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E0FD47F52 for ; Fri, 25 Apr 2014 01:43:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6606304043 for ; Thu, 24 Apr 2014 23:43:35 -0700 (PDT) X-ASG-Debug-ID: 1398408213-04cbb04b937b600001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LHCgDseDO9XL9Q1X (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:43:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZrB-0005TK-7s; Fri, 25 Apr 2014 06:43:33 +0000 Date: Thu, 24 Apr 2014 23:43:33 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 04/10] xfs: introduce per allocation group inumbers Message-ID: <20140425064333.GA20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 04/10] xfs: introduce per allocation group inumbers References: <535078B5.4010700@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078B5.4010700@oracle.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398408213 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 18, 2014 at 08:58:29AM +0800, Jeff Liu wrote: > From: Jie Liu > > Introduce xfs_perag_inumbers(), it could be used to fetch the inode number > tables per allocation group via a new ioctl(2) in the future. Also, that > would be a net win considering the scalability for a file system with huge > number of inodes as multiple allocation groups can be scanned in parallel, > refactor xfs_inumbers() with it. Given that you don't actually introduce a per-ag inumbers interface in this series I'd prefer if you just refactor the inumbers code to add a helper that operates on an AG with xfs_inumbers moving on to the next one, but not adding the xfs_aginumbers structure that just makes the move less obvious for now. From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:48:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9D2EA7F52 for ; Fri, 25 Apr 2014 01:48:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 79A938F8040 for ; Thu, 24 Apr 2014 23:48:20 -0700 (PDT) X-ASG-Debug-ID: 1398408495-04bdf05c747ef00001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id IC5oOP29fwQoAv3S (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:48:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZvj-0006ih-NN; Fri, 25 Apr 2014 06:48:15 +0000 Date: Thu, 24 Apr 2014 23:48:15 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat Message-ID: <20140425064815.GB20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat References: <535078B8.4020905@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078B8.4020905@oracle.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398408495 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > Moreover, this fix also get rid of the redundant user buffer count > pre-checkups as it has already been validated in upper callers. > - if (!ubcountp || *ubcountp <= 0) { > - return EINVAL; > - } Probably better to have this as a separate patch. > - /* > - * Loop as long as we're unable to read the > - * inode btree. > - */ > - while (error) { > - agino += XFS_INODES_PER_CHUNK; > - if (XFS_AGINO_TO_AGBNO(mp, agino) >= > - be32_to_cpu(agi->agi_length)) > - break; > - error = xfs_inobt_lookup(cur, agino, > - XFS_LOOKUP_GE, &tmp); > - cond_resched(); > - } This code goes back to 1995, but I still can't see how it would make sense. I think we should get rid of this, but I'd also love to have Dave and Eric double check it as well. Signed-off-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:49:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AF0F47F52 for ; Fri, 25 Apr 2014 01:49:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 434B8AC006 for ; Thu, 24 Apr 2014 23:49:47 -0700 (PDT) X-ASG-Debug-ID: 1398408585-04cb6c2b7d7dd80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rKI31xF1sDanvNky (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:49:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdZxB-0006kX-Md; Fri, 25 Apr 2014 06:49:45 +0000 Date: Thu, 24 Apr 2014 23:49:45 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 06/10] xfs: introduce xfs_bulkstat_ichunk_ra Message-ID: <20140425064945.GC20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 06/10] xfs: introduce xfs_bulkstat_ichunk_ra References: <535078C3.2040506@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078C3.2040506@oracle.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398408585 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.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:53:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C1AE7F52 for ; Fri, 25 Apr 2014 01:53:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A4BC7AC006 for ; Thu, 24 Apr 2014 23:53:02 -0700 (PDT) X-ASG-Debug-ID: 1398408781-04cb6c58bc45cc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id MVW701eSw8CmOX18 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:53:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wda0L-000187-4E; Fri, 25 Apr 2014 06:53:01 +0000 Date: Thu, 24 Apr 2014 23:53:01 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 07/10] xfs: introduce xfs_bulkstat_grab_ichunk Message-ID: <20140425065301.GD20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 07/10] xfs: introduce xfs_bulkstat_grab_ichunk References: <535078C5.5060107@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078C5.5060107@oracle.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398408781 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > - agino = r.ir_startino + XFS_INODES_PER_CHUNK; > + agino += r.ir_startino + XFS_INODES_PER_CHUNK; why did this turns from a = into a += ? From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 01:55:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A5C667F52 for ; Fri, 25 Apr 2014 01:55:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F19D8F8040 for ; Thu, 24 Apr 2014 23:55:46 -0700 (PDT) X-ASG-Debug-ID: 1398408945-04cbb04b917c080001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id b5u0JYmpNIgSGppa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 24 Apr 2014 23:55:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wda2z-0002Zx-Bm; Fri, 25 Apr 2014 06:55:45 +0000 Date: Thu, 24 Apr 2014 23:55:45 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 10/10] xfs: isolate xfs_qm_quotacheck to its source file Message-ID: <20140425065545.GE20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 10/10] xfs: isolate xfs_qm_quotacheck to its source file References: <535078D4.4000802@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535078D4.4000802@oracle.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398408945 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Apr 18, 2014 at 08:59:00AM +0800, Jeff Liu wrote: > From: Jie Liu > > Isolate xfs_qm_quotacheck() to xfs_qm.c as there is no other users of it. > > Signed-off-by: Jie Liu Looks good, but the description is a bit confusing, we'd normallay say something like: "xfs: mark xfs_qm_quotacheck as static xfs_qm_quotacheck is not used outside of xfs_qm.c. Mark it static and move it around in the file to avoid a forward declaration." Reviewed-by: Christoph Hellwig From jeff.liu@oracle.com Fri Apr 25 02:14:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7BBA97F52 for ; Fri, 25 Apr 2014 02:14:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 06665AC006 for ; Fri, 25 Apr 2014 00:14:43 -0700 (PDT) X-ASG-Debug-ID: 1398410082-04cb6c2b7b7f2d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vEXiN6l2KmAHW9Pk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Apr 2014 00:14:42 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3P7EJPQ013182 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Apr 2014 07:14:19 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3P7EI57012357 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 25 Apr 2014 07:14:18 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3P7EHan012342; Fri, 25 Apr 2014 07:14:18 GMT Received: from [192.168.1.106] (/221.223.105.238) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 25 Apr 2014 00:14:17 -0700 Message-ID: <535A0B46.9040203@oracle.com> Date: Fri, 25 Apr 2014 15:14:14 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 04/10] xfs: introduce per allocation group inumbers References: <535078B5.4010700@oracle.com> <20140425064333.GA20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 04/10] xfs: introduce per allocation group inumbers In-Reply-To: <20140425064333.GA20871@infradead.org> 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: 1398410082 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/25 2014 14:43 PM, Christoph Hellwig wrote: > On Fri, Apr 18, 2014 at 08:58:29AM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> Introduce xfs_perag_inumbers(), it could be used to fetch the inode number >> tables per allocation group via a new ioctl(2) in the future. Also, that >> would be a net win considering the scalability for a file system with huge >> number of inodes as multiple allocation groups can be scanned in parallel, >> refactor xfs_inumbers() with it. > > Given that you don't actually introduce a per-ag inumbers interface in > this series I'd prefer if you just refactor the inumbers code to > add a helper that operates on an AG with xfs_inumbers moving on to > the next one, but not adding the xfs_aginumbers structure that just > makes the move less obvious for now. Fair enough, I'll take care of it. Thanks, -Jeff From jeff.liu@oracle.com Fri Apr 25 02:22:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 842E87F52 for ; Fri, 25 Apr 2014 02:22:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D0A0AC006 for ; Fri, 25 Apr 2014 00:22:09 -0700 (PDT) X-ASG-Debug-ID: 1398410528-04cbb04b927d5e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id tXMVzcCWGypxpNTk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Apr 2014 00:22:08 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3P7Lj4R020660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Apr 2014 07:21:45 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3P7LiB5003275 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 25 Apr 2014 07:21:45 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3P7Li09003265; Fri, 25 Apr 2014 07:21:44 GMT Received: from [192.168.1.106] (/221.223.105.238) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 25 Apr 2014 00:21:43 -0700 Message-ID: <535A0D05.1090004@oracle.com> Date: Fri, 25 Apr 2014 15:21:41 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat References: <535078B8.4020905@oracle.com> <20140425064815.GB20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat In-Reply-To: <20140425064815.GB20871@infradead.org> 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: 1398410528 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/25 2014 14:48 PM, Christoph Hellwig wrote: >> Moreover, this fix also get rid of the redundant user buffer count >> pre-checkups as it has already been validated in upper callers. > >> - if (!ubcountp || *ubcountp <= 0) { >> - return EINVAL; >> - } > > Probably better to have this as a separate patch. Sometimes, I'd to put such kind of trivial fixes into a relative effective patch if possible. But from another point of view, yep, have it as a separate patch would make it more convenient for reviewer. > >> - /* >> - * Loop as long as we're unable to read the >> - * inode btree. >> - */ >> - while (error) { >> - agino += XFS_INODES_PER_CHUNK; >> - if (XFS_AGINO_TO_AGBNO(mp, agino) >= >> - be32_to_cpu(agi->agi_length)) >> - break; >> - error = xfs_inobt_lookup(cur, agino, >> - XFS_LOOKUP_GE, &tmp); >> - cond_resched(); >> - } > > This code goes back to 1995, but I still can't see how it would make > sense. I think we should get rid of this, but I'd also love to have > Dave and Eric double check it as well. > > Signed-off-by: Christoph Hellwig Thanks, -Jeff From jeff.liu@oracle.com Fri Apr 25 02:55:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C09B07F52 for ; Fri, 25 Apr 2014 02:55:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A5308F8049 for ; Fri, 25 Apr 2014 00:55:36 -0700 (PDT) X-ASG-Debug-ID: 1398412530-04cb6c2b7a814e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mcfXkivlnnkEP9Sj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Apr 2014 00:55:31 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3P7t5qV021810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Apr 2014 07:55:06 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3P7t4UX026709 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 25 Apr 2014 07:55:05 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s3P7t49o008535; Fri, 25 Apr 2014 07:55:04 GMT Received: from [192.168.1.106] (/221.223.105.238) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 25 Apr 2014 00:55:04 -0700 Message-ID: <535A14D5.30203@oracle.com> Date: Fri, 25 Apr 2014 15:55:01 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 07/10] xfs: introduce xfs_bulkstat_grab_ichunk References: <535078C5.5060107@oracle.com> <20140425065301.GD20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 07/10] xfs: introduce xfs_bulkstat_grab_ichunk In-Reply-To: <20140425065301.GD20871@infradead.org> 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: 1398412531 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/25 2014 14:53 PM, Christoph Hellwig wrote: >> - agino = r.ir_startino + XFS_INODES_PER_CHUNK; > >> + agino += r.ir_startino + XFS_INODES_PER_CHUNK; > > why did this turns from a = into a += ? Ah, this should be "a = ", will fix it. Thanks, -Jeff From jeff.liu@oracle.com Fri Apr 25 03:06:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A44B37F52 for ; Fri, 25 Apr 2014 03:06:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35955AC008 for ; Fri, 25 Apr 2014 01:06:06 -0700 (PDT) X-ASG-Debug-ID: 1398413164-04cb6c2b7b81f10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id dHvKS9WO5tWcqGI3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Apr 2014 01:06:05 -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.2/Sentrion-MTA-4.3.2) with ESMTP id s3P85fCh031591 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 25 Apr 2014 08:05:42 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 s3P85eB0023896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 25 Apr 2014 08:05:40 GMT Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s3P85dt0021638; Fri, 25 Apr 2014 08:05:39 GMT Received: from [192.168.1.106] (/221.223.105.238) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 25 Apr 2014 01:05:39 -0700 Message-ID: <535A1750.20109@oracle.com> Date: Fri, 25 Apr 2014 16:05:36 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 10/10] xfs: isolate xfs_qm_quotacheck to its source file References: <535078D4.4000802@oracle.com> <20140425065545.GE20871@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 10/10] xfs: isolate xfs_qm_quotacheck to its source file In-Reply-To: <20140425065545.GE20871@infradead.org> 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: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1398413164 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 04/25 2014 14:55 PM, Christoph Hellwig wrote: > On Fri, Apr 18, 2014 at 08:59:00AM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> Isolate xfs_qm_quotacheck() to xfs_qm.c as there is no other users of it. >> >> Signed-off-by: Jie Liu > > Looks good, but the description is a bit confusing, we'd normallay say > something like: > > "xfs: mark xfs_qm_quotacheck as static > > xfs_qm_quotacheck is not used outside of xfs_qm.c. Mark it static and > move it around in the file to avoid a forward declaration." Nice suggestion, thanks for your review. Thanks, -Jeff From lists@nerdbynature.de Fri Apr 25 05:21:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 85F927F52 for ; Fri, 25 Apr 2014 05:21:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00B46AC007 for ; Fri, 25 Apr 2014 03:21:22 -0700 (PDT) X-ASG-Debug-ID: 1398421279-04cbb04b9088120001-NocioJ Received: from trent.utfs.org (trent.utfs.org [94.185.90.103]) by cuda.sgi.com with ESMTP id wVCN5uk81QjfPn4n (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Apr 2014 03:21:21 -0700 (PDT) X-Barracuda-Envelope-From: lists@nerdbynature.de X-Barracuda-Apparent-Source-IP: 94.185.90.103 Received: by trent.utfs.org (Postfix, from userid 8) id 896BD3DCEC; Fri, 25 Apr 2014 12:21:18 +0200 (CEST) Received: from trent.utfs.org (localhost [127.0.0.1]) by trent.utfs.org (Postfix) with ESMTP id 1FE0A3DCDF for ; Fri, 25 Apr 2014 12:21:17 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by trent.utfs.org (Postfix) with ESMTP id 016A43DB00 for ; Fri, 25 Apr 2014 12:21:17 +0200 (CEST) Date: Fri, 25 Apr 2014 03:21:16 -0700 (PDT) From: Christian Kujau To: xfs@oss.sgi.com Subject: 3.15.0-rc2: RECLAIM_FS-safe -> RECLAIM_FS-unsafe lock order detected Message-ID: X-ASG-Orig-Subj: 3.15.0-rc2: RECLAIM_FS-safe -> RECLAIM_FS-unsafe lock order detected User-Agent: Alpine 2.19.4 (DEB 40 2013-11-18) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-AV-Checked: ClamAV using ClamSMTP (127.0.0.1) X-Barracuda-Connect: trent.utfs.org[94.185.90.103] X-Barracuda-Start-Time: 1398421280 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5240 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I haven't run vanilla for a while, so this is pretty much a copy of what I reported[0] back with 3.14-rc2, but now with 3.15-rc2. Full dmesg & .config can be found here: http://nerdbynature.de/bits/3.15-rc2/ ====================================================== [ INFO: RECLAIM_FS-safe -> RECLAIM_FS-unsafe lock order detected ] 3.15.0-rc2 #1 Not tainted ------------------------------------------------------ rm/8288 [HC0[0]:SC0[0]:HE1:SE1] is trying to acquire: (&mm->mmap_sem){++++++}, at: [] might_fault+0x58/0xa0 and this task is already holding: (&xfs_dir_ilock_class){++++-.}, at: [] xfs_ilock_data_map_shared+0x28/0x70 which would create a new lock dependency: (&xfs_dir_ilock_class){++++-.} -> (&mm->mmap_sem){++++++} but this new dependency connects a RECLAIM_FS-irq-safe lock: (&xfs_dir_ilock_class){++++-.} ... which became RECLAIM_FS-irq-safe at: [] lock_acquire+0x54/0x70 [] down_write_nested+0x50/0xa0 [] xfs_reclaim_inode+0x108/0x318 [] xfs_reclaim_inodes_ag+0x1b4/0x360 [] xfs_reclaim_inodes_nr+0x38/0x4c [] super_cache_scan+0x150/0x158 [] shrink_slab_node+0x138/0x228 [] shrink_slab+0x124/0x13c [] kswapd+0x3f8/0x884 [] kthread+0xbc/0xd0 [] ret_from_kernel_thread+0x5c/0x64 to a RECLAIM_FS-irq-unsafe lock: (&mm->mmap_sem){++++++} ... which became RECLAIM_FS-irq-unsafe at: ... [] lockdep_trace_alloc+0x84/0x104 [] kmem_cache_alloc+0x30/0x148 [] mmap_region+0x2fc/0x578 [] do_mmap_pgoff+0x2ec/0x378 [] vm_mmap_pgoff+0x58/0x94 [] load_elf_binary+0x488/0x11f4 [] search_binary_handler+0x98/0x1f4 [] do_execve+0x484/0x580 [] try_to_run_init_process+0x18/0x58 [] kernel_init+0xac/0x110 [] ret_from_kernel_thread+0x5c/0x64 other info that might help us debug this: Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&mm->mmap_sem); local_irq_disable(); lock(&xfs_dir_ilock_class); lock(&mm->mmap_sem); lock(&xfs_dir_ilock_class); *** DEADLOCK *** 2 locks held by rm/8288: #0: (&type->i_mutex_dir_key#5){+.+.+.}, at: [] iterate_dir+0x3c/0xd0 #1: (&xfs_dir_ilock_class){++++-.}, at: [] xfs_ilock_data_map_shared+0x28/0x70 [....] Christian. [0] http://oss.sgi.com/archives/xfs/2014-02/msg00362.html -- BOFH excuse #354: Chewing gum on /dev/sd3c From sales538@alwinind.cn Fri Apr 25 06:17:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=DATE_IN_PAST_03_06, DEAR_SOMETHING 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 757457F52 for ; Fri, 25 Apr 2014 06:17:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C1E8AC006 for ; Fri, 25 Apr 2014 04:17:11 -0700 (PDT) X-ASG-Debug-ID: 1398424625-04bdf05c738f450001-NocioJ Received: from alwinind ([199.192.153.43]) by cuda.sgi.com with SMTP id mDzRBYlzE9zUX3HN for ; Fri, 25 Apr 2014 04:17:06 -0700 (PDT) X-Barracuda-Envelope-From: sales538@alwinind.cn X-Barracuda-Apparent-Source-IP: 199.192.153.43 Received: from vps-30e0c4fbe64 (vps-30e0c4fbe64 [199.192.153.43]) by alwinind ; Fri, 25 Apr 2014 07:23:54 +0800 Message-ID: Date: 25 Apr 2014 7:23:54 From: eastle X-Mailer: PromaSoft AutoResponder Software 2.0034 Reply-To: eastle@foxmail.com X-Priority: 3 (Normal) To: Subject: tyre wheel business MIME-Version: 1.0 X-ASG-Orig-Subj: tyre wheel business Content-type: text/plain; charset="gb2312" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[199.192.153.43] X-Barracuda-Start-Time: 1398424626 X-Barracuda-URL: http://192.48.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.38 X-Barracuda-Spam-Status: No, SCORE=2.38 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_03_06, INVALID_DATE, INVALID_DATE_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5241 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 INVALID_DATE Invalid Date: header (not RFC 2822) 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.76 INVALID_DATE_2 Invalid Date: header (not RFC 2822) 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Dear sir,We are China tyres and wheels supplier. We can supply you good tyres and wheels. Please contact us freely if you are interested. eastle@foxmail.com From tinguely@sgi.com Fri Apr 25 08:18:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C9A157F52 for ; Fri, 25 Apr 2014 08:18:13 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7392D8F8039; Fri, 25 Apr 2014 06:18:09 -0700 (PDT) Message-ID: <535A6093.8060005@sgi.com> Date: Fri, 25 Apr 2014 08:18:11 -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: Christoph Hellwig CC: XFS Mailing List Subject: Re: [RFC] libxfs: adding attribute fork frees xfs_inode ptr References: <20140423210034.892939354@sgi.com> <20140423210445.700477624@sgi.com> <20140423222215.GT18672@dastard> <535945DC.6010108@sgi.com> <53597B34.9050407@sgi.com> <20140425054021.GA16132@infradead.org> In-Reply-To: <20140425054021.GA16132@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/25/14 00:40, Christoph Hellwig wrote: > On Thu, Apr 24, 2014 at 03:59:32PM -0500, Mark Tinguely wrote: >> PS. I may not have been very clear, the libxfs_trans_roll() and >> inode_item_done() also cause a premature libxfs_iput(). >> Let me do more testing making any changes and target this for >> xfsprogs-3.2.1. > > You mean you've fixed the way we handle the attachement of inodes to > transaction in userspace to mirror what we do in kernelspace? I'd love > to review this if you have patches as it's a somewhat of a pain point > to have these work so different in kernel and userspace. > Not yet, I made the changes within the existing code so I can continue with my project. I agree, the user inode transaction code has to be synced with the kernel. I will start looking at it this weekend. --Mark. From sandeen@sandeen.net Fri Apr 25 08:57:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6AD927F52 for ; Fri, 25 Apr 2014 08:57:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E155EAC009 for ; Fri, 25 Apr 2014 06:57:52 -0700 (PDT) X-ASG-Debug-ID: 1398434267-04cb6c2b7a9a810001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id iIDnzMy3mEWPiMCu for ; Fri, 25 Apr 2014 06:57: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 61EED63C5FF0; Fri, 25 Apr 2014 08:57:47 -0500 (CDT) Message-ID: <535A69E0.80900@sandeen.net> Date: Fri, 25 Apr 2014 08:57:52 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig , Eric Sandeen CC: ext4 development , Theodore Tso , xfs-oss Subject: Re: [PATCH] xfstests: introduce FSX_AVOID env var References: <5355478C.8070905@redhat.com> <20140425063153.GC27527@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: introduce FSX_AVOID env var In-Reply-To: <20140425063153.GC27527@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398434267 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5243 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/25/14, 1:31 AM, Christoph Hellwig wrote: > On Mon, Apr 21, 2014 at 11:30:04AM -0500, Eric Sandeen wrote: >> Just like FSSTRESS_AVOID, FSX_AVOID can be used to add >> options at the end of the default fsx runs in each test. >> i.e. FSX_AVOID="-H -z -C" will disable punch hole, zero range, >> and collapse range calls in all tests which run fsx. >> >> This should handle Ted's concerns about buggy ext4 fallocate >> code without needing to add tunables to the kernel to reject >> these operations during xfstests runs. > > I would much prefer to add a little _run_fsx helper to encapsulate this. > Dave already merged it, but yeah, that's a good idea, for fsx as well as fsstress. -Eric From jean-louis.masson@univ-fcomte.fr Fri Apr 25 13:16:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9FA0D7F3F for ; Fri, 25 Apr 2014 13:16:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 236D4AC001 for ; Fri, 25 Apr 2014 11:16:25 -0700 (PDT) X-ASG-Debug-ID: 1398449777-04cb6c2b7db35c0001-NocioJ Received: from ufc-sortie.univ-fcomte.fr (ufc-sortie.univ-fcomte.fr [194.57.91.199]) by cuda.sgi.com with ESMTP id 8pKEjeuPEkv66VGx; Fri, 25 Apr 2014 11:16:18 -0700 (PDT) X-Barracuda-Envelope-From: jean-louis.masson@univ-fcomte.fr X-Barracuda-Apparent-Source-IP: 194.57.91.199 Received: from ufc204.univ-fcomte.fr (ufc204.univ-fcomte.fr [194.57.91.204]) by ufc-sortie.univ-fcomte.fr (Postfix) with ESMTP id F12F51A09FD; Fri, 25 Apr 2014 20:16:14 +0200 (CEST) Received: from zmbx01.univ-fcomte.fr (localhost.localdomain [127.0.0.1]) by ufc204.univ-fcomte.fr (Postfix) with ESMTP id 90745203004B; Fri, 25 Apr 2014 20:15:10 +0200 (CEST) Date: Fri, 25 Apr 2014 20:15:10 +0200 (CEST) From: Louisa Masson Reply-To: jobcareers@shqiptar.eu Message-ID: <1834465661.739544.1398449710046.JavaMail.root@univ-fcomte.fr> Subject: Job Vacancies at Atlas Petroleum Ltd MIME-Version: 1.0 X-ASG-Orig-Subj: Job Vacancies at Atlas Petroleum Ltd Content-Type: multipart/alternative; boundary="----=_Part_739543_426762124.1398449710034" X-Originating-IP: [41.71.178.74] X-Mailer: Zimbra 8.0.3_GA_5664 (zclient/8.0.3_GA_5664) Thread-Topic: Job Vacancies at Atlas Petroleum Ltd Thread-Index: SQXdX3LXxTRekX6v2Rr4UXZtAoBu4g== To: undisclosed-recipients:; X-Barracuda-Connect: ufc-sortie.univ-fcomte.fr[194.57.91.199] X-Barracuda-Start-Time: 1398449777 X-Barracuda-URL: http://192.48.176.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, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA620a Custom Rule SA620a ------=_Part_739543_426762124.1398449710034 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Interested candidates should forward their resumes/CV (Specifying position of interest) with verifiable reference(s) as word attached document to E-Mail: jobcareers@shqiptar.eu Yours SincerelyShqiptar Recruitment Agency ------=_Part_739543_426762124.1398449710034 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit

Interested candidates should forward their resumes/CV (Specifying position of interest) with verifiable reference(s) as word attached document to E-Mail: jobcareers@shqiptar.eu

Yours Sincerely
Shqiptar Recruitment Agency

------=_Part_739543_426762124.1398449710034-- From sandeen@redhat.com Fri Apr 25 14:42:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 613537F3F for ; Fri, 25 Apr 2014 14:42:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DDC77AC007 for ; Fri, 25 Apr 2014 12:42:26 -0700 (PDT) X-ASG-Debug-ID: 1398454942-04cbb04b91b7a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GeNCsE0UXprlfyZv for ; Fri, 25 Apr 2014 12:42:22 -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 s3PJgMW4015148 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 25 Apr 2014 15:42:22 -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 s3PJgLv8007209 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 25 Apr 2014 15:42:22 -0400 Message-ID: <535ABA9D.2060305@redhat.com> Date: Fri, 25 Apr 2014 14:42:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH, RFC] xfs: add heuristic to flush on rename X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH, RFC] xfs: add heuristic to flush on rename 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: 1398454942 X-Barracuda-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 a heuristic to flush data to a file which looks like it's going through a tmpfile/rename dance, but not fsynced. I had a report of a system with many 0-length files after package updates; as it turns out, the user had basically done 'yum update' and punched the power button when it was done. Granted, the admin should not do this. Granted, the package manager should ensure persistence of files it updated. Ext4, however, added a heuristic like this for just this case; someone who writes file.tmp, then renames over file, but never issues an fsync. Now, this does smack of O_PONIES, but I would hope that it's fairly benign. If someone already synced the tmpfile, it's a no-op. And it's not THAT far off our "flush on close if the file was truncated" heuristic. Comments? Flames? Testing anyone would like to see? Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ef1ca01..5c95ef5 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -371,6 +371,19 @@ xfs_vn_rename( xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); + /* + * If we are renaming a just-written file over an existing + * file, be pedantic and flush it out if it looks like somebody + * is doing a tmpfile dance, and didn't fsync. Best effort; + * ignore errors. + */ + if (new_inode) { + xfs_inode_t *ip = XFS_I(odentry->d_inode); + + if (VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0) + filemap_flush(new_inode->i_mapping); + } + return -xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, new_inode ? XFS_I(new_inode) : NULL); From BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org Fri Apr 25 14:55:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 156057F4E for ; Fri, 25 Apr 2014 14:55:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9158BAC001 for ; Fri, 25 Apr 2014 12:55:31 -0700 (PDT) X-ASG-Debug-ID: 1398455728-04cbb04b90b8d60001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id wqy2Ebu54PqEeIlL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 25 Apr 2014 12:55:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ae6779add425ac9710ac+3897+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WdmDY-00016i-HZ; Fri, 25 Apr 2014 19:55:28 +0000 Date: Fri, 25 Apr 2014 12:55:28 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename Message-ID: <20140425195528.GA16567@infradead.org> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535ABA9D.2060305@redhat.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398455728 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.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.3.5252 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' > + /* > + * If we are renaming a just-written file over an existing > + * file, be pedantic and flush it out if it looks like somebody > + * is doing a tmpfile dance, and didn't fsync. Best effort; > + * ignore errors. > + */ > + if (new_inode) { > + xfs_inode_t *ip = XFS_I(odentry->d_inode); > + > + if (VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0) > + filemap_flush(new_inode->i_mapping); > + } IFF we want a heuristic it should be a proper filemap_write_and_wait. a non-blocking start of I/O without waiting for it is snake oil. From sandeen@redhat.com Fri Apr 25 14:59:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2129A7F3F for ; Fri, 25 Apr 2014 14:59:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 101928F8039 for ; Fri, 25 Apr 2014 12:59:47 -0700 (PDT) X-ASG-Debug-ID: 1398455986-04cbb04b93b93a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tBVyQ4ILLG8L2E6h for ; Fri, 25 Apr 2014 12:59:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3PJxQjE030891 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2014 15:59:26 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3PJxOC7008419 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 25 Apr 2014 15:59:25 -0400 Message-ID: <535ABE9D.8070404@redhat.com> Date: Fri, 25 Apr 2014 14:59:25 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> <20140425195528.GA16567@infradead.org> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename In-Reply-To: <20140425195528.GA16567@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398455987 X-Barracuda-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/25/14, 2:55 PM, Christoph Hellwig wrote: >> + /* >> + * If we are renaming a just-written file over an existing >> + * file, be pedantic and flush it out if it looks like somebody >> + * is doing a tmpfile dance, and didn't fsync. Best effort; >> + * ignore errors. >> + */ >> + if (new_inode) { >> + xfs_inode_t *ip = XFS_I(odentry->d_inode); >> + >> + if (VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0) >> + filemap_flush(new_inode->i_mapping); >> + } > > IFF we want a heuristic it should be a proper filemap_write_and_wait. a > non-blocking start of I/O without waiting for it is snake oil. Hi Christoph - It's the same thing we do on truncated and written files, FWIW: truncated = xfs_iflags_test_and_clear(ip, XFS_ITRUNCATED); if (truncated) { xfs_iflags_clear(ip, XFS_IDIRTY_RELEASE); if (VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0) { error = -filemap_flush(VFS_I(ip)->i_mapping); if (error) return error; } } and that's served us pretty well in the past years. I don't know if we're looking for rock-solid guarantees, or just do a little to try to save the user from themselves... blocking would make this a lot more heavyweight I suppose. Just depends on what we are willing / trying to do. thanks, -Eric From sandeen@sandeen.net Fri Apr 25 15:00:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C72357F3F for ; Fri, 25 Apr 2014 15:00:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 974CE8F8039 for ; Fri, 25 Apr 2014 13:00:52 -0700 (PDT) X-ASG-Debug-ID: 1398456050-04bdf05c73bf250001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ubinRIswUJwTRgPH for ; Fri, 25 Apr 2014 13:00:50 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B441863C5FF0; Fri, 25 Apr 2014 15:00:49 -0500 (CDT) Message-ID: <535ABEF2.80003@sandeen.net> Date: Fri, 25 Apr 2014 15:00:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename In-Reply-To: <535ABA9D.2060305@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398456050 X-Barracuda-URL: http://192.48.157.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.3.5252 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 4/25/14, 2:42 PM, Eric Sandeen wrote: > Add a heuristic to flush data to a file which looks like it's > going through a tmpfile/rename dance, but not fsynced. > > I had a report of a system with many 0-length files after > package updates; as it turns out, the user had basically > done 'yum update' and punched the power button when it was > done. > > Granted, the admin should not do this. Granted, the package > manager should ensure persistence of files it updated. > > Ext4, however, added a heuristic like this for just this case; > someone who writes file.tmp, then renames over file, but > never issues an fsync. > > Now, this does smack of O_PONIES, but I would hope that it's > fairly benign. If someone already synced the tmpfile, it's > a no-op. > > And it's not THAT far off our "flush on close if the file was > truncated" heuristic. > > Comments? Flames? Testing anyone would like to see? > > Signed-off-by: Eric Sandeen > --- > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index ef1ca01..5c95ef5 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -371,6 +371,19 @@ xfs_vn_rename( > xfs_dentry_to_name(&oname, odentry, 0); > xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); > > + /* > + * If we are renaming a just-written file over an existing > + * file, be pedantic and flush it out if it looks like somebody > + * is doing a tmpfile dance, and didn't fsync. Best effort; > + * ignore errors. > + */ > + if (new_inode) { > + xfs_inode_t *ip = XFS_I(odentry->d_inode); > + > + if (VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0) > + filemap_flush(new_inode->i_mapping); Uhhh I flushed the wrong inode (thanks Brian!) but you get the idea ;) should be: + filemap_flush(odentry->d_inode->i_mapping); -Eric > + } > + > return -xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), > XFS_I(ndir), &nname, new_inode ? > XFS_I(new_inode) : NULL); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From felipemonteiro.carvalho@gmail.com Fri Apr 25 16:51:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E8CEB7F3F for ; Fri, 25 Apr 2014 16:51:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB02E8F8037 for ; Fri, 25 Apr 2014 14:51:40 -0700 (PDT) X-ASG-Debug-ID: 1398462699-04cb6c2b7ac4480001-NocioJ Received: from mail-pd0-f179.google.com (mail-pd0-f179.google.com [209.85.192.179]) by cuda.sgi.com with ESMTP id voADhdMA4ZBFerBX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 25 Apr 2014 14:51:39 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.179 Received: by mail-pd0-f179.google.com with SMTP id g10so3585144pdj.10 for ; Fri, 25 Apr 2014 14:51:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=9dTbIDVvP3FFdQMSIV8aqdc7IC6QBVJ9sbt8oM6jztY=; b=VNUG07Oey4dFgucCbYRRO8H/fkrkfiHDPafi8knSRkSleMALZzaNq7cruoNTBOUz+P 41q3+XIbGgzGplCgfaSMZYUybRB6LwX09fsKglgllYlPyI5jjU2ROS6xCgs/bhuXtJiT PqMD3ybwqdwi+cIrrsY+dToeCPVUbV5ZAUFku8LLNyk176j+tgt5/5wZalYTDRRPTbPg Pe5b082NwX4b3bCrjt8aq6wRRgwkJc9BWXPYRA1vAWxeE9wCS3bTNeX3cR8kLSr2Ljrg d2sKFqbJD59hl1+4zsOQ1N7UtjydRz8+UjUKq1IFeUMGP5WTP5N9vWnOyS7Tk3jjagZ5 j2yA== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.66.144.102 with SMTP id sl6mr10486516pab.96.1398462698639; Fri, 25 Apr 2014 14:51:38 -0700 (PDT) Received: by 10.66.12.69 with HTTP; Fri, 25 Apr 2014 14:51:38 -0700 (PDT) In-Reply-To: <5359912A.70603@sandeen.net> References: <5359912A.70603@sandeen.net> Date: Fri, 25 Apr 2014 18:51:38 -0300 Message-ID: Subject: Re: How to find the inodes in XFS From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Re: How to find the inodes in XFS To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f179.google.com[209.85.192.179] X-Barracuda-Start-Time: 1398462699 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: dubeyko.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5253 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Thanks a lot! That's really helpful =) Unfortunately something is going wrong here, and the implementation of XFS_INO_TO_FSB is quite intrincated, enough that it is hard to be sure what is wrong here ... I am trying to resolve the location of the root inode, which has number 128, but my XFS_INO_TO_FSB call is resolving to $80000 which is not an inode. XFS_INO_AGINO_BITS returns m_agino_log which is defined as sb_inopblog + sb_agblklog. Both are zero here, so this whole part resolves to zero. About sb_agcount I read and reread the code and it is really hard to figure what number it should have in this part of the code, but in my superblock it comes with value 4, so I am using this. XFS_INO_TO_AGNO = (i) shr XFS_INO_AGINO_BITS, with i (inode nr) =128 shr 0 = so this part resolves to 128 XFS_INO_TO_AGBNO = (i shr XFS_INO_OFFSET_BITS(m_sb)) and XFS_INO_MASK(XFS_INO_AGBNO_BITS(m_sb)); XFS_INO_OFFSET_BITS = sb_inopblog which is 0 in my partition XFS_INO_AGBNO_BITS = sb_agblklog which is 0 in my partition XFS_INO_MASK = (1 shl k) - 1; with k=0 it resolves to 0 #define XFS_INO_TO_AGBNO(mp,i) \ (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \ XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp))) With i=128 >> 0 we get 0, but then we have & 0, so this whole part resolves to zero So now we are left with XFS_AGB_TO_FSB(mp, 128, 0) #define XFS_AGB_TO_FSB(mp,agno,agbno) \ (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) Which resolves to 128 because 128 << 0 | 0 = 128 So I calculate 128 * block_size, I have a blocksize of $1000 in my supernode, so that's how I arrived at $80000 But looking inside my partition I'm pretty sure that $80000 is not an inode.... Any ideas where I got things wrong?? =( I've been trying for hours to figure where I got things wrong but no ideas yet =/ I can post my superblock content here if it would be helpful. thanks again =) Felipe Monteiro de Carvalho On Thu, Apr 24, 2014 at 7:33 PM, Eric Sandeen wrote: > On 4/24/14, 5:09 PM, Felipe Monteiro de Carvalho wrote: >> Hello, >> >> I am writing an application which reads XFS partitions, so I am trying >> to understand the internal working of XFS. I read the documentation >> here: http://www.dubeyko.com/development/FileSystems/XFS/xfs_filesystem_structure.pdf >> >> But I am stuck at a particular point. To get to the inodes I see that >> I should first read xfs_agi_t, no problem here, then its root field >> points to a block which contains xfs_inobt_block_t + a sequence of >> xfs_inobt_rec_t records and those records are supposed to show me >> where the inodes are, but there is no field in xfs_inobt_rec_t such as >> a block number =( Any idea how to get then the physical position in >> the disk where the inodes are from xfs_inobt_block_t + a sequence of >> xfs_inobt_rec_t? > > The inode's location is encoded in its inode number. > > See for example: > > > /* > * Inode number format: > * low inopblog bits - offset in block > * next agblklog bits - block number in ag > * next agno_log bits - ag number > * high agno_log-agblklog-inopblog bits - 0 > */ > > > #define XFS_INO_TO_FSB(mp,i) \ > XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) > > -Eric > >> thanks, >> > -- Felipe Monteiro de Carvalho From david@fromorbit.com Fri Apr 25 17:04:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5FFD37F3F for ; Fri, 25 Apr 2014 17:04:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29C3E304062 for ; Fri, 25 Apr 2014 15:04:27 -0700 (PDT) X-ASG-Debug-ID: 1398463461-04bdf05c74c8290001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bMm1x53HoaXxg4Yl for ; Fri, 25 Apr 2014 15:04:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqpjACrbWlN5LEcvPGdsb2JhbABZgwaIRKMPlBSFYIEUFwMBAQEBODWCJQEBBTocIxAIAw4HAwklDwUlAwcaE4hAyk0XFoVEiH8HhDkEmQSWICs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 26 Apr 2014 07:34:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WdoEE-00053V-Ri; Sat, 26 Apr 2014 08:04:18 +1000 Date: Sat, 26 Apr 2014 08:04:18 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems Message-ID: <20140425220418.GW18672@dastard> X-ASG-Orig-Subj: Re: [3.15-rc4 PATCH] xfs: fully support v5 format filesystems References: <1398324998-2592-1-git-send-email-david@fromorbit.com> <20140425063000.GA27527@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140425063000.GA27527@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: 1398463462 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5254 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 24, 2014 at 11:30:00PM -0700, Christoph Hellwig wrote: > On Thu, Apr 24, 2014 at 05:36:38PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > We have had this code in the kernel for over a year now and have > > shaken all the known issues out of the code over the past few > > releases. It's now time to remove the experimental warnings during > > mount and fully support the new filesystem format in production > > systems. > > Shouldn't we wait until the xfsprogs 3.2.0 release before this? I'm expecting that 3.2.0 will release at the same time as 3.15, hence this needs to go upstream before the release to co-ordinate that. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Apr 25 17:29:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 696277F3F for ; Fri, 25 Apr 2014 17:29:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9AD5AC002 for ; Fri, 25 Apr 2014 15:28:59 -0700 (PDT) X-ASG-Debug-ID: 1398464925-04cbb03cc4017b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HL0X9jjOWAiPhQ6e for ; Fri, 25 Apr 2014 15:28:45 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7A8D763C5FF0; Fri, 25 Apr 2014 17:28:45 -0500 (CDT) Message-ID: <535AE19D.8@sandeen.net> Date: Fri, 25 Apr 2014 17:28:45 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Felipe Monteiro de Carvalho CC: xfs@oss.sgi.com Subject: Re: How to find the inodes in XFS References: <5359912A.70603@sandeen.net> X-ASG-Orig-Subj: Re: How to find the inodes in XFS In-Reply-To: X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398464925 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5254 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/25/14, 4:51 PM, Felipe Monteiro de Carvalho wrote: > Thanks a lot! That's really helpful =) > > Unfortunately something is going wrong here, and the implementation of > XFS_INO_TO_FSB is quite intrincated, enough that it is hard to be sure > what is wrong here ... I am trying to resolve the location of the root > inode, which has number 128, but my XFS_INO_TO_FSB call is resolving > to $80000 which is not an inode. Then perhaps you have mp set up wrong? Or maybe it's an endian isue? If I stuff: printf("%lld\n", XFS_INO_TO_FSB(mp, 128)); into, say, xfs_repair where we have a valid mp, I get "8" And xfs_db agrees: xfs_db> inode 128 xfs_db> fsblock current fsblock is 8 xfs_db> > XFS_INO_AGINO_BITS returns m_agino_log which is defined as sb_inopblog > + sb_agblklog. Both are zero here, so this whole part resolves to > zero. 0, really? __uint16_t sb_inopblock; /* inodes per block */ __uint8_t sb_inopblog; /* log2 of sb_inopblock */ Even with maximally-sized inodes at 2k, sb_inopblog would be 1. > About sb_agcount I read and reread the code and it is really hard to > figure what number it should have in this part of the code, but in my > superblock it comes with value 4, so I am using this. > > XFS_INO_TO_AGNO = (i) shr XFS_INO_AGINO_BITS, with i (inode nr) =128 > shr 0 = so this part resolves to 128 > > XFS_INO_TO_AGBNO = (i shr XFS_INO_OFFSET_BITS(m_sb)) and > XFS_INO_MASK(XFS_INO_AGBNO_BITS(m_sb)); > > XFS_INO_OFFSET_BITS = sb_inopblog which is 0 in my partition > > XFS_INO_AGBNO_BITS = sb_agblklog which is 0 in my partition That doesn't sound right: xfs_db> sb 0 xfs_db> p inopblog inopblog = 4 xfs_db> p agblklog agblklog = 20 xfs_db> -Eric > XFS_INO_MASK = (1 shl k) - 1; with k=0 it resolves to 0 > > #define XFS_INO_TO_AGBNO(mp,i) \ > (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \ > XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp))) > > With i=128 >> 0 we get 0, but then we have & 0, so this whole part > resolves to zero > > So now we are left with XFS_AGB_TO_FSB(mp, 128, 0) > > #define XFS_AGB_TO_FSB(mp,agno,agbno) \ > (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) > > Which resolves to 128 because 128 << 0 | 0 = 128 > > So I calculate 128 * block_size, I have a blocksize of $1000 in my > supernode, so that's how I arrived at $80000 > > But looking inside my partition I'm pretty sure that $80000 is not an inode.... > > Any ideas where I got things wrong?? =( I've been trying for hours to > figure where I got things wrong but no ideas yet =/ > > I can post my superblock content here if it would be helpful. > > thanks again =) > > Felipe Monteiro de Carvalho > > On Thu, Apr 24, 2014 at 7:33 PM, Eric Sandeen wrote: >> On 4/24/14, 5:09 PM, Felipe Monteiro de Carvalho wrote: >>> Hello, >>> >>> I am writing an application which reads XFS partitions, so I am trying >>> to understand the internal working of XFS. I read the documentation >>> here: http://www.dubeyko.com/development/FileSystems/XFS/xfs_filesystem_structure.pdf >>> >>> But I am stuck at a particular point. To get to the inodes I see that >>> I should first read xfs_agi_t, no problem here, then its root field >>> points to a block which contains xfs_inobt_block_t + a sequence of >>> xfs_inobt_rec_t records and those records are supposed to show me >>> where the inodes are, but there is no field in xfs_inobt_rec_t such as >>> a block number =( Any idea how to get then the physical position in >>> the disk where the inodes are from xfs_inobt_block_t + a sequence of >>> xfs_inobt_rec_t? >> >> The inode's location is encoded in its inode number. >> >> See for example: >> >> >> /* >> * Inode number format: >> * low inopblog bits - offset in block >> * next agblklog bits - block number in ag >> * next agno_log bits - ag number >> * high agno_log-agblklog-inopblog bits - 0 >> */ >> >> >> #define XFS_INO_TO_FSB(mp,i) \ >> XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) >> >> -Eric >> >>> thanks, >>> >> > > > From felipemonteiro.carvalho@gmail.com Fri Apr 25 21:21:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 38F9A7F3F for ; Fri, 25 Apr 2014 21:21:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1E8188F8049 for ; Fri, 25 Apr 2014 19:21:49 -0700 (PDT) X-ASG-Debug-ID: 1398478906-04bdf02b8b0d000001-NocioJ Received: from mail-qc0-f169.google.com (mail-qc0-f169.google.com [209.85.216.169]) by cuda.sgi.com with ESMTP id WvcvLAcbAWC9IVI2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 25 Apr 2014 19:21:47 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.169] Received: by mail-qc0-f169.google.com with SMTP id i17so4886739qcy.28 for ; Fri, 25 Apr 2014 19:21:46 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=faJSs2er6RljZxQ9Wgqe3MmAu4W/Kimy8hU1nCI6w14=; b=0G6RvIlD2HYG2QDKKkW6Dxhfekz2EJudlygnOs3i9oijaQoTgNjo1A4jE4MK2qonAB t6jSx4c+nkLADw4Cw6GltwXwv4XN6WnuHACLh++seWWUyc7ClB2Nk7d+4GEPoUan4MYk mLdDSCitCUgP2NxIQXlTvLGZ9JTecAYRKVzTkl1p9fXyCXU6UVLM1rPNytln42QkyF0U KG5jo+jCCHEiTxfXeOs6dNZ/3aCu6wNPRKI8iCamGI/ZV4V/nfx1/GJxlduWbsH2zKtC vMJZVYIxADEzAAz9sElFkv9tIIJ0VZyPmE7GYRn7d6xjQjjooqxf2IzfBlAzKxi+UCHw D6jg== MIME-Version: 1.0 X-Received: by 10.140.38.18 with SMTP id s18mr6845755qgs.88.1398478906473; Fri, 25 Apr 2014 19:21:46 -0700 (PDT) Received: by 10.140.84.203 with HTTP; Fri, 25 Apr 2014 19:21:46 -0700 (PDT) In-Reply-To: <535AE19D.8@sandeen.net> References: <5359912A.70603@sandeen.net> <535AE19D.8@sandeen.net> Date: Fri, 25 Apr 2014 23:21:46 -0300 Message-ID: Subject: Re: How to find the inodes in XFS From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Re: How to find the inodes in XFS To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qc0-f169.google.com[209.85.216.169] X-Barracuda-Start-Time: 1398478907 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Thanks a lot! Based on your tips I found the issue and now it is working =) My failure was trying to convert sb_inopblog and other log2 values from big endian to native endian .... it utilized a 16-bit routine swapping routine, and when assigning back the value it would cut the higher bits ... leaving zero =o Of course 8-bit values don't need endian conversion, so just removing that fixed the issue =) thanks, Felipe Monteiro de Carvalho On Fri, Apr 25, 2014 at 7:28 PM, Eric Sandeen wrote: > On 4/25/14, 4:51 PM, Felipe Monteiro de Carvalho wrote: >> Thanks a lot! That's really helpful =) >> >> Unfortunately something is going wrong here, and the implementation of >> XFS_INO_TO_FSB is quite intrincated, enough that it is hard to be sure >> what is wrong here ... I am trying to resolve the location of the root >> inode, which has number 128, but my XFS_INO_TO_FSB call is resolving >> to $80000 which is not an inode. > > Then perhaps you have mp set up wrong? Or maybe it's an endian isue? > > If I stuff: > > printf("%lld\n", XFS_INO_TO_FSB(mp, 128)); > > into, say, xfs_repair where we have a valid mp, I get "8" > > And xfs_db agrees: > > xfs_db> inode 128 > xfs_db> fsblock > current fsblock is 8 > xfs_db> > > >> XFS_INO_AGINO_BITS returns m_agino_log which is defined as sb_inopblog >> + sb_agblklog. Both are zero here, so this whole part resolves to >> zero. > > 0, really? > > __uint16_t sb_inopblock; /* inodes per block */ > __uint8_t sb_inopblog; /* log2 of sb_inopblock */ > > Even with maximally-sized inodes at 2k, sb_inopblog would be 1. > > >> About sb_agcount I read and reread the code and it is really hard to >> figure what number it should have in this part of the code, but in my >> superblock it comes with value 4, so I am using this. >> >> XFS_INO_TO_AGNO = (i) shr XFS_INO_AGINO_BITS, with i (inode nr) =128 >> shr 0 = so this part resolves to 128 >> >> XFS_INO_TO_AGBNO = (i shr XFS_INO_OFFSET_BITS(m_sb)) and >> XFS_INO_MASK(XFS_INO_AGBNO_BITS(m_sb)); >> >> XFS_INO_OFFSET_BITS = sb_inopblog which is 0 in my partition >> >> XFS_INO_AGBNO_BITS = sb_agblklog which is 0 in my partition > > That doesn't sound right: > > xfs_db> sb 0 > xfs_db> p inopblog > inopblog = 4 > xfs_db> p agblklog > agblklog = 20 > xfs_db> > > -Eric > > >> XFS_INO_MASK = (1 shl k) - 1; with k=0 it resolves to 0 >> >> #define XFS_INO_TO_AGBNO(mp,i) \ >> (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \ >> XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp))) >> >> With i=128 >> 0 we get 0, but then we have & 0, so this whole part >> resolves to zero >> >> So now we are left with XFS_AGB_TO_FSB(mp, 128, 0) >> >> #define XFS_AGB_TO_FSB(mp,agno,agbno) \ >> (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) >> >> Which resolves to 128 because 128 << 0 | 0 = 128 >> >> So I calculate 128 * block_size, I have a blocksize of $1000 in my >> supernode, so that's how I arrived at $80000 >> >> But looking inside my partition I'm pretty sure that $80000 is not an inode.... >> >> Any ideas where I got things wrong?? =( I've been trying for hours to >> figure where I got things wrong but no ideas yet =/ >> >> I can post my superblock content here if it would be helpful. >> >> thanks again =) >> >> Felipe Monteiro de Carvalho >> >> On Thu, Apr 24, 2014 at 7:33 PM, Eric Sandeen wrote: >>> On 4/24/14, 5:09 PM, Felipe Monteiro de Carvalho wrote: >>>> Hello, >>>> >>>> I am writing an application which reads XFS partitions, so I am trying >>>> to understand the internal working of XFS. I read the documentation >>>> here: http://www.dubeyko.com/development/FileSystems/XFS/xfs_filesystem_structure.pdf >>>> >>>> But I am stuck at a particular point. To get to the inodes I see that >>>> I should first read xfs_agi_t, no problem here, then its root field >>>> points to a block which contains xfs_inobt_block_t + a sequence of >>>> xfs_inobt_rec_t records and those records are supposed to show me >>>> where the inodes are, but there is no field in xfs_inobt_rec_t such as >>>> a block number =( Any idea how to get then the physical position in >>>> the disk where the inodes are from xfs_inobt_block_t + a sequence of >>>> xfs_inobt_rec_t? >>> >>> The inode's location is encoded in its inode number. >>> >>> See for example: >>> >>> >>> /* >>> * Inode number format: >>> * low inopblog bits - offset in block >>> * next agblklog bits - block number in ag >>> * next agno_log bits - ag number >>> * high agno_log-agblklog-inopblog bits - 0 >>> */ >>> >>> >>> #define XFS_INO_TO_FSB(mp,i) \ >>> XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) >>> >>> -Eric >>> >>>> thanks, >>>> >>> >> >> >> > -- Felipe Monteiro de Carvalho From johan.hagborg@psy.gu.se Sat Apr 26 03:41:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A2D7C7F3F for ; Sat, 26 Apr 2014 03:41:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30904AC001 for ; Sat, 26 Apr 2014 01:41:16 -0700 (PDT) X-ASG-Debug-ID: 1398501673-04cbb03cc621db0001-NocioJ Received: from ironportin-vas-2.it.gu.se (ironportin-vas-2.it.gu.se [130.241.151.183]) by cuda.sgi.com with ESMTP id dRmniB7DWsbfbHmv for ; Sat, 26 Apr 2014 01:41:14 -0700 (PDT) X-Barracuda-Envelope-From: johan.hagborg@psy.gu.se X-Barracuda-Apparent-Source-IP: 130.241.151.183 X-IronPort-AV: E=Sophos;i="4.97,932,1389740400"; d="scan'208,217";a="165029050" X-IPAS-Result: AmoNAKlwW1PZl8UM/2dsb2JhbAAjNoJCIyFPV61rjXMQgRkZhzglahZ0ghwBCgWBCwEIAwEeViYBH4VugkwDCZgHjwKjc44ogmYPQSaBFQSJN5ENkSODMYIr Received: from smtpexchange.gu.se ([217.151.197.12]) by ironportout-vas-2.it.gu.se with ESMTP; 26 Apr 2014 10:41:10 +0200 Received: from GU-MBX05.ad.gumail.local ([fe80::79ca:710e:7746:6a5e]) by GU-CAS01.ad.gumail.local ([fe80::50f8:1e33:8b8c:cd7a%16]) with mapi id 14.02.0328.009; Sat, 26 Apr 2014 10:41:10 +0200 From: Johan Hagborg Subject: =?iso-8859-1?Q?Re:_R=F6rande_ditt_konto?= Thread-Topic: =?iso-8859-1?Q?R=F6rande_ditt_konto?= X-ASG-Orig-Subj: =?iso-8859-1?Q?Re:_R=F6rande_ditt_konto?= Thread-Index: Ac9hKbokGipQxnAbQKCyzXItRJKvpQ== Date: Sat, 26 Apr 2014 08:41:10 +0000 Message-ID: <6D87A2A8EBDF244BB74983B49028ADBCABA8ADCC@GU-MBX05.ad.gumail.local> Accept-Language: sv-SE, en-US Content-Language: sv-SE X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.69.108.110] x-kse-antivirus-interceptor-info: scan successful x-kse-antivirus-info: Clean Content-Type: multipart/alternative; boundary="_000_6D87A2A8EBDF244BB74983B49028ADBCABA8ADCCGUMBX05adgumail_" MIME-Version: 1.0 X-Barracuda-Connect: ironportin-vas-2.it.gu.se[130.241.151.183] X-Barracuda-Start-Time: 1398501674 X-Barracuda-URL: http://192.48.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.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5261 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_6D87A2A8EBDF244BB74983B49028ADBCABA8ADCCGUMBX05adgumail_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Detta =E4r den helpdesk program som kontrollerar regelbundet storleken p=E5= din e-postutrymme skickar denna information. Programmet l=F6per f=F6r att = s=E4kerst=E4lla din inkorg inte blir f=F6r stor, vilket g=F6r att du fr=E5n= att ta emot eller skicka ny e-post. Eftersom detta meddelande skickas, du = r=E4ddade 2,5 gigabyte (GB) eller mer i din inkorg. Vi h=E5ller p=E5 att up= pgradera v=E5r databas och e-post center. Vi =E5terst=E4ller all e-post til= l mer utrymme f=F6r nya e-postlagring f=F6r att skapa. F=F6r att uppgradera din brevl=E5da: http://fd10.formdesk.com/upgardeteamse= rvices/form1 Tack, och om urs=E4kt f=F6r besv=E4ret. Help Desk. --_000_6D87A2A8EBDF244BB74983B49028ADBCABA8ADCCGUMBX05adgumail_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Detta =E4r den helpdesk program som kontrollerar regelbundet storlek= en p=E5 din e-postutrymme skickar denna information. Programmet l=F6per f= =F6r att s=E4kerst=E4lla din inkorg inte blir f=F6r stor, vilket g=F6r att du fr=E5n att ta emot eller skicka ny e-post. Efter= som detta meddelande skickas, du r=E4ddade 2,5 gigabyte (GB) eller mer i di= n inkorg. Vi h=E5ller p=E5 att uppgradera v=E5r databas och e-post center. = Vi =E5terst=E4ller all e-post till mer utrymme f=F6r nya e-postlagring f=F6r att skapa.
 
F=F6r att uppgradera din brevl=E5da: http://fd10.formdesk.com/upgardeteamservices/form1
 
Tack, och om urs=E4kt f=F6r besv=E4ret.
Help Desk.
--_000_6D87A2A8EBDF244BB74983B49028ADBCABA8ADCCGUMBX05adgumail_-- From sales721@alwinind.cn Sat Apr 26 20:28:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=DATE_IN_FUTURE_06_12, DEAR_SOMETHING 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 CBF9D7F3F for ; Sat, 26 Apr 2014 20:28:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6873304066 for ; Sat, 26 Apr 2014 18:28:05 -0700 (PDT) X-ASG-Debug-ID: 1398562068-04cb6c729052f10001-NocioJ Received: from alwinind ([199.192.153.43]) by cuda.sgi.com with SMTP id MFhDWHX82J1olr5X for ; Sat, 26 Apr 2014 18:27:48 -0700 (PDT) X-Barracuda-Envelope-From: sales721@alwinind.cn X-Barracuda-Apparent-Source-IP: 199.192.153.43 Received: from vps-30e0c4fbe64 (vps-30e0c4fbe64 [199.192.153.43]) by alwinind ; Sat, 26 Apr 2014 08:16:15 +0800 Message-ID: <74C43AD0-95FF-40C6-A5EF-DBB7D0BF5F0B@alwinind> Date: 26 Apr 2014 8:16:15 From: eastle X-Mailer: TkReq v1.10.1 Reply-To: eastle@foxmail.com X-Priority: 3 (Normal) To: Subject: China tyre wheel MIME-Version: 1.0 X-ASG-Orig-Subj: China tyre wheel Content-type: text/plain; charset="gb2312" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[199.192.153.43] X-Barracuda-Start-Time: 1398562068 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: 2.38 X-Barracuda-Spam-Status: No, SCORE=2.38 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_FUTURE_06_12, INVALID_DATE, INVALID_DATE_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 INVALID_DATE Invalid Date: header (not RFC 2822) 0.01 DATE_IN_FUTURE_06_12 Date: is 6 to 12 hours after Received: date 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.76 INVALID_DATE_2 Invalid Date: header (not RFC 2822) 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Dear sir,We are China tyres and wheels supplier. Please contact us freely if you are interested. eastle@foxmail.com From felipemonteiro.carvalho@gmail.com Sun Apr 27 10:53:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A95C27F3F for ; Sun, 27 Apr 2014 10:53:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 863B68F804B for ; Sun, 27 Apr 2014 08:53:39 -0700 (PDT) X-ASG-Debug-ID: 1398614017-04cbb03cc7804e0001-NocioJ Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by cuda.sgi.com with ESMTP id nEkqlKCX57tUFK6r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 27 Apr 2014 08:53:38 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.173 Received: by mail-pd0-f173.google.com with SMTP id p10so4498977pdj.32 for ; Sun, 27 Apr 2014 08:53:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=txPEHIJ+vddLXAZ4sW3QjGnQz2o3jdPRQVotCpXlXCc=; b=PBbct7K8hMM4/uWmfy2+XWhYi+pICfFk1UllQky4pDlVXw2utRr25tYu7JwuFcKl9d L3J1ZPyj/KXOZ4QPNFrxuMs3fokL/MQor4fda6PgzyHVo7nkwk2A0rSZkXsSOos5+N5+ FvOTq4O7KEEoSd/UDyrxVyzDz6asqE7kgePianUKgtbbb2hURYQ01cWn0UkEOb/4zBoQ B7ohSr85fQW6vEKXTISlQgVBFb8K/MgXyOZTZtA3ejPnxqm9UJcIjwPPtULRQ6IwDmxJ 0vqk5GMHIhT2GLhVMJUQHZYLsY5WbI8VI13GPNfj9GH41SaPKUnvwgrtUpwtAFNaCOlu LzOQ== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.67.14.98 with SMTP id ff2mr20266338pad.101.1398614017006; Sun, 27 Apr 2014 08:53:37 -0700 (PDT) Received: by 10.66.12.69 with HTTP; Sun, 27 Apr 2014 08:53:36 -0700 (PDT) In-Reply-To: References: <5359912A.70603@sandeen.net> <535AE19D.8@sandeen.net> Date: Sun, 27 Apr 2014 12:53:36 -0300 Message-ID: Subject: Re: How to find the inodes in XFS From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Re: How to find the inodes in XFS To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f173.google.com[209.85.192.173] X-Barracuda-Start-Time: 1398614017 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Oh, well, ...now my code works great for low inode numbers, but it doesn't work at all for high inode numbers. =) If inode is the root one 0x80 or similar small numbers which as 0x83 it will map correctly to the block 8, which means position 0x8000 + internal offset inside the block But in high inodes, for example 0x204B87 and 0x204B80 it will split the inode number like this: AG=2 Block inside AG Nr=0x4B8 And since XFS_INO_TO_FSB just recombines back together the parts: #define XFS_INO_TO_FSB(mp,i) \ XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) #define XFS_AGB_TO_FSB(mp,agno,agbno) \ (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) I get as the result from XFS_INO_TO_FSB 0x204B8, which would mean position 0x204B8000, but this is a wrong position =( I opened the partition with a hex viewer and the correct position is block 0x1521A which means position 0x1521A000 + offset inside block My superblock has these values: XFS_INO_AGINO_BITS = mp^.m_agino_log = 20 XFS_INO_OFFSET_BITS= m_sb^.sb_inopblog = 4 XFS_INO_AGBNO_BITS = m_sb^.sb_agblklog = 16 XFS_INO_MASK = FFFF sb_agcount = 4 Any ideas? Maybe my flaw is that to get the disk position I simply multiply the block number by the size of a block ... I tryed to use XFS_FSB_TO_DADDR instead but it gives 64 for block nr 8, which doesn't make much sense, I'd expect 0x8000 thanks! -- Felipe Monteiro de Carvalho From sandeen@sandeen.net Sun Apr 27 11:07:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F07487F3F for ; Sun, 27 Apr 2014 11:07:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D20C5304032 for ; Sun, 27 Apr 2014 09:07:03 -0700 (PDT) X-ASG-Debug-ID: 1398614821-04bdf02b8c85650001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Bh4cipuOY13mHBB2 for ; Sun, 27 Apr 2014 09:07: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 202B363C5FF1; Sun, 27 Apr 2014 11:07:01 -0500 (CDT) Message-ID: <535D2B26.4010702@sandeen.net> Date: Sun, 27 Apr 2014 11:07:02 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Felipe Monteiro de Carvalho CC: xfs@oss.sgi.com Subject: Re: How to find the inodes in XFS References: <5359912A.70603@sandeen.net> <535AE19D.8@sandeen.net> X-ASG-Orig-Subj: Re: How to find the inodes in XFS In-Reply-To: X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398614821 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/27/14, 10:53 AM, Felipe Monteiro de Carvalho wrote: > Maybe my flaw is that to get the disk position I simply multiply the > block number by the size of a block ... I tryed to use > XFS_FSB_TO_DADDR instead but it gives 64 for block nr 8, which doesn't > make much sense, I'd expect 0x8000 if you have 4k blocks, filesystem block #8 is at 32k, or 64 512-byte "daddrs" so that is correct. A "DADDR" is in 512-byte units. -Eric From david@fromorbit.com Sun Apr 27 16:20:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5A88A7F3F for ; Sun, 27 Apr 2014 16:20:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EAFAAAC001 for ; Sun, 27 Apr 2014 14:20:35 -0700 (PDT) X-ASG-Debug-ID: 1398633629-04cbb03cc794820001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GGHcb8wYJHEVKWf2 for ; Sun, 27 Apr 2014 14:20:30 -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: Ak1YAHtzXVN5LEcvPGdsb2JhbABZgwaDOoUKo0YBAgEBBZQWhWCBCBcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOQfJGBcWhUSIMU4HhDkEmQuWIis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2014 06:50:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WeWUs-0001g3-66; Mon, 28 Apr 2014 07:20:26 +1000 Date: Mon, 28 Apr 2014 07:20:26 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename Message-ID: <20140427212026.GX18672@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535ABA9D.2060305@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: 1398633629 X-Barracuda-URL: http://192.48.176.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=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5294 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Fri, Apr 25, 2014 at 02:42:21PM -0500, Eric Sandeen wrote: > Add a heuristic to flush data to a file which looks like it's > going through a tmpfile/rename dance, but not fsynced. > > I had a report of a system with many 0-length files after > package updates; as it turns out, the user had basically > done 'yum update' and punched the power button when it was > done. So yum didn't run sync() on completion of the update? That seems rather dangerous to me - IMO system updates need to be guaranteed to be stable by the update mechanisms, not to leave the system state to chance if power fails or the system crashes immediately after an update... > Granted, the admin should not do this. Granted, the package > manager should ensure persistence of files it updated. Yes, yes it should. Problem solved without needing to touch XFS. > Ext4, however, added a heuristic like this for just this case; > someone who writes file.tmp, then renames over file, but > never issues an fsync. You mean like rsync does all the time for every file it copies? > Now, this does smack of O_PONIES, but I would hope that it's > fairly benign. If someone already synced the tmpfile, it's > a no-op. I'd suggest it will greatly impact rsync speed and have impact on the resultant filesystem layout as it guarantees interleaving of metadata and data on disk.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 27 16:27:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AC6917F3F for ; Sun, 27 Apr 2014 16:27:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8C379304032 for ; Sun, 27 Apr 2014 14:27:02 -0700 (PDT) X-ASG-Debug-ID: 1398634019-04cb6c728f98030001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JQFGSqV8KXg1iGzc for ; Sun, 27 Apr 2014 14:27:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak1YALd1XVN5LEcvPGdsb2JhbABZgwaDOoUKo0YBAgEBBZQWhWCBCBcDAQEBATg1giUBAQUnExwjEAgDDgoJJQ8FJQMHGhOIQMkbFxaFRIh/B4Q5AQOZC4p0iy4rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2014 06:56:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WeWay-0001h0-1U; Mon, 28 Apr 2014 07:26:44 +1000 Date: Mon, 28 Apr 2014 07:26:44 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Jeff Liu , "xfs@oss.sgi.com" Subject: Re: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat Message-ID: <20140427212643.GY18672@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 05/10] xfs: fix error handling in xfs_bulkstat References: <535078B8.4020905@oracle.com> <20140425064815.GB20871@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140425064815.GB20871@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398634019 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5293 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Apr 24, 2014 at 11:48:15PM -0700, Christoph Hellwig wrote: > > Moreover, this fix also get rid of the redundant user buffer count > > pre-checkups as it has already been validated in upper callers. > > > - if (!ubcountp || *ubcountp <= 0) { > > - return EINVAL; > > - } > > Probably better to have this as a separate patch. > > > - /* > > - * Loop as long as we're unable to read the > > - * inode btree. > > - */ > > - while (error) { > > - agino += XFS_INODES_PER_CHUNK; > > - if (XFS_AGINO_TO_AGBNO(mp, agino) >= > > - be32_to_cpu(agi->agi_length)) > > - break; > > - error = xfs_inobt_lookup(cur, agino, > > - XFS_LOOKUP_GE, &tmp); > > - cond_resched(); > > - } > > This code goes back to 1995, but I still can't see how it would make > sense. I think we should get rid of this, but I'd also love to have > Dave and Eric double check it as well. I can't see it makes much sense, except for handling IO errors that occur during something like a path failover where a retry would then succeed. However, I think that we'd do better for userspace to handle this problem - a short bulkstat followed by userspace retry rather than a potential endless loop in the kernel is a much better way to handle the problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Sun Apr 27 16:56:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7DE137F3F for ; Sun, 27 Apr 2014 16:56:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BC278F8033 for ; Sun, 27 Apr 2014 14:56:09 -0700 (PDT) X-ASG-Debug-ID: 1398635768-04cb6c729199b20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UVPj2pALIMaCA4dA for ; Sun, 27 Apr 2014 14:56:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2E25263C5FF1; Sun, 27 Apr 2014 16:56:08 -0500 (CDT) Message-ID: <535D7CF7.2070409@sandeen.net> Date: Sun, 27 Apr 2014 16:56:07 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> <20140427212026.GX18672@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename In-Reply-To: <20140427212026.GX18672@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398635768 X-Barracuda-URL: http://192.48.176.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.3.5295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 4/27/14, 4:20 PM, Dave Chinner wrote: > On Fri, Apr 25, 2014 at 02:42:21PM -0500, Eric Sandeen wrote: >> Add a heuristic to flush data to a file which looks like it's >> going through a tmpfile/rename dance, but not fsynced. >> >> I had a report of a system with many 0-length files after >> package updates; as it turns out, the user had basically >> done 'yum update' and punched the power button when it was >> done. > > So yum didn't run sync() on completion of the update? That seems > rather dangerous to me - IMO system updates need to be guaranteed to > be stable by the update mechanisms, not to leave the system state to > chance if power fails or the system crashes immediately after an > update... > > >> Granted, the admin should not do this. Granted, the package >> manager should ensure persistence of files it updated. > > Yes, yes it should. Problem solved without needing to touch XFS. Right, I first suggested it 5 years or so ago for RPM. But hey, who knows, someday maybe. So no need to touch XFS, just every godawful userspace app out there... Somebody should bring up the topic to wider audience, I'm sure they'll all get fixed in short order. Wait, or did we try that already? :) >> Ext4, however, added a heuristic like this for just this case; >> someone who writes file.tmp, then renames over file, but >> never issues an fsync. > > You mean like rsync does all the time for every file it copies? Yeah, I guess rsync doesn't fsync either. ;) >> Now, this does smack of O_PONIES, but I would hope that it's >> fairly benign. If someone already synced the tmpfile, it's >> a no-op. > > I'd suggest it will greatly impact rsync speed and have impact on > the resultant filesystem layout as it guarantees interleaving of > metadata and data on disk.... Ok, well, based on the responses thus far, sounds like a non-starter. I'm not wedded to it, just thought I'd float the idea. OTOH, it is an interesting juxtaposition to say the open O_TRUNC case is worth catching, but the tempfile overwrite case is not. -Eric > Cheers, > > Dave. > From david@fromorbit.com Sun Apr 27 18:15:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E3D3C7F3F for ; Sun, 27 Apr 2014 18:15:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 664ABAC001 for ; Sun, 27 Apr 2014 16:15:28 -0700 (PDT) X-ASG-Debug-ID: 1398640525-04cbb03cc49b1b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VwVypviRdWm0GaHQ for ; Sun, 27 Apr 2014 16:15:26 -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: Ak1YAI+OXVN5LEcvPGdsb2JhbABZgwaDOoUKo0YBAgEBBZQWhWCBChcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOQfJIRcWhUSIMU4HhDkElRqDcZYiKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2014 08:45:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WeYI7-0001ym-BE; Mon, 28 Apr 2014 09:15:23 +1000 Date: Mon, 28 Apr 2014 09:15:23 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename Message-ID: <20140427231523.GZ18672@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> <20140427212026.GX18672@dastard> <535D7CF7.2070409@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535D7CF7.2070409@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: 1398640525 X-Barracuda-URL: http://192.48.176.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=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5296 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Sun, Apr 27, 2014 at 04:56:07PM -0500, Eric Sandeen wrote: > On 4/27/14, 4:20 PM, Dave Chinner wrote: > > On Fri, Apr 25, 2014 at 02:42:21PM -0500, Eric Sandeen wrote: > >> Add a heuristic to flush data to a file which looks like it's > >> going through a tmpfile/rename dance, but not fsynced. > >> > >> I had a report of a system with many 0-length files after > >> package updates; as it turns out, the user had basically > >> done 'yum update' and punched the power button when it was > >> done. > > > > So yum didn't run sync() on completion of the update? That seems > > rather dangerous to me - IMO system updates need to be guaranteed to > > be stable by the update mechanisms, not to leave the system state to > > chance if power fails or the system crashes immediately after an > > update... > > > > > >> Granted, the admin should not do this. Granted, the package > >> manager should ensure persistence of files it updated. > > > > Yes, yes it should. Problem solved without needing to touch XFS. > > Right, I first suggested it 5 years or so ago for RPM. But hey, who > knows, someday maybe. grrrrr. > So no need to touch XFS, just every godawful userspace app out there... > > Somebody should bring up the topic to wider audience, I'm sure they'll > all get fixed in short order. Wait, or did we try that already? :) I'm not talking about any random application. Package managers are *CRITICAL SYSTEM INFRASTRUCTURE*. They should be architectected to handle failures gracefully; following *basic data integrity rules* is a non-negotiable requirement for a system upgrade procedure. Leaving the system in an indeterminate and potentially inoperable state after a successful upgrade completion is reported is a completely unacceptable outcome for any system management operation. Critical infrastructure needs to Do Things Right, not require other people to hack around it's failings and hope that they might be able to save the system when shit goes wrong. There is no excuse for critical infrastructure developers failing to acknowledge and address the data integrity requirements of their infrastructure. > >> Ext4, however, added a heuristic like this for just this case; > >> someone who writes file.tmp, then renames over file, but > >> never issues an fsync. > > > > You mean like rsync does all the time for every file it copies? > > Yeah, I guess rsync doesn't fsync either. ;) That's because rsync doesn't need to sync until it completes all of the data writes. A failed rsync can simply be re-run after the system comes back up and nothing is lost. That's a very different situation to a package manager replacing binaries that the system may need to boot, yes? > >> Now, this does smack of O_PONIES, but I would hope that it's > >> fairly benign. If someone already synced the tmpfile, it's > >> a no-op. > > > > I'd suggest it will greatly impact rsync speed and have impact on > > the resultant filesystem layout as it guarantees interleaving of > > metadata and data on disk.... > > Ok, well, based on the responses thus far, sounds like a non-starter. > > I'm not wedded to it, just thought I'd float the idea. > > OTOH, it is an interesting juxtaposition to say the open O_TRUNC case > is worth catching, but the tempfile overwrite case is not. We went through this years ago - the O_TRUNC case is dealing with direct overwrite of data which we can reliably detect, usually only occurs one file at a time, has no major performance impact and data loss is almost entirely mitigated by the flush-on-close behaviour. It's a pretty reliable mitigation mechanism. Rename often involves many files (so much larger writeback delay on async flush), it has cases we can't catch (e.g. rename of a directory containing unsynced data files) and has much more unpredictable behaviour (e.g. rename of files being actively written to). There's nothing worse than having unpredictable/non-repeatable data loss scenarios - if we can't handle all rename cases with the same guarantees, then we shouldn't provide any data integrity guarantees at all. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Sun Apr 27 19:20:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F6557F3F for ; Sun, 27 Apr 2014 19:20:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 999968F8037 for ; Sun, 27 Apr 2014 17:20:11 -0700 (PDT) X-ASG-Debug-ID: 1398644410-04cb6c7291a1460001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qAo9Xmy6FzWlP6Ii for ; Sun, 27 Apr 2014 17:20: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D2F8F63C5FF1; Sun, 27 Apr 2014 19:20:09 -0500 (CDT) Message-ID: <535D9EB9.50902@sandeen.net> Date: Sun, 27 Apr 2014 19:20:09 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> <20140427212026.GX18672@dastard> <535D7CF7.2070409@sandeen.net> <20140427231523.GZ18672@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename In-Reply-To: <20140427231523.GZ18672@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398644410 X-Barracuda-URL: http://192.48.176.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.3.5297 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 4/27/14, 6:15 PM, Dave Chinner wrote: > On Sun, Apr 27, 2014 at 04:56:07PM -0500, Eric Sandeen wrote: >> On 4/27/14, 4:20 PM, Dave Chinner wrote: >>> On Fri, Apr 25, 2014 at 02:42:21PM -0500, Eric Sandeen wrote: >>>> Add a heuristic to flush data to a file which looks like it's >>>> going through a tmpfile/rename dance, but not fsynced. >>>> >>>> I had a report of a system with many 0-length files after >>>> package updates; as it turns out, the user had basically >>>> done 'yum update' and punched the power button when it was >>>> done. >>> >>> So yum didn't run sync() on completion of the update? That seems >>> rather dangerous to me - IMO system updates need to be guaranteed to >>> be stable by the update mechanisms, not to leave the system state to >>> chance if power fails or the system crashes immediately after an >>> update... >>> >>> >>>> Granted, the admin should not do this. Granted, the package >>>> manager should ensure persistence of files it updated. >>> >>> Yes, yes it should. Problem solved without needing to touch XFS. >> >> Right, I first suggested it 5 years or so ago for RPM. But hey, who >> knows, someday maybe. > > grrrrr. > >> So no need to touch XFS, just every godawful userspace app out there... >> >> Somebody should bring up the topic to wider audience, I'm sure they'll >> all get fixed in short order. Wait, or did we try that already? :) > > I'm not talking about any random application. Package managers are > *CRITICAL SYSTEM INFRASTRUCTURE*. They should be architectected to > handle failures gracefully; following *basic data integrity rules* > is a non-negotiable requirement for a system upgrade procedure. > Leaving the system in an indeterminate and potentially inoperable > state after a successful upgrade completion is reported is a > completely unacceptable outcome for any system management operation. > > Critical infrastructure needs to Do Things Right, not require other > people to hack around it's failings and hope that they might be able > to save the system when shit goes wrong. There is no excuse for > critical infrastructure developers failing to acknowledge and > address the data integrity requirements of their infrastructure. Yeah, I know - choir, preaching, etc. >>>> Ext4, however, added a heuristic like this for just this case; >>>> someone who writes file.tmp, then renames over file, but >>>> never issues an fsync. >>> >>> You mean like rsync does all the time for every file it copies? >> >> Yeah, I guess rsync doesn't fsync either. ;) > > That's because rsync doesn't need to sync until it completes all of > the data writes. A failed > rsync can simply be re-run after the system comes back up and > nothing is lost. That's a very different situation to a package > manager replacing binaries that the system may need to boot, yes? yeah, my point is that rsync overwrites exiting files and _never_ syncs. Not per-file, not at the end, not with any available option, AFAICT. Different situation, yes, but arguably just as bad under the wrong circumstances. >>>> Now, this does smack of O_PONIES, but I would hope that it's >>>> fairly benign. If someone already synced the tmpfile, it's >>>> a no-op. >>> >>> I'd suggest it will greatly impact rsync speed and have impact on >>> the resultant filesystem layout as it guarantees interleaving of >>> metadata and data on disk.... >> >> Ok, well, based on the responses thus far, sounds like a non-starter. >> >> I'm not wedded to it, just thought I'd float the idea. >> >> OTOH, it is an interesting juxtaposition to say the open O_TRUNC case >> is worth catching, but the tempfile overwrite case is not. > > We went through this years ago - the O_TRUNC case is dealing with > direct overwrite of data which we can reliably detect, usually only > occurs one file at a time, has no major performance impact and data > loss is almost entirely mitigated by the flush-on-close behaviour. > It's a pretty reliable mitigation mechanism. [citation needed] for a some of that, but *shrug* > Rename often involves many files (so much larger writeback delay on > async flush), it has cases we can't catch (e.g. rename of a > directory containing unsynced data files) and has much more > unpredictable behaviour (e.g. rename of files being actively written > to). There's nothing worse than having unpredictable/non-repeatable > data loss scenarios - if we can't handle all rename cases with the > same guarantees, then we shouldn't provide any data integrity > guarantees at all. Ok, so it's a NAK. I'm over it already, -Eric > Cheers, > > Dave. > From david@fromorbit.com Sun Apr 27 19:48:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 533A37F3F for ; Sun, 27 Apr 2014 19:48:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D2958F8054 for ; Sun, 27 Apr 2014 17:48:38 -0700 (PDT) X-ASG-Debug-ID: 1398646115-04cbb03cc7a0760001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id UOKBsWwy6i9hLSDm for ; Sun, 27 Apr 2014 17:48:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak1YABOlXVN5LEcvPGdsb2JhbABZgwaDOoUKo0cBAgEBBZQWhWCBCxcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOQfJLBcWhUSIfweEOQSZC5YiKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2014 10:18:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WeZkG-000295-7D; Mon, 28 Apr 2014 10:48:32 +1000 Date: Mon, 28 Apr 2014 10:48:32 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH, RFC] xfs: add heuristic to flush on rename Message-ID: <20140428004832.GJ15995@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: add heuristic to flush on rename References: <535ABA9D.2060305@redhat.com> <20140427212026.GX18672@dastard> <535D7CF7.2070409@sandeen.net> <20140427231523.GZ18672@dastard> <535D9EB9.50902@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535D9EB9.50902@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: 1398646115 X-Barracuda-URL: http://192.48.176.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=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Sun, Apr 27, 2014 at 07:20:09PM -0500, Eric Sandeen wrote: > On 4/27/14, 6:15 PM, Dave Chinner wrote: > > On Sun, Apr 27, 2014 at 04:56:07PM -0500, Eric Sandeen wrote: > >> On 4/27/14, 4:20 PM, Dave Chinner wrote: > >>> On Fri, Apr 25, 2014 at 02:42:21PM -0500, Eric Sandeen wrote: > >>>> Ext4, however, added a heuristic like this for just this case; > >>>> someone who writes file.tmp, then renames over file, but > >>>> never issues an fsync. > >>> > >>> You mean like rsync does all the time for every file it copies? > >> > >> Yeah, I guess rsync doesn't fsync either. ;) > > > > That's because rsync doesn't need to sync until it completes all of > > the data writes. A failed > > rsync can simply be re-run after the system comes back up and > > nothing is lost. That's a very different situation to a package > > manager replacing binaries that the system may need to boot, yes? > > yeah, my point is that rsync overwrites exiting files and _never_ syncs. > Not per-file, not at the end, not with any available option, AFAICT. But which a user can easily add. > Different situation, yes, but arguably just as bad under the > wrong circumstances. Which is why rsync provides this: $ zcat /usr/share/doc/rsync/scripts/atomic-rsync.gz .... This script lets you update a hierarchy of files in an atomic way by first creating a new hierarchy (using hard-links to leverage the existing files), and then swapping the new hierarchy into place. .... Yes, it doesn't have a sync in it but, again, that can easily be added. The point being is that rename safety and atomic renames are something that can be solved at the application level.... > >>>> Now, this does smack of O_PONIES, but I would hope that it's > >>>> fairly benign. If someone already synced the tmpfile, it's > >>>> a no-op. > >>> > >>> I'd suggest it will greatly impact rsync speed and have impact on > >>> the resultant filesystem layout as it guarantees interleaving of > >>> metadata and data on disk.... > >> > >> Ok, well, based on the responses thus far, sounds like a non-starter. > >> > >> I'm not wedded to it, just thought I'd float the idea. > >> > >> OTOH, it is an interesting juxtaposition to say the open O_TRUNC case > >> is worth catching, but the tempfile overwrite case is not. > > > > We went through this years ago - the O_TRUNC case is dealing with > > direct overwrite of data which we can reliably detect, usually only > > occurs one file at a time, has no major performance impact and data > > loss is almost entirely mitigated by the flush-on-close behaviour. > > It's a pretty reliable mitigation mechanism. > > [citation needed] for a some of that, but *shrug* It was internal to SGI, mainly related to Irix, unfortunately, which is where all this "avoid NULL files" stuff came from originally... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 27 19:50:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 515BB7F3F for ; Sun, 27 Apr 2014 19:50:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50B8B304048 for ; Sun, 27 Apr 2014 17:50:47 -0700 (PDT) X-ASG-Debug-ID: 1398646244-04cbb03cc5a0930001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lzHBrEdt7xEpp2lf for ; Sun, 27 Apr 2014 17:50:45 -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: Am1TABOlXVN5LEcvPGdsb2JhbABZgwZPgmuoUQECAQEFlBaFYIELFwMBAQEBODWCJQEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDkHDsk1FoVEiH8HhDkElRqDcYE7iTkQix4r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2014 10:20:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WeZmN-00029I-5k; Mon, 28 Apr 2014 10:50:43 +1000 Date: Mon, 28 Apr 2014 10:50:43 +1000 From: Dave Chinner To: Christian Kujau Cc: xfs@oss.sgi.com Subject: Re: 3.15.0-rc2: RECLAIM_FS-safe -> RECLAIM_FS-unsafe lock order detected Message-ID: <20140428005043.GK15995@dastard> X-ASG-Orig-Subj: Re: 3.15.0-rc2: RECLAIM_FS-safe -> RECLAIM_FS-unsafe lock order detected 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: 1398646244 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Apr 25, 2014 at 03:21:16AM -0700, Christian Kujau wrote: > Hi, > > I haven't run vanilla for a while, so this is pretty much a copy of > what I reported[0] back with 3.14-rc2, but now with 3.15-rc2. Full > dmesg & .config can be found here: > > http://nerdbynature.de/bits/3.15-rc2/ > > > ====================================================== > [ INFO: RECLAIM_FS-safe -> RECLAIM_FS-unsafe lock order detected ] > 3.15.0-rc2 #1 Not tainted > ------------------------------------------------------ > rm/8288 [HC0[0]:SC0[0]:HE1:SE1] is trying to acquire: > (&mm->mmap_sem){++++++}, at: [] might_fault+0x58/0xa0 > > and this task is already holding: > (&xfs_dir_ilock_class){++++-.}, at: [] > xfs_ilock_data_map_shared+0x28/0x70 > which would create a new lock dependency: > (&xfs_dir_ilock_class){++++-.} -> (&mm->mmap_sem){++++++} > > but this new dependency connects a RECLAIM_FS-irq-safe lock: > (&xfs_dir_ilock_class){++++-.} > ... which became RECLAIM_FS-irq-safe at: > [] lock_acquire+0x54/0x70 > [] down_write_nested+0x50/0xa0 > [] xfs_reclaim_inode+0x108/0x318 > [] xfs_reclaim_inodes_ag+0x1b4/0x360 > [] xfs_reclaim_inodes_nr+0x38/0x4c > [] super_cache_scan+0x150/0x158 > [] shrink_slab_node+0x138/0x228 > [] shrink_slab+0x124/0x13c > [] kswapd+0x3f8/0x884 > [] kthread+0xbc/0xd0 > [] ret_from_kernel_thread+0x5c/0x64 > to a RECLAIM_FS-irq-unsafe lock: > (&mm->mmap_sem){++++++} > ... which became RECLAIM_FS-irq-unsafe at: > ... [] lockdep_trace_alloc+0x84/0x104 > [] kmem_cache_alloc+0x30/0x148 > [] mmap_region+0x2fc/0x578 > [] do_mmap_pgoff+0x2ec/0x378 > [] vm_mmap_pgoff+0x58/0x94 > [] load_elf_binary+0x488/0x11f4 > [] search_binary_handler+0x98/0x1f4 > [] do_execve+0x484/0x580 > [] try_to_run_init_process+0x18/0x58 > [] kernel_init+0xac/0x110 > [] ret_from_kernel_thread+0x5c/0x64 > > other info that might help us debug this: > > Possible interrupt unsafe locking scenario: > > CPU0 CPU1 > ---- ---- > lock(&mm->mmap_sem); > local_irq_disable(); > lock(&xfs_dir_ilock_class); > lock(&mm->mmap_sem); > > lock(&xfs_dir_ilock_class); Known false positive. Directory inodes can't be mmap()d or execv()d, nor can referenced inodes be reclaimed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Apr 27 20:00:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F21997F3F for ; Sun, 27 Apr 2014 20:00:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0A888F806F for ; Sun, 27 Apr 2014 18:00:20 -0700 (PDT) X-ASG-Debug-ID: 1398646818-04bdf02b8ba3be0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id zZ0NBqj4HeRWrksM for ; Sun, 27 Apr 2014 18:00:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlZYACynXVN5LEcvPGdsb2JhbABZgwZPgmuFCqNIAQIBAQWSPYFZhWCBCxcDAQEBATg1gwIjGCQ0BSUDBy2IQMlFFoVEiH8dghgPgXwEmQuUHoIEKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Apr 2014 10:30:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WeZvb-0002CA-SY; Mon, 28 Apr 2014 11:00:15 +1000 Date: Mon, 28 Apr 2014 11:00:15 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to ce0aa2b Message-ID: <20140428010015.GL15995@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to ce0aa2b MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="WBsA/oQW3eTA3LlM" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398646818 X-Barracuda-URL: http://192.48.157.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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) --WBsA/oQW3eTA3LlM Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. The new head of the master branch is commit: ce0aa2b common: Use _require_xfs_io_command() instead of helpers New Commits: Dave Chinner (6): [31a50c7] generic/204: tweak reserve pool size [ca93123] generic: cleanup space after test in TESTDIR [9d7807d] xfs: remove dmapi tests from the auto group [03227f9] filter: xfs_repair emits new corruption messagse [a12a56f] shared/051: remove ACL count subtest [a841a6d] generic: introduce new large ACL test Lukas Czerner (1): [ce0aa2b] common: Use _require_xfs_io_command() instead of helpers Code Diffstat: common/attr | 31 ++++++++++++ common/defrag | 2 +- common/rc | 41 --------------- common/repair | 3 ++ tests/btrfs/026 | 2 +- tests/btrfs/027 | 2 +- tests/btrfs/028 | 2 +- tests/btrfs/047 | 2 +- tests/ext4/001 | 2 +- tests/ext4/002 | 2 +- tests/generic/009 | 2 +- tests/generic/012 | 8 +-- tests/generic/016 | 8 +-- tests/generic/017 | 4 +- tests/generic/021 | 8 +-- tests/generic/022 | 8 +-- tests/generic/026 | 132 ++++++++++++++++++++++++++++++++++++++++++++++= ++ tests/generic/026.out | 9 ++++ tests/generic/070 | 1 + tests/generic/204 | 2 - tests/generic/213 | 2 +- tests/generic/214 | 2 +- tests/generic/223 | 2 +- tests/generic/228 | 2 +- tests/generic/255 | 6 +-- tests/generic/256 | 2 +- tests/generic/274 | 2 +- tests/generic/300 | 4 +- tests/generic/311 | 2 +- tests/generic/312 | 2 +- tests/generic/316 | 4 +- tests/generic/group | 1 + tests/shared/051 | 45 ----------------- tests/shared/051.out | 135 ----------------------------------------------= ---- tests/shared/298 | 2 +- tests/xfs/252 | 4 +- tests/xfs/290 | 2 +- tests/xfs/292 | 2 + tests/xfs/group | 50 +++++++++---------- 39 files changed, 249 insertions(+), 293 deletions(-) create mode 100644 tests/generic/026 create mode 100644 tests/generic/026.out --=20 Dave Chinner david@fromorbit.com --WBsA/oQW3eTA3LlM Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTXagfAAoJEK3oKUf0dfodi9AP/iWS0robDYMnjkzFaSfYadSa pQUL0K1j1Pq9lZXLwpVOSHVQp863QWCU6LefPN4u0e8sMVKuqmRgdKNb8aMIGdNr oxTPPsWIZdoUQCGMUTG3rtre9uATtSJwtJMp43JeSCVzuU3D1D2UHC1MOZvfE3aH B2JG2qF6j9q5IIxzJbAJqz/miAhOk8YrGYpHxkNNJ/w7OdZMBPxfxkmpub9xzYwo e3c+okmEcBOkNW6COy008gZcmaBFhmptlNBsu67rXCS9S7K19Nh9gyygTgI3iwbW 9JaBEm8pjd9GzroP/Vbw4SKyOmeYqrztzWCwVXZc2i5SvONau1QcI0i21eHY2DbT ATsCbAD88ASjr9HhM3ZdG9VjniHOIDPdwkDBk9thc9Aqnj8UPVLIdssKf9LLDPFk hc0Sb8EucSk2yTILcW6W2FKE5NAz47twkr0xDRU+wc6hlqa4yXqRIcn/u24cwEek Lti0mZ6jR+Yjou2hdIk+8yO5mNM13ZWJpuDsbPhc0kHqgul9RwmF9Nf/IhCfIXMP E2yOuA990MBUY7bXFgLs7DWimxGJ/EC4kKSnlH610u6FbjD278FNt79gmR9jTghT /jRSV4pARvKCGcLl76tPqDgzJSzeBW4SWgduHufUIqIZPbKfncNfDVubBdXQz1cu OVtkKF8F4zAlVWqAB6DV =rKnH -----END PGP SIGNATURE----- --WBsA/oQW3eTA3LlM-- From jan.cizmar@truni.sk Mon Apr 28 11:17:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE, T_KHOP_FOREIGN_CLICK autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E5EA29DF8 for ; Mon, 28 Apr 2014 11:17:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9CA9304048 for ; Mon, 28 Apr 2014 09:17:28 -0700 (PDT) X-ASG-Debug-ID: 1398701840-04cb6c728fddf00001-NocioJ Received: from smtp.truni.sk (smtp.truni.sk [193.87.54.71]) by cuda.sgi.com with ESMTP id sbM0gF6JbyrWDauS for ; Mon, 28 Apr 2014 09:17:20 -0700 (PDT) X-Barracuda-Envelope-From: jan.cizmar@truni.sk X-Barracuda-Apparent-Source-IP: 193.87.54.71 Received: from localhost (localhost [127.0.0.1]) by smtp.truni.sk (Postfix) with ESMTP id 6239D645F2; Mon, 28 Apr 2014 16:22:24 +0200 (CEST) X-Virus-Scanned: amavisd-new at truni.sk Received: from smtp.truni.sk ([127.0.0.1]) by localhost (z1-mta1.truni.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id imH7nNey4Rt8; Mon, 28 Apr 2014 16:22:14 +0200 (CEST) Received: from z1-mbox1.truni.sk (z1-mbox1.truni.sk [10.33.16.74]) by smtp.truni.sk (Postfix) with ESMTP id E7BCE64908; Mon, 28 Apr 2014 16:14:38 +0200 (CEST) Date: Mon, 28 Apr 2014 16:14:40 +0200 (CEST) From: ING ONLINE Message-ID: <164342150.745023.1398694480426.JavaMail.root@truni.sk> Subject: Dringend! MIME-Version: 1.0 X-ASG-Orig-Subj: Dringend! Content-Type: multipart/alternative; boundary="----=_Part_745022_1662722023.1398694480422" X-Mailer: Zimbra 7.2.4_GA_2903 (zclient/7.2.4_GA_2903) To: undisclosed-recipients:; X-Barracuda-Connect: smtp.truni.sk[193.87.54.71] X-Barracuda-Start-Time: 1398701840 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, BSF_SC7_SA578_CH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5319 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA074b Custom Rule SA074b 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH ------=_Part_745022_1662722023.1398694480422 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Geachte ING Client, =20 Houdt u er rekening mee dat de toegang tot uw online-account dreigt te verl= open.Om de toegang tot uw=20 online account actief te houden, vragen wij u dan gelieve om zo snel mogeli= jk in te loggen.Gebruik de=20 onderstaande link om verder te gaan en toegang te krijgen tot uw account. Nadat u gebruik heeft gemaakt van de onderstaande link zal er door =C3=A9= =C3=A9n van onze medewerkers nog=20 contact met u worden opgenomen om het gehele proces te voltooien. Wanneer h= et gehele proces gereed=20 is zal u weer als vanouds gebruik kunnen maken van uw ING-online. Klik hier Met toegang tot uw ING online kunt u het grootste gedeelte van uw bankverri= chtingen=20 uitvoeren door u aan te melden op het onlinebankieren. =20 Wij willen u alvast bedanken voor uw medewerking ING. Hoogachtend, =20 Klantenservice ------=_Part_745022_1662722023.1398694480422 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable Geachte = ING Client,
 
Houdt u er rekening mee dat de toegang tot uw onli= ne-account dreigt te verlopen.Om de toegang tot uw
online account actie= f te houden, vragen wij u dan gelieve om zo snel mogelijk in te loggen.Gebr= uik de
onderstaande link om verder te gaan en toegang te krijgen tot uw= account.

Nadat u gebruik heeft gemaakt van de onderstaande link zal= er door =C3=A9=C3=A9n van onze medewerkers nog
contact met u worden op= genomen om het gehele proces te voltooien. Wanneer het gehele proces gereed=
is zal u weer als vanouds gebruik kunnen maken van uw ING-online.
<= br>Klik hier

Met toegang tot uw ING online kunt u = het grootste gedeelte van uw bankverrichtingen
uitvoeren door u aan te = melden op het onlinebankieren.
 
Wij willen u alvast bedanken vo= or uw medewerking ING.

Hoogachtend,
 
Klantenservice ------=_Part_745022_1662722023.1398694480422-- From beziers.bio2000@labosud-ocbiologie.fr Mon Apr 28 11:29:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=TVD_SPACE_RATIO autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 23B3C29DF8 for ; Mon, 28 Apr 2014 11:29:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6105AC001 for ; Mon, 28 Apr 2014 09:29:43 -0700 (PDT) X-ASG-Debug-ID: 1398702580-04cb6c7290defd0001-NocioJ Received: from relais1.herault-networks.fr (relais1.herault-networks.fr [109.205.0.14]) by cuda.sgi.com with ESMTP id ssrHQl2KMrEsIz03 for ; Mon, 28 Apr 2014 09:29:41 -0700 (PDT) X-Barracuda-Envelope-From: beziers.bio2000@labosud-ocbiologie.fr X-Barracuda-Apparent-Source-IP: 109.205.0.14 Received: from mail.labosud-ocbiologie.fr (unknown [109.205.1.242]) by relais1.herault-networks.fr (Postfix) with ESMTP id 77AC660DA5; Mon, 28 Apr 2014 18:28:43 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.labosud-ocbiologie.fr (Postfix) with ESMTP id AC84424000F; Mon, 28 Apr 2014 15:23:31 +0200 (CEST) Received: from mail.labosud-ocbiologie.fr ([127.0.0.1]) by localhost (mail.labosud-ocbiologie.fr [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id tAbolPLCrUcD; Mon, 28 Apr 2014 15:23:23 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.labosud-ocbiologie.fr (Postfix) with ESMTP id 48A22240011; Mon, 28 Apr 2014 15:23:23 +0200 (CEST) X-Virus-Scanned: amavisd-new at mail.labosud-ocbiologie.fr Received: from mail.labosud-ocbiologie.fr ([127.0.0.1]) by localhost (mail.labosud-ocbiologie.fr [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id cHLWmV4cAIZ6; Mon, 28 Apr 2014 15:23:22 +0200 (CEST) Received: from mail.labosud-ocbiologie.fr (labosud-cloud.absys-services.fr [172.16.10.1]) by mail.labosud-ocbiologie.fr (Postfix) with ESMTP id AA88224000A; Mon, 28 Apr 2014 15:23:22 +0200 (CEST) Date: Mon, 28 Apr 2014 15:23:22 +0200 (CEST) From: Account Verification Reply-To: Account Verification Message-ID: <1918723781.1501375.1398691402588.JavaMail.zimbra@labosud-ocbiologie.fr> Subject: Desk MIME-Version: 1.0 X-ASG-Orig-Subj: Desk Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [37.130.229.149] X-Mailer: Zimbra 8.0.7_GA_6021 (zclient/8.0.7_GA_6021) Thread-Topic: Desk Thread-Index: jE7h5/xkb4WxR4IafqnYSPlbkYudTw== X-Barracuda-Connect: relais1.herault-networks.fr[109.205.0.14] X-Barracuda-Start-Time: 1398702581 X-Barracuda-URL: http://192.48.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.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=MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5319 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 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:;


=
BEZIERS BIO 2000
= JY REAL / P. DUMAS / F. DUMAS
7H00-19H30
Samedi : 7H00-12H00
SITE DE B= EZIERS BIO 2000
2 bis s= quare des volontaires biterois 39-45 - 34500 - BEZIERS
Tel : 04 67 90 20 00 - Fax : 04 67 76 52 82 <= BR>beziers.bio2000@labosu= d-ocbiologie.fr
From sandeen@redhat.com Mon Apr 28 11:35:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A089629DF8 for ; Mon, 28 Apr 2014 11:35:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3C959AC004 for ; Mon, 28 Apr 2014 09:35:20 -0700 (PDT) X-ASG-Debug-ID: 1398702918-04cbb03cc6dc190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8En0eWNv6vdkaFyF for ; Mon, 28 Apr 2014 09:35:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3SGZIGs018738 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 28 Apr 2014 12:35:18 -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 s3SGZGWc002269 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 28 Apr 2014 12:35:17 -0400 Message-ID: <535E8344.2070209@redhat.com> Date: Mon, 28 Apr 2014 11:35:16 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss CC: Boris Ranto Subject: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() 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: 1398702918 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs to test for a shut down fs, lest we go down paths we'll never be able to complete; Boris reported that during some stress tests he had threads stuck in xlog_cil_force_lsn via xfs_dir_fsync(). [ 3663.361709] sfsuspend-par D ffff88042f0b4540 0 3981 3947 0x00000080 [ 3663.394472] Call Trace: [ 3663.397199] [] schedule+0x29/0x70 [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] [ 3663.435873] [] do_fsync+0x65/0xa0 [ 3663.441408] [] SyS_fsync+0x10/0x20 [ 3663.447043] [] system_call_fastpath+0x16/0x1b Reported-by: Boris Ranto Signed-off-by: Eric Sandeen --- NB: While I've not asked Boris to test this yet, it seems clear (?) that dir_fsync should behave the same as file_fsync() in the face of a shut-down fs. diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 4c749ab..2b94362 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -146,6 +146,9 @@ xfs_dir_fsync( trace_xfs_dir_fsync(ip); + if (XFS_FORCED_SHUTDOWN(mp)) + return -XFS_ERROR(EIO); + xfs_ilock(ip, XFS_ILOCK_SHARED); if (xfs_ipincount(ip)) lsn = ip->i_itemp->ili_last_lsn; From BATV+11e52c447cba5e925735+3900+infradead.org+hch@bombadil.srs.infradead.org Mon Apr 28 11:47:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0CE7B29DF8 for ; Mon, 28 Apr 2014 11:47:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8BFA5AC003 for ; Mon, 28 Apr 2014 09:47:56 -0700 (PDT) X-ASG-Debug-ID: 1398703674-04cb6c7291e0600001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id KjyalzGxLGTFrWPX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 28 Apr 2014 09:47:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+11e52c447cba5e925735+3900+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Weoig-0004xs-Lv; Mon, 28 Apr 2014 16:47:54 +0000 Date: Mon, 28 Apr 2014 09:47:54 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Boris Ranto Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() Message-ID: <20140428164754.GA17472@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535E8344.2070209@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398703675 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: > Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs > to test for a shut down fs, It probably should. > lest we go down paths we'll > never be able to complete; Boris reported that during some > stress tests he had threads stuck in xlog_cil_force_lsn > via xfs_dir_fsync(). But this could still happen if we get a shutdown coming in after that test. From sandeen@redhat.com Mon Apr 28 12:18:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9508929DF8 for ; Mon, 28 Apr 2014 12:18:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A2928F8033 for ; Mon, 28 Apr 2014 10:18:56 -0700 (PDT) X-ASG-Debug-ID: 1398705534-04cbb03cc6df810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id S24gqh08EfEf5CBN for ; Mon, 28 Apr 2014 10:18:55 -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 s3SHIWC9008277 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 28 Apr 2014 13:18:33 -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 s3SHIV1q012424 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 28 Apr 2014 13:18:32 -0400 Message-ID: <535E8D67.3010504@redhat.com> Date: Mon, 28 Apr 2014 12:18:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss , Boris Ranto Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428164754.GA17472@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() In-Reply-To: <20140428164754.GA17472@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398705535 X-Barracuda-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/28/14, 11:47 AM, Christoph Hellwig wrote: > On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >> to test for a shut down fs, > > It probably should. > >> lest we go down paths we'll >> never be able to complete; Boris reported that during some >> stress tests he had threads stuck in xlog_cil_force_lsn >> via xfs_dir_fsync(). > > But this could still happen if we get a shutdown coming in after that > test. True... that looked a bit hairier to sort out. :( -Eric From tinguely@sgi.com Mon Apr 28 12:22:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1D7FA29DF8 for ; Mon, 28 Apr 2014 12:22:16 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF653304043; Mon, 28 Apr 2014 10:22:12 -0700 (PDT) Message-ID: <535E8E47.2040701@sgi.com> Date: Mon, 28 Apr 2014 12:22:15 -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: Christoph Hellwig , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428164754.GA17472@infradead.org> <535E8D67.3010504@redhat.com> In-Reply-To: <535E8D67.3010504@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/28/14 12:18, Eric Sandeen wrote: > On 4/28/14, 11:47 AM, Christoph Hellwig wrote: >> On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >>> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >>> to test for a shut down fs, >> >> It probably should. >> >>> lest we go down paths we'll >>> never be able to complete; Boris reported that during some >>> stress tests he had threads stuck in xlog_cil_force_lsn >>> via xfs_dir_fsync(). >> >> But this could still happen if we get a shutdown coming in after that >> test. > > True... that looked a bit hairier to sort out. :( > > -Eric > Are the sync lsn look okay? Was there an error writing the iclog buffer? xfs_do_force_shutdown() will also do a xlog_cil_force_lsn() via the xfs_log_force_umount if the log buffer write was not in error. That should be the same or later than this lsn. --Mark. From sandeen@sandeen.net Mon Apr 28 12:26:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D919229DF8 for ; Mon, 28 Apr 2014 12:26:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA56E8F8039 for ; Mon, 28 Apr 2014 10:26:38 -0700 (PDT) X-ASG-Debug-ID: 1398705997-04cb6c7292e3640001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FrmNzIj2amI5mAxV for ; Mon, 28 Apr 2014 10:26:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E549563C5FF1; Mon, 28 Apr 2014 12:26:36 -0500 (CDT) Message-ID: <535E8F4C.8000003@sandeen.net> Date: Mon, 28 Apr 2014 12:26:36 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely , Eric Sandeen CC: Christoph Hellwig , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428164754.GA17472@infradead.org> <535E8D67.3010504@redhat.com> <535E8E47.2040701@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() In-Reply-To: <535E8E47.2040701@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398705997 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/28/14, 12:22 PM, Mark Tinguely wrote: > On 04/28/14 12:18, Eric Sandeen wrote: >> On 4/28/14, 11:47 AM, Christoph Hellwig wrote: >>> On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >>>> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >>>> to test for a shut down fs, >>> >>> It probably should. >>> >>>> lest we go down paths we'll >>>> never be able to complete; Boris reported that during some >>>> stress tests he had threads stuck in xlog_cil_force_lsn >>>> via xfs_dir_fsync(). >>> >>> But this could still happen if we get a shutdown coming in after that >>> test. >> >> True... that looked a bit hairier to sort out. :( >> >> -Eric >> > > > Are the sync lsn look okay? Was there an error writing the iclog buffer? > > xfs_do_force_shutdown() will also do a xlog_cil_force_lsn() via the > xfs_log_force_umount if the log buffer write was not in error. That > should be the same or later than this lsn. I don't have full details, unfortunately, just the sysrq backtraces. -Eric > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Mon Apr 28 12:49:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 75C5029DF8 for ; Mon, 28 Apr 2014 12:49:23 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB4B0304043; Mon, 28 Apr 2014 10:49:22 -0700 (PDT) Message-ID: <535E94A4.2060701@sgi.com> Date: Mon, 28 Apr 2014 12:49:24 -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: Eric Sandeen , Christoph Hellwig , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428164754.GA17472@infradead.org> <535E8D67.3010504@redhat.com> <535E8E47.2040701@sgi.com> <535E8F4C.8000003@sandeen.net> In-Reply-To: <535E8F4C.8000003@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/28/14 12:26, Eric Sandeen wrote: > On 4/28/14, 12:22 PM, Mark Tinguely wrote: >> On 04/28/14 12:18, Eric Sandeen wrote: >>> On 4/28/14, 11:47 AM, Christoph Hellwig wrote: >>>> On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >>>>> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >>>>> to test for a shut down fs, >>>> >>>> It probably should. >>>> >>>>> lest we go down paths we'll >>>>> never be able to complete; Boris reported that during some >>>>> stress tests he had threads stuck in xlog_cil_force_lsn >>>>> via xfs_dir_fsync(). >>>> >>>> But this could still happen if we get a shutdown coming in after that >>>> test. >>> >>> True... that looked a bit hairier to sort out. :( >>> >>> -Eric >>> >> >> >> Are the sync lsn look okay? Was there an error writing the iclog buffer? >> >> xfs_do_force_shutdown() will also do a xlog_cil_force_lsn() via the >> xfs_log_force_umount if the log buffer write was not in error. That >> should be the same or later than this lsn. > > I don't have full details, unfortunately, just the sysrq backtraces. > > -Eric > >> --Mark. anything in the log as to what caused the hang? You mention a forced shutdown; what caused the forced shutdown? Is this the latest bits (3.15)? --Mark. From sandeen@sandeen.net Mon Apr 28 12:54:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 66FCD29DF8 for ; Mon, 28 Apr 2014 12:54:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB696AC002 for ; Mon, 28 Apr 2014 10:53:56 -0700 (PDT) X-ASG-Debug-ID: 1398707635-04cb6c728fe56d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GTkCqOuiZmkA94qb for ; Mon, 28 Apr 2014 10:53:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6756263C5FF1; Mon, 28 Apr 2014 12:53:55 -0500 (CDT) Message-ID: <535E95B2.3010403@sandeen.net> Date: Mon, 28 Apr 2014 12:53:54 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely CC: Eric Sandeen , Christoph Hellwig , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428164754.GA17472@infradead.org> <535E8D67.3010504@redhat.com> <535E8E47.2040701@sgi.com> <535E8F4C.8000003@sandeen.net> <535E94A4.2060701@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() In-Reply-To: <535E94A4.2060701@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398707635 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5323 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/28/14, 12:49 PM, Mark Tinguely wrote: > On 04/28/14 12:26, Eric Sandeen wrote: >> On 4/28/14, 12:22 PM, Mark Tinguely wrote: >>> On 04/28/14 12:18, Eric Sandeen wrote: >>>> On 4/28/14, 11:47 AM, Christoph Hellwig wrote: >>>>> On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >>>>>> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >>>>>> to test for a shut down fs, >>>>> >>>>> It probably should. >>>>> >>>>>> lest we go down paths we'll >>>>>> never be able to complete; Boris reported that during some >>>>>> stress tests he had threads stuck in xlog_cil_force_lsn >>>>>> via xfs_dir_fsync(). >>>>> >>>>> But this could still happen if we get a shutdown coming in after that >>>>> test. >>>> >>>> True... that looked a bit hairier to sort out. :( >>>> >>>> -Eric >>>> >>> >>> >>> Are the sync lsn look okay? Was there an error writing the iclog buffer? >>> >>> xfs_do_force_shutdown() will also do a xlog_cil_force_lsn() via the >>> xfs_log_force_umount if the log buffer write was not in error. That >>> should be the same or later than this lsn. >> >> I don't have full details, unfortunately, just the sysrq backtraces. >> >> -Eric >> >>> --Mark. > > anything in the log as to what caused the hang? You mention a forced shutdown; what caused the forced shutdown? Perhaps Boris can answer that. > Is this the latest bits (3.15)? It was 3.10 with backported xfs bits from about 3.14. -Eric > --Mark. > From david@fromorbit.com Mon Apr 28 15:54:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 92EAE29DF8 for ; Mon, 28 Apr 2014 15:54:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E912AC002 for ; Mon, 28 Apr 2014 13:54:25 -0700 (PDT) X-ASG-Debug-ID: 1398718463-04cb6c7292fa8b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GUA6rXPkceo3PbaS for ; Mon, 28 Apr 2014 13:54:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvVLAH6/XlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZl2gRoXAwEBAQE4NYIlAQEEATocIwULCAMYCSUPBSUDBxoTiDkHyFIXFoVEiH8HgySBFQSZC4p0iy4r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:24:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WesZA-0004yz-K6; Tue, 29 Apr 2014 06:54:20 +1000 Date: Tue, 29 Apr 2014 06:54:20 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss , Boris Ranto Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() Message-ID: <20140428205420.GB18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535E8344.2070209@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: 1398718463 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: > Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs > to test for a shut down fs, lest we go down paths we'll > never be able to complete; Boris reported that during some > stress tests he had threads stuck in xlog_cil_force_lsn > via xfs_dir_fsync(). > > [ 3663.361709] sfsuspend-par D ffff88042f0b4540 0 3981 3947 0x00000080 > > [ 3663.394472] Call Trace: > [ 3663.397199] [] schedule+0x29/0x70 > [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > [ 3663.435873] [] do_fsync+0x65/0xa0 > [ 3663.441408] [] SyS_fsync+0x10/0x20 > [ 3663.447043] [] system_call_fastpath+0x16/0x1b Wow, I believe it's taken this long for us to notice that we can't break out of xlog_cil_force_lsn() if we fail on xlog_write() from a CIL push. I'd say that xlog_cil_force_lsn() needs log shutdown checks before it goes to sleep in xlog_wait().... > Reported-by: Boris Ranto > Signed-off-by: Eric Sandeen > --- > > NB: While I've not asked Boris to test this yet, it seems > clear (?) that dir_fsync should behave the same as > file_fsync() in the face of a shut-down fs. > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 4c749ab..2b94362 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -146,6 +146,9 @@ xfs_dir_fsync( > > trace_xfs_dir_fsync(ip); > > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -XFS_ERROR(EIO); > + That won't hurt, but it won't fix the problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Apr 28 16:05:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 13B0E29DF8 for ; Mon, 28 Apr 2014 16:05:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8EEF0AC002 for ; Mon, 28 Apr 2014 14:05:05 -0700 (PDT) X-ASG-Debug-ID: 1398719103-04cb6c7291fde40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id jWNKj9w2ce5BvEvi for ; Mon, 28 Apr 2014 14:05:03 -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: AiFvANPBXlN5LEcvPGdsb2JhbABZgwZPqysCCgwBAQEFmxAXAwEBAQE4NYMCO4ECAweIbQ6Vb7J1hVqHA4IZhCMEo3+JKoIEKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-00050t-Gz for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050X-Fu for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/9 v3] xfs_db, xfs_repair: improve CRC error detection Date: Tue, 29 Apr 2014 07:04:50 +1000 X-ASG-Orig-Subj: [PATCH 0/9 v3] xfs_db, xfs_repair: improve CRC error detection Message-Id: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719103 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is the third version of the patchset originally posted here: http://oss.sgi.com/archives/xfs/2014-04/msg00374.html This version corrects the issues that Christoph commented on in the second version. Version 3: - factored out libxfs_readbuf_verify() - LIBXFS_B_UNCHECKED flag setting/clearing cleaned up - cleaned up dirty checks on AG header scan - cleaned up error path goto stack on AG header scan - added no_modify check to remote symlink buffer bad CRC rewrite. Version 2: - move LIBXFS_B_UNCHECKED to the correct patch (patch 1) - set_cur_iotype assumes a valid type (patch 2) - comments added to explain the way LIBXFS_B_UNCHECKED and dirty buffers are supposed to interact (patch 3) - fixed comment flow and added separate "crc_error" return variable to dir_read_buf() (patch 4) - reworked CRC error handling of AG headers (patch 5) - readded missing dirty/no_modify assert (patch 6) - fixed typos (patch 8) - fixed "repair" variable initialisation flow (patch 9) - fixed dirty buffer accounting on the cursor to dirty the correct buffer on CRC errors, added some clarifying comments (patch 9) Comments and testing welcome! -Dave. From dave@fromorbit.com Mon Apr 28 16:05:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A2D7429DF9 for ; Mon, 28 Apr 2014 16:05:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 97B548F804B for ; Mon, 28 Apr 2014 14:05:09 -0700 (PDT) X-ASG-Debug-ID: 1398719103-04cb6c7291fde40003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 4WozEkcThA73ReGe for ; Mon, 28 Apr 2014 14:05:08 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVaiRyEIwSvLSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-00050v-I2 for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050f-HH for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/9] db: verify buffer on type change Date: Tue, 29 Apr 2014 07:04:52 +1000 X-ASG-Orig-Subj: [PATCH 2/9] db: verify buffer on type change Message-Id: <1398719099-19194-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719108 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently when the type command is run, we simply change the type associated with the buffer, but don't verify it. This results in unchecked CRCs being displayed. Hence when changing the type, run the verifier associated with the type to determine if the buffer contents is valid or not. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- db/io.c | 24 ++++++++++++++++++++++++ db/io.h | 1 + db/type.c | 9 +++++---- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/db/io.c b/db/io.c index 387f171..7f1b76a 100644 --- a/db/io.c +++ b/db/io.c @@ -552,6 +552,30 @@ set_cur( ring_add(); } +void +set_iocur_type( + const typ_t *t) +{ + struct xfs_buf *bp = iocur_top->bp; + + iocur_top->typ = t; + + /* verify the buffer if the type has one. */ + if (!bp) + return; + if (!t->bops) { + bp->b_ops = NULL; + bp->b_flags |= LIBXFS_B_UNCHECKED; + return; + } + if (!(bp->b_flags & LIBXFS_B_UPTODATE)) + return; + bp->b_error = 0; + bp->b_ops = t->bops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; +} + static void stack_help(void) { diff --git a/db/io.h b/db/io.h index 7875119..71082e6 100644 --- a/db/io.h +++ b/db/io.h @@ -62,6 +62,7 @@ extern void write_cur(void); extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); extern void ring_add(void); +extern void set_iocur_type(const struct typ *t); /* * returns -1 for unchecked, 0 for bad and 1 for good diff --git a/db/type.c b/db/type.c index 04d0d56..b29f2a4 100644 --- a/db/type.c +++ b/db/type.c @@ -162,10 +162,11 @@ type_f( if (tt == NULL) { dbprintf(_("no such type %s\n"), argv[1]); } else { - if (iocur_top->typ == NULL) { - dbprintf(_("no current object\n")); - } else { - iocur_top->typ = cur_typ = tt; + if (iocur_top->typ == NULL) + dbprintf(_("no current object\n")); + else { + cur_typ = tt; + set_iocur_type(tt); } } } -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1936029DF8 for ; Mon, 28 Apr 2014 16:05:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F178530404E for ; Mon, 28 Apr 2014 14:05:10 -0700 (PDT) X-ASG-Debug-ID: 1398719103-04cb6c7291fde40004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6VYg15raavHuDH9j for ; Mon, 28 Apr 2014 14:05:09 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVajT8Ery0rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-000511-JZ for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050u-Ik for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/9] repair: detect CRC errors in AG headers Date: Tue, 29 Apr 2014 07:04:55 +1000 X-ASG-Orig-Subj: [PATCH 5/9] repair: detect CRC errors in AG headers Message-Id: <1398719099-19194-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719109 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner repair doesn't currently detect verifier errors in AG header blocks - apart from the primary superblock they are not detected. They are, fortunately, corrected in the important cases (AGF, AGI and AGFL) because these structures are rebuilt in phase 5, but if you run xfs_repair in checking mode it won't report them as bad. Signed-off-by: Dave Chinner --- repair/scan.c | 83 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 1744c32..dec84ed 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1207,39 +1207,38 @@ scan_ag( void *arg) { struct aghdr_cnts *agcnts = arg; - xfs_agf_t *agf; - xfs_buf_t *agfbuf; + struct xfs_agf *agf; + struct xfs_buf *agfbuf = NULL; int agf_dirty = 0; - xfs_agi_t *agi; - xfs_buf_t *agibuf; + struct xfs_agi *agi; + struct xfs_buf *agibuf = NULL; int agi_dirty = 0; - xfs_sb_t *sb; - xfs_buf_t *sbbuf; + struct xfs_sb *sb = NULL; + struct xfs_buf *sbbuf = NULL; int sb_dirty = 0; int status; + char *objname = NULL; - sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), - 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; - } - sb = (xfs_sb_t *)calloc(BBSIZE, 1); + sb = (struct xfs_sb *)calloc(BBSIZE, 1); if (!sb) { do_error(_("can't allocate memory for superblock\n")); - libxfs_putbuf(sbbuf); return; } + + sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), + XFS_FSS_TO_BB(mp, 1), 0, &xfs_sb_buf_ops); + if (!sbbuf) { + objname = _("root superblock"); + goto out_free_sb; + } libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); agfbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), 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); - free(sb); - return; + objname = _("agf block"); + goto out_free_sbbuf; } agf = XFS_BUF_TO_AGF(agfbuf); @@ -1247,11 +1246,8 @@ scan_ag( XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), 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); - libxfs_putbuf(sbbuf); - free(sb); - return; + objname = _("agi block"); + goto out_free_agfbuf; } agi = XFS_BUF_TO_AGI(agibuf); @@ -1295,15 +1291,9 @@ scan_ag( } if (status && no_modify) { - libxfs_putbuf(agibuf); - libxfs_putbuf(agfbuf); - libxfs_putbuf(sbbuf); - free(sb); - do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), agno); - - return; + goto out_free_agibuf; } scan_freelist(agf, agcnts); @@ -1312,21 +1302,34 @@ scan_ag( validate_agi(agi, agno, agcnts); ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); + ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); + ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); + + /* + * Only pay attention to CRC/verifier errors if we can correct them. + * While there, ensure that we corrected a corruption error if the + * verifier detected one. + */ + if (!no_modify) { + ASSERT(agi_dirty || agibuf->b_error != EFSCORRUPTED); + ASSERT(agf_dirty || agfbuf->b_error != EFSCORRUPTED); + ASSERT(sb_dirty || sbbuf->b_error != EFSCORRUPTED); + + agi_dirty += (agibuf->b_error == EFSBADCRC); + agf_dirty += (agfbuf->b_error == EFSBADCRC); + sb_dirty += (sbbuf->b_error == EFSBADCRC); + } if (agi_dirty && !no_modify) libxfs_writebuf(agibuf, 0); else libxfs_putbuf(agibuf); - ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); - if (agf_dirty && !no_modify) libxfs_writebuf(agfbuf, 0); else libxfs_putbuf(agfbuf); - ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); - if (sb_dirty && !no_modify) { if (agno == 0) memcpy(&mp->m_sb, sb, sizeof(xfs_sb_t)); @@ -1341,6 +1344,18 @@ scan_ag( print_inode_list(i); #endif return; + +out_free_agibuf: + libxfs_putbuf(agibuf); +out_free_agfbuf: + libxfs_putbuf(agfbuf); +out_free_sbbuf: + libxfs_putbuf(sbbuf); +out_free_sb: + free(sb); + + if (objname) + do_error(_("can't get %s for ag %d\n"), objname, agno); } #define SCAN_THREADS 32 -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6E36829DF8 for ; Mon, 28 Apr 2014 16:05:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 633C18F804B for ; Mon, 28 Apr 2014 14:05:08 -0700 (PDT) X-ASG-Debug-ID: 1398719103-04cb6c7291fde40002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 3kmmJFyZKr5H4gHO for ; Mon, 28 Apr 2014 14:05: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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVaiBuBAYQjBK8tK4Es Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-000512-KR for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050z-JB for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/9] repair: report AG btree verifier errors Date: Tue, 29 Apr 2014 07:04:56 +1000 X-ASG-Orig-Subj: [PATCH 6/9] repair: report AG btree verifier errors Message-Id: <1398719099-19194-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719104 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we scan the filesystem freespace and inode maps in phase 2, we don't report CRC errors that are found. We don't really care from a repair perspective, because the trees are completely rebuilt from the ground up in phase 5, but froma checking perspective we need to inform the user that we found inconsistencies. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- repair/scan.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/repair/scan.c b/repair/scan.c index dec84ed..4b0ea04 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -82,6 +82,12 @@ scan_sbtree( do_error(_("can't read btree block %d/%d\n"), agno, root); return; } + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + do_warn(_("btree block %d/%d is suspect, error %d\n"), + agno, root, bp->b_error); + suspect = 1; + } + (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, isroot, magic, priv); libxfs_putbuf(bp); @@ -123,6 +129,7 @@ scan_lbtree( xfs_buf_t *bp; int err; int dirty = 0; + bool badcrc = false; bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, root), XFS_FSB_TO_BB(mp, 1), 0, ops); @@ -132,6 +139,19 @@ scan_lbtree( XFS_FSB_TO_AGBNO(mp, root)); return(1); } + + /* + * only check for bad CRC here - caller will determine if there + * is a corruption or not and whether it got corrected and so needs + * writing back. CRC errors always imply we need to write the block. + */ + if (bp->b_error == EFSBADCRC) { + do_warn(_("btree block %d/%d is suspect, error %d\n"), + XFS_FSB_TO_AGNO(mp, root), + XFS_FSB_TO_AGBNO(mp, root), bp->b_error); + badcrc = true; + } + err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, type, whichfork, root, ino, tot, nex, blkmapp, bm_cursor, isroot, check_dups, &dirty, @@ -139,7 +159,7 @@ scan_lbtree( ASSERT(dirty == 0 || (dirty && !no_modify)); - if (dirty && !no_modify) + if ((dirty || badcrc) && !no_modify) libxfs_writebuf(bp, 0); else libxfs_putbuf(bp); @@ -1066,6 +1086,9 @@ scan_freelist( do_abort(_("can't read agfl block for ag %d\n"), agno); return; } + if (agflbuf->b_error == EFSBADCRC) + do_warn(_("agfl has bad CRC for ag %d\n"), agno); + freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); i = be32_to_cpu(agf->agf_flfirst); -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8B60F29DFE for ; Mon, 28 Apr 2014 16:05:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80CD88F804B for ; Mon, 28 Apr 2014 14:05:11 -0700 (PDT) X-ASG-Debug-ID: 1398719108-04cb6c7292fdea0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id eXvnumS548ifTTm0 for ; Mon, 28 Apr 2014 14:05:09 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVajT8Ery0rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-00050x-J5 for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050p-IH for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Date: Tue, 29 Apr 2014 07:04:54 +1000 X-ASG-Orig-Subj: [PATCH 4/9] repair: detect and correct CRC errors in directory blocks Message-Id: <1398719099-19194-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719108 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner repair doesn't currently verifier errors in directory blocks - they cause repair to ignore blocks and hence fail because it can't read critical blocks from the directory. Fix this by having the directory buffer read code detect a verifier error and retry the read without the verifier if the verifier has detected an error. Then pass the verifer error with the successfully read buffer back to the caller, so the caller can handle the error appropriately. In most cases, this is simply marking the directory as needing a rebuild, so once the directory entries have been checked and repaired, it will rewrite all the directory buffers (including the clean ones) and in the process recalculate all the the CRC on the directory blocks. Hence pure CRC errors in directory blocks are now handled correctly by xfs_repair. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- repair/phase6.c | 94 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 19 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index 0c35e1c..5ae6a3d 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -125,6 +125,45 @@ typedef struct freetab { #define DIR_HASH_CK_TOTAL 6 /* + * Need to handle CRC and validation errors specially here. If there is a + * validator error, re-read without the verifier so that we get a buffer we can + * check and repair. Re-attach the ops to the buffer after the read so that when + * it is rewritten the CRC is recalculated. + * + * If the buffer was not read, we return an error. If the buffer was read but + * had a CRC or corruption error, we reread it without the verifier and if it is + * read successfully we increment *crc_error and return 0. Otherwise we + * return the read error. + */ +static int +dir_read_buf( + struct xfs_inode *ip, + xfs_dablk_t bno, + xfs_daddr_t mappedbno, + struct xfs_buf **bpp, + const struct xfs_buf_ops *ops, + int *crc_error) +{ + int error; + int error2; + + error = libxfs_da_read_buf(NULL, ip, bno, mappedbno, bpp, + XFS_DATA_FORK, ops); + + if (error != EFSBADCRC && error != EFSCORRUPTED) + return error; + + error2 = libxfs_da_read_buf(NULL, ip, bno, mappedbno, bpp, + XFS_DATA_FORK, NULL); + if (error2) + return error2; + + (*crc_error)++; + (*bpp)->b_ops = ops; + return 0; +} + +/* * Returns 0 if the name already exists (ie. a duplicate) */ static int @@ -1906,15 +1945,19 @@ longform_dir2_check_leaf( int seeval; struct xfs_dir2_leaf_entry *ents; struct xfs_dir3_icleaf_hdr leafhdr; + int error; + int fixit = 0; da_bno = mp->m_dirleafblk; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, XFS_DATA_FORK, - &xfs_dir3_leaf1_buf_ops)) { + error = dir_read_buf(ip, da_bno, -1, &bp, &xfs_dir3_leaf1_buf_ops, + &fixit); + if (error) { do_error( - _("can't read block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); /* NOTREACHED */ } + leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents = xfs_dir3_leaf_ents_p(leaf); @@ -1951,7 +1994,7 @@ longform_dir2_check_leaf( return 1; } libxfs_putbuf(bp); - return 0; + return fixit; } /* @@ -1978,6 +2021,8 @@ longform_dir2_check_node( struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir3_icfree_hdr freehdr; __be16 *bests; + int error; + int fixit = 0; for (da_bno = mp->m_dirleafblk, next_da_bno = 0; next_da_bno != NULLFILEOFF && da_bno < mp->m_dirfreeblk; @@ -1993,11 +2038,12 @@ longform_dir2_check_node( * a node block, then we'll skip it below based on a magic * number check. */ - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bp, - XFS_DATA_FORK, &xfs_da3_node_buf_ops)) { + error = dir_read_buf(ip, da_bno, -1, &bp, + &xfs_da3_node_buf_ops, &fixit); + if (error) { do_warn( - _("can't read leaf block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read leaf block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); return 1; } leaf = bp->b_addr; @@ -2016,6 +2062,12 @@ longform_dir2_check_node( libxfs_putbuf(bp); return 1; } + + /* + * If there's a validator error, we need to ensure that we got + * the right ops on the buffer for when we write it back out. + */ + bp->b_ops = &xfs_dir3_leafn_buf_ops; if (leafhdr.count > xfs_dir3_max_leaf_ents(mp, leaf) || leafhdr.count < leafhdr.stale) { do_warn( @@ -2039,11 +2091,13 @@ longform_dir2_check_node( next_da_bno = da_bno + mp->m_dirblkfsbs - 1; 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, &xfs_dir3_free_buf_ops)) { + + error = dir_read_buf(ip, da_bno, -1, &bp, + &xfs_dir3_free_buf_ops, &fixit); + if (error) { do_warn( - _("can't read freespace block %u for directory inode %" PRIu64 "\n"), - da_bno, ip->i_ino); + _("can't read freespace block %u for directory inode %" PRIu64 ", error %d\n"), + da_bno, ip->i_ino, error); return 1; } free = bp->b_addr; @@ -2093,7 +2147,7 @@ longform_dir2_check_node( return 1; } } - return 0; + return fixit; } /* @@ -2148,6 +2202,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, next_da_bno != NULLFILEOFF && da_bno < mp->m_dirleafblk; da_bno = (xfs_dablk_t)next_da_bno) { const struct xfs_buf_ops *ops; + int error; next_da_bno = da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) @@ -2167,11 +2222,12 @@ longform_dir2_entry_check(xfs_mount_t *mp, ops = &xfs_dir3_block_buf_ops; else ops = &xfs_dir3_data_buf_ops; - if (libxfs_da_read_buf(NULL, ip, da_bno, -1, &bplist[db], - XFS_DATA_FORK, ops)) { + + error = dir_read_buf(ip, da_bno, -1, &bplist[db], ops, &fixit); + if (error) { do_warn( - _("can't read data block %u for directory inode %" PRIu64 "\n"), - da_bno, ino); + _("can't read data block %u for directory inode %" PRIu64 " error %d\n"), + da_bno, ino, error); *num_illegal += 1; /* @@ -2189,7 +2245,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, irec, ino_offset, &bplist[db], hashtab, &freetab, da_bno, isblock); } - fixit = (*num_illegal != 0) || dir2_is_badino(ino) || *need_dot; + fixit |= (*num_illegal != 0) || dir2_is_badino(ino) || *need_dot; if (!dotdot_update) { /* check btree and freespace */ -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28D3F29E0B for ; Mon, 28 Apr 2014 16:05:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FA838F804B for ; Mon, 28 Apr 2014 14:05:12 -0700 (PDT) X-ASG-Debug-ID: 1398719105-04cbb03cc7fad40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Njkdd5FKhLVPB16R for ; Mon, 28 Apr 2014 14:05:05 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVaiRyEIwSvLSuBLiQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-00050u-HX for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050a-Gh for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/9] db: don't claim unchecked CRCs are correct Date: Tue, 29 Apr 2014 07:04:51 +1000 X-ASG-Orig-Subj: [PATCH 1/9] db: don't claim unchecked CRCs are correct Message-Id: <1398719099-19194-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719105 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5331 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently xfs_db will claim the CRC on a structure is correct if the buffer is not marked with an error. However, buffers may have been read without a verifier, and hence have not had their CRCs validated. in this case, we shoul dreport "unchecked" rather than "correct". For example: xfs_db> fsb 0x6003f xfs_db> type dir3 xfs_db> p dhdr.hdr.magic = 0x58444433 dhdr.hdr.crc = 0x2d0f9c9d (unchecked) .... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- db/fprint.c | 15 ++++++++++++++- db/io.c | 2 ++ db/io.h | 12 +++++++++--- include/libxfs.h | 1 + 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/db/fprint.c b/db/fprint.c index 435d984..52782e2 100644 --- a/db/fprint.c +++ b/db/fprint.c @@ -206,7 +206,20 @@ fp_crc( __int64_t val; char *ok; - ok = iocur_crc_valid() ? "correct" : "bad"; + switch (iocur_crc_valid()) { + case -1: + ok = "unchecked"; + break; + case 0: + ok = "bad"; + break; + case 1: + ok = "correct"; + break; + default: + ok = "unknown state"; + break; + } for (i = 0, bitpos = bit; i < count && !seenint(); diff --git a/db/io.c b/db/io.c index 5eb61d9..387f171 100644 --- a/db/io.c +++ b/db/io.c @@ -531,6 +531,8 @@ set_cur( return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; + if (!ops) + bp->b_flags |= LIBXFS_B_UNCHECKED; iocur_top->bb = d; iocur_top->blen = c; diff --git a/db/io.h b/db/io.h index ad39bee..7875119 100644 --- a/db/io.h +++ b/db/io.h @@ -63,10 +63,16 @@ extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); extern void ring_add(void); -static inline bool +/* + * returns -1 for unchecked, 0 for bad and 1 for good + */ +static inline int iocur_crc_valid() { - return (iocur_top->bp && - iocur_top->bp->b_error != EFSBADCRC && + if (!iocur_top->bp) + return -1; + if (iocur_top->bp->b_flags & LIBXFS_B_UNCHECKED) + return -1; + return (iocur_top->bp->b_error != EFSBADCRC && (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } diff --git a/include/libxfs.h b/include/libxfs.h index 6bc6c94..6b1e276 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -333,6 +333,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */ LIBXFS_B_UPTODATE = 0x0008, /* buffer is sync'd to disk */ LIBXFS_B_DISCONTIG = 0x0010, /* discontiguous buffer */ + LIBXFS_B_UNCHECKED = 0x0020, /* needs verification */ }; #define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 963AD29DFE for ; Mon, 28 Apr 2014 16:05:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 893DA304064 for ; Mon, 28 Apr 2014 14:05:12 -0700 (PDT) X-ASG-Debug-ID: 1398719103-04cb6c7291fde40005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id SA6VPCdCp9iNOxEu for ; Mon, 28 Apr 2014 14:05:10 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVajT8Ery0rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-000516-Lo for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00051E-L4 for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Date: Tue, 29 Apr 2014 07:04:59 +1000 X-ASG-Orig-Subj: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-Id: <1398719099-19194-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719110 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently the attribute code will not detect and correct errors in the attribute tree. It also fails to validate the CRCs and headers on remote attribute blocks. Ensure that all the attribute blocks are CRC checked and that the processing functions understand the correct block formats for decoding. Signed-off-by: Dave Chinner --- repair/attr_repair.c | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index ba85ac2..9b57960 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -604,6 +604,7 @@ verify_da_path(xfs_mount_t *mp, libxfs_putbuf(bp); return(1); } + /* * update cursor, write out the *current* level if * required. don't write out the descendant level @@ -615,6 +616,8 @@ verify_da_path(xfs_mount_t *mp, libxfs_writebuf(cursor->level[this_level].bp, 0); else libxfs_putbuf(cursor->level[this_level].bp); + + /* switch cursor to point at the new buffer we just read */ cursor->level[this_level].bp = bp; cursor->level[this_level].dirty = 0; cursor->level[this_level].bno = dabno; @@ -624,6 +627,14 @@ verify_da_path(xfs_mount_t *mp, cursor->level[this_level].n = newnode; #endif entry = cursor->level[this_level].index = 0; + + /* + * We want to rewrite the buffer a CRC error seeing as it + * contains what appears to be a valid node block, but only if + * we are fixing errors. + */ + if (bp->b_error == EFSBADCRC && !no_modify) + cursor->level[this_level].dirty++; } /* * ditto for block numbers @@ -974,6 +985,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, xfs_dfsbno_t bno; xfs_buf_t *bp; int clearit = 0, i = 0, length = 0, amountdone = 0; + int hdrsize = 0; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + hdrsize = sizeof(struct xfs_attr3_rmt_hdr); /* ASSUMPTION: valuelen is a valid number, so use it for looping */ /* Note that valuelen is not a multiple of blocksize */ @@ -986,16 +1001,26 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, break; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_attr3_rmt_buf_ops); if (!bp) { do_warn( _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); clearit = 1; break; } + + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + do_warn( + _("Corrupt remote block for attributes of inode %" PRIu64 "\n"), ino); + clearit = 1; + break; + } + ASSERT(mp->m_sb.sb_blocksize == XFS_BUF_COUNT(bp)); - length = MIN(XFS_BUF_COUNT(bp), valuelen - amountdone); - memmove(value, XFS_BUF_PTR(bp), length); + + length = MIN(XFS_BUF_COUNT(bp) - hdrsize, valuelen - amountdone); + memmove(value, XFS_BUF_PTR(bp) + hdrsize, length); amountdone += length; value += length; i++; @@ -1143,7 +1168,6 @@ process_leaf_attr_block( xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); clearit = usedbs = 0; - *repair = 0; firstb = mp->m_sb.sb_blocksize; stop = xfs_attr3_leaf_hdr_size(leaf); @@ -1320,13 +1344,16 @@ process_leaf_attr_level(xfs_mount_t *mp, } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); + XFS_FSB_TO_BB(mp, 1), 0, + &xfs_attr3_leaf_buf_ops); if (!bp) { do_warn( _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), da_bno, dev_bno, ino); goto error_out; } + if (bp->b_error == EFSBADCRC) + repair++; leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); @@ -1382,9 +1409,9 @@ process_leaf_attr_level(xfs_mount_t *mp, current_hashval = greatest_hashval; - if (repair && !no_modify) + if (repair && !no_modify) libxfs_writebuf(bp, 0); - else + else libxfs_putbuf(bp); } while (da_bno != 0); @@ -1512,6 +1539,8 @@ process_longform_attr( ino); return(1); } + if (bp->b_error == EFSBADCRC) + (*repair)++; /* verify leaf block */ leaf = (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); @@ -1555,7 +1584,7 @@ process_longform_attr( 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) { + if (*repair || repairlinks) { *repair = 1; libxfs_writebuf(bp, 0); } else -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 38F5029DFE for ; Mon, 28 Apr 2014 16:05:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2E9B88F804B for ; Mon, 28 Apr 2014 14:05:13 -0700 (PDT) X-ASG-Debug-ID: 1398719105-04cbb03cc7fad40002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id O9QZVZ0yoqEC7EUT for ; Mon, 28 Apr 2014 14:05:11 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVaiBuBAYQjBK8tK4Es Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:03 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-000514-LQ for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-000519-Kh for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 8/9] repair: handle remote symlink CRC errors Date: Tue, 29 Apr 2014 07:04:58 +1000 X-ASG-Orig-Subj: [PATCH 8/9] repair: handle remote symlink CRC errors Message-Id: <1398719099-19194-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719111 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5331 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We can't really repair broken symlink buffer contents, but we can at least warn about it and correct the CRC error so the symlink is again readable. Signed-off-by: Dave Chinner --- repair/dinode.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index b086bec..8891e84 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1254,6 +1254,7 @@ process_symlink_remote( while (pathlen > 0) { int blk_cnt = 1; int byte_cnt; + int badcrc = 0; fsbno = blkmap_get(blkmap, i); if (fsbno == NULLDFSBNO) { @@ -1284,6 +1285,12 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), lino, i, fsbno); return 1; } + if (bp->b_error == EFSBADCRC) { + do_warn( +_("Bad symlink buffer CRC, block %" PRIu64 ", inode %" PRIu64 ".\n" + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); + badcrc = 1; + } byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); byte_cnt = MIN(pathlen, byte_cnt); @@ -1307,7 +1314,10 @@ _("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n") offset += byte_cnt; i++; - libxfs_putbuf(bp); + if (badcrc && !no_modify) + libxfs_writebuf(bp, 0); + else + libxfs_putbuf(bp); } return 0; } -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B2E5529DFE for ; Mon, 28 Apr 2014 16:05:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 39BCEAC003 for ; Mon, 28 Apr 2014 14:05:13 -0700 (PDT) X-ASG-Debug-ID: 1398719108-04cb6c7292fdea0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZCkqU7DTTuhnbl7J for ; Mon, 28 Apr 2014 14:05:11 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVajT8Ery0rgS4k Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-00050w-IZ for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-00050k-Hm for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Date: Tue, 29 Apr 2014 07:04:53 +1000 X-ASG-Orig-Subj: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-Id: <1398719099-19194-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719110 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Prefetch currently does not do CRC validation when the IO completes due to the optimisation it performs and the fact that it does not know what the type of metadata into the buffer is supposed to be. Hence, mark all prefetched buffers as "suspect" so that when the end user tries to read it with a supplied validation function the validation is run even though the buffer was already in the cache. Signed-off-by: Dave Chinner --- include/libxfs.h | 2 ++ libxfs/rdwr.c | 58 ++++++++++++++++++++++++++++++++++++++++--------------- repair/prefetch.c | 7 ++++--- 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 6b1e276..9c10957 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -436,6 +436,8 @@ extern void libxfs_putbuf (xfs_buf_t *); #endif +extern void libxfs_readbuf_verify(struct xfs_buf *bp, + const struct xfs_buf_ops *ops); extern xfs_buf_t *libxfs_getsb(xfs_mount_t *, int); extern void libxfs_bcache_purge(void); extern void libxfs_bcache_flush(void); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 7208a2f..ea4bdfd 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -708,6 +708,17 @@ libxfs_readbufr(struct xfs_buftarg *btp, xfs_daddr_t blkno, xfs_buf_t *bp, return error; } +void +libxfs_readbuf_verify(struct xfs_buf *bp, const struct xfs_buf_ops *ops) +{ + if (!ops) + return; + bp->b_ops = ops; + bp->b_ops->verify_read(bp); + bp->b_flags &= ~LIBXFS_B_UNCHECKED; +} + + xfs_buf_t * libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, const struct xfs_buf_ops *ops) @@ -718,23 +729,38 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, bp = libxfs_getbuf(btp, blkno, len); if (!bp) return NULL; - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + + /* + * if the buffer was prefetched, it is likely that it was not validated. + * Hence if we are supplied an ops function and the buffer is marked as + * unchecked, we need to validate it now. + * + * We do this verification even if the buffer is dirty - the + * verification is almost certainly going to fail the CRC check in this + * case as a dirty buffer has not had the CRC recalculated. However, we + * should not be dirtying unchecked buffers and therefore failing it + * here because it's dirty and unchecked indicates we've screwed up + * somewhere else. + */ + bp->b_error = 0; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { + if (bp->b_flags & LIBXFS_B_UNCHECKED) + libxfs_readbuf_verify(bp, ops); 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. + * Set the ops on a cache miss (i.e. first physical read) as the + * verifier may change the ops to match the type of 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_error = 0; - bp->b_ops = ops; error = libxfs_readbufr(btp, blkno, bp, len, flags); if (error) bp->b_error = error; - else if (bp->b_ops) - bp->b_ops->verify_read(bp); + else + libxfs_readbuf_verify(bp, ops); return bp; } @@ -786,16 +812,15 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, return NULL; bp->b_error = 0; - bp->b_ops = ops; - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { + if (bp->b_flags & LIBXFS_B_UNCHECKED) + libxfs_readbuf_verify(bp, ops); return bp; - - error = libxfs_readbufr_map(btp, bp, flags); - if (!error) { - bp->b_flags |= LIBXFS_B_UPTODATE; - if (bp->b_ops) - bp->b_ops->verify_read(bp); } + error = libxfs_readbufr_map(btp, bp, flags); + if (!error) + libxfs_readbuf_verify(bp, ops); + #ifdef IO_DEBUG printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, @@ -888,7 +913,8 @@ libxfs_writebufr(xfs_buf_t *bp) #endif if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; - bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); + bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT | + LIBXFS_B_UNCHECKED); } return error; } diff --git a/repair/prefetch.c b/repair/prefetch.c index 6d6d344..65fedf5 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -387,8 +387,7 @@ pf_read_inode_dirs( int hasdir = 0; int isadir; - bp->b_ops = &xfs_inode_buf_ops; - bp->b_ops->verify_read(bp); + libxfs_readbuf_verify(bp, &xfs_inode_buf_ops); if (bp->b_error) return; @@ -460,6 +459,7 @@ pf_read_discontig( pthread_mutex_unlock(&args->lock); libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); + bp->b_flags |= LIBXFS_B_UNCHECKED; libxfs_putbuf(bp); pthread_mutex_lock(&args->lock); } @@ -582,7 +582,8 @@ pf_batch_read( if (len < size) break; memcpy(XFS_BUF_PTR(bplist[i]), pbuf, size); - bplist[i]->b_flags |= LIBXFS_B_UPTODATE; + bplist[i]->b_flags |= (LIBXFS_B_UPTODATE | + LIBXFS_B_UNCHECKED); len -= size; if (B_IS_INODE(XFS_BUF_PRIORITY(bplist[i]))) pf_read_inode_dirs(args, bplist[i]); -- 1.9.0 From dave@fromorbit.com Mon Apr 28 16:05:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F17BC29E21 for ; Mon, 28 Apr 2014 16:05:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 695FEAC002 for ; Mon, 28 Apr 2014 14:05:14 -0700 (PDT) X-ASG-Debug-ID: 1398719103-04cb6c7291fde40006-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id NQkXAOdsLZ4Y9NIz for ; Mon, 28 Apr 2014 14:05:12 -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: AuNLANPBXlN5LEcvPGdsb2JhbABZgwaIRKNOAQEBBZsQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDIcoVajT8Ery0r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 06:35:03 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WesjV-000513-Kz for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WesjV-000514-KA for xfs@oss.sgi.com; Tue, 29 Apr 2014 07:05:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/9] repair: remove more dirv1 leftovers Date: Tue, 29 Apr 2014 07:04:57 +1000 X-ASG-Orig-Subj: [PATCH 7/9] repair: remove more dirv1 leftovers Message-Id: <1398719099-19194-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1398719099-19194-1-git-send-email-david@fromorbit.com> References: <1398719099-19194-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398719111 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner get_bmapi() and it's children were only called by dirv1 code. There are no current callers, so remove them. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- repair/dinode.c | 239 -------------------------------------------------------- repair/dinode.h | 6 -- 2 files changed, 245 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 48f17ac..b086bec 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -870,245 +870,6 @@ get_agino_buf(xfs_mount_t *mp, } /* - * these next routines return the filesystem blockno of the - * block containing the block "bno" in the file whose bmap - * tree (or extent list) is rooted by "rootblock". - * - * the next routines are utility routines for the third - * routine, get_bmapi(). - * - * NOTE: getfunc_extlist only used by dirv1 checking code - */ -static xfs_dfsbno_t -getfunc_extlist(xfs_mount_t *mp, - xfs_ino_t ino, - xfs_dinode_t *dip, - xfs_dfiloff_t bno, - int whichfork) -{ - xfs_bmbt_irec_t irec; - xfs_dfsbno_t final_fsbno = NULLDFSBNO; - xfs_bmbt_rec_t *rootblock = (xfs_bmbt_rec_t *) - XFS_DFORK_PTR(dip, whichfork); - xfs_extnum_t nextents = XFS_DFORK_NEXTENTS(dip, whichfork); - int i; - - for (i = 0; i < nextents; i++) { - libxfs_bmbt_disk_get_all(rootblock + i, &irec); - if (irec.br_startoff <= bno && - bno < irec.br_startoff + irec.br_blockcount) { - final_fsbno = bno - irec.br_startoff + irec.br_startblock; - break; - } - } - - return(final_fsbno); -} - -/* - * NOTE: getfunc_btree only used by dirv1 checking code... - */ -static xfs_dfsbno_t -getfunc_btree(xfs_mount_t *mp, - xfs_ino_t ino, - xfs_dinode_t *dip, - xfs_dfiloff_t bno, - int whichfork) -{ - int i; -#ifdef DEBUG - int prev_level; -#endif - int found; - int numrecs; - xfs_bmbt_rec_t *rec; - xfs_bmbt_irec_t irec; - xfs_bmbt_ptr_t *pp; - xfs_bmbt_key_t *key; - xfs_bmdr_key_t *rkey; - xfs_bmdr_ptr_t *rp; - xfs_dfsbno_t fsbno; - xfs_buf_t *bp; - xfs_dfsbno_t final_fsbno = NULLDFSBNO; - struct xfs_btree_block *block; - xfs_bmdr_block_t *rootblock = (xfs_bmdr_block_t *) - XFS_DFORK_PTR(dip, whichfork); - - ASSERT(rootblock->bb_level != 0); - /* - * deal with root block, it's got a slightly different - * header structure than interior nodes. We know that - * a btree should have at least 2 levels otherwise it - * would be an extent list. - */ - rkey = XFS_BMDR_KEY_ADDR(rootblock, 1); - rp = XFS_BMDR_PTR_ADDR(rootblock, 1, - xfs_bmdr_maxrecs(mp, XFS_DFORK_SIZE(dip, mp, whichfork), 1)); - found = -1; - for (i = 0; i < be16_to_cpu(rootblock->bb_numrecs) - 1; i++) { - if (be64_to_cpu(rkey[i].br_startoff) <= bno && - bno < be64_to_cpu(rkey[i + 1].br_startoff)) { - found = i; - break; - } - } - if (i == be16_to_cpu(rootblock->bb_numrecs) - 1 && - bno >= be64_to_cpu(rkey[i].br_startoff)) - found = i; - - ASSERT(found != -1); - - fsbno = be64_to_cpu(rp[found]); - - ASSERT(verify_dfsbno(mp, fsbno)); - - bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - do_error(_("cannot read bmap block %" PRIu64 "\n"), fsbno); - return(NULLDFSBNO); - } - block = XFS_BUF_TO_BLOCK(bp); - numrecs = be16_to_cpu(block->bb_numrecs); - - /* - * ok, now traverse any interior btree nodes - */ -#ifdef DEBUG - prev_level = be16_to_cpu(block->bb_level); -#endif - - while (be16_to_cpu(block->bb_level) > 0) { -#ifdef DEBUG - ASSERT(be16_to_cpu(block->bb_level) < prev_level); - - prev_level = be16_to_cpu(block->bb_level); -#endif - if (numrecs > mp->m_bmap_dmxr[1]) { - do_warn( -_("# of bmap records in inode %" PRIu64 " exceeds max (%u, max - %u)\n"), - ino, numrecs, - mp->m_bmap_dmxr[1]); - libxfs_putbuf(bp); - return(NULLDFSBNO); - } - if (verbose && numrecs < mp->m_bmap_dmnr[1]) { - do_warn( -_("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), proceeding ...\n"), - ino, numrecs, mp->m_bmap_dmnr[1]); - } - key = XFS_BMBT_KEY_ADDR(mp, block, 1); - pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - for (found = -1, i = 0; i < numrecs - 1; i++) { - if (be64_to_cpu(key[i].br_startoff) <= bno && bno < - be64_to_cpu(key[i + 1].br_startoff)) { - found = i; - break; - } - } - if (i == numrecs - 1 && bno >= be64_to_cpu(key[i].br_startoff)) - found = i; - - ASSERT(found != -1); - fsbno = be64_to_cpu(pp[found]); - - ASSERT(verify_dfsbno(mp, fsbno)); - - /* - * release current btree block and read in the - * next btree block to be traversed - */ - libxfs_putbuf(bp); - bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, fsbno), - XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - do_error(_("cannot read bmap block %" PRIu64 "\n"), - fsbno); - return(NULLDFSBNO); - } - block = XFS_BUF_TO_BLOCK(bp); - numrecs = be16_to_cpu(block->bb_numrecs); - } - - /* - * current block must be a leaf block - */ - ASSERT(be16_to_cpu(block->bb_level) == 0); - if (numrecs > mp->m_bmap_dmxr[0]) { - do_warn( -_("# of bmap records in inode %" PRIu64 " greater than maximum (%u, max - %u)\n"), - ino, numrecs, mp->m_bmap_dmxr[0]); - libxfs_putbuf(bp); - return(NULLDFSBNO); - } - if (verbose && numrecs < mp->m_bmap_dmnr[0]) - do_warn( -_("- # of bmap records in inode %" PRIu64 " less than minimum (%u, min - %u), continuing...\n"), - ino, numrecs, mp->m_bmap_dmnr[0]); - - rec = XFS_BMBT_REC_ADDR(mp, block, 1); - for (i = 0; i < numrecs; i++) { - libxfs_bmbt_disk_get_all(rec + i, &irec); - if (irec.br_startoff <= bno && - bno < irec.br_startoff + irec.br_blockcount) { - final_fsbno = bno - irec.br_startoff + - irec.br_startblock; - break; - } - } - libxfs_putbuf(bp); - - if (final_fsbno == NULLDFSBNO) - do_warn(_("could not map block %" PRIu64 "\n"), bno); - - return(final_fsbno); -} - -/* - * this could be smarter. maybe we should have an open inode - * routine that would get the inode buffer and return back - * an inode handle. I'm betting for the moment that this - * is used only by the directory and attribute checking code - * and that the avl tree find and buffer cache search are - * relatively cheap. If they're too expensive, we'll just - * have to fix this and add an inode handle to the da btree - * cursor. - * - * caller is responsible for checking doubly referenced blocks - * and references to holes - * - * NOTE: get_bmapi only used by dirv1 checking code - */ -xfs_dfsbno_t -get_bmapi(xfs_mount_t *mp, xfs_dinode_t *dino_p, - xfs_ino_t ino_num, xfs_dfiloff_t bno, int whichfork) -{ - xfs_dfsbno_t fsbno; - - switch (XFS_DFORK_FORMAT(dino_p, whichfork)) { - case XFS_DINODE_FMT_EXTENTS: - fsbno = getfunc_extlist(mp, ino_num, dino_p, bno, whichfork); - break; - case XFS_DINODE_FMT_BTREE: - fsbno = getfunc_btree(mp, ino_num, dino_p, bno, whichfork); - break; - case XFS_DINODE_FMT_LOCAL: - do_error(_("get_bmapi() called for local inode %" PRIu64 "\n"), - ino_num); - fsbno = NULLDFSBNO; - break; - default: - /* - * shouldn't happen - */ - do_error(_("bad inode format for inode %" PRIu64 "\n"), ino_num); - fsbno = NULLDFSBNO; - } - - return(fsbno); -} - -/* * higher level inode processing stuff starts here: * first, one utility routine for each type of inode */ diff --git a/repair/dinode.h b/repair/dinode.h index 5ee51ca..80f3e4e 100644 --- a/repair/dinode.h +++ b/repair/dinode.h @@ -119,12 +119,6 @@ get_agino_buf(xfs_mount_t *mp, xfs_agino_t agino, xfs_dinode_t **dipp); -xfs_dfsbno_t -get_bmapi(xfs_mount_t *mp, - xfs_dinode_t *dip, - xfs_ino_t ino_num, - xfs_dfiloff_t bno, - int whichfork ); void dinode_bmbt_translation_init(void); char * get_forkname(int whichfork); -- 1.9.0 From tinguely@sgi.com Mon Apr 28 16:39:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 CF3CB29DF8 for ; Mon, 28 Apr 2014 16:39:49 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6743A304048; Mon, 28 Apr 2014 14:39:49 -0700 (PDT) Message-ID: <535ECAA6.3050200@sgi.com> Date: Mon, 28 Apr 2014 16:39:50 -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 , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428205420.GB18672@dastard> In-Reply-To: <20140428205420.GB18672@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/28/14 15:54, Dave Chinner wrote: > On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >> to test for a shut down fs, lest we go down paths we'll >> never be able to complete; Boris reported that during some >> stress tests he had threads stuck in xlog_cil_force_lsn >> via xfs_dir_fsync(). >> >> [ 3663.361709] sfsuspend-par D ffff88042f0b4540 0 3981 3947 0x00000080 >> >> [ 3663.394472] Call Trace: >> [ 3663.397199] [] schedule+0x29/0x70 >> [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] >> [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] >> [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] >> [ 3663.435873] [] do_fsync+0x65/0xa0 >> [ 3663.441408] [] SyS_fsync+0x10/0x20 >> [ 3663.447043] [] system_call_fastpath+0x16/0x1b > > Wow, I believe it's taken this long for us to notice that we can't > break out of xlog_cil_force_lsn() if we fail on xlog_write() > from a CIL push. > > I'd say that xlog_cil_force_lsn() needs log shutdown checks before > it goes to sleep in xlog_wait().... > >> Reported-by: Boris Ranto >> Signed-off-by: Eric Sandeen >> --- >> >> NB: While I've not asked Boris to test this yet, it seems >> clear (?) that dir_fsync should behave the same as >> file_fsync() in the face of a shut-down fs. >> >> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c >> index 4c749ab..2b94362 100644 >> --- a/fs/xfs/xfs_file.c >> +++ b/fs/xfs/xfs_file.c >> @@ -146,6 +146,9 @@ xfs_dir_fsync( >> >> trace_xfs_dir_fsync(ip); >> >> + if (XFS_FORCED_SHUTDOWN(mp)) >> + return -XFS_ERROR(EIO); >> + > > That won't hurt, but it won't fix the problem. > > Cheers, > > Dave. Similar to what Jeff Liu mention in Dec: http://oss.sgi.com/archives/xfs/2013-12/msg00870.html --Mark. From david@fromorbit.com Mon Apr 28 17:19:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 192E029DF8 for ; Mon, 28 Apr 2014 17:19:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DBF7304048 for ; Mon, 28 Apr 2014 15:19:21 -0700 (PDT) X-ASG-Debug-ID: 1398723559-04cb6c7292102c10001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id j2FhdXvxszihWOWz for ; Mon, 28 Apr 2014 15:19:19 -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: AtZLAJ/TXlN5LEcvPGdsb2JhbABZgwZPqzcMAQEBBZl2gRoXAwEBAQE4NYIlAQEEAScTHCMFCwgDFQMJJQ8FJQMHGhOIOQcOyGYXFoVEhwOBfAeDJIEVBJkLinSLLis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 07:48:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wetsv-0005IB-80; Tue, 29 Apr 2014 08:18:49 +1000 Date: Tue, 29 Apr 2014 08:18:49 +1000 From: Dave Chinner To: Mark Tinguely Cc: Eric Sandeen , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() Message-ID: <20140428221849.GC18672@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428205420.GB18672@dastard> <535ECAA6.3050200@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535ECAA6.3050200@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: 1398723559 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 28, 2014 at 04:39:50PM -0500, Mark Tinguely wrote: > On 04/28/14 15:54, Dave Chinner wrote: > >On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: > >>Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs > >>to test for a shut down fs, lest we go down paths we'll > >>never be able to complete; Boris reported that during some > >>stress tests he had threads stuck in xlog_cil_force_lsn > >>via xfs_dir_fsync(). > >> > >>[ 3663.361709] sfsuspend-par D ffff88042f0b4540 0 3981 3947 0x00000080 > >> > >>[ 3663.394472] Call Trace: > >>[ 3663.397199] [] schedule+0x29/0x70 > >>[ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > >>[ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > >>[ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > >>[ 3663.435873] [] do_fsync+0x65/0xa0 > >>[ 3663.441408] [] SyS_fsync+0x10/0x20 > >>[ 3663.447043] [] system_call_fastpath+0x16/0x1b > > > >Wow, I believe it's taken this long for us to notice that we can't > >break out of xlog_cil_force_lsn() if we fail on xlog_write() > >from a CIL push. .... > Similar to what Jeff Liu mention in Dec: > > http://oss.sgi.com/archives/xfs/2013-12/msg00870.html Which fell through the cracks because of objections to calling wake_up_all(&ctx->cil->xc_commit_wait) from xlog_cil_committed(). FYI, I just independently wrote a patch to fix this, and part of the fix is that it calls wake_up_all(&ctx->cil->xc_commit_wait) from xlog_cil_committed(). The rest of the fix indicates that the above patch wasn't sufficient. Patch below. This time it isn't going to fall through the cracks because I don't think the objections are valid... Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: don't sleep in xlog_cil_force_lsn on shutdown From: Dave Chinner Reports of a shutdown hang when fsyncing a directory have surfaced, such as this: [ 3663.394472] Call Trace: [ 3663.397199] [] schedule+0x29/0x70 [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] [ 3663.435873] [] do_fsync+0x65/0xa0 [ 3663.441408] [] SyS_fsync+0x10/0x20 [ 3663.447043] [] system_call_fastpath+0x16/0x1b If we trigger a shutdown in xlog_cil_push() from xlog_write(), we will never wake waiters on the current push sequence number, so anything waiting in xlog_cil_force_lsn() for that push sequence number to come up will not get woken and hence stall the shutdown. Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in the push abort handling, in the log shutdown code when waking all waiters, and adding a shutdown check in the sequence completion wait loops to ensure they abort when a wakeup due to a shutdown occurs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 7 +++++-- fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index a5f8bd9..dbba2d7 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3952,11 +3952,14 @@ xfs_log_force_umount( retval = xlog_state_ioerror(log); spin_unlock(&log->l_icloglock); } + /* - * Wake up everybody waiting on xfs_log_force. - * Callback all log item committed functions as if the + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone + * waiting on a CIL push that is issued as part of a log force first + * before running the log item committed callback functions as if the * log writes were completed. */ + wake_up_all(&log->l_cilp->xc_commit_wait); xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); #ifdef XFSERRORDEBUG diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 7e54553..3a68ddf 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -385,7 +385,15 @@ xlog_cil_committed( xfs_extent_busy_clear(mp, &ctx->busy_extents, (mp->m_flags & XFS_MOUNT_DISCARD) && !abort); + /* + * If we are aborting the commit, wake up anyone waiting on the + * committing list. If we don't, then a shutdown we can leave processes + * waiting in xlog_cil_force_lsn() waiting on a sequence commit that + * will never happen because we aborted it. + */ spin_lock(&ctx->cil->xc_push_lock); + if (abort) + wake_up_all(&cil->xc_commit_wait); list_del(&ctx->committing); spin_unlock(&ctx->cil->xc_push_lock); @@ -564,8 +572,18 @@ restart: spin_lock(&cil->xc_push_lock); list_for_each_entry(new_ctx, &cil->xc_committing, committing) { /* + * Avoid getting stuck in this loop because we were woken by the + * shutdown, but then went back to sleep once already in the + * shutdown state. + */ + if (XLOG_FORCED_SHUTDOWN(log)) { + spin_unlock(&cil->xc_push_lock); + goto out_abort_free_ticket; + } + + /* * Higher sequences will wait for this one so skip them. - * Don't wait for own own sequence, either. + * Don't wait for our own sequence, either. */ if (new_ctx->sequence >= ctx->sequence) continue; @@ -810,6 +828,13 @@ restart: */ spin_lock(&cil->xc_push_lock); list_for_each_entry(ctx, &cil->xc_committing, committing) { + /* + * Avoid getting stuck in this loop because we were woken by the + * shutdown, but then went back to sleep once already in the + * shutdown state. + */ + if (XLOG_FORCED_SHUTDOWN(log)) + goto out_shutdown; if (ctx->sequence > sequence) continue; if (!ctx->commit_lsn) { @@ -833,14 +858,12 @@ restart: * push sequence after the above wait loop and the CIL still contains * dirty objects. * - * When the push occurs, it will empty the CIL and - * atomically increment the currect sequence past the push sequence and - * move it into the committing list. Of course, if the CIL is clean at - * the time of the push, it won't have pushed the CIL at all, so in that - * case we should try the push for this sequence again from the start - * just in case. + * When the push occurs, it will empty the CIL and atomically increment + * the currect sequence past the push sequence and move it into the + * committing list. Of course, if the CIL is clean at the time of the + * push, it won't have pushed the CIL at all, so in that case we should + * try the push for this sequence again from the start just in case. */ - if (sequence == cil->xc_current_sequence && !list_empty(&cil->xc_cil)) { spin_unlock(&cil->xc_push_lock); @@ -849,6 +872,17 @@ restart: spin_unlock(&cil->xc_push_lock); return commit_lsn; + + /* + * We detected a shutdown in progress. We need to trigger the log force + * to pass through it's iclog state machine error handling, even though + * we are already in a shutdown state. Hence we can't return + * NULLCOMMITLSN here as that has special meaning to log forces (i.e. + * LSN is already stable), so we return a zero LSN instead. + */ +out_shutdown: + spin_unlock(&cil->xc_push_lock); + return 0; } /* From bob.mastors@solidfire.com Mon Apr 28 17:29:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7FFE329DF8 for ; Mon, 28 Apr 2014 17:29:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 538108F8040 for ; Mon, 28 Apr 2014 15:29:10 -0700 (PDT) X-ASG-Debug-ID: 1398724142-04cbb03cc41008a0001-NocioJ Received: from mail-ve0-f173.google.com (mail-ve0-f173.google.com [209.85.128.173]) by cuda.sgi.com with ESMTP id gFqsZeHh4nbpxxBg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 28 Apr 2014 15:29:03 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.128.173 Received: by mail-ve0-f173.google.com with SMTP id oy12so8783774veb.18 for ; Mon, 28 Apr 2014 15:29:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=+YZ2aA3xzKPXQUbFXyFdVsFzr0PUaRXCWiRWjXQJDZA=; b=kq8bLU2dhc7v80Wr1eZNiF7rLuLUkTrk0kKrcIya2vCMSE4vldHHzpRTO9zveUPJQA ZUc45+Mzt+DMK5a0FFC2ZY3A1GKmvY/z4b1Ckowqr0aAYGC2KelNeV4luSc8H5mFlEGT 1VVjJS/vLiC+70PLI6Bz5wGojCVhS6uMM6hSpgxA0L3Q1QN/H6W00nGdgCwmiBcG4XPc 1XSH4vMB5HAS7fiC9daQJUUA6UwAMeTDvWv2GuSgS88Tflz25mnOz2cZkuYJaOHmM/h5 DYItwoVZZ/DOYuCeQ/ZYUy2zgL4/jCUvNpxgj34MBRPSLx72vTEglUJfuXLfFQgSrMXN mt+g== X-Gm-Message-State: ALoCoQm8V0OkNOJgK17Gl3439nCQLsA0LGM3LZyZgpTBr2BB5Fw8ImE6HFl6eJq0BxA6wSR4Q3oy MIME-Version: 1.0 X-Received: by 10.58.74.38 with SMTP id q6mr25126395vev.7.1398724142446; Mon, 28 Apr 2014 15:29:02 -0700 (PDT) Received: by 10.52.78.67 with HTTP; Mon, 28 Apr 2014 15:29:02 -0700 (PDT) Date: Mon, 28 Apr 2014 16:29:02 -0600 Message-ID: Subject: xfs umount hang in xfs_ail_push_all_sync on i/o error From: Bob Mastors X-ASG-Orig-Subj: xfs umount hang in xfs_ail_push_all_sync on i/o error To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7bacbedca64ec404f821d726 X-Barracuda-Connect: mail-ve0-f173.google.com[209.85.128.173] X-Barracuda-Start-Time: 1398724142 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bacbedca64ec404f821d726 Content-Type: text/plain; charset=ISO-8859-1 Greetings, I have an xfs umount hang caused by forcing the block device to return i/o errors while copying files to the filesystem. Detailed steps to reproduce the problem on virtualbox are below. The linux version is a recent pull and reports as 3.15.0-rc3. [ 2040.248096] INFO: task umount:10303 blocked for more than 120 seconds. [ 2040.323947] Not tainted 3.15.0-rc3 #4 [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 2040.352665] umount D ffffffff8180fe40 0 10303 8691 0x00000000 [ 2040.404918] ffff88001e33dd58 0000000000000086 ffff88001e33dd48 ffffffff81080f82 [ 2040.489901] ffff88001b311900 0000000000013180 ffff88001e33dfd8 0000000000013180 [ 2040.534772] ffff88003daa3200 ffff88001b311900 ffff88002421aec0 ffff88002421ae80 [ 2040.587450] Call Trace: [ 2040.592176] [] ? try_to_wake_up+0x232/0x2b0 [ 2040.620212] [] schedule+0x29/0x70 [ 2040.627685] [] xfs_ail_push_all_sync+0x96/0xd0 [xfs] [ 2040.632236] [] ? __wake_up_sync+0x20/0x20 [ 2040.659105] [] xfs_unmountfs+0x63/0x160 [xfs] [ 2040.691774] [] ? kmem_free+0x35/0x40 [xfs] [ 2040.698610] [] xfs_fs_put_super+0x25/0x60 [xfs] [ 2040.706838] [] generic_shutdown_super+0x7e/0x100 [ 2040.723958] [] kill_block_super+0x30/0x80 [ 2040.734963] [] deactivate_locked_super+0x4d/0x80 [ 2040.745485] [] deactivate_super+0x4e/0x70 [ 2040.751274] [] mntput_no_expire+0xd2/0x160 [ 2040.755894] [] SyS_umount+0xaf/0x3b0 [ 2040.761032] [] system_call_fastpath+0x16/0x1b [ .060058] XFS (sdb): xfs_log_force: error 5 returned. [ 268059] XFS (sdb): xfs_log_force: error 5 returned. I took a look at xfs_ail_push_all_sync and it is pretty easy to see the hang. But it is not obvious to me how to fix it. Any ideas would be appreciated. I am available to run additional tests or capture more logging or whatever if that would help. Thanks, Bob virtual box setup ----------------- 1 GB ram 8 GB disk 4 processors Operating System: Linux Version: Debian (64 bit) Bridged networking iso: debian-7.4.0-amd64-netinst.iso Software selection select SSH server select Standard system utilities deselect everything else dhcp ip address: 172.17.5.129 upgrade linux to 3.15.0-rc3 --------------------------- ssh 172.17.5.129 su cd /mnt/ksrc/linux make modules_install make install reboot install tools ------------- ssh 172.17.5.129 su apt-get install xfsprogs apt-get install open-iscsi apt-get install --no-install-recommends targetcli python-urwid reboot reproduce bug ------------- ssh 172.17.5.129 su targetcli cd backstores fileio/ create name=file_backend2 file_or_dev=my_disk2 size=1G /iscsi create portals/ create 172.17.5.129 cd < luns/ create /backstores/fileio/file_backend2 cd < set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1 exit iscsiadm -m discovery -t sendtargets -p 172.17.5.129 iscsiadm -m node --login --target iqn.from_previous_iscsiadm_cmd_output fdisk -l mkfs -t xfs -f /dev/sdXX mkdir /mnt/vola put following lines in a shell script "foo.sh", fix up target and block device set -x iscsiadm -m node --target iqn.2003-01.org.linux-iscsi.debian.x8664:sn.51ab79ac3ce2 --login sleep 1 mount -t xfs /dev/sdb /mnt/vola sleep 10 iscsiadm -m node -U all sleep 1 umount /mnt/vola run the shell script in a loop like: while true; do ./foo.sh; done in another terminal run the following: while true; do cp -r /usr/lib /mnt/vola; done The hang seems to take from two to ten minutes to occur. --047d7bacbedca64ec404f821d726 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Greetings,

I have an xfs umo= unt hang caused by forcing the block device to return
i/o errors = while copying files to the filesystem.
Detailed steps to reproduc= e the problem on virtualbox are below.

The linux version is a recent pull and reports as 3.15.= 0-rc3.

[ 2040.248096] INFO: task umount:10303 bloc= ked for more than 120 seconds.
[ 2040.323947] =A0 =A0 =A0 Not tai= nted 3.15.0-rc3 #4
[ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_se= cs" disables this message.
[ 2040.352665] umount =A0 =A0 =A0= =A0 =A0D ffffffff8180fe40 =A0 =A0 0 10303 =A0 8691 0x00000000
[ = 2040.404918] =A0ffff88001e33dd58 0000000000000086 ffff88001e33dd48 ffffffff= 81080f82
[ 2040.489901] =A0ffff88001b311900 0000000000013180 ffff88001e33dfd8 0= 000000000013180
[ 2040.534772] =A0ffff88003daa3200 ffff88001b3119= 00 ffff88002421aec0 ffff88002421ae80
[ 2040.587450] Call Trace:
[ 2040.592176] =A0[<ffffffff81080f82>] ? try_to_wake_up+0x232/0x= 2b0
[ 2040.620212] =A0[<ffffffff816c54d9>] schedule+0x29/0x= 70
[ 2040.627685] =A0[<ffffffffa04c4cd6>] xfs_ail_push_all_= sync+0x96/0xd0 [xfs]
[ 2040.632236] =A0[<ffffffff81092230>] ? __wake_up_sync+0x20/0x2= 0
[ 2040.659105] =A0[<ffffffffa04731a3>] xfs_unmountfs+0x63= /0x160 [xfs]
[ 2040.691774] =A0[<ffffffffa0478f65>] ? kmem_= free+0x35/0x40 [xfs]
[ 2040.698610] =A0[<ffffffffa0474cf5>] xfs_fs_put_super+0x25/0x6= 0 [xfs]
[ 2040.706838] =A0[<ffffffff8119561e>] generic_shut= down_super+0x7e/0x100
[ 2040.723958] =A0[<ffffffff811956d0>= ] kill_block_super+0x30/0x80
[ 2040.734963] =A0[<ffffffff8119591d>] deactivate_locked_super+0= x4d/0x80
[ 2040.745485] =A0[<ffffffff8119652e>] deactivate_= super+0x4e/0x70
[ 2040.751274] =A0[<ffffffff811b1d42>] mntp= ut_no_expire+0xd2/0x160
[ 2040.755894] =A0[<ffffffff811b2fff>] SyS_umount+0xaf/0x3b0
[ 2040.761032] =A0[<ffffffff816d1592>] system_call_fastpath+0x= 16/0x1b
[ .060058] XFS (sdb): xfs_log_force: error 5 returned.
[ 268059] XFS (sdb): xfs_log_force: error 5 returned.

I took a look at xfs_ail_push_all_sync and it is pretty easy to se= e
the hang. But it is not obvious to me how to fix it.
Any ideas would be appreciated.

I am available to = run additional tests or capture more logging
or whatever if that = would help.

Thanks,
Bob

virtual box setup
-----------------
1 G= B ram
8 GB disk
4 processors
Operating System= : Linux
Version: Debian (64 bit)
Bridged networking
iso: debian-7.4.0-amd64-netinst.iso
Software selection
=
=A0 =A0 select SSH server
=A0 =A0 select Standard system uti= lities
=A0 =A0 deselect everything else
=A0 =A0=A0
dhcp ip address: 172.17.5.129

upgrade linux to 3.15.0-rc3
-----------------= ----------
ssh 172.17.5.129
su
cd /mnt/ksrc/l= inux
make modules_install
make install
reboot=

install tools
-------------
ssh 172= .17.5.129
su
apt-get install xfsprogs
apt-get= install open-iscsi
apt-get install --no-install-recommends targe= tcli python-urwid
reboot

reproduce bug
-------------<= /div>
ssh 172.17.5.129
su
targetcli
=A0 = =A0 cd backstores
=A0 =A0 fileio/ create name=3Dfile_backend2 fil= e_or_dev=3Dmy_disk2 size=3D1G
=A0 =A0 /iscsi create
=A0 =A0 portals/ create 172.17.5.129
=A0 =A0 cd <
=A0 =A0 luns/ create /backstores/fileio/= file_backend2
=A0 =A0 cd <
=A0 =A0 set attribute aut= hentication=3D0 demo_mode_write_protect=3D0 generate_node_acls=3D1 cache_dy= namic_acls=3D1
=A0 =A0 exit

iscsiadm -m discovery -t sendtar= gets -p 172.17.5.129
iscsiadm -m node --login --target iqn.from_p= revious_iscsiadm_cmd_output
fdisk -l
mkfs -t xfs -f /de= v/sdXX
mkdir /mnt/vola

put following lines in a shel= l script "foo.sh", fix up target and block device
=A0 = =A0 set -x
=A0 =A0 iscsiadm -m node --target iqn.2003-01.org.linu= x-iscsi.debian.x8664:sn.51ab79ac3ce2 --login
=A0 =A0 sleep 1
=A0 =A0 mount -t xfs /dev/sdb /mnt/vola
=A0 =A0 sleep 10
=A0 =A0 iscsiadm -m node -U all
= =A0 =A0 sleep 1
=A0 =A0 umount /mnt/vola

run the shell script in a loop like:
=A0 =A0 while true; do ./foo.sh; done

in anot= her terminal run the following:
=A0 =A0 while true; do cp -r /usr= /lib /mnt/vola; done

The hang seems to take from t= wo to ten minutes to occur.

--047d7bacbedca64ec404f821d726-- From tinguely@sgi.com Mon Apr 28 18:00:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3F76329DF8 for ; Mon, 28 Apr 2014 18:00:14 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id C81A6304048; Mon, 28 Apr 2014 16:00:13 -0700 (PDT) Message-ID: <535EDD7F.9000002@sgi.com> Date: Mon, 28 Apr 2014 18:00:15 -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 , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428205420.GB18672@dastard> <535ECAA6.3050200@sgi.com> <20140428221849.GC18672@dastard> In-Reply-To: <20140428221849.GC18672@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/28/14 17:18, Dave Chinner wrote: > On Mon, Apr 28, 2014 at 04:39:50PM -0500, Mark Tinguely wrote: >> > On 04/28/14 15:54, Dave Chinner wrote: >>> > >On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: >>>> > >>Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs >>>> > >>to test for a shut down fs, lest we go down paths we'll >>>> > >>never be able to complete; Boris reported that during some >>>> > >>stress tests he had threads stuck in xlog_cil_force_lsn >>>> > >>via xfs_dir_fsync(). >>>> > >> >>>> > >>[ 3663.361709] sfsuspend-par D ffff88042f0b4540 0 3981 3947 0x00000080 >>>> > >> >>>> > >>[ 3663.394472] Call Trace: >>>> > >>[ 3663.397199] [] schedule+0x29/0x70 >>>> > >>[ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] >>>> > >>[ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] >>>> > >>[ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] >>>> > >>[ 3663.435873] [] do_fsync+0x65/0xa0 >>>> > >>[ 3663.441408] [] SyS_fsync+0x10/0x20 >>>> > >>[ 3663.447043] [] system_call_fastpath+0x16/0x1b >>> > > >>> > >Wow, I believe it's taken this long for us to notice that we can't >>> > >break out of xlog_cil_force_lsn() if we fail on xlog_write() >> > >from a CIL push. > .... > >> > Similar to what Jeff Liu mention in Dec: >> > >> > http://oss.sgi.com/archives/xfs/2013-12/msg00870.html > Which fell through the cracks because of objections to calling > wake_up_all(&ctx->cil->xc_commit_wait) from xlog_cil_committed(). > > FYI, I just independently wrote a patch to fix this, and part of the > fix is that it calls wake_up_all(&ctx->cil->xc_commit_wait) from > xlog_cil_committed(). The rest of the fix indicates that the above > patch wasn't sufficient. Patch below. > > This time it isn't going to fall through the cracks because I don't > think the objections are valid... > > Cheers, > > Dave. > -- I did not intend to stall out the patch. I came to like the idea of always notifying the waiters on an lsn after the iclog is successfully written out not just when we start the IO. --Mark. From david@fromorbit.com Mon Apr 28 18:46:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 46B1829DF8 for ; Mon, 28 Apr 2014 18:46:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C5988F8054 for ; Mon, 28 Apr 2014 16:46:07 -0700 (PDT) X-ASG-Debug-ID: 1398728761-04bdf02b8c108620001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id LNfM7fvIUy3Rle7K for ; Mon, 28 Apr 2014 16:46: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: AvNLAJLnXlN5LEcvPGdsb2JhbABZgwaIRKNZAQEBBZl2gRoXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hAyQEXFoVEiH8HgySBFQSZC4p0iy4r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 09:16:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WevFG-0005U9-QP; Tue, 29 Apr 2014 09:45:58 +1000 Date: Tue, 29 Apr 2014 09:45:58 +1000 From: Dave Chinner To: Bob Mastors Cc: xfs@oss.sgi.com Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error Message-ID: <20140428234558.GD18672@dastard> X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o 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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398728761 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote: > Greetings, > > I have an xfs umount hang caused by forcing the block device to return > i/o errors while copying files to the filesystem. > Detailed steps to reproduce the problem on virtualbox are below. > > The linux version is a recent pull and reports as 3.15.0-rc3. > > [ 2040.248096] INFO: task umount:10303 blocked for more than 120 seconds. > [ 2040.323947] Not tainted 3.15.0-rc3 #4 > [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [ 2040.352665] umount D ffffffff8180fe40 0 10303 8691 > 0x00000000 > [ 2040.404918] ffff88001e33dd58 0000000000000086 ffff88001e33dd48 > ffffffff81080f82 > [ 2040.489901] ffff88001b311900 0000000000013180 ffff88001e33dfd8 > 0000000000013180 > [ 2040.534772] ffff88003daa3200 ffff88001b311900 ffff88002421aec0 > ffff88002421ae80 > [ 2040.587450] Call Trace: > [ 2040.592176] [] ? try_to_wake_up+0x232/0x2b0 > [ 2040.620212] [] schedule+0x29/0x70 > [ 2040.627685] [] xfs_ail_push_all_sync+0x96/0xd0 [xfs] > [ 2040.632236] [] ? __wake_up_sync+0x20/0x20 > [ 2040.659105] [] xfs_unmountfs+0x63/0x160 [xfs] > [ 2040.691774] [] ? kmem_free+0x35/0x40 [xfs] > [ 2040.698610] [] xfs_fs_put_super+0x25/0x60 [xfs] > [ 2040.706838] [] generic_shutdown_super+0x7e/0x100 > [ 2040.723958] [] kill_block_super+0x30/0x80 > [ 2040.734963] [] deactivate_locked_super+0x4d/0x80 > [ 2040.745485] [] deactivate_super+0x4e/0x70 > [ 2040.751274] [] mntput_no_expire+0xd2/0x160 > [ 2040.755894] [] SyS_umount+0xaf/0x3b0 > [ 2040.761032] [] system_call_fastpath+0x16/0x1b > [ .060058] XFS (sdb): xfs_log_force: error 5 returned. > [ 268059] XFS (sdb): xfs_log_force: error 5 returned. > > I took a look at xfs_ail_push_all_sync and it is pretty easy to see > the hang. But it is not obvious to me how to fix it. > Any ideas would be appreciated. > > I am available to run additional tests or capture more logging > or whatever if that would help. What's the entire log output from the first shutdown message? Cheers, Dave. -- Dave Chinner david@fromorbit.com From bob.mastors@solidfire.com Mon Apr 28 18:51:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 92A6D29DF8 for ; Mon, 28 Apr 2014 18:51:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 852D9304048 for ; Mon, 28 Apr 2014 16:51:36 -0700 (PDT) X-ASG-Debug-ID: 1398729092-04cbb03cc7104950001-NocioJ Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id luIvsm1aANFrOkiS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 28 Apr 2014 16:51:32 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 Received: by mail-vc0-f181.google.com with SMTP id hy4so3074516vcb.40 for ; Mon, 28 Apr 2014 16:51:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=NPUZwItlxT3eKZnoDiC9TTpeky+ld/wP48c1gwNHQXc=; b=WTAltmFZSd5XMkmRUAZF6VPRRwYNozPE2J2R2gESd14upwoWZg2TsFxImqzDn61X8P 7ayvSM6oUgoecfIVosbQXzrW26cThu51jp44MvXeEKy2K5P5AAS2PXBUM/+8VPDmCVLk rKWwAPIRn2E4Ka4dtCEnPZCue3oPuaTmIG4tN2s7Rhl/c0oUt07ddGttfPi1g7pljU2r 0ZxIfnW04mfI/+yEFiBgKJQS4DbtPetn4cQW38ynkI24wmlxYkT1dXxn/x6PLt/jzjR2 /6Ly1y9H9NkXMEnbs8tq/gCCMd1/R5JsEwjYRztBzyAqH1YYiC+wyCF2/YJqoONFrPvN JriA== X-Gm-Message-State: ALoCoQkJAzDV18/E7bWkauP9odk68G2jaBOYBZkB0pAcVkEVZhr3JeFXISS9YLhoQAMVAHqi/jCS MIME-Version: 1.0 X-Received: by 10.221.26.10 with SMTP id rk10mr26392060vcb.0.1398729091972; Mon, 28 Apr 2014 16:51:31 -0700 (PDT) Received: by 10.52.78.67 with HTTP; Mon, 28 Apr 2014 16:51:31 -0700 (PDT) In-Reply-To: <20140428234558.GD18672@dastard> References: <20140428234558.GD18672@dastard> Date: Mon, 28 Apr 2014 17:51:31 -0600 Message-ID: Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error From: Bob Mastors X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=001a11339ae4aa33e204f822fe89 X-Barracuda-Connect: mail-vc0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1398729092 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11339ae4aa33e204f822fe89 Content-Type: multipart/alternative; boundary=001a11339ae4aa33e004f822fe87 --001a11339ae4aa33e004f822fe87 Content-Type: text/plain; charset=ISO-8859-1 Log output attached. The xfs filesystem being mounted and unmounted is the only xfs filesystem on the system. Bob On Mon, Apr 28, 2014 at 5:45 PM, Dave Chinner wrote: > On Mon, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote: > > Greetings, > > > > I have an xfs umount hang caused by forcing the block device to return > > i/o errors while copying files to the filesystem. > > Detailed steps to reproduce the problem on virtualbox are below. > > > > The linux version is a recent pull and reports as 3.15.0-rc3. > > > > [ 2040.248096] INFO: task umount:10303 blocked for more than 120 seconds. > > [ 2040.323947] Not tainted 3.15.0-rc3 #4 > > [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > disables > > this message. > > [ 2040.352665] umount D ffffffff8180fe40 0 10303 8691 > > 0x00000000 > > [ 2040.404918] ffff88001e33dd58 0000000000000086 ffff88001e33dd48 > > ffffffff81080f82 > > [ 2040.489901] ffff88001b311900 0000000000013180 ffff88001e33dfd8 > > 0000000000013180 > > [ 2040.534772] ffff88003daa3200 ffff88001b311900 ffff88002421aec0 > > ffff88002421ae80 > > [ 2040.587450] Call Trace: > > [ 2040.592176] [] ? try_to_wake_up+0x232/0x2b0 > > [ 2040.620212] [] schedule+0x29/0x70 > > [ 2040.627685] [] xfs_ail_push_all_sync+0x96/0xd0 > [xfs] > > [ 2040.632236] [] ? __wake_up_sync+0x20/0x20 > > [ 2040.659105] [] xfs_unmountfs+0x63/0x160 [xfs] > > [ 2040.691774] [] ? kmem_free+0x35/0x40 [xfs] > > [ 2040.698610] [] xfs_fs_put_super+0x25/0x60 [xfs] > > [ 2040.706838] [] generic_shutdown_super+0x7e/0x100 > > [ 2040.723958] [] kill_block_super+0x30/0x80 > > [ 2040.734963] [] deactivate_locked_super+0x4d/0x80 > > [ 2040.745485] [] deactivate_super+0x4e/0x70 > > [ 2040.751274] [] mntput_no_expire+0xd2/0x160 > > [ 2040.755894] [] SyS_umount+0xaf/0x3b0 > > [ 2040.761032] [] system_call_fastpath+0x16/0x1b > > [ .060058] XFS (sdb): xfs_log_force: error 5 returned. > > [ 268059] XFS (sdb): xfs_log_force: error 5 returned. > > > > I took a look at xfs_ail_push_all_sync and it is pretty easy to see > > the hang. But it is not obvious to me how to fix it. > > Any ideas would be appreciated. > > > > I am available to run additional tests or capture more logging > > or whatever if that would help. > > What's the entire log output from the first shutdown message? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a11339ae4aa33e004f822fe87 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Log output attached.
The xfs filesystem being mounted = and unmounted is the only xfs filesystem on the system.
Bob
=


On Mon,= Apr 28, 2014 at 5:45 PM, Dave Chinner <david@fromorbit.com> wrote:
On M= on, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote:
> Greetings,
>
> I have an xfs umount hang caused by forcing the block device to return=
> i/o errors while copying files to the filesystem.
> Detailed steps to reproduce the problem on virtualbox are below.
>
> The linux version is a recent pull and reports as 3.15.0-rc3.
>
> [ 2040.248096] INFO: task umount:10303 blocked for more than 120 secon= ds.
> [ 2040.323947] =A0 =A0 =A0 Not tainted 3.15.0-rc3 #4
> [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_se= cs" disables
> this message.
> [ 2040.352665] umount =A0 =A0 =A0 =A0 =A0D ffffffff8180fe40 =A0 =A0 0 = 10303 =A0 8691
> 0x00000000
> [ 2040.404918] =A0ffff88001e33dd58 0000000000000086 ffff88001e33dd48 > ffffffff81080f82
> [ 2040.489901] =A0ffff88001b311900 0000000000013180 ffff88001e33dfd8 > 0000000000013180
> [ 2040.534772] =A0ffff88003daa3200 ffff88001b311900 ffff88002421aec0 > ffff88002421ae80
> [ 2040.587450] Call Trace:
> [ 2040.592176] =A0[<ffffffff81080f82>] ? try_to_wake_up+0x232/0x= 2b0
> [ 2040.620212] =A0[<ffffffff816c54d9>] schedule+0x29/0x70
> [ 2040.627685] =A0[<ffffffffa04c4cd6>] xfs_ail_push_all_sync+0x9= 6/0xd0 [xfs]
> [ 2040.632236] =A0[<ffffffff81092230>] ? __wake_up_sync+0x20/0x2= 0
> [ 2040.659105] =A0[<ffffffffa04731a3>] xfs_unmountfs+0x63/0x160 = [xfs]
> [ 2040.691774] =A0[<ffffffffa0478f65>] ? kmem_free+0x35/0x40 [xf= s]
> [ 2040.698610] =A0[<ffffffffa0474cf5>] xfs_fs_put_super+0x25/0x6= 0 [xfs]
> [ 2040.706838] =A0[<ffffffff8119561e>] generic_shutdown_super+0x= 7e/0x100
> [ 2040.723958] =A0[<ffffffff811956d0>] kill_block_super+0x30/0x8= 0
> [ 2040.734963] =A0[<ffffffff8119591d>] deactivate_locked_super+0= x4d/0x80
> [ 2040.745485] =A0[<ffffffff8119652e>] deactivate_super+0x4e/0x7= 0
> [ 2040.751274] =A0[<ffffffff811b1d42>] mntput_no_expire+0xd2/0x1= 60
> [ 2040.755894] =A0[<ffffffff811b2fff>] SyS_umount+0xaf/0x3b0
> [ 2040.761032] =A0[<ffffffff816d1592>] system_call_fastpath+0x16= /0x1b
> [ .060058] XFS (sdb): xfs_log_force: error 5 returned.
> [ 268059] XFS (sdb): xfs_log_force: error 5 returned.
>
> I took a look at xfs_ail_push_all_sync and it is pretty easy to see > the hang. But it is not obvious to me how to fix it.
> Any ideas would be appreciated.
>
> I am available to run additional tests or capture more logging
> or whatever if that would help.

What's the entire log output from the first shutdown messag= e?

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--001a11339ae4aa33e004f822fe87-- --001a11339ae4aa33e204f822fe89 Content-Type: text/x-log; charset=US-ASCII; name="vb-debian2.log" Content-Disposition: attachment; filename="vb-debian2.log" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hukf26rn0 WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0DQpbICAgIDAu MDAwMDAwXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHUNClsgICAgMC4wMDAwMDBdIElu aXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdWFjY3QNClsgICAgMC4wMDAwMDBdIExpbnV4IHZl cnNpb24gMy4xNS4wLXJjMyAocm1hc3RvcnNAcm1hc3RvcnMpIChnY2MgdmVyc2lvbiA0LjYuMyAo VWJ1bnR1L0xpbmFybyA0LjYuMy0xdWJ1bnR1NSkgKSAjNCBTTVAgTW9uIEFwciAyOCAxNDo0MDoz MCBNRFQgMjAxNA0KWyAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiBCT09UX0lNQUdFPS9ib290 L3ZtbGludXotMy4xNS4wLXJjMyByb290PVVVSUQ9ZmNiZjZmNGEtMTk2Ny00NGZjLWE3OWUtZDBk OWE3MDRhODhkIHJvIGNvbnNvbGU9dHR5IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjgNClsgICAgMC4w MDAwMDBdIEtFUk5FTCBzdXBwb3J0ZWQgY3B1czoNClsgICAgMC4wMDAwMDBdICAgSW50ZWwgR2Vu dWluZUludGVsDQpbICAgIDAuMDAwMDAwXSAgIEFNRCBBdXRoZW50aWNBTUQNClsgICAgMC4wMDAw MDBdICAgQ2VudGF1ciBDZW50YXVySGF1bHMNClsgICAgMC4wMDAwMDBdIGU4MjA6IEJJT1MtcHJv dmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoNClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAw eDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDlmYmZmXSB1c2FibGUNClsgICAgMC4wMDAw MDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwOWZjMDAtMHgwMDAwMDAwMDAwMDlmZmZm XSByZXNlcnZlZA0KWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDBm MDAwMC0weDAwMDAwMDAwMDAwZmZmZmZdIHJlc2VydmVkDQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4 MjA6IFttZW0gMHgwMDAwMDAwMDAwMTAwMDAwLTB4MDAwMDAwMDAzZmZlZmZmZl0gdXNhYmxlDQpb ICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDNmZmYwMDAwLTB4MDAwMDAw MDAzZmZmZmZmZl0gQUNQSSBkYXRhDQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgw MDAwMDAwMGZmZmMwMDAwLTB4MDAwMDAwMDBmZmZmZmZmZl0gcmVzZXJ2ZWQNClsgICAgMC4wMDAw MDBdIE5YIChFeGVjdXRlIERpc2FibGUpIHByb3RlY3Rpb246IGFjdGl2ZQ0KWyAgICAwLjAwMDAw MF0gU01CSU9TIDIuNSBwcmVzZW50Lg0KWyAgICAwLjAwMDAwMF0gTm8gQUdQIGJyaWRnZSBmb3Vu ZA0KWyAgICAwLjAwMDAwMF0gZTgyMDogbGFzdF9wZm4gPSAweDNmZmYwIG1heF9hcmNoX3BmbiA9 IDB4NDAwMDAwMDAwDQpbICAgIDAuMDAwMDAwXSB4ODYgUEFUIGVuYWJsZWQ6IGNwdSAwLCBvbGQg MHg3MDQwNjAwMDcwNDA2LCBuZXcgMHg3MDEwNjAwMDcwMTA2DQpbICAgIDAuMDAwMDAwXSBDUFUg TVRSUnMgYWxsIGJsYW5rIC0gdmlydHVhbGl6ZWQgc3lzdGVtLg0KWyAgICAwLjAwMDAwMF0gZm91 bmQgU01QIE1QLXRhYmxlIGF0IFttZW0gMHgwMDA5ZmZmMC0weDAwMDlmZmZmXSBtYXBwZWQgYXQg W2ZmZmY4ODAwMDAwOWZmZjBdDQpbICAgIDAuMDAwMDAwXSBTY2FubmluZyAxIGFyZWFzIGZvciBs b3cgbWVtb3J5IGNvcnJ1cHRpb24NClsgICAgMC4wMDAwMDBdIGluaXRfbWVtb3J5X21hcHBpbmc6 IFttZW0gMHgwMDAwMDAwMC0weDAwMGZmZmZmXQ0KWyAgICAwLjAwMDAwMF0gaW5pdF9tZW1vcnlf bWFwcGluZzogW21lbSAweDNmYzAwMDAwLTB4M2ZkZmZmZmZdDQpbICAgIDAuMDAwMDAwXSBpbml0 X21lbW9yeV9tYXBwaW5nOiBbbWVtIDB4M2MwMDAwMDAtMHgzZmJmZmZmZl0NClsgICAgMC4wMDAw MDBdIGluaXRfbWVtb3J5X21hcHBpbmc6IFttZW0gMHgwMDEwMDAwMC0weDNiZmZmZmZmXQ0KWyAg ICAwLjAwMDAwMF0gaW5pdF9tZW1vcnlfbWFwcGluZzogW21lbSAweDNmZTAwMDAwLTB4M2ZmZWZm ZmZdDQpbICAgIDAuMDAwMDAwXSBSQU1ESVNLOiBbbWVtIDB4MjhkYWMwMDAtMHgzMDZjZGZmZl0N ClsgICAgMC4wMDAwMDBdIEFDUEk6IFJTRFAgMHgwMDAwMDAwMDAwMEUwMDAwIDAwMDAyNCAodjAy IFZCT1ggICkNClsgICAgMC4wMDAwMDBdIEFDUEk6IFhTRFQgMHgwMDAwMDAwMDNGRkYwMDMwIDAw MDAzQyAodjAxIFZCT1ggICBWQk9YWFNEVCAwMDAwMDAwMSBBU0wgIDAwMDAwMDYxKQ0KWyAgICAw LjAwMDAwMF0gQUNQSTogRkFDUCAweDAwMDAwMDAwM0ZGRjAwRjAgMDAwMEY0ICh2MDQgVkJPWCAg IFZCT1hGQUNQIDAwMDAwMDAxIEFTTCAgMDAwMDAwNjEpDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBE U0RUIDB4MDAwMDAwMDAzRkZGMDQ4MCAwMDFCOTYgKHYwMSBWQk9YICAgVkJPWEJJT1MgMDAwMDAw MDIgSU5UTCAyMDEwMDUyOCkNClsgICAgMC4wMDAwMDBdIEFDUEk6IEZBQ1MgMHgwMDAwMDAwMDNG RkYwMjAwIDAwMDA0MA0KWyAgICAwLjAwMDAwMF0gQUNQSTogQVBJQyAweDAwMDAwMDAwM0ZGRjAy NDAgMDAwMDZDICh2MDIgVkJPWCAgIFZCT1hBUElDIDAwMDAwMDAxIEFTTCAgMDAwMDAwNjEpDQpb ICAgIDAuMDAwMDAwXSBBQ1BJOiBTU0RUIDB4MDAwMDAwMDAzRkZGMDJCMCAwMDAxQ0MgKHYwMSBW Qk9YICAgVkJPWENQVVQgMDAwMDAwMDIgSU5UTCAyMDEwMDUyOCkNClsgICAgMC4wMDAwMDBdIE5v IE5VTUEgY29uZmlndXJhdGlvbiBmb3VuZA0KWyAgICAwLjAwMDAwMF0gRmFraW5nIGEgbm9kZSBh dCBbbWVtIDB4MDAwMDAwMDAwMDAwMDAwMC0weDAwMDAwMDAwM2ZmZWZmZmZdDQpbICAgIDAuMDAw MDAwXSBJbml0bWVtIHNldHVwIG5vZGUgMCBbbWVtIDB4MDAwMDAwMDAtMHgzZmZlZmZmZl0NClsg ICAgMC4wMDAwMDBdICAgTk9ERV9EQVRBIFttZW0gMHgzZmZlYjAwMC0weDNmZmVmZmZmXQ0KWyAg ICAwLjAwMDAwMF0gWm9uZSByYW5nZXM6DQpbICAgIDAuMDAwMDAwXSAgIERNQSAgICAgIFttZW0g MHgwMDAwMTAwMC0weDAwZmZmZmZmXQ0KWyAgICAwLjAwMDAwMF0gICBETUEzMiAgICBbbWVtIDB4 MDEwMDAwMDAtMHhmZmZmZmZmZl0NClsgICAgMC4wMDAwMDBdICAgTm9ybWFsICAgZW1wdHkNClsg ICAgMC4wMDAwMDBdIE1vdmFibGUgem9uZSBzdGFydCBmb3IgZWFjaCBub2RlDQpbICAgIDAuMDAw MDAwXSBFYXJseSBtZW1vcnkgbm9kZSByYW5nZXMNClsgICAgMC4wMDAwMDBdICAgbm9kZSAgIDA6 IFttZW0gMHgwMDAwMTAwMC0weDAwMDllZmZmXQ0KWyAgICAwLjAwMDAwMF0gICBub2RlICAgMDog W21lbSAweDAwMTAwMDAwLTB4M2ZmZWZmZmZdDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBQTS1UaW1l ciBJTyBQb3J0OiAweDQwMDgNClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4 MDBdIGxhcGljX2lkWzB4MDBdIGVuYWJsZWQpDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAo YWNwaV9pZFsweDAxXSBsYXBpY19pZFsweDAxXSBlbmFibGVkKQ0KWyAgICAwLjAwMDAwMF0gQUNQ STogTEFQSUMgKGFjcGlfaWRbMHgwMl0gbGFwaWNfaWRbMHgwMl0gZW5hYmxlZCkNClsgICAgMC4w MDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDNdIGxhcGljX2lkWzB4MDNdIGVuYWJsZWQp DQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJT0FQSUMgKGlkWzB4MDRdIGFkZHJlc3NbMHhmZWMwMDAw MF0gZ3NpX2Jhc2VbMF0pDQpbICAgIDAuMDAwMDAwXSBJT0FQSUNbMF06IGFwaWNfaWQgNCwgdmVy c2lvbiAxNywgYWRkcmVzcyAweGZlYzAwMDAwLCBHU0kgMC0yMw0KWyAgICAwLjAwMDAwMF0gQUNQ STogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgMCBnbG9iYWxfaXJxIDIgZGZsIGRmbCkNClsg ICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2ly cSA5IGhpZ2ggbGV2ZWwpDQpbICAgIDAuMDAwMDAwXSBVc2luZyBBQ1BJIChNQURUKSBmb3IgU01Q IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24NClsgICAgMC4wMDAwMDBdIHNtcGJvb3Q6IEFsbG93 aW5nIDQgQ1BVcywgMCBob3RwbHVnIENQVXMNClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVk IG5vc2F2ZSBtZW1vcnk6IFttZW0gMHgwMDA5ZjAwMC0weDAwMDlmZmZmXQ0KWyAgICAwLjAwMDAw MF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDAwMGEwMDAwLTB4MDAwZWZm ZmZdDQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4 MDAwZjAwMDAtMHgwMDBmZmZmZl0NClsgICAgMC4wMDAwMDBdIGU4MjA6IFttZW0gMHg0MDAwMDAw MC0weGZmZmJmZmZmXSBhdmFpbGFibGUgZm9yIFBDSSBkZXZpY2VzDQpbICAgIDAuMDAwMDAwXSBz ZXR1cF9wZXJjcHU6IE5SX0NQVVM6MjU2IG5yX2NwdW1hc2tfYml0czoyNTYgbnJfY3B1X2lkczo0 IG5yX25vZGVfaWRzOjENClsgICAgMC4wMDAwMDBdIFBFUkNQVTogRW1iZWRkZWQgMjcgcGFnZXMv Y3B1IEBmZmZmODgwMDNmYzAwMDAwIHM4MTUzNiByODE5MiBkMjA4NjQgdTUyNDI4OA0KWyAgICAw LjAwMDAwMF0gQnVpbHQgMSB6b25lbGlzdHMgaW4gTm9kZSBvcmRlciwgbW9iaWxpdHkgZ3JvdXBp bmcgb24uICBUb3RhbCBwYWdlczogMjU3OTEzDQpbICAgIDAuMDAwMDAwXSBQb2xpY3kgem9uZTog RE1BMzINClsgICAgMC4wMDAwMDBdIEtlcm5lbCBjb21tYW5kIGxpbmU6IEJPT1RfSU1BR0U9L2Jv b3Qvdm1saW51ei0zLjE1LjAtcmMzIHJvb3Q9VVVJRD1mY2JmNmY0YS0xOTY3LTQ0ZmMtYTc5ZS1k MGQ5YTcwNGE4OGQgcm8gY29uc29sZT10dHkgY29uc29sZT10dHlTMCwxMTUyMDBuOA0KWyAgICAw LjAwMDAwMF0gUElEIGhhc2ggdGFibGUgZW50cmllczogNDA5NiAob3JkZXI6IDMsIDMyNzY4IGJ5 dGVzKQ0KWyAgICAwLjAwMDAwMF0gQ2hlY2tpbmcgYXBlcnR1cmUuLi4NClsgICAgMC4wMDAwMDBd IE5vIEFHUCBicmlkZ2UgZm91bmQNClsgICAgMC4wMDAwMDBdIE1lbW9yeTogODkxMjI4Sy8xMDQ4 MTIwSyBhdmFpbGFibGUgKDY5OTdLIGtlcm5lbCBjb2RlLCAxMDY1SyByd2RhdGEsIDMyNzJLIHJv ZGF0YSwgMTE5NksgaW5pdCwgMTA2OEsgYnNzLCAxNTY4OTJLIHJlc2VydmVkKQ0KWyAgICAwLjAw MDAwMF0gU0xVQjogSFdhbGlnbj02NCwgT3JkZXI9MC0zLCBNaW5PYmplY3RzPTAsIENQVXM9NCwg Tm9kZXM9MQ0KWyAgICAwLjAwMDAwMF0gSGllcmFyY2hpY2FsIFJDVSBpbXBsZW1lbnRhdGlvbi4N ClsgICAgMC4wMDAwMDBdIAlSQ1UgZHludGljay1pZGxlIGdyYWNlLXBlcmlvZCBhY2NlbGVyYXRp b24gaXMgZW5hYmxlZC4NClsgICAgMC4wMDAwMDBdIAlSQ1UgcmVzdHJpY3RpbmcgQ1BVcyBmcm9t IE5SX0NQVVM9MjU2IHRvIG5yX2NwdV9pZHM9NC4NClsgICAgMC4wMDAwMDBdIFJDVTogQWRqdXN0 aW5nIGdlb21ldHJ5IGZvciByY3VfZmFub3V0X2xlYWY9MTYsIG5yX2NwdV9pZHM9NA0KWyAgICAw LjAwMDAwMF0gTlJfSVJRUzoxNjY0MCBucl9pcnFzOjcxMiAxNg0KWyAgICAwLjAwMDAwMF0gQ29u c29sZTogY29sb3VyIFZHQSsgODB4MjUNClsgICAgMC4wMDAwMDBdIGNvbnNvbGUgW3R0eTBdIGVu YWJsZWQNClsgICAgMC4wMDAwMDBdIGNvbnNvbGUgW3R0eVMwXSBlbmFibGVkDQpbICAgIDAuMDAw MDAwXSBhbGxvY2F0ZWQgNDE5NDMwNCBieXRlcyBvZiBwYWdlX2Nncm91cA0KWyAgICAwLjAwMDAw MF0gcGxlYXNlIHRyeSAnY2dyb3VwX2Rpc2FibGU9bWVtb3J5JyBvcHRpb24gaWYgeW91IGRvbid0 IHdhbnQgbWVtb3J5IGNncm91cHMNClsgICAgMC4wMDAwMDBdIHRzYzogRmFzdCBUU0MgY2FsaWJy YXRpb24gdXNpbmcgUElUDQpbICAgIDAuMDAwMDAwXSB0c2M6IERldGVjdGVkIDMzNzcuMDYzIE1I eiBwcm9jZXNzb3INClsgICAgMC4wMDgwMjVdIENhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBw ZWQpLCB2YWx1ZSBjYWxjdWxhdGVkIHVzaW5nIHRpbWVyIGZyZXF1ZW5jeS4uIDY3NTQuMTIgQm9n b01JUFMgKGxwaj0xMzUwODI1MikNClsgICAgMC4wMTYwMDRdIHBpZF9tYXg6IGRlZmF1bHQ6IDMy NzY4IG1pbmltdW06IDMwMQ0KWyAgICAwLjAxNjczOF0gQUNQSTogQ29yZSByZXZpc2lvbiAyMDE0 MDIxNA0KWyAgICAwLjAxNzk0MV0gQUNQSTogQWxsIEFDUEkgVGFibGVzIHN1Y2Nlc3NmdWxseSBh Y3F1aXJlZA0KWyAgICAwLjAxODg5OF0gU2VjdXJpdHkgRnJhbWV3b3JrIGluaXRpYWxpemVkDQpb ICAgIDAuMDIwMDEyXSBBcHBBcm1vcjogQXBwQXJtb3IgaW5pdGlhbGl6ZWQNClsgICAgMC4wMjA2 OTVdIFlhbWE6IGJlY29taW5nIG1pbmRmdWwuDQpbICAgIDAuMDIxMzQ3XSBEZW50cnkgY2FjaGUg aGFzaCB0YWJsZSBlbnRyaWVzOiAxMzEwNzIgKG9yZGVyOiA4LCAxMDQ4NTc2IGJ5dGVzKQ0KWyAg ICAwLjAyMjQzMV0gSW5vZGUtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiA2NTUzNiAob3JkZXI6 IDcsIDUyNDI4OCBieXRlcykNClsgICAgMC4wMjM2MTddIE1vdW50LWNhY2hlIGhhc2ggdGFibGUg ZW50cmllczogMjA0OCAob3JkZXI6IDIsIDE2Mzg0IGJ5dGVzKQ0KWyAgICAwLjAyNDAwNV0gTW91 bnRwb2ludC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDIwNDggKG9yZGVyOiAyLCAxNjM4NCBi eXRlcykNClsgICAgMC4wMjUwNzZdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIG1lbW9yeQ0K WyAgICAwLjAyNTc3NF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgZGV2aWNlcw0KWyAgICAw LjAyNjQ3Nl0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgZnJlZXplcg0KWyAgICAwLjAyODAw NF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgbmV0X2Nscw0KWyAgICAwLjAyODc1MF0gSW5p dGlhbGl6aW5nIGNncm91cCBzdWJzeXMgYmxraW8NClsgICAgMC4wMjk0MTVdIEluaXRpYWxpemlu ZyBjZ3JvdXAgc3Vic3lzIHBlcmZfZXZlbnQNClsgICAgMC4wMzAyNDBdIENQVTogUGh5c2ljYWwg UHJvY2Vzc29yIElEOiAwDQpbICAgIDAuMDMwODg2XSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAw DQpbICAgIDAuMDMxNTA2XSBtY2U6IENQVSBzdXBwb3J0cyAwIE1DRSBiYW5rcw0KWyAgICAwLjAz MjA4OF0gTGFzdCBsZXZlbCBpVExCIGVudHJpZXM6IDRLQiAxMDI0LCAyTUIgMTAyNCwgNE1CIDEw MjQNClsgICAgMC4wMzIwODhdIExhc3QgbGV2ZWwgZFRMQiBlbnRyaWVzOiA0S0IgMTAyNCwgMk1C IDEwMjQsIDRNQiAxMDI0LCAxR0IgNA0KWyAgICAwLjAzMjA4OF0gdGxiX2ZsdXNoYWxsX3NoaWZ0 OiA2DQpbICAgIDAuMDM0NDA2XSBGcmVlaW5nIFNNUCBhbHRlcm5hdGl2ZXMgbWVtb3J5OiAyNEsg KGZmZmZmZmZmODFlMzcwMDAgLSBmZmZmZmZmZjgxZTNkMDAwKQ0KWyAgICAwLjAzNTYxOF0gZnRy YWNlOiBhbGxvY2F0aW5nIDI2NjU1IGVudHJpZXMgaW4gMTA1IHBhZ2VzDQpbICAgIDAuMDQ4MzQ2 XSAuLlRJTUVSOiB2ZWN0b3I9MHgzMCBhcGljMT0wIHBpbjE9MiBhcGljMj0tMSBwaW4yPS0xDQpb ICAgIDAuMDk1NzQxXSBzbXBib290OiBDUFUwOiBJbnRlbChSKSBDb3JlKFRNKSBpNy00NzcwIENQ VSBAIDMuNDBHSHogKGZhbTogMDYsIG1vZGVsOiAzYywgc3RlcHBpbmc6IDAzKQ0KWyAgICAwLjEx MjAwMF0gUGVyZm9ybWFuY2UgRXZlbnRzOiB1bnN1cHBvcnRlZCBwNiBDUFUgbW9kZWwgNjAgbm8g UE1VIGRyaXZlciwgc29mdHdhcmUgZXZlbnRzIG9ubHkuDQpbICAgIDAuMTIxMDcxXSBOTUkgd2F0 Y2hkb2c6IGRpc2FibGVkIChjcHUwKTogaGFyZHdhcmUgZXZlbnRzIG5vdCBlbmFibGVkDQpbICAg IDAuMTI0MTQ0XSB4ODY6IEJvb3RpbmcgU01QIGNvbmZpZ3VyYXRpb246DQpbICAgIDAuMTI4MDAy XSAuLi4uIG5vZGUgICMwLCBDUFVzOiAgICAgICMxDQpbICAgIDAuMDEyMDAwXSBtY2U6IENQVSBz dXBwb3J0cyAwIE1DRSBiYW5rcw0KWyAgICAwLjE2NDAwMF0gVFNDIHN5bmNocm9uaXphdGlvbiBb Q1BVIzAgLT4gQ1BVIzFdOg0KWyAgICAwLjE2NDAwMF0gTWVhc3VyZWQgNzgyMTIgY3ljbGVzIFRT QyB3YXJwIGJldHdlZW4gQ1BVcywgdHVybmluZyBvZmYgVFNDIGNsb2NrLg0KWyAgICAwLjE2NDAw MF0gdHNjOiBNYXJraW5nIFRTQyB1bnN0YWJsZSBkdWUgdG8gY2hlY2tfdHNjX3N5bmNfc291cmNl IGZhaWxlZA0KWyAgICAwLjE2NDE4MF0gICMyDQpbICAgIDAuMDEyMDAwXSBtY2U6IENQVSBzdXBw b3J0cyAwIE1DRSBiYW5rcw0KWyAgICAwLjIwOTI5OV0gICMzDQpbICAgIDAuMDEyMDAwXSBtY2U6 IENQVSBzdXBwb3J0cyAwIE1DRSBiYW5rcw0KWyAgICAwLjIzMzkzOF0geDg2OiBCb290ZWQgdXAg MSBub2RlLCA0IENQVXMNClsgICAgMC4yMzQ1ODJdIHNtcGJvb3Q6IFRvdGFsIG9mIDQgcHJvY2Vz c29ycyBhY3RpdmF0ZWQgKDI3MDE2LjUwIEJvZ29NSVBTKQ0KWyAgICAwLjIzNjI5OF0gZGV2dG1w ZnM6IGluaXRpYWxpemVkDQpbICAgIDAuMjM3ODUyXSBldm06IHNlY3VyaXR5LnNlbGludXgNClsg ICAgMC4yMzgzOTFdIGV2bTogc2VjdXJpdHkuU01BQ0s2NA0KWyAgICAwLjIzOTA4OF0gZXZtOiBz ZWN1cml0eS5jYXBhYmlsaXR5DQpbICAgIDAuMjQwNzU3XSByZWd1bGF0b3ItZHVtbXk6IG5vIHBh cmFtZXRlcnMNClsgICAgMC4yNDE1NzFdIFJUQyB0aW1lOiAyMTozNToxNSwgZGF0ZTogMDQvMjgv MTQNClsgICAgMC4yNDIzMDddIE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMTYNClsg ICAgMC4yNDMxMTZdIGNwdWlkbGU6IHVzaW5nIGdvdmVybm9yIGxhZGRlcg0KWyAgICAwLjI1NjAw OF0gY3B1aWRsZTogdXNpbmcgZ292ZXJub3IgbWVudQ0KWyAgICAwLjI2ODAyNl0gQUNQSTogYnVz IHR5cGUgUENJIHJlZ2lzdGVyZWQNClsgICAgMC4yODgwMDJdIGFjcGlwaHA6IEFDUEkgSG90IFBs dWcgUENJIENvbnRyb2xsZXIgRHJpdmVyIHZlcnNpb246IDAuNQ0KWyAgICAwLjMxNjA3N10gUENJ OiBVc2luZyBjb25maWd1cmF0aW9uIHR5cGUgMSBmb3IgYmFzZSBhY2Nlc3MNClsgICAgMC4zNDQ1 NzFdIEFDUEk6IEFkZGVkIF9PU0koTW9kdWxlIERldmljZSkNClsgICAgMC4zNTYwMDJdIEFDUEk6 IEFkZGVkIF9PU0koUHJvY2Vzc29yIERldmljZSkNClsgICAgMC4zNTY2OTFdIEFDUEk6IEFkZGVk IF9PU0koMy4wIF9TQ1AgRXh0ZW5zaW9ucykNClsgICAgMC4zNTc1NTFdIEFDUEk6IEFkZGVkIF9P U0koUHJvY2Vzc29yIEFnZ3JlZ2F0b3IgRGV2aWNlKQ0KWyAgICAwLjM2MDE2NF0gQUNQSTogRXhl Y3V0ZWQgMSBibG9ja3Mgb2YgbW9kdWxlLWxldmVsIGV4ZWN1dGFibGUgQU1MIGNvZGUNClsgICAg MC4zNjI3NjddIEFDUEk6IEludGVycHJldGVyIGVuYWJsZWQNClsgICAgMC4zNjM0NjhdIEFDUEkg RXhjZXB0aW9uOiBBRV9OT1RfRk9VTkQsIFdoaWxlIGV2YWx1YXRpbmcgU2xlZXAgU3RhdGUgW1xf UzFfXSAoMjAxNDAyMTQvaHd4ZmFjZS01ODApDQpbICAgIDAuMzY1MDQ3XSBBQ1BJIEV4Y2VwdGlv bjogQUVfTk9UX0ZPVU5ELCBXaGlsZSBldmFsdWF0aW5nIFNsZWVwIFN0YXRlIFtcX1MyX10gKDIw MTQwMjE0L2h3eGZhY2UtNTgwKQ0KWyAgICAwLjM2NzE3Ml0gQUNQSSBFeGNlcHRpb246IEFFX05P VF9GT1VORCwgV2hpbGUgZXZhbHVhdGluZyBTbGVlcCBTdGF0ZSBbXF9TM19dICgyMDE0MDIxNC9o d3hmYWNlLTU4MCkNClsgICAgMC4zNjg0NDRdIEFDUEkgRXhjZXB0aW9uOiBBRV9OT1RfRk9VTkQs IFdoaWxlIGV2YWx1YXRpbmcgU2xlZXAgU3RhdGUgW1xfUzRfXSAoMjAxNDAyMTQvaHd4ZmFjZS01 ODApDQpbICAgIDAuMzcwMTA3XSBBQ1BJOiAoc3VwcG9ydHMgUzAgUzUpDQpbICAgIDAuMzcwNzI1 XSBBQ1BJOiBVc2luZyBJT0FQSUMgZm9yIGludGVycnVwdCByb3V0aW5nDQpbICAgIDAuMzcxNDk1 XSBQQ0k6IElnbm9yaW5nIGhvc3QgYnJpZGdlIHdpbmRvd3MgZnJvbSBBQ1BJOyBpZiBuZWNlc3Nh cnksIHVzZSAicGNpPXVzZV9jcnMiIGFuZCByZXBvcnQgYSBidWcNClsgICAgMC4zNzMyOTddIEFD UEk6IFBDSSBSb290IEJyaWRnZSBbUENJMF0gKGRvbWFpbiAwMDAwIFtidXMgMDAtZmZdKQ0KWyAg ICAwLjM3NjAwNF0gYWNwaSBQTlAwQTAzOjAwOiBfT1NDOiBPUyBzdXBwb3J0cyBbQVNQTSBDbG9j a1BNIFNlZ21lbnRzIE1TSV0NClsgICAgMC4zNzY5MzNdIGFjcGkgUE5QMEEwMzowMDogX09TQyBm YWlsZWQgKEFFX05PVF9GT1VORCk7IGRpc2FibGluZyBBU1BNDQpbICAgIDAuMzc3ODM1XSBhY3Bp IFBOUDBBMDM6MDA6IGZhaWwgdG8gYWRkIE1NQ09ORklHIGluZm9ybWF0aW9uLCBjYW4ndCBhY2Nl c3MgZXh0ZW5kZWQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgdW5kZXIgdGhpcyBicmlkZ2UuDQpb ICAgIDAuMzgwMDcwXSBQQ0kgaG9zdCBicmlkZ2UgdG8gYnVzIDAwMDA6MDANClsgICAgMC4zODA3 MzNdIHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW2J1cyAwMC1mZl0NClsgICAg MC4zODE1MTRdIHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW2lvICAweDAwMDAt MHhmZmZmXQ0KWyAgICAwLjM4MjM2M10gcGNpX2J1cyAwMDAwOjAwOiByb290IGJ1cyByZXNvdXJj ZSBbbWVtIDB4MDAwMDAwMDAtMHg3ZmZmZmZmZmZmXQ0KWyAgICAwLjM4NDYxM10gcGNpIDAwMDA6 MDA6MDEuMTogbGVnYWN5IElERSBxdWlyazogcmVnIDB4MTA6IFtpbyAgMHgwMWYwLTB4MDFmN10N ClsgICAgMC4zODU2NzNdIHBjaSAwMDAwOjAwOjAxLjE6IGxlZ2FjeSBJREUgcXVpcms6IHJlZyAw eDE0OiBbaW8gIDB4MDNmNl0NClsgICAgMC4zODY1NTZdIHBjaSAwMDAwOjAwOjAxLjE6IGxlZ2Fj eSBJREUgcXVpcms6IHJlZyAweDE4OiBbaW8gIDB4MDE3MC0weDAxNzddDQpbICAgIDAuMzg3NTMz XSBwY2kgMDAwMDowMDowMS4xOiBsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxYzogW2lvICAweDAz NzZdDQpbICAgIDAuNDA5NDYxXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0FdIChJUlFz ICo1IDkgMTAgMTEpDQpbICAgIDAuNDE2ODkwXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xO S0JdIChJUlFzIDUgOSAxMCAqMTEpDQpbICAgIDAuNDE4MzUxXSBBQ1BJOiBQQ0kgSW50ZXJydXB0 IExpbmsgW0xOS0NdIChJUlFzIDUgOSAqMTAgMTEpDQpbICAgIDAuNDI4OTM1XSBBQ1BJOiBQQ0kg SW50ZXJydXB0IExpbmsgW0xOS0RdIChJUlFzIDUgKjkgMTAgMTEpDQpbICAgIDAuNDUyMDkxXSBB Q1BJOiBFbmFibGVkIDEgR1BFcyBpbiBibG9jayAwMCB0byAwNw0KWyAgICAwLjQ3MjExN10gdmdh YXJiOiBkZXZpY2UgYWRkZWQ6IFBDSTowMDAwOjAwOjAyLjAsZGVjb2Rlcz1pbyttZW0sb3ducz1p byttZW0sbG9ja3M9bm9uZQ0KWyAgICAwLjQ3NjAwM10gdmdhYXJiOiBsb2FkZWQNClsgICAgMC40 NzY1MTVdIHZnYWFyYjogYnJpZGdlIGNvbnRyb2wgcG9zc2libGUgMDAwMDowMDowMi4wDQpbICAg IDAuNDc3NTQwXSBTQ1NJIHN1YnN5c3RlbSBpbml0aWFsaXplZA0KWyAgICAwLjQ4MDA0Nl0gQUNQ STogYnVzIHR5cGUgVVNCIHJlZ2lzdGVyZWQNClsgICAgMC40ODAwNDZdIHVzYmNvcmU6IHJlZ2lz dGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdXNiZnMNClsgICAgMC40ODA4MThdIHVzYmNvcmU6 IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgaHViDQpbICAgIDAuNDgxNTk4XSB1c2Jj b3JlOiByZWdpc3RlcmVkIG5ldyBkZXZpY2UgZHJpdmVyIHVzYg0KWyAgICAwLjQ4NDEzOV0gUENJ OiBVc2luZyBBQ1BJIGZvciBJUlEgcm91dGluZw0KWyAgICAwLjQ4NTE4OF0gTmV0TGFiZWw6IElu aXRpYWxpemluZw0KWyAgICAwLjQ4NTE4OF0gTmV0TGFiZWw6ICBkb21haW4gaGFzaCBzaXplID0g MTI4DQpbICAgIDAuNDg1MTg4XSBOZXRMYWJlbDogIHByb3RvY29scyA9IFVOTEFCRUxFRCBDSVBT T3Y0DQpbICAgIDAuNDg1NDc0XSBOZXRMYWJlbDogIHVubGFiZWxlZCB0cmFmZmljIGFsbG93ZWQg YnkgZGVmYXVsdA0KWyAgICAwLjQ4ODEwOF0gU3dpdGNoZWQgdG8gY2xvY2tzb3VyY2UgcmVmaW5l ZC1qaWZmaWVzDQpbICAgIDAuNDkwNDc1XSBBcHBBcm1vcjogQXBwQXJtb3IgRmlsZXN5c3RlbSBF bmFibGVkDQpbICAgIDAuNTAwMDI1XSBwbnA6IFBuUCBBQ1BJIGluaXQNClsgICAgMC41MDA2Mjdd IEFDUEk6IGJ1cyB0eXBlIFBOUCByZWdpc3RlcmVkDQpbICAgIDAuNTAxNjIxXSBwbnA6IFBuUCBB Q1BJOiBmb3VuZCA1IGRldmljZXMNClsgICAgMC41MDIyODldIEFDUEk6IGJ1cyB0eXBlIFBOUCB1 bnJlZ2lzdGVyZWQNClsgICAgMC41MTQzODZdIFN3aXRjaGVkIHRvIGNsb2Nrc291cmNlIGFjcGlf cG0NClsgICAgMC41MTUwODRdIE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMg0KWyAg ICAwLjUxNzIxNV0gVENQIGVzdGFibGlzaGVkIGhhc2ggdGFibGUgZW50cmllczogODE5MiAob3Jk ZXI6IDQsIDY1NTM2IGJ5dGVzKQ0KWyAgICAwLjUxODE5MV0gVENQIGJpbmQgaGFzaCB0YWJsZSBl bnRyaWVzOiA4MTkyIChvcmRlcjogNSwgMTMxMDcyIGJ5dGVzKQ0KWyAgICAwLjUyMzE1Nl0gVENQ OiBIYXNoIHRhYmxlcyBjb25maWd1cmVkIChlc3RhYmxpc2hlZCA4MTkyIGJpbmQgODE5MikNClsg ICAgMC41MjQyNjBdIFRDUDogcmVubyByZWdpc3RlcmVkDQpbICAgIDAuNTI0ODcxXSBVRFAgaGFz aCB0YWJsZSBlbnRyaWVzOiA1MTIgKG9yZGVyOiAyLCAxNjM4NCBieXRlcykNClsgICAgMC41MjU3 NjldIFVEUC1MaXRlIGhhc2ggdGFibGUgZW50cmllczogNTEyIChvcmRlcjogMiwgMTYzODQgYnl0 ZXMpDQpbICAgIDAuNTI2NzMzXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDENClsg ICAgMC41Mjc1NDJdIHBjaSAwMDAwOjAwOjAwLjA6IExpbWl0aW5nIGRpcmVjdCBQQ0kvUENJIHRy YW5zZmVycw0KWyAgICAwLjUyODU4OV0gcGNpIDAwMDA6MDA6MDEuMDogQWN0aXZhdGluZyBJU0Eg RE1BIGhhbmcgd29ya2Fyb3VuZHMNClsgICAgMC41MzA1ODVdIFRyeWluZyB0byB1bnBhY2sgcm9v dGZzIGltYWdlIGFzIGluaXRyYW1mcy4uLg0KWyAgICAxLjg1MjM0Nl0gRnJlZWluZyBpbml0cmQg bWVtb3J5OiAxMjQwNDBLIChmZmZmODgwMDI4ZGFjMDAwIC0gZmZmZjg4MDAzMDZjZTAwMCkNClsg ICAgMS44ODQyNzRdIHBsYXRmb3JtIHJ0Y19jbW9zOiByZWdpc3RlcmVkIHBsYXRmb3JtIFJUQyBk ZXZpY2UgKG5vIFBOUCBkZXZpY2UgZm91bmQpDQpbICAgIDEuODg3NzgwXSBTY2FubmluZyBmb3Ig bG93IG1lbW9yeSBjb3JydXB0aW9uIGV2ZXJ5IDYwIHNlY29uZHMNClsgICAgMS44ODg5NjBdIGZ1 dGV4IGhhc2ggdGFibGUgZW50cmllczogMTAyNCAob3JkZXI6IDQsIDY1NTM2IGJ5dGVzKQ0KWyAg ICAxLjg4OTgzMF0gSW5pdGlhbGlzZSBzeXN0ZW0gdHJ1c3RlZCBrZXlyaW5nDQpbICAgIDEuODkw NTI3XSBhdWRpdDogaW5pdGlhbGl6aW5nIG5ldGxpbmsgc3Vic3lzIChkaXNhYmxlZCkNClsgICAg MS44OTEzMzVdIGF1ZGl0OiB0eXBlPTIwMDAgYXVkaXQoMTM5ODcyMDkxNS44ODc6MSk6IGluaXRp YWxpemVkDQpbICAgIDEuOTEwMTA2XSBib3VuY2UgcG9vbCBzaXplOiA2NCBwYWdlcw0KWyAgICAx LjkxMDc2N10gSHVnZVRMQiByZWdpc3RlcmVkIDIgTUIgcGFnZSBzaXplLCBwcmUtYWxsb2NhdGVk IDAgcGFnZXMNClsgICAgMS45MTI5MzZdIFZGUzogRGlzayBxdW90YXMgZHF1b3RfNi41LjINClsg ICAgMS45MTM2MzBdIERxdW90LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNTEyIChvcmRlciAw LCA0MDk2IGJ5dGVzKQ0KWyAgICAxLjkxNDc2Ml0gZnVzZSBpbml0IChBUEkgdmVyc2lvbiA3LjIz KQ0KWyAgICAxLjkxNTU3Nl0gbXNnbW5pIGhhcyBiZWVuIHNldCB0byAxOTgyDQpbICAgIDEuOTE5 MDYzXSBLZXkgdHlwZSBhc3ltbWV0cmljIHJlZ2lzdGVyZWQNClsgICAgMS45MjAwMDNdIEFzeW1t ZXRyaWMga2V5IHBhcnNlciAneDUwOScgcmVnaXN0ZXJlZA0KWyAgICAxLjkyMTEwM10gQmxvY2sg bGF5ZXIgU0NTSSBnZW5lcmljIChic2cpIGRyaXZlciB2ZXJzaW9uIDAuNCBsb2FkZWQgKG1ham9y IDI1MikNClsgICAgMS45NTMxNTZdIGlvIHNjaGVkdWxlciBub29wIHJlZ2lzdGVyZWQNClsgICAg MS45NTM4MTVdIGlvIHNjaGVkdWxlciBkZWFkbGluZSByZWdpc3RlcmVkIChkZWZhdWx0KQ0KWyAg ICAxLjk1NDgxN10gaW8gc2NoZWR1bGVyIGNmcSByZWdpc3RlcmVkDQpbICAgIDEuOTU1NTQ2XSBw Y2lfaG90cGx1ZzogUENJIEhvdCBQbHVnIFBDSSBDb3JlIHZlcnNpb246IDAuNQ0KWyAgICAxLjk1 NzEwM10gcGNpZWhwOiBQQ0kgRXhwcmVzcyBIb3QgUGx1ZyBDb250cm9sbGVyIERyaXZlciB2ZXJz aW9uOiAwLjQNClsgICAgMS45NTgyMTJdIEFDUEk6IEFDIEFkYXB0ZXIgW0FDXSAob24tbGluZSkN ClsgICAgMS45NTg5ODhdIGlucHV0OiBQb3dlciBCdXR0b24gYXMgL2RldmljZXMvTE5YU1lTVE06 MDAvTE5YUFdSQk46MDAvaW5wdXQvaW5wdXQwDQpbICAgIDEuOTYwMjExXSBBQ1BJOiBQb3dlciBC dXR0b24gW1BXUkZdDQpbICAgIDEuOTYwNzU4XSBpbnB1dDogU2xlZXAgQnV0dG9uIGFzIC9kZXZp Y2VzL0xOWFNZU1RNOjAwL0xOWFNMUEJOOjAwL2lucHV0L2lucHV0MQ0KWyAgICAxLjk2MTk1MF0g QUNQSTogU2xlZXAgQnV0dG9uIFtTTFBGXQ0KWyAgICAxLjk2MzEzNl0gR0hFUzogSEVTVCBpcyBu b3QgZW5hYmxlZCENClsgICAgMS45NjQwNThdIFNlcmlhbDogODI1MC8xNjU1MCBkcml2ZXIsIDMy IHBvcnRzLCBJUlEgc2hhcmluZyBlbmFibGVkDQpbICAgIDEuOTg2MTkxXSAwMDowNDogdHR5UzAg YXQgSS9PIDB4M2Y4IChpcnEgPSA0LCBiYXNlX2JhdWQgPSAxMTUyMDApIGlzIGEgMTY1NTBBDQpb ICAgIDEuOTkyNjk4XSBMaW51eCBhZ3BnYXJ0IGludGVyZmFjZSB2MC4xMDMNClsgICAgMS45OTU0 MDddIGJyZDogbW9kdWxlIGxvYWRlZA0KWyAgICAxLjk5NzM3Ml0gbG9vcDogbW9kdWxlIGxvYWRl ZA0KWyAgICAxLjk5ODY1N10gc2NzaTAgOiBhdGFfcGlpeA0KWyAgICAyLjAwMDk0NV0gc2NzaTEg OiBhdGFfcGlpeA0KWyAgICAyLjAwMTUzNF0gYXRhMTogUEFUQSBtYXggVURNQS8zMyBjbWQgMHgx ZjAgY3RsIDB4M2Y2IGJtZG1hIDB4ZDAwMCBpcnEgMTQNClsgICAgMi4wMDI4NDRdIGF0YTI6IFBB VEEgbWF4IFVETUEvMzMgY21kIDB4MTcwIGN0bCAweDM3NiBibWRtYSAweGQwMDggaXJxIDE1DQpb ICAgIDIuMDA0MDg3XSBsaWJwaHk6IEZpeGVkIE1ESU8gQnVzOiBwcm9iZWQNClsgICAgMi4wMDQ4 NDhdIHR1bjogVW5pdmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlciwgMS42DQpbICAgIDIuMDA1 NjExXSB0dW46IChDKSAxOTk5LTIwMDQgTWF4IEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNv bT4NClsgICAgMi4wMDY2MzBdIFBQUCBnZW5lcmljIGRyaXZlciB2ZXJzaW9uIDIuNC4yDQpbICAg IDIuMDA3NDM1XSBlaGNpX2hjZDogVVNCIDIuMCAnRW5oYW5jZWQnIEhvc3QgQ29udHJvbGxlciAo RUhDSSkgRHJpdmVyDQpbICAgIDIuMDA4NDkzXSBlaGNpLXBjaTogRUhDSSBQQ0kgcGxhdGZvcm0g ZHJpdmVyDQpbICAgIDIuMDA5MjkzXSBlaGNpLXBsYXRmb3JtOiBFSENJIGdlbmVyaWMgcGxhdGZv cm0gZHJpdmVyDQpbICAgIDIuMDEwMTU3XSBvaGNpX2hjZDogVVNCIDEuMSAnT3BlbicgSG9zdCBD b250cm9sbGVyIChPSENJKSBEcml2ZXINClsgICAgMi4wMjM0NDldIG9oY2ktcGNpOiBPSENJIFBD SSBwbGF0Zm9ybSBkcml2ZXINClsgICAgMi4wMjQ2MDBdIG9oY2ktcGNpIDAwMDA6MDA6MDYuMDog T0hDSSBQQ0kgaG9zdCBjb250cm9sbGVyDQpbICAgIDIuMDI1NDI1XSBvaGNpLXBjaSAwMDAwOjAw OjA2LjA6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIgMQ0KWyAg ICAyLjAyNjY4MF0gb2hjaS1wY2kgMDAwMDowMDowNi4wOiBpcnEgMjIsIGlvIG1lbSAweGYwODA0 MDAwDQpbICAgIDIuMDgwMjUxXSB1c2IgdXNiMTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVu ZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAxDQpbICAgIDIuMDgxMjcxXSB1c2IgdXNiMTogTmV3IFVT QiBkZXZpY2Ugc3RyaW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTENClsgICAg Mi4wODI0NjddIHVzYiB1c2IxOiBQcm9kdWN0OiBPSENJIFBDSSBob3N0IGNvbnRyb2xsZXINClsg ICAgMi4wODMyNTddIHVzYiB1c2IxOiBNYW51ZmFjdHVyZXI6IExpbnV4IDMuMTUuMC1yYzMgb2hj aV9oY2QNClsgICAgMi4wODQzMDFdIHVzYiB1c2IxOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MDYu MA0KWyAgICAyLjA4NTE3NV0gaHViIDEtMDoxLjA6IFVTQiBodWIgZm91bmQNClsgICAgMi4wODU4 MzFdIGh1YiAxLTA6MS4wOiA4IHBvcnRzIGRldGVjdGVkDQpbICAgIDIuMDg2NzM5XSBvaGNpLXBs YXRmb3JtOiBPSENJIGdlbmVyaWMgcGxhdGZvcm0gZHJpdmVyDQpbICAgIDIuMDg3NjcyXSB1aGNp X2hjZDogVVNCIFVuaXZlcnNhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlcg0KWyAg ICAyLjA4ODYzNl0gaTgwNDI6IFBOUDogUFMvMiBDb250cm9sbGVyIFtQTlAwMzAzOlBTMkssUE5Q MGYwMzpQUzJNXSBhdCAweDYwLDB4NjQgaXJxIDEsMTINClsgICAgMi4wOTAzOTVdIHNlcmlvOiBp ODA0MiBLQkQgcG9ydCBhdCAweDYwLDB4NjQgaXJxIDENClsgICAgMi4wOTI0NTJdIHNlcmlvOiBp ODA0MiBBVVggcG9ydCBhdCAweDYwLDB4NjQgaXJxIDEyDQpbICAgIDIuMDkzNDczXSBtb3VzZWRl djogUFMvMiBtb3VzZSBkZXZpY2UgY29tbW9uIGZvciBhbGwgbWljZQ0KWyAgICAyLjA5NDY3OV0g aW5wdXQ6IEFUIFRyYW5zbGF0ZWQgU2V0IDIga2V5Ym9hcmQgYXMgL2RldmljZXMvcGxhdGZvcm0v aTgwNDIvc2VyaW8wL2lucHV0L2lucHV0Mg0KWyAgICAyLjA5NjM2Ml0gcnRjX2Ntb3MgcnRjX2Nt b3M6IHJ0YyBjb3JlOiByZWdpc3RlcmVkIHJ0Y19jbW9zIGFzIHJ0YzANClsgICAgMi4wOTc0NjJd IHJ0Y19jbW9zIHJ0Y19jbW9zOiBhbGFybXMgdXAgdG8gb25lIGRheSwgMTE0IGJ5dGVzIG52cmFt DQpbICAgIDIuMDk4NjgzXSBkZXZpY2UtbWFwcGVyOiB1ZXZlbnQ6IHZlcnNpb24gMS4wLjMNClsg ICAgMi4wOTk3MzldIGRldmljZS1tYXBwZXI6IGlvY3RsOiA0LjI3LjAtaW9jdGwgKDIwMTMtMTAt MzApIGluaXRpYWxpc2VkOiBkbS1kZXZlbEByZWRoYXQuY29tDQpbICAgIDIuMTAxMTgzXSBsZWR0 cmlnLWNwdTogcmVnaXN0ZXJlZCB0byBpbmRpY2F0ZSBhY3Rpdml0eSBvbiBDUFVzDQpbICAgIDIu MTAyMTU5XSBUQ1A6IGN1YmljIHJlZ2lzdGVyZWQNClsgICAgMi4xMDI4NjNdIE5FVDogUmVnaXN0 ZXJlZCBwcm90b2NvbCBmYW1pbHkgMTANClsgICAgMi4xMDM4OTRdIE5FVDogUmVnaXN0ZXJlZCBw cm90b2NvbCBmYW1pbHkgMTcNClsgICAgMi4xMDQ3MDhdIEtleSB0eXBlIGRuc19yZXNvbHZlciBy ZWdpc3RlcmVkDQpbICAgIDIuMTA1ODY0XSBMb2FkaW5nIGNvbXBpbGVkLWluIFguNTA5IGNlcnRp ZmljYXRlcw0KWyAgICAyLjEwNzE1M10gTG9hZGVkIFguNTA5IGNlcnQgJ01hZ3JhdGhlYTogR2xh Y2llciBzaWduaW5nIGtleTogYjEzYmM1YzIwMWZlYmNlNmNiODM5M2RiNTRlYTI1NDY4MzJhZjMz NycNClsgICAgMi4xMDg3MjJdIHJlZ2lzdGVyZWQgdGFza3N0YXRzIHZlcnNpb24gMQ0KWyAgICAy LjExMTY0OF0gS2V5IHR5cGUgdHJ1c3RlZCByZWdpc3RlcmVkDQpbICAgIDIuMTE0MzEzXSBLZXkg dHlwZSBlbmNyeXB0ZWQgcmVnaXN0ZXJlZA0KWyAgICAyLjExNjg5Nl0gQXBwQXJtb3I6IEFwcEFy bW9yIHNoYTEgcG9saWN5IGhhc2hpbmcgZW5hYmxlZA0KWyAgICAyLjExODg1MV0gICBNYWdpYyBu dW1iZXI6IDEwOjM1MDo2MDINClsgICAgMi4xMTk2MjVdIHJ0Y19jbW9zIHJ0Y19jbW9zOiBzZXR0 aW5nIHN5c3RlbSBjbG9jayB0byAyMDE0LTA0LTI4IDIxOjM1OjE3IFVUQyAoMTM5ODcyMDkxNykN ClsgICAgMi4xMjExNTNdIEJJT1MgRUREIGZhY2lsaXR5IHYwLjE2IDIwMDQtSnVuLTI1LCAwIGRl dmljZXMgZm91bmQNClsgICAgMi4xMjIwODNdIEVERCBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxl Lg0KWyAgICAyLjE2MDQxNV0gYXRhMi4wMDogQVRBUEk6IFZCT1ggQ0QtUk9NLCAxLjAsIG1heCBV RE1BLzEzMw0KWyAgICAyLjE2NzIwOV0gYXRhMi4wMDogY29uZmlndXJlZCBmb3IgVURNQS8zMw0K WyAgICAyLjE3MDQ4MF0gc2NzaSAxOjA6MDowOiBDRC1ST00gICAgICAgICAgICBWQk9YICAgICBD RC1ST00gICAgICAgICAgIDEuMCAgUFE6IDAgQU5TSTogNQ0KWyAgICAyLjE4MDU1M10gc3IwOiBz Y3NpMy1tbWMgZHJpdmU6IDMyeC8zMnggeGEvZm9ybTIgdHJheQ0KWyAgICAyLjE4MzQzM10gY2Ry b206IFVuaWZvcm0gQ0QtUk9NIGRyaXZlciBSZXZpc2lvbjogMy4yMA0KWyAgICAyLjE4NDcyMV0g c3IgMTowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMCB0eXBlIDUNClsgICAgMi4xODYz NDRdIEZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6IDExOTZLIChmZmZmZmZmZjgxZDBjMDAw IC0gZmZmZmZmZmY4MWUzNzAwMCkNClsgICAgMi4xODg0ODNdIFdyaXRlIHByb3RlY3RpbmcgdGhl IGtlcm5lbCByZWFkLW9ubHkgZGF0YTogMTIyODhrDQpbICAgIDIuMTkzOTUwXSBGcmVlaW5nIHVu dXNlZCBrZXJuZWwgbWVtb3J5OiAxMTg0SyAoZmZmZjg4MDAwMTZkODAwMCAtIGZmZmY4ODAwMDE4 MDAwMDApDQpbICAgIDIuMTk4OTk5XSBGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiA4MjRL IChmZmZmODgwMDAxYjMyMDAwIC0gZmZmZjg4MDAwMWMwMDAwMCkNCkxvYWRpbmcsIHBsZWFzZSB3 YWl0Li4uDQpbICAgIDIuMjA5OTgxXSB1ZGV2ZFsxMDddOiBzdGFydGluZyB2ZXJzaW9uIDE3NQ0K WyAgICAyLjI0NTkzMF0gZTEwMDA6IEludGVsKFIpIFBSTy8xMDAwIE5ldHdvcmsgRHJpdmVyIC0g dmVyc2lvbiA3LjMuMjEtazgtTkFQSQ0KWyAgICAyLjI0NzU0N10gZTEwMDA6IENvcHlyaWdodCAo YykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uLg0KWyAgICAyLjQ5MjE3MF0gdXNiIDEtMTog bmV3IGZ1bGwtc3BlZWQgVVNCIGRldmljZSBudW1iZXIgMiB1c2luZyBvaGNpLXBjaQ0KWyAgICAy LjYyNTAyM10gZTEwMDAgMDAwMDowMDowMy4wIGV0aDA6IChQQ0k6MzNNSHo6MzItYml0KSAwODow MDoyNzo2ZDplMDo0ZA0KWyAgICAyLjcyODUzMF0gZTEwMDAgMDAwMDowMDowMy4wIGV0aDA6IElu dGVsKFIpIFBSTy8xMDAwIE5ldHdvcmsgQ29ubmVjdGlvbg0KWyAgICAyLjc0OTQ3OF0gYWhjaSAw MDAwOjAwOjBkLjA6IFNTUyBmbGFnIHNldCwgcGFyYWxsZWwgYnVzIHNjYW4gZGlzYWJsZWQNClsg ICAgMi43NTA2MzJdIGFoY2kgMDAwMDowMDowZC4wOiBBSENJIDAwMDEuMDEwMCAzMiBzbG90cyAx IHBvcnRzIDMgR2JwcyAweDEgaW1wbCBTQVRBIG1vZGUNClsgICAgMi43NTE5MTldIGFoY2kgMDAw MDowMDowZC4wOiBmbGFnczogNjRiaXQgbmNxIHN0YWcgb25seSBjY2MgDQpbICAgIDIuNzUzNTEw XSBzY3NpMiA6IGFoY2kNClsgICAgMi43NTQxNzddIGF0YTM6IFNBVEEgbWF4IFVETUEvMTMzIGFi YXIgbTgxOTJAMHhmMDgwNjAwMCBwb3J0IDB4ZjA4MDYxMDAgaXJxIDIxDQpbICAgIDIuNzU2MTM0 XSB1c2IgMS0xOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9ODBlZSwgaWRQcm9kdWN0 PTAwMjENClsgICAgMi43NTcxNjVdIHVzYiAxLTE6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1m cj0xLCBQcm9kdWN0PTMsIFNlcmlhbE51bWJlcj0wDQpbICAgIDIuNzU4MTk3XSB1c2IgMS0xOiBQ cm9kdWN0OiBVU0IgVGFibGV0DQpbICAgIDIuNzU4ODQyXSB1c2IgMS0xOiBNYW51ZmFjdHVyZXI6 IFZpcnR1YWxCb3gNClsgICAgMi43NjYyNzddIGhpZHJhdzogcmF3IEhJRCBldmVudHMgZHJpdmVy IChDKSBKaXJpIEtvc2luYQ0KWyAgICAyLjgxNjIyNV0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcg aW50ZXJmYWNlIGRyaXZlciB1c2JoaWQNClsgICAgMi44MzI4MTRdIHVzYmhpZDogVVNCIEhJRCBj b3JlIGRyaXZlcg0KWyAgICAyLjgzOTE4OF0gaW5wdXQ6IFZpcnR1YWxCb3ggVVNCIFRhYmxldCBh cyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDYuMC91c2IxLzEtMS8xLTE6MS4wLzAwMDM6 ODBFRTowMDIxLjAwMDEvaW5wdXQvaW5wdXQ0DQpbICAgIDIuODY5MzU1XSBoaWQtZ2VuZXJpYyAw MDAzOjgwRUU6MDAyMS4wMDAxOiBpbnB1dCxoaWRyYXcwOiBVU0IgSElEIHYxLjEwIE1vdXNlIFtW aXJ0dWFsQm94IFVTQiBUYWJsZXRdIG9uIHVzYi0wMDAwOjAwOjA2LjAtMS9pbnB1dDANClsgICAg My4wNzI0ODldIGF0YTM6IFNBVEEgbGluayB1cCAzLjAgR2JwcyAoU1N0YXR1cyAxMjMgU0NvbnRy b2wgMzAwKQ0KWyAgICAzLjA5MDY2Ml0gYXRhMy4wMDogQVRBLTY6IFZCT1ggSEFSRERJU0ssIDEu MCwgbWF4IFVETUEvMTMzDQpbICAgIDMuMDkxNTM2XSBhdGEzLjAwOiAxNjc3NzIxNiBzZWN0b3Jz LCBtdWx0aSAxMjg6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpDQpbICAgIDMuMDkyNjY4XSBhdGEz LjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEzMw0KWyAgICAzLjA5MzY3M10gc2NzaSAyOjA6MDow OiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBWQk9YIEhBUkRESVNLICAgIDEuMCAgUFE6IDAg QU5TSTogNQ0KWyAgICAzLjA5NTU4M10gc2QgMjowOjA6MDogW3NkYV0gMTY3NzcyMTYgNTEyLWJ5 dGUgbG9naWNhbCBibG9ja3M6ICg4LjU4IEdCLzguMDAgR2lCKQ0KWyAgICAzLjA5NTYxN10gc2Qg MjowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMSB0eXBlIDANClsgICAgMy4wOTg3NDhd IHNkIDI6MDowOjA6IFtzZGFdIFdyaXRlIFByb3RlY3QgaXMgb2ZmDQpbICAgIDMuMTAwMTU1XSBz ZCAyOjA6MDowOiBbc2RhXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxl ZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUENClsgICAgMy4xMDM4MjNdICBzZGE6IHNkYTEg c2RhMiA8IHNkYTUgPg0KWyAgICAzLjEyNjQyNF0gc2QgMjowOjA6MDogW3NkYV0gQXR0YWNoZWQg U0NTSSBkaXNrDQpbICAgIDUuMjY4ODY0XSBmbG9wcHkwOiBubyBmbG9wcHkgY29udHJvbGxlcnMg Zm91bmQNCkJlZ2luOiBMb2FkaW5nIGVzc2VudGlhbCBkcml2ZXJzIC4uLiBkb25lLg0KQmVnaW46 IFJ1bm5pbmcgL3NjcmlwdHMvaW5pdC1wcmVtb3VudCAuLi4gZG9uZS4NCkJlZ2luOiBNb3VudGlu ZyByb290IGZpbGUgc3lzdGVtIC4uLiBCZWdpbjogUnVubmluZyAvc2NyaXB0cy9sb2NhbC10b3Ag Li4uIGRvbmUuDQpCZWdpbjogUnVubmluZyAvc2NyaXB0cy9sb2NhbC1wcmVtb3VudCAuLi4gWyAg ICA1LjM1MDM3NV0gUE06IFN0YXJ0aW5nIG1hbnVhbCByZXN1bWUgZnJvbSBkaXNrDQpkb25lLg0K WyAgICA1LjM1NDAwOF0gRVhUNC1mcyAoc2RhMSk6IElORk86IHJlY292ZXJ5IHJlcXVpcmVkIG9u IHJlYWRvbmx5IGZpbGVzeXN0ZW0NClsgICAgNS4zNjg0MzBdIEVYVDQtZnMgKHNkYTEpOiB3cml0 ZSBhY2Nlc3Mgd2lsbCBiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeQ0KWyAgICA1LjM4OTExM10g RVhUNC1mcyAoc2RhMSk6IHJlY292ZXJ5IGNvbXBsZXRlDQpbICAgIDUuMzk2MDU3XSBFWFQ0LWZz IChzZGExKTogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuIE9wdHM6 IChudWxsKQ0KQmVnaW46IFJ1bm5pbmcgL3NjcmlwdHMvbG9jYWwtYm90dG9tIC4uLiBkb25lLg0K ZG9uZS4NCkJlZ2luOiBSdW5uaW5nIC9zY3JpcHRzL2luaXQtYm90dG9tIC4uLiBkb25lLg0KDUlO SVQ6IHZlcnNpb24gMi44OCBib290aW5nDQ0KWxtbMzZtaW5mbxtbMzk7NDltXSBVc2luZyBtYWtl ZmlsZS1zdHlsZSBjb25jdXJyZW50IGJvb3QgaW4gcnVubGV2ZWwgUy4NClsuLi4uXSBTdGFydGlu ZyB0aGUgaG90cGx1ZyBldmVudHMgZGlzcGF0Y2hlcjogdWRldmRbICAgIDUuNjMxNjgyXSB1ZGV2 ZFszOTJdOiBzdGFydGluZyB2ZXJzaW9uIDE3NQ0KG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sg G1szOTs0OW0bOBtbPzI1aBtbPzBjLg0KWy4uLi5dIFN5bnRoZXNpemluZyB0aGUgaW5pdGlhbCBo b3RwbHVnIGV2ZW50cy4uLhtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8y NWgbWz8wY2RvbmUuDQpbICAgIDUuNjc4ODkwXSBwaWl4NF9zbWJ1cyAwMDAwOjAwOjA3LjA6IFNN QnVzIGJhc2UgYWRkcmVzcyB1bmluaXRpYWxpemVkIC0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3Jj ZV9hZGRyPTB4YWRkcg0KWy4uLi5dIFdhaXRpbmcgZm9yIC9kZXYgdG8gYmUgZnVsbHkgcG9wdWxh dGVkLi4uWyAgICA1LjY4OTQ3Nl0gaW5wdXQ6IFBDIFNwZWFrZXIgYXMgL2RldmljZXMvcGxhdGZv cm0vcGNzcGtyL2lucHV0L2lucHV0NQ0KWyAgICA1LjcyMzQxNl0gcGFycG9ydF9wYyAwMDowMzog cmVwb3J0ZWQgYnkgUGx1ZyBhbmQgUGxheSBBQ1BJDQpbICAgIDUuNzUwNzI5XSBFcnJvcjogRHJp dmVyICdwY3Nwa3InIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgYWJvcnRpbmcuLi4NClsgICAgNS45 MjQ4MDldIGlucHV0OiBJbUV4UFMvMiBHZW5lcmljIEV4cGxvcmVyIE1vdXNlIGFzIC9kZXZpY2Vz L3BsYXRmb3JtL2k4MDQyL3NlcmlvMS9pbnB1dC9pbnB1dDYNClsgICAgNi4wODQwOThdIHNuZF9p bnRlbDh4MCAwMDAwOjAwOjA1LjA6IGludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jazogbWVhc3Vy ZWQgNTU0MzIgdXNlY3MgKDExNTY4IHNhbXBsZXMpDQpbICAgIDYuMTkxMTQ2XSBzbmRfaW50ZWw4 eDAgMDAwMDowMDowNS4wOiBtZWFzdXJlZCBjbG9jayAyMDg2ODggcmVqZWN0ZWQNClsgICAgNi41 NTIxNjJdIHNuZF9pbnRlbDh4MCAwMDAwOjAwOjA1LjA6IGludGVsOHgwX21lYXN1cmVfYWM5N19j bG9jazogbWVhc3VyZWQgNTU5NTMgdXNlY3MgKDExMjk5IHNhbXBsZXMpDQpbICAgIDYuNjA3MTI3 XSBzbmRfaW50ZWw4eDAgMDAwMDowMDowNS4wOiBtZWFzdXJlZCBjbG9jayAyMDE5MzcgcmVqZWN0 ZWQNClsgICAgNi45ODAxMzddIHNuZF9pbnRlbDh4MCAwMDAwOjAwOjA1LjA6IGludGVsOHgwX21l YXN1cmVfYWM5N19jbG9jazogbWVhc3VyZWQgNTU5NzYgdXNlY3MgKDExMzE3IHNhbXBsZXMpDQpb ICAgIDYuOTg0MzMxXSBzbmRfaW50ZWw4eDAgMDAwMDowMDowNS4wOiBtZWFzdXJlZCBjbG9jayAy MDIxNzUgcmVqZWN0ZWQNClsgICAgNi45ODUyNDNdIHNuZF9pbnRlbDh4MCAwMDAwOjAwOjA1LjA6 IGNsb2NraW5nIHRvIDQ4MDAwDQpbICAgIDguNzQwNzQwXSBmbG9wcHkwOiBubyBmbG9wcHkgY29u dHJvbGxlcnMgZm91bmQNChtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8y NWgbWz8wY2RvbmUuDQpbLi4uLl0gU2V0dGluZyBwcmVsaW1pbmFyeSBrZXltYXAuLi4bWz8yNWwb Wz8xYxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGNkb25lLg0KWy4uLi5dIEFj dGl2YXRpbmcgc3dhcC4uLlsgICAgOC45NTc4NzFdIEFkZGluZyAzOTIxODhrIHN3YXAgb24gL2Rl di9zZGE1LiAgUHJpb3JpdHk6LTEgZXh0ZW50czoxIGFjcm9zczozOTIxODhrIEZTDQobWz8yNWwb Wz8xYxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGNkb25lLg0KWyAgICA4Ljk3 NTgyM10gRVhUNC1mcyAoc2RhMSk6IHJlLW1vdW50ZWQuIE9wdHM6IChudWxsKQ0KWy4uLi5dIENo ZWNraW5nIHJvb3QgZmlsZSBzeXN0ZW0uLi5mc2NrIGZyb20gdXRpbC1saW51eCAyLjIwLjENCi9k ZXYvc2RhMTogY2xlYW4sIDY2NzcyLzQ5OTcxMiBmaWxlcywgMTcyODE0MS8xOTk4MzM2IGJsb2Nr cw0KG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0bOBtbPzI1aBtbPzBjZG9uZS4N ClsgICAgOS4wMjU5NjhdIEVYVDQtZnMgKHNkYTEpOiByZS1tb3VudGVkLiBPcHRzOiBlcnJvcnM9 cmVtb3VudC1ybw0KWxtbMzZtaW5mbxtbMzk7NDltXSBMb2FkaW5nIGtlcm5lbCBtb2R1bGUgbG9v cC4NClsuLi4uXSBDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMuLi4gL3RtcBtbPzI1bBtbPzFj GzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8yNWgbWz8wYy4NClttbnRlbnRdOiBsaW5lIDEg aW4gL2V0Yy9mc3RhYiBpcyBiYWQNClttbnRlbnRdOiBsaW5lIDMgaW4gL2V0Yy9mc3RhYiBpcyBi YWQNClttbnRlbnRdOiBsaW5lIDQgaW4gL2V0Yy9mc3RhYiBpcyBiYWQNClttbnRlbnRdOiBsaW5l IDUgaW4gL2V0Yy9mc3RhYiBpcyBiYWQNClttbnRlbnRdOiBsaW5lIDcgaW4gL2V0Yy9mc3RhYiBp cyBiYWQ7IHJlc3Qgb2YgZmlsZSBpZ25vcmVkDQpbbW50ZW50XTogbGluZSAxIGluIC9ldGMvZnN0 YWIgaXMgYmFkDQpbbW50ZW50XTogbGluZSAzIGluIC9ldGMvZnN0YWIgaXMgYmFkDQpbbW50ZW50 XTogbGluZSA0IGluIC9ldGMvZnN0YWIgaXMgYmFkDQpbbW50ZW50XTogbGluZSA1IGluIC9ldGMv ZnN0YWIgaXMgYmFkDQpbbW50ZW50XTogbGluZSA3IGluIC9ldGMvZnN0YWIgaXMgYmFkOyByZXN0 IG9mIGZpbGUgaWdub3JlZA0KW21udGVudF06IGxpbmUgMSBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0K W21udGVudF06IGxpbmUgMyBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxpbmUgNCBp biAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxpbmUgNSBpbiAvZXRjL2ZzdGFiIGlzIGJh ZA0KW21udGVudF06IGxpbmUgNyBpbiAvZXRjL2ZzdGFiIGlzIGJhZDsgcmVzdCBvZiBmaWxlIGln bm9yZWQNClttbnRlbnRdOiBsaW5lIDEgaW4gL2V0Yy9mc3RhYiBpcyBiYWQNClttbnRlbnRdOiBs aW5lIDMgaW4gL2V0Yy9mc3RhYiBpcyBiYWQNClttbnRlbnRdOiBsaW5lIDQgaW4gL2V0Yy9mc3Rh YiBpcyBiYWQNClttbnRlbnRdOiBsaW5lIDUgaW4gL2V0Yy9mc3RhYiBpcyBiYWQNClttbnRlbnRd OiBsaW5lIDcgaW4gL2V0Yy9mc3RhYiBpcyBiYWQ7IHJlc3Qgb2YgZmlsZSBpZ25vcmVkDQpbbW50 ZW50XTogbGluZSAxIGluIC9ldGMvZnN0YWIgaXMgYmFkDQpbbW50ZW50XTogbGluZSAzIGluIC9l dGMvZnN0YWIgaXMgYmFkDQpbbW50ZW50XTogbGluZSA0IGluIC9ldGMvZnN0YWIgaXMgYmFkDQpb bW50ZW50XTogbGluZSA1IGluIC9ldGMvZnN0YWIgaXMgYmFkDQpbbW50ZW50XTogbGluZSA3IGlu IC9ldGMvZnN0YWIgaXMgYmFkOyByZXN0IG9mIGZpbGUgaWdub3JlZA0KW21udGVudF06IGxpbmUg MSBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxpbmUgMyBpbiAvZXRjL2ZzdGFiIGlz IGJhZA0KW21udGVudF06IGxpbmUgNCBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxp bmUgNSBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxpbmUgNyBpbiAvZXRjL2ZzdGFi IGlzIGJhZDsgcmVzdCBvZiBmaWxlIGlnbm9yZWQNClsuLi4uXSBBY3RpdmF0aW5nIGx2bSBhbmQg bWQgc3dhcC4uLhtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8yNWgbWz8w Y2RvbmUuDQpbLi4uLl0gQ2hlY2tpbmcgZmlsZSBzeXN0ZW1zLi4uZnNjayBmcm9tIHV0aWwtbGlu dXggMi4yMC4xDQobWz8yNWwbWz8xYxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/ MGNkb25lLg0KWy4uLi5dIE1vdW50aW5nIGxvY2FsIGZpbGVzeXN0ZW1zLi4uW21udGVudF06IGxp bmUgMSBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxpbmUgMyBpbiAvZXRjL2ZzdGFi IGlzIGJhZA0KW21udGVudF06IGxpbmUgNCBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06 IGxpbmUgNSBpbiAvZXRjL2ZzdGFiIGlzIGJhZA0KW21udGVudF06IGxpbmUgNyBpbiAvZXRjL2Zz dGFiIGlzIGJhZDsgcmVzdCBvZiBmaWxlIGlnbm9yZWQNChtbPzI1bBtbPzFjGzcbWzFHWxtbMzJt IG9rIBtbMzk7NDltGzgbWz8yNWgbWz8wY2RvbmUuDQpbLi4uLl0gQWN0aXZhdGluZyBzd2FwZmls ZSBzd2FwLi4uG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0bOBtbPzI1aBtbPzBj ZG9uZS4NClsuLi4uXSBDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMuLi4bWz8yNWwbWz8xYxs3 G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGMuDQpbICAgIDkuNDQ1MzMzXSByYW5k b206IG5vbmJsb2NraW5nIHBvb2wgaXMgaW5pdGlhbGl6ZWQNClsuLi4uXSBTZXR0aW5nIGtlcm5l bCB2YXJpYWJsZXMgLi4uG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0bOBtbPzI1 aBtbPzBjZG9uZS4NClsuLi4uXSBDb25maWd1cmluZyBuZXR3b3JrIGludGVyZmFjZXMuLi4bWz8y NWwbWz8xYxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGNkb25lLg0KWy4uLi5d IFN0YXJ0aW5nIHJwY2JpbmQgZGFlbW9uLi4uG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1sz OTs0OW0bOBtbPzI1aBtbPzBjLg0KWy4uLi5dIFN0YXJ0aW5nIE5GUyBjb21tb24gdXRpbGl0aWVz OiBzdGF0ZFsgICAgOS42NDQ0NTldIFJQQzogUmVnaXN0ZXJlZCBuYW1lZCBVTklYIHNvY2tldCB0 cmFuc3BvcnQgbW9kdWxlLg0KWyAgICA5LjY0NTc5MV0gUlBDOiBSZWdpc3RlcmVkIHVkcCB0cmFu c3BvcnQgbW9kdWxlLg0KWyAgICA5LjY0NjU0M10gUlBDOiBSZWdpc3RlcmVkIHRjcCB0cmFuc3Bv cnQgbW9kdWxlLg0KWyAgICA5LjY0NzQzOV0gUlBDOiBSZWdpc3RlcmVkIHRjcCBORlN2NC4xIGJh Y2tjaGFubmVsIHRyYW5zcG9ydCBtb2R1bGUuDQpbICAgIDkuNjY2MjI4XSBGUy1DYWNoZTogTG9h ZGVkDQpbICAgIDkuNzY3MTYzXSBGUy1DYWNoZTogTmV0ZnMgJ25mcycgcmVnaXN0ZXJlZCBmb3Ig Y2FjaGluZw0KWyAgICA5Ljc3MzAyNV0gZTEwMDA6IGV0aDAgTklDIExpbmsgaXMgVXAgMTAwMCBN YnBzIEZ1bGwgRHVwbGV4LCBGbG93IENvbnRyb2w6IFJYDQpbICAgIDkuNzc4MzUxXSBJUHY2OiBB RERSQ09ORihORVRERVZfVVApOiBldGgwOiBsaW5rIGlzIG5vdCByZWFkeQ0KWyAgICA5LjgyNDUy OF0gSVB2NjogQUREUkNPTkYoTkVUREVWX0NIQU5HRSk6IGV0aDA6IGxpbmsgYmVjb21lcyByZWFk eQ0KWyAgICA5Ljg1MzkwM10gSW5zdGFsbGluZyBrbmZzZCAoY29weXJpZ2h0IChDKSAxOTk2IG9r aXJAbW9uYWQuc3diLmRlKS4NCiBpZG1hcGQbWz8yNWwbWz8xYxs3G1sxR1sbWzMybSBvayAbWzM5 OzQ5bRs4G1s/MjVoG1s/MGMuDQpbLi4uLl0gQ2xlYW5pbmcgdXAgdGVtcG9yYXJ5IGZpbGVzLi4u G1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0bOBtbPzI1aBtbPzBjLg0KWxtbMzZt aW5mbxtbMzk7NDltXSBTZXR0aW5nIGNvbnNvbGUgc2NyZWVuIG1vZGVzLg0Kc2V0dGVybTogY2Fu bm90ICh1bilzZXQgcG93ZXJzYXZlIG1vZGU6IEluYXBwcm9wcmlhdGUgaW9jdGwgZm9yIGRldmlj ZQ0KG1s5OzMwXRtbMTQ7MzBdWxtbMzZtaW5mbxtbMzk7NDltXSBTa2lwcGluZyBmb250IGFuZCBr ZXltYXAgc2V0dXAgKGhhbmRsZWQgYnkgY29uc29sZS1zZXR1cCkuDQpbLi4uLl0gU2V0dGluZyB1 cCBjb25zb2xlIGZvbnQgYW5kIGtleW1hcC4uLhtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtb Mzk7NDltGzgbWz8yNWgbWz8wY2RvbmUuDQpbICAgMTAuMTc5MTcwXSBMb2FkaW5nIGlTQ1NJIHRy YW5zcG9ydCBjbGFzcyB2Mi4wLTg3MC4NClsuLi4uXSBTZXR0aW5nIHVwIFggc29ja2V0IGRpcmVj dG9yaWVzLi4uIC90bXAvLlgxMS11bml4IC90bXAvLklDRS11bml4G1s/MjVsG1s/MWMbNxtbMUdb G1szMm0gb2sgG1szOTs0OW0bOBtbPzI1aBtbPzBjLg0KWy4uLi5dIFN0YXJ0aW5nIGlTQ1NJIGlu aXRpYXRvciBzZXJ2aWNlOiBpc2NzaWRbICAgMTAuMTk4NDM5XSBpc2NzaTogcmVnaXN0ZXJlZCB0 cmFuc3BvcnQgKHRjcCkNClsgICAxMC4yNjg5MzhdIGlzY3NpOiByZWdpc3RlcmVkIHRyYW5zcG9y dCAoaXNlcikNChtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8yNWgbWz8w Yy4NClsuLi4uXSBTZXR0aW5nIHVwIGlTQ1NJIHRhcmdldHM6DQppc2NzaWFkbTogTm8gcmVjb3Jk cyBmb3VuZA0KG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0bOBtbPzI1aBtbPzBj Lg0KWy4uLi5dIE1vdW50aW5nIG5ldHdvcmsgZmlsZXN5c3RlbXM6G1s/MjVsG1s/MWMbNxtbMUdb G1szMm0gb2sgG1szOTs0OW0bOBtbPzI1aBtbPzBjLg0KDUlOSVQ6IEVudGVyaW5nIHJ1bmxldmVs OiAyDQ0KWxtbMzZtaW5mbxtbMzk7NDltXSBVc2luZyBtYWtlZmlsZS1zdHlsZSBjb25jdXJyZW50 IGJvb3QgaW4gcnVubGV2ZWwgMi4NClsuLi4uXSBTdGFydGluZyBycGNiaW5kIGRhZW1vbi4uLlsu Li4uXSBBbHJlYWR5IHJ1bm5pbmcuG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0b OBtbPzI1aBtbPzBjLg0KWy4uLi5dIFN0YXJ0aW5nIE5GUyBjb21tb24gdXRpbGl0aWVzOiBzdGF0 ZCBpZG1hcGQbWz8yNWwbWz8xYxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGMu DQpbLi4uLl0gU3RhcnRpbmcgVmlydHVhbEJveCBBZGRpdGlvbnNWQm94U2VydmljZTogZXJyb3I6 IFZiZ2xSM0luaXQgZmFpbGVkIHdpdGggcmM9VkVSUl9GSUxFX05PVF9GT1VORA0KG1s/MjVsG1s/ MWMbNxtbMUdbG1szMW1GQUlMG1szOTs0OW0bOBtbPzI1aBtbPzBjIBtbMzFtZmFpbGVkIRtbMzk7 NDltDQpbLi4uLl0gU3RhcnRpbmcgZW5oYW5jZWQgc3lzbG9nZDogcnN5c2xvZ2QbWz8yNWwbWz8x Yxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGMuDQpbLi4uLl0gU3RhcnRpbmcg ZGVmZXJyZWQgZXhlY3V0aW9uIHNjaGVkdWxlcjogYXRkG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0g b2sgG1szOTs0OW0bOBtbPzI1aBtbPzBjLg0KWy4uLi5dIFN0YXJ0aW5nIHBlcmlvZGljIGNvbW1h bmQgc2NoZWR1bGVyOiBjcm9uG1s/MjVsG1s/MWMbNxtbMUdbG1szMm0gb2sgG1szOTs0OW0bOBtb PzI1aBtbPzBjLg0KWy4uLi5dIFN0YXJ0aW5nIE9wZW5CU0QgU2VjdXJlIFNoZWxsIHNlcnZlcjog c3NoZBtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8yNWgbWz8wYy4NClsg ICAxMC40OTk3NDddIFJvdW5kaW5nIGRvd24gYWxpZ25lZCBtYXhfc2VjdG9ycyBmcm9tIDQyOTQ5 NjcyOTUgdG8gNDI5NDk2NzI4OA0KWy4uLi5dIFN0YXJ0aW5nIEFDUEkgc2VydmljZXMuLi4bWz8y NWwbWz8xYxs3G1sxR1sbWzMybSBvayAbWzM5OzQ5bRs4G1s/MjVoG1s/MGMuDQpbLi4uLl0gU3Rh cnRpbmcgTVRBOiBleGltNBtbPzI1bBtbPzFjGzcbWzFHWxtbMzJtIG9rIBtbMzk7NDltGzgbWz8y NWgbWz8wYy4NCkxvYWRpbmcgdGFyZ2V0X2NvcmVfbW9kL0NvbmZpZ0ZTIGNvcmU6ICAgW09LXQ0K Q2FsbGluZyBDb25maWdGUyBzY3JpcHQgL2V0Yy90YXJnZXQvdGNtX3N0YXJ0LnNoIGZvciB0YXJn ZXRfY29yZV9tb2Q6ICAgW09LXQ0KQ2FsbGluZyBDb25maWdGUyBzY3JpcHQgL2V0Yy90YXJnZXQv bGlvX3N0YXJ0LnNoIGZvciBpc2NzaV90YXJnZXRfbW9kOiAgIFtPS10NCkNhbGxpbmcgQ29uZmln RlMgc2NyaXB0IC9ldGMvdGFyZ2V0L2ZjX3N0YXJ0LnNoOiAgIFtPS10NCkNhbGxpbmcgQ29uZmln RlMgc2NyaXB0IC9ldGMvdGFyZ2V0L2xvb3BiYWNrX3N0YXJ0LnNoOiAgIFtPS10NCkNhbGxpbmcg Q29uZmlnRlMgc2NyaXB0IC9ldGMvdGFyZ2V0L3FsYTJ4eHhfc3RhcnQuc2g6IFsgICAxMS45MjE5 MzBdIHFsYTJ4eHggWzAwMDA6MDA6MDAuMF0tMDAwNTogOiBRTG9naWMgRmlicmUgQ2hhbm5lbCBI QkEgRHJpdmVyOiA4LjA3LjAwLjAyLWsuDQogIFtPS10NCkNhbGxpbmcgQ29uZmlnRlMgc2NyaXB0 IC9ldGMvdGFyZ2V0L3NycHRfc3RhcnQuc2g6ICAgW09LXQ0KWy4uLi5dIHN0YXJ0cGFyOiBzZXJ2 aWNlKHMpIHJldHVybmVkIGZhaWx1cmU6IHZpcnR1YWxib3gtZ3Vlc3QtdXRpbHMgLi4uG1s/MjVs G1s/MWMbNxtbMUdbG1szMW1GQUlMG1szOTs0OW0bOBtbPzI1aBtbPzBjIBtbMzFtZmFpbGVkIRtb Mzk7NDltDQpbIDEwNjAuOTIwNjk1XSBzY3NpMyA6IGlTQ1NJIEluaXRpYXRvciBvdmVyIFRDUC9J UA0KWyAxMDYxLjE5Nzc3N10gc2NzaSAzOjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBMSU8tT1JH ICBGSUxFSU8gICAgICAgICAgIDQuMCAgUFE6IDAgQU5TSTogNQ0KWyAxMDYxLjIwMDkzN10gc2Qg MzowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMiB0eXBlIDANClsgMTA2MS4yMDExMjJd IHNkIDM6MDowOjA6IFtzZGJdIDIwOTcxNTIgNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgxLjA3 IEdCLzEuMDAgR2lCKQ0KWyAxMDYxLjIwMTk3NV0gc2QgMzowOjA6MDogW3NkYl0gV3JpdGUgUHJv dGVjdCBpcyBvZmYNClsgMTA2MS4yMDIyNzNdIHNkIDM6MDowOjA6IFtzZGJdIFdyaXRlIGNhY2hl OiBkaXNhYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBG VUENClsgMTA2MS4yMDUwODBdICBzZGI6IHVua25vd24gcGFydGl0aW9uIHRhYmxlDQpbIDEwNjEu MjA3NjE5XSBzZCAzOjA6MDowOiBbc2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2sNClsgMTE2OC4yNzEy NTVdIFNHSSBYRlMgd2l0aCBBQ0xzLCBzZWN1cml0eSBhdHRyaWJ1dGVzLCByZWFsdGltZSwgbGFy Z2UgYmxvY2svaW5vZGUgbnVtYmVycywgbm8gZGVidWcgZW5hYmxlZA0KWyAxMTY4LjM3NDkxMl0g WEZTIChzZGIpOiBNb3VudGluZyBGaWxlc3lzdGVtDQpbIDExNjguNDA0OTEwXSBYRlMgKHNkYik6 IEVuZGluZyBjbGVhbiBtb3VudA0KWyAxMTc5Ljk2MDU1M10gWEZTIChzZGIpOiBtZXRhZGF0YSBJ L08gZXJyb3I6IGJsb2NrIDB4MTAwMDIyICgieGxvZ19pb2RvbmUiKSBlcnJvciAxOSBudW1ibGtz IDY0DQpbIDExNzkuOTY0NDMxXSBYRlMgKHNkYik6IHhmc19kb19mb3JjZV9zaHV0ZG93bigweDIp IGNhbGxlZCBmcm9tIGxpbmUgMTE3MCBvZiBmaWxlIGZzL3hmcy94ZnNfbG9nLmMuICBSZXR1cm4g YWRkcmVzcyA9IDB4ZmZmZmZmZmZhMDRiOTg1OQ0KWyAxMTc5Ljk2NjIxNV0gWEZTIChzZGIpOiBM b2cgSS9PIEVycm9yIERldGVjdGVkLiAgU2h1dHRpbmcgZG93biBmaWxlc3lzdGVtDQpbIDExNzku OTY3MTgwXSBYRlMgKHNkYik6IFBsZWFzZSB1bW91bnQgdGhlIGZpbGVzeXN0ZW0gYW5kIHJlY3Rp ZnkgdGhlIHByb2JsZW0ocykNClsgMTE3OS45NjkxNzldIFhGUyAoc2RiKTogVW5hYmxlIHRvIHVw ZGF0ZSBzdXBlcmJsb2NrIGNvdW50ZXJzLiBGcmVlc3BhY2UgbWF5IG5vdCBiZSBjb3JyZWN0IG9u IG5leHQgbW91bnQuDQpbIDExNzkuOTcxNDE4XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVy cm9yIDUgcmV0dXJuZWQuDQpbIDEyMTQuNTQ3NzgxXSBzY3NpNCA6IGlTQ1NJIEluaXRpYXRvciBv dmVyIFRDUC9JUA0KWyAxMjE0Ljg2MjA3Ml0gc2NzaSA0OjA6MDowOiBEaXJlY3QtQWNjZXNzICAg ICBMSU8tT1JHICBGSUxFSU8gICAgICAgICAgIDQuMCAgUFE6IDAgQU5TSTogNQ0KWyAxMjE0Ljg4 MDE0Nl0gc2QgNDowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMiB0eXBlIDANClsgMTIx NC44ODAyMjBdIHNkIDQ6MDowOjA6IFtzZGJdIDIwOTcxNTIgNTEyLWJ5dGUgbG9naWNhbCBibG9j a3M6ICgxLjA3IEdCLzEuMDAgR2lCKQ0KWyAxMjE0Ljg4MDk5Nl0gc2QgNDowOjA6MDogW3NkYl0g V3JpdGUgUHJvdGVjdCBpcyBvZmYNClsgMTIxNC44ODEzMTVdIHNkIDQ6MDowOjA6IFtzZGJdIFdy aXRlIGNhY2hlOiBkaXNhYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0 IERQTyBvciBGVUENClsgMTIxNC44ODM4NjRdICBzZGI6IHVua25vd24gcGFydGl0aW9uIHRhYmxl DQpbIDEyMTQuODkyNDM2XSBzZCA0OjA6MDowOiBbc2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2sNClsg MTIxNS45MDM1MTBdIFhGUyAoc2RiKTogTW91bnRpbmcgRmlsZXN5c3RlbQ0KWyAxMjE1Ljk1NzMw OF0gWEZTIChzZGIpOiBFbmRpbmcgY2xlYW4gbW91bnQNClsgMTIyNy41MDA1OTRdIFhGUyAoc2Ri KTogbWV0YWRhdGEgSS9PIGVycm9yOiBibG9jayAweDEwMDAyMiAoInhsb2dfaW9kb25lIikgZXJy b3IgMTkgbnVtYmxrcyA2NA0KWyAxMjI3LjUzMjQ5MV0gWEZTIChzZGIpOiB4ZnNfZG9fZm9yY2Vf c2h1dGRvd24oMHgyKSBjYWxsZWQgZnJvbSBsaW5lIDExNzAgb2YgZmlsZSBmcy94ZnMveGZzX2xv Zy5jLiAgUmV0dXJuIGFkZHJlc3MgPSAweGZmZmZmZmZmYTA0Yjk4NTkNClsgMTIyNy41MzQxMjld IFhGUyAoc2RiKTogTG9nIEkvTyBFcnJvciBEZXRlY3RlZC4gIFNodXR0aW5nIGRvd24gZmlsZXN5 c3RlbQ0KWyAxMjI3LjUzNTA4NV0gWEZTIChzZGIpOiBQbGVhc2UgdW1vdW50IHRoZSBmaWxlc3lz dGVtIGFuZCByZWN0aWZ5IHRoZSBwcm9ibGVtKHMpDQpbIDEyMjcuNTM2MzMwXSBYRlMgKHNkYik6 IFVuYWJsZSB0byB1cGRhdGUgc3VwZXJibG9jayBjb3VudGVycy4gRnJlZXNwYWNlIG1heSBub3Qg YmUgY29ycmVjdCBvbiBuZXh0IG1vdW50Lg0KWyAxMjI3LjUzNzczOF0gWEZTIChzZGIpOiB4ZnNf bG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAxMjQ2LjI3NzI5N10gc2NzaTUgOiBpU0NT SSBJbml0aWF0b3Igb3ZlciBUQ1AvSVANClsgMTI0Ni41NDU3MjldIHNjc2kgNTowOjA6MDogRGly ZWN0LUFjY2VzcyAgICAgTElPLU9SRyAgRklMRUlPICAgICAgICAgICA0LjAgIFBROiAwIEFOU0k6 IDUNClsgMTI0Ni42MDgyODhdIHNkIDU6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzIg dHlwZSAwDQpbIDEyNDYuNjA4NDI4XSBzZCA1OjA6MDowOiBbc2RiXSAyMDk3MTUyIDUxMi1ieXRl IGxvZ2ljYWwgYmxvY2tzOiAoMS4wNyBHQi8xLjAwIEdpQikNClsgMTI0Ni42MDkyMjldIHNkIDU6 MDowOjA6IFtzZGJdIFdyaXRlIFByb3RlY3QgaXMgb2ZmDQpbIDEyNDYuNjA5NTE1XSBzZCA1OjA6 MDowOiBbc2RiXSBXcml0ZSBjYWNoZTogZGlzYWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRv ZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVBDQpbIDEyNDYuNjExNDExXSAgc2RiOiB1bmtub3duIHBh cnRpdGlvbiB0YWJsZQ0KWyAxMjQ2LjYxNzY1NF0gc2QgNTowOjA6MDogW3NkYl0gQXR0YWNoZWQg U0NTSSBkaXNrDQpbIDEyNDcuNjI4MjEwXSBYRlMgKHNkYik6IE1vdW50aW5nIEZpbGVzeXN0ZW0N ClsgMTI0Ny42NTkzMTldIFhGUyAoc2RiKTogRW5kaW5nIGNsZWFuIG1vdW50DQpbIDEyNTkuMjky NDc4XSBYRlMgKHNkYik6IG1ldGFkYXRhIEkvTyBlcnJvcjogYmxvY2sgMHgxMDAwMjIgKCJ4bG9n X2lvZG9uZSIpIGVycm9yIDE5IG51bWJsa3MgNjQNClsgMTI1OS4yOTg4MzVdIFhGUyAoc2RiKTog eGZzX2RvX2ZvcmNlX3NodXRkb3duKDB4MikgY2FsbGVkIGZyb20gbGluZSAxMTcwIG9mIGZpbGUg ZnMveGZzL3hmc19sb2cuYy4gIFJldHVybiBhZGRyZXNzID0gMHhmZmZmZmZmZmEwNGI5ODU5DQpb IDEyNTkuMzAwNjA5XSBYRlMgKHNkYik6IExvZyBJL08gRXJyb3IgRGV0ZWN0ZWQuICBTaHV0dGlu ZyBkb3duIGZpbGVzeXN0ZW0NClsgMTI1OS4zMDE1ODZdIFhGUyAoc2RiKTogUGxlYXNlIHVtb3Vu dCB0aGUgZmlsZXN5c3RlbSBhbmQgcmVjdGlmeSB0aGUgcHJvYmxlbShzKQ0KWyAxMjU5LjMwMjc4 N10gWEZTIChzZGIpOiBVbmFibGUgdG8gdXBkYXRlIHN1cGVyYmxvY2sgY291bnRlcnMuIEZyZWVz cGFjZSBtYXkgbm90IGJlIGNvcnJlY3Qgb24gbmV4dCBtb3VudC4NClsgMTI1OS4zMDQyNjddIFhG UyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMTI1OS41NjM0MjBd IHNjc2k2IDogaVNDU0kgSW5pdGlhdG9yIG92ZXIgVENQL0lQDQpbIDEyNTkuODIzMjIxXSBzY3Np IDY6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAgIExJTy1PUkcgIEZJTEVJTyAgICAgICAgICAgNC4w ICBQUTogMCBBTlNJOiA1DQpbIDEyNTkuODI2MTAxXSBzZCA2OjA6MDowOiBBdHRhY2hlZCBzY3Np IGdlbmVyaWMgc2cyIHR5cGUgMA0KWyAxMjU5LjgyNjM1Ml0gc2QgNjowOjA6MDogW3NkYl0gMjA5 NzE1MiA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDEuMDcgR0IvMS4wMCBHaUIpDQpbIDEyNTku ODI3MjM0XSBzZCA2OjA6MDowOiBbc2RiXSBXcml0ZSBQcm90ZWN0IGlzIG9mZg0KWyAxMjU5Ljgy NzUxOV0gc2QgNjowOjA6MDogW3NkYl0gV3JpdGUgY2FjaGU6IGRpc2FibGVkLCByZWFkIGNhY2hl OiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQQ0KWyAxMjU5LjgyOTU4Nl0gIHNk YjogdW5rbm93biBwYXJ0aXRpb24gdGFibGUNClsgMTI1OS44Mzc3NzZdIHNkIDY6MDowOjA6IFtz ZGJdIEF0dGFjaGVkIFNDU0kgZGlzaw0KWyAxMjYwLjg0MDY1OV0gWEZTIChzZGIpOiBNb3VudGlu ZyBGaWxlc3lzdGVtDQpbIDEyNjAuOTAxNDU0XSBYRlMgKHNkYik6IEVuZGluZyBjbGVhbiBtb3Vu dA0KWyAxMjcyLjQzNzc3Ml0gWEZTIChzZGIpOiBtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4 MTAwMDIyICgieGxvZ19pb2RvbmUiKSBlcnJvciAxOSBudW1ibGtzIDY0DQpbIDEyNzIuNDQ3NjI5 XSBYRlMgKHNkYik6IHhmc19kb19mb3JjZV9zaHV0ZG93bigweDIpIGNhbGxlZCBmcm9tIGxpbmUg MTE3MCBvZiBmaWxlIGZzL3hmcy94ZnNfbG9nLmMuICBSZXR1cm4gYWRkcmVzcyA9IDB4ZmZmZmZm ZmZhMDRiOTg1OQ0KWyAxMjcyLjQ2MTY2NV0gWEZTIChzZGIpOiBMb2cgSS9PIEVycm9yIERldGVj dGVkLiAgU2h1dHRpbmcgZG93biBmaWxlc3lzdGVtDQpbIDEyNzIuNDYyNTcwXSBYRlMgKHNkYik6 IFBsZWFzZSB1bW91bnQgdGhlIGZpbGVzeXN0ZW0gYW5kIHJlY3RpZnkgdGhlIHByb2JsZW0ocykN ClsgMTI3Mi40OTgyOTFdIFhGUyAoc2RiKTogVW5hYmxlIHRvIHVwZGF0ZSBzdXBlcmJsb2NrIGNv dW50ZXJzLiBGcmVlc3BhY2UgbWF5IG5vdCBiZSBjb3JyZWN0IG9uIG5leHQgbW91bnQuDQpbIDEy NzIuNTAwODg5XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJuZWQuDQpb IDEyNzIuNzU4MjM5XSBzY3NpNyA6IGlTQ1NJIEluaXRpYXRvciBvdmVyIFRDUC9JUA0KWyAxMjcz LjEwNjA0OV0gc2NzaSA3OjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBMSU8tT1JHICBGSUxFSU8g ICAgICAgICAgIDQuMCAgUFE6IDAgQU5TSTogNQ0KWyAxMjczLjIxMjQ2Nl0gc2QgNzowOjA6MDog QXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMiB0eXBlIDANClsgMTI3My4yMTI5NzBdIHNkIDc6MDow OjA6IFtzZGJdIDIwOTcxNTIgNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgxLjA3IEdCLzEuMDAg R2lCKQ0KWyAxMjczLjIxMzc1OV0gc2QgNzowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVjdCBpcyBv ZmYNClsgMTI3My4yMTQyNTJdIHNkIDc6MDowOjA6IFtzZGJdIFdyaXRlIGNhY2hlOiBkaXNhYmxl ZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUENClsgMTI3 My4yMTY1NDZdICBzZGI6IHVua25vd24gcGFydGl0aW9uIHRhYmxlDQpbIDEyNzMuMjIxNTcwXSBz ZCA3OjA6MDowOiBbc2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2sNClsgMTI3NC4yMzA2OTldIFhGUyAo c2RiKTogTW91bnRpbmcgRmlsZXN5c3RlbQ0KWyAxMjc0LjI3OTczNV0gWEZTIChzZGIpOiBFbmRp bmcgY2xlYW4gbW91bnQNClsgMTI4NS45MTY4NTRdIFhGUyAoc2RiKTogbWV0YWRhdGEgSS9PIGVy cm9yOiBibG9jayAweDEwMDAyMiAoInhsb2dfaW9kb25lIikgZXJyb3IgMTkgbnVtYmxrcyA2NA0K WyAxMjg1LjkyMDMyNl0gWEZTIChzZGIpOiB4ZnNfZG9fZm9yY2Vfc2h1dGRvd24oMHgyKSBjYWxs ZWQgZnJvbSBsaW5lIDExNzAgb2YgZmlsZSBmcy94ZnMveGZzX2xvZy5jLiAgUmV0dXJuIGFkZHJl c3MgPSAweGZmZmZmZmZmYTA0Yjk4NTkNClsgMTI4NS45MjMyNzRdIFhGUyAoc2RiKTogTG9nIEkv TyBFcnJvciBEZXRlY3RlZC4gIFNodXR0aW5nIGRvd24gZmlsZXN5c3RlbQ0KWyAxMjg1LjkyNDQx M10gWEZTIChzZGIpOiBQbGVhc2UgdW1vdW50IHRoZSBmaWxlc3lzdGVtIGFuZCByZWN0aWZ5IHRo ZSBwcm9ibGVtKHMpDQpbIDEyODUuOTI1NjgyXSBYRlMgKHNkYik6IFVuYWJsZSB0byB1cGRhdGUg c3VwZXJibG9jayBjb3VudGVycy4gRnJlZXNwYWNlIG1heSBub3QgYmUgY29ycmVjdCBvbiBuZXh0 IG1vdW50Lg0KWyAxMjg1LjkyODc3MF0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1 IHJldHVybmVkLg0KWyAxMjg2LjE4NTc4NV0gc2NzaTggOiBpU0NTSSBJbml0aWF0b3Igb3ZlciBU Q1AvSVANClsgMTI4Ni40NDE4NDBdIHNjc2kgODowOjA6MDogRGlyZWN0LUFjY2VzcyAgICAgTElP LU9SRyAgRklMRUlPICAgICAgICAgICA0LjAgIFBROiAwIEFOU0k6IDUNClsgMTI4Ni41NDc3MTld IHNkIDg6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzIgdHlwZSAwDQpbIDEyODYuNTQ4 MDYzXSBzZCA4OjA6MDowOiBbc2RiXSAyMDk3MTUyIDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAo MS4wNyBHQi8xLjAwIEdpQikNClsgMTI4Ni41NDg3MTddIHNkIDg6MDowOjA6IFtzZGJdIFdyaXRl IFByb3RlY3QgaXMgb2ZmDQpbIDEyODYuNTQ4OTAwXSBzZCA4OjA6MDowOiBbc2RiXSBXcml0ZSBj YWNoZTogZGlzYWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8g b3IgRlVBDQpbIDEyODYuNTUyMDQzXSAgc2RiOiB1bmtub3duIHBhcnRpdGlvbiB0YWJsZQ0KWyAx Mjg2LjU1ODE0MF0gc2QgODowOjA6MDogW3NkYl0gQXR0YWNoZWQgU0NTSSBkaXNrDQpbIDEyODcu NTY3MjY1XSBYRlMgKHNkYik6IE1vdW50aW5nIEZpbGVzeXN0ZW0NClsgMTI4Ny41OTM2MjJdIFhG UyAoc2RiKTogRW5kaW5nIGNsZWFuIG1vdW50DQpbIDEyOTcuNjI2MjA1XSBCdWZmZXIgSS9PIGVy cm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sgMjEwNjA3DQpbIDEyOTcuNjMyOTA3XSBs b3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJvciBvbiBzZGINClsgMTI5Ny42MzM1NjldIEJ1 ZmZlciBJL08gZXJyb3Igb24gZGV2aWNlIHNkYiwgbG9naWNhbCBibG9jayA3NjANClsgMTI5Ny42 MzM1NzFdIGxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gSS9PIGVycm9yIG9uIHNkYg0KWyAxMjk3LjYz MzYwNF0gQnVmZmVyIEkvTyBlcnJvciBvbiBkZXZpY2Ugc2RiLCBsb2dpY2FsIGJsb2NrIDc2MQ0K WyAxMjk3LjYzMzYwNl0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RiDQpb IDEyOTcuNjM4OTEzXSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxv Y2sgMjEwNjA4DQpbIDEyOTcuNjQwOTE2XSBsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJv ciBvbiBzZGINClsgMTI5Ny42NDU3MjRdIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2aWNlIHNkYiwg bG9naWNhbCBibG9jayAyMTA2MDkNClsgMTI5Ny42NDYwMjZdIEJ1ZmZlciBJL08gZXJyb3Igb24g ZGV2aWNlIHNkYiwgbG9naWNhbCBibG9jayA3NjINClsgMTI5Ny42NDYwMjZdIGxvc3QgcGFnZSB3 cml0ZSBkdWUgdG8gSS9PIGVycm9yIG9uIHNkYg0KWyAxMjk3LjY0NjAyN10gQnVmZmVyIEkvTyBl cnJvciBvbiBkZXZpY2Ugc2RiLCBsb2dpY2FsIGJsb2NrIDc2Mw0KWyAxMjk3LjY0NjAyN10gbG9z dCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RiDQpbIDEyOTcuNjQ2MDI4XSBCdWZm ZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sgNzY0DQpbIDEyOTcuNjQ2 MDI4XSBsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJvciBvbiBzZGINClsgMTI5Ny42NDYw MjldIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2aWNlIHNkYiwgbG9naWNhbCBibG9jayA3NjUNClsg MTI5Ny42NDYwMjldIGxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gSS9PIGVycm9yIG9uIHNkYg0KWyAx Mjk3LjY1MzU5Ml0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RiDQpbIDEy OTcuNjU0NjY4XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sg MjEwNjEwDQpbIDEyOTcuNjU1NzYxXSBsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJvciBv biBzZGINClsgMTI5Ny42NzY1MjhdIFhGUyAoc2RiKTogbWV0YWRhdGEgSS9PIGVycm9yOiBibG9j ayAweDEwMTVhNSAoInhsb2dfaW9kb25lIikgZXJyb3IgNSBudW1ibGtzIDY0DQpbIDEyOTcuNjc4 NjU0XSBYRlMgKHNkYik6IHhmc19kb19mb3JjZV9zaHV0ZG93bigweDIpIGNhbGxlZCBmcm9tIGxp bmUgMTE3MCBvZiBmaWxlIGZzL3hmcy94ZnNfbG9nLmMuICBSZXR1cm4gYWRkcmVzcyA9IDB4ZmZm ZmZmZmZhMDRiOTg1OQ0KWyAxMjk3LjY4MTA4Nl0gWEZTIChzZGIpOiBMb2cgSS9PIEVycm9yIERl dGVjdGVkLiAgU2h1dHRpbmcgZG93biBmaWxlc3lzdGVtDQpbIDEyOTcuNjgyMDgwXSBYRlMgKHNk Yik6IFBsZWFzZSB1bW91bnQgdGhlIGZpbGVzeXN0ZW0gYW5kIHJlY3RpZnkgdGhlIHByb2JsZW0o cykNClsgMTI5Ny42ODM1OTJdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1 cm5lZC4NClsgMTI5OS4yNzM0NTVdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSBy ZXR1cm5lZC4NClsgMTI5OS4yNzczODNdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3Ig NSByZXR1cm5lZC4NClsgMTI5OS4yNzg4MjddIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJy b3IgNSByZXR1cm5lZC4NClsgMTI5OS41MzU4MThdIHNjc2k5IDogaVNDU0kgSW5pdGlhdG9yIG92 ZXIgVENQL0lQDQpbIDEyOTkuNzkzNjAxXSBzY3NpIDk6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAg IExJTy1PUkcgIEZJTEVJTyAgICAgICAgICAgNC4wICBQUTogMCBBTlNJOiA1DQpbIDEyOTkuODA0 NDc3XSBzZCA5OjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2cyIHR5cGUgMA0KWyAxMjk5 LjgwNDk1NF0gc2QgOTowOjA6MDogW3NkYl0gMjA5NzE1MiA1MTItYnl0ZSBsb2dpY2FsIGJsb2Nr czogKDEuMDcgR0IvMS4wMCBHaUIpDQpbIDEyOTkuODA3MjA4XSBzZCA5OjA6MDowOiBbc2RiXSBX cml0ZSBQcm90ZWN0IGlzIG9mZg0KWyAxMjk5LjgwODIzOV0gc2QgOTowOjA6MDogW3NkYl0gV3Jp dGUgY2FjaGU6IGRpc2FibGVkLCByZWFkIGNhY2hlOiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQg RFBPIG9yIEZVQQ0KWyAxMjk5LjgxMTI4NF0gIHNkYjogdW5rbm93biBwYXJ0aXRpb24gdGFibGUN ClsgMTI5OS44MTU2ODddIHNkIDk6MDowOjA6IFtzZGJdIEF0dGFjaGVkIFNDU0kgZGlzaw0KWyAx MzAwLjgxNzc5NV0gWEZTIChzZGIpOiBNb3VudGluZyBGaWxlc3lzdGVtDQpbIDEzMDAuODc2ODAz XSBYRlMgKHNkYik6IFN0YXJ0aW5nIHJlY292ZXJ5IChsb2dkZXY6IGludGVybmFsKQ0KWyAxMzAx Ljc1NzcyMl0gWEZTIChzZGIpOiBFbmRpbmcgcmVjb3ZlcnkgKGxvZ2RldjogaW50ZXJuYWwpDQpb IDEzMTcuNTY0Mjk1XSAgY29ubmVjdGlvbjc6MDogcGluZyB0aW1lb3V0IG9mIDUgc2VjcyBleHBp cmVkLCByZWN2IHRpbWVvdXQgNSwgbGFzdCByeCA0Mjk1MjE5MTgyLCBsYXN0IHBpbmcgNDI5NTIy MDQzNCwgbm93IDQyOTUyMjE2ODgNClsgMTMxNy42OTgzNzNdICBjb25uZWN0aW9uNzowOiBkZXRl Y3RlZCBjb25uIGVycm9yICgxMDExKQ0KWyAxMzE3Ljk1MjE5NF0gc2QgOTowOjA6MDogW3NkYl0g VW5oYW5kbGVkIGVycm9yIGNvZGUNClsgMTMxOC4wMDQ1NDVdIHNkIDk6MDowOjA6IFtzZGJdICAN ClsgMTMxOC4wMjc4MjddIFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBk cml2ZXJieXRlPURSSVZFUl9PSw0KWyAxMzE4LjA5MjYwNl0gc2QgOTowOjA6MDogW3NkYl0gQ0RC OiANClsgMTMxOC4xMjQ0OTRdIFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgZTcgMDAgMDAgMDQgMDAg MDANClsgMTMxOC4xNTI0NDJdIGVuZF9yZXF1ZXN0OiByZWNvdmVyYWJsZSB0cmFuc3BvcnQgZXJy b3IsIGRldiBzZGIsIHNlY3RvciAyMDI1MjE2DQpbIDEzMTguMTUzNjAwXSBxdWlldF9lcnJvcjog NzgyNSBjYWxsYmFja3Mgc3VwcHJlc3NlZA0KWyAxMzE4LjE1NDMxNF0gQnVmZmVyIEkvTyBlcnJv ciBvbiBkZXZpY2Ugc2RiLCBsb2dpY2FsIGJsb2NrIDIwOTU5MQ0KWyAxMzE4LjE1NTEzOF0gbG9z dCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RiDQpbIDEzMTguMTU1ODUyXSBCdWZm ZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sgMjA5NTkyDQpbIDEzMTgu MTU2ODA4XSBzZCA5OjA6MDowOiBbc2RiXSBVbmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjE1 NzU5Ml0gc2QgOTowOjA6MDogW3NkYl0gIA0KWyAxMzE4LjE1ODE2NV0gUmVzdWx0OiBob3N0Ynl0 ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNUIGRyaXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguMTU5 MDU4XSBzZCA5OjA6MDowOiBbc2RiXSBDREI6IA0KWyAxMzE4LjE1OTY0N10gV3JpdGUoMTApOiAy YSAwMCAwMCAxZSA4YyA4MCAwMCAwNCAwMCAwMA0KWyAxMzE4LjE2MTQxMV0gZW5kX3JlcXVlc3Q6 IHJlY292ZXJhYmxlIHRyYW5zcG9ydCBlcnJvciwgZGV2IHNkYiwgc2VjdG9yIDIwMDIwNDgNClsg MTMxOC4xNjIzNDZdIHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEz MTguMTYzMjM0XSBzZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguMTYzODA1XSBSZXN1bHQ6IGhv c3RieXRlPURJRF9UUkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMx OC4xNjQ3NDZdIHNkIDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguMTY1Mzg5XSBXcml0ZSgx MCk6IDJhIDAwIDAwIDE5IDg2IDM4IDAwIDA0IDAwIDAwDQpbIDEzMTguMTY3MDQ3XSBlbmRfcmVx dWVzdDogcmVjb3ZlcmFibGUgdHJhbnNwb3J0IGVycm9yLCBkZXYgc2RiLCBzZWN0b3IgMTY3Mjc2 MA0KWyAxMzE4LjE2ODA2M10gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVycm9yIGNvZGUN ClsgMTMxOC4xNjg4MDRdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC4xNjkzNTJdIFJlc3Vs dDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURSSVZFUl9PSw0K WyAxMzE4LjE3MDI0MF0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC4xNzA4NDFdIFdy aXRlKDEwKTogMmEgMDAgMDAgMTkgOGEgMzggMDAgMDQgMDAgMDANClsgMTMxOC4xODg3NDRdIGVu ZF9yZXF1ZXN0OiByZWNvdmVyYWJsZSB0cmFuc3BvcnQgZXJyb3IsIGRldiBzZGIsIHNlY3RvciAx NjczNzg0DQpbIDEzMTguMTk4NjcxXSBzZCA5OjA6MDowOiBbc2RiXSBVbmhhbmRsZWQgZXJyb3Ig Y29kZQ0KWyAxMzE4LjE5OTYwM10gc2QgOTowOjA6MDogW3NkYl0gIA0KWyAxMzE4LjIwMDIxM10g UmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNUIGRyaXZlcmJ5dGU9RFJJVkVS X09LDQpbIDEzMTguMjAzMjU0XSBzZCA5OjA6MDowOiBbc2RiXSBDREI6IA0KWyAxMzE4LjIwMzgz MV0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBhNCAwMCAwMCAwMSA3MCAwMA0KWyAxMzE4LjIwNTU3 Nl0gZW5kX3JlcXVlc3Q6IHJlY292ZXJhYmxlIHRyYW5zcG9ydCBlcnJvciwgZGV2IHNkYiwgc2Vj dG9yIDIwMDgwNjQNClsgMTMxOC4yMDY1MDZdIHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBl cnJvciBjb2RlDQpbIDEzMTguMjA3MjE1XSBzZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguMjA3 Nzk4XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9UUkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1E UklWRVJfT0sNClsgMTMxOC4yMDg3ODNdIHNkIDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTgu MjA5NDI3XSBXcml0ZSgxMCk6IDJhIDAwIDAwIDFlIGFiIDAwIDAwIDA0IDAwIDAwDQpbIDEzMTgu MjExNDgyXSBlbmRfcmVxdWVzdDogcmVjb3ZlcmFibGUgdHJhbnNwb3J0IGVycm9yLCBkZXYgc2Ri LCBzZWN0b3IgMjAwOTg1Ng0KWyAxMzE4LjI1MzY4NV0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5k bGVkIGVycm9yIGNvZGUNClsgMTMxOC4yNTQ0NDNdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMx OC4yNTUwMjhdIFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJi eXRlPURSSVZFUl9PSw0KWyAxMzE4LjI1NTk0Nl0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsg MTMxOC4yNTY2OTZdIFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgYTcgMDAgMDAgMDQgMDAgMDANClsg MTMxOC4yNjA3NzFdIGVuZF9yZXF1ZXN0OiByZWNvdmVyYWJsZSB0cmFuc3BvcnQgZXJyb3IsIGRl diBzZGIsIHNlY3RvciAyMDA4ODMyDQpbIDEzMTguMzQzODEwXSBzZCA5OjA6MDowOiBbc2RiXSBV bmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjM5MjU2M10gc2QgOTowOjA6MDogW3NkYl0gIA0K WyAxMzE4LjQyNDUxMV0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNUIGRy aXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNDk2NjE3XSBzZCA5OjA6MDowOiBbc2RiXSBDREI6 IA0KWyAxMzE4LjQ5NzI4Ml0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSA4OCA4MCAwMCAwNCAwMCAw MA0KWyAxMzE4LjQ5OTE1Nl0gZW5kX3JlcXVlc3Q6IHJlY292ZXJhYmxlIHRyYW5zcG9ydCBlcnJv ciwgZGV2IHNkYiwgc2VjdG9yIDIwMDEwMjQNClsgMTMxOC41MDAyMDFdIHNkIDk6MDowOjA6IFtz ZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTguNTAwOTgxXSBzZCA5OjA6MDowOiBbc2Ri XSAgDQpbIDEzMTguNTAxNTYzXSBSZXN1bHQ6IGhvc3RieXRlPURJRF9UUkFOU1BPUlRfRkFJTEZB U1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC41MDI1MDhdIHNkIDk6MDowOjA6IFtzZGJd IENEQjogDQpbIDEzMTguNTAzMTMyXSBXcml0ZSgxMCk6IDJhIDAwIDAwIDFlIGViIDAwIDAwIDA0 IDAwIDAwDQpbIDEzMTguNTA0OTM0XSBlbmRfcmVxdWVzdDogcmVjb3ZlcmFibGUgdHJhbnNwb3J0 IGVycm9yLCBkZXYgc2RiLCBzZWN0b3IgMjAyNjI0MA0KWyAxMzE4LjUwNTkxOV0gc2QgOTowOjA6 MDogW3NkYl0gVW5oYW5kbGVkIGVycm9yIGNvZGUNClsgMTMxOC41MDY2NzNdIHNkIDk6MDowOjA6 IFtzZGJdICANClsgMTMxOC41MDcyNTJdIFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9G QUlMRkFTVCBkcml2ZXJieXRlPURSSVZFUl9PSw0KWyAxMzE4LjUwODI1Nl0gc2QgOTowOjA6MDog W3NkYl0gQ0RCOiANClsgMTMxOC41MDg5NDBdIFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgODMgMDAg MDAgMDAgYTggMDANClsgMTMxOC41MTA3OTNdIGVuZF9yZXF1ZXN0OiByZWNvdmVyYWJsZSB0cmFu c3BvcnQgZXJyb3IsIGRldiBzZGIsIHNlY3RvciAxOTk5NjE2DQpbIDEzMTguNTExNzc4XSBzZCA5 OjA6MDowOiBbc2RiXSBVbmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjUxMjU1M10gc2QgOTow OjA6MDogW3NkYl0gIA0KWyAxMzE4LjUxMzE2OV0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQ T1JUX0ZBSUxGQVNUIGRyaXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNTE0MTAzXSBzZCA5OjA6 MDowOiBbc2RiXSBDREI6IA0KWyAxMzE4LjUxNDcyNV0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBk MyAwMCAwMCAwNCAwMCAwMA0KWyAxMzE4LjUxNjU1OV0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5k bGVkIGVycm9yIGNvZGUNClsgMTMxOC41MTczMDVdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMx OC41MTc4ODJdIFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJi eXRlPURSSVZFUl9PSw0KWyAxMzE4LjUxODgyMV0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsg MTMxOC41MTk0MzNdIFdyaXRlKDEwKTogMmEgMDAgMDAgMTkgOGUgMzggMDAgMDIgOTAgMDANClsg MTMxOC41MjEyNjZdIHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEz MTguNTIyMDE3XSBzZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguNTIyNjAwXSBSZXN1bHQ6IGhv c3RieXRlPURJRF9UUkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMx OC41MjM2NjhdIHNkIDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguNTI0MzEyXSBXcml0ZSgx MCk6IDJhIDAwIDAwIDFhIDE4IDUwIDAwIDAzIDkwIDAwDQpbIDEzMTguNTI2MDgyXSBzZCA5OjA6 MDowOiBbc2RiXSBVbmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjUyNjgzNl0gc2QgOTowOjA6 MDogW3NkYl0gIA0KWyAxMzE4LjUyNzQyMV0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JU X0ZBSUxGQVNUIGRyaXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNTI4NDM2XSBzZCA5OjA6MDow OiBbc2RiXSBDREI6IA0KWyAxMzE4LjUyOTA4Nl0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBjMyAw MCAwMCAwNCAwMCAwMA0KWyAxMzE4LjUzMDgyN10gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVk IGVycm9yIGNvZGUNClsgMTMxOC41MzE1NjldIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC41 MzIxOTRdIFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRl PURSSVZFUl9PSw0KWyAxMzE4LjUzMzE4MV0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMx OC41MzM3OTVdIFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgYjcgMDAgMDAgMDQgMDAgMDANClsgMTMx OC41MzcwODhdIHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTgu NTM3ODM4XSBzZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguNTM4NDE0XSBSZXN1bHQ6IGhvc3Ri eXRlPURJRF9UUkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC41 MzkzNjNdIHNkIDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguNTM5OTc0XSBXcml0ZSgxMCk6 IDJhIDAwIDAwIDFlIGIzIDAwIDAwIDA0IDAwIDAwDQpbIDEzMTguNTQxODA3XSBzZCA5OjA6MDow OiBbc2RiXSBVbmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjU0MjU1M10gc2QgOTowOjA6MDog W3NkYl0gIA0KWyAxMzE4LjU0MzEzM10gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZB SUxGQVNUIGRyaXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNTQ0MTk3XSBzZCA5OjA6MDowOiBb c2RiXSBDREI6IA0KWyAxMzE4LjU0NDk0OF0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBmMyAwMCAw MCAwNCAwMCAwMA0KWyAxMzE4LjU0NjY4N10gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVy cm9yIGNvZGUNClsgMTMxOC41NDg3NjBdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC41NDkz ODBdIFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURS SVZFUl9PSw0KWyAxMzE4LjU1MDMxNV0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC41 NTA5NDBdIFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgZDcgMDAgMDAgMDQgMDAgMDANClsgMTMxOC41 NTI4OTVdIHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTguNTU0 NDk1XSBzZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguNTU1MDgyXSBSZXN1bHQ6IGhvc3RieXRl PURJRF9UUkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC41NTYw ODRdIHNkIDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguNTU2NzM5XSBXcml0ZSgxMCk6IDJh IDAwIDAwIDFlIGY3IDAwIDAwIDA0IDAwIDAwDQpbIDEzMTguNTU4NDc5XSBzZCA5OjA6MDowOiBb c2RiXSBVbmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjU1OTM2OF0gc2QgOTowOjA6MDogW3Nk Yl0gIA0KWyAxMzE4LjU1OTk0N10gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxG QVNUIGRyaXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNTYwOTM5XSBzZCA5OjA6MDowOiBbc2Ri XSBDREI6IA0KWyAxMzE4LjU2MTYxOF0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBjNyAwMCAwMCAw NCAwMCAwMA0KWyAxMzE4LjU2MzM2NV0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVycm9y IGNvZGUNClsgMTMxOC41NjQxODRdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC41NjQ4MTld IFJlc3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURSSVZF Ul9PSw0KWyAxMzE4LjU2NTc1OV0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC41NjYz NzJdIFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgYWYgMDAgMDAgMDQgMDAgMDANClsgMTMxOC41Njgx NzFdIHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTguNTY4OTUw XSBzZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguNTY5NTMzXSBSZXN1bHQ6IGhvc3RieXRlPURJ RF9UUkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC41NzA0NzFd IHNkIDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguNTcxMjI5XSBXcml0ZSgxMCk6IDJhIDAw IDAwIDFlIGJmIDAwIDAwIDA0IDAwIDAwDQpbIDEzMTguNTczMTA2XSBzZCA5OjA6MDowOiBbc2Ri XSBVbmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjU3Mzg1Nl0gc2QgOTowOjA6MDogW3NkYl0g IA0KWyAxMzE4LjU3NDQ0Ml0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNU IGRyaXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNTc1Mzg0XSBzZCA5OjA6MDowOiBbc2RiXSBD REI6IA0KWyAxMzE4LjU3NjA2MV0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSA5MCA4MCAwMCAwMyBh MCAwMA0KWyAxMzE4LjU3NzgzNF0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVycm9yIGNv ZGUNClsgMTMxOC41Nzg1NzldIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC41NzkxNjFdIFJl c3VsdDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURSSVZFUl9P Sw0KWyAxMzE4LjU4MDE0Ml0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC41ODA3OTVd IFdyaXRlKDEwKTogMmEgMDAgMDAgMWUgYTUgODAgMDAgMDEgNTAgMDANClsgMTMxOC41ODI1MzNd IHNkIDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTguNTgzNDE5XSBz ZCA5OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguNTg0MDAwXSBSZXN1bHQ6IGhvc3RieXRlPURJRF9U UkFOU1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC41ODQ5OTRdIHNk IDk6MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguNTg1NjQ4XSBXcml0ZSgxMCk6IDJhIDAwIDAw IDFlIGJiIDAwIDAwIDA0IDAwIDAwDQpbIDEzMTguNTg3Mzk4XSBzZCA5OjA6MDowOiBbc2RiXSBV bmhhbmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjU4ODIwOF0gc2QgOTowOjA6MDogW3NkYl0gIA0K WyAxMzE4LjU4ODg0Nl0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNUIGRy aXZlcmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNTg5NzgzXSBzZCA5OjA6MDowOiBbc2RiXSBDREI6 IA0KWyAxMzE4LjU5MDQwMl0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBlMyAwMCAwMCAwNCAwMCAw MA0KWyAxMzE4LjU5MjM3MV0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVycm9yIGNvZGUN ClsgMTMxOC41OTMxMjFdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC41OTM3MDJdIFJlc3Vs dDogaG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURSSVZFUl9PSw0K WyAxMzE4LjU5NDYzNl0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC41OTUzOThdIFdy aXRlKDEwKTogMmEgMDAgMDAgMWUgZGYgMDAgMDAgMDQgMDAgMDANClsgMTMxOC41OTcyMDhdIHNk IDk6MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTguNTk3OTU1XSBzZCA5 OjA6MDowOiBbc2RiXSAgDQpbIDEzMTguNTk4NTM1XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9UUkFO U1BPUlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC41OTk0ODFdIHNkIDk6 MDowOjA6IFtzZGJdIENEQjogDQpbIDEzMTguNjAwMTM4XSBXcml0ZSgxMCk6IDJhIDAwIDAwIDFl IGVmIDAwIDAwIDA0IDAwIDAwDQpbIDEzMTguNjAxOTA0XSBzZCA5OjA6MDowOiBbc2RiXSBVbmhh bmRsZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjYwMjY0OV0gc2QgOTowOjA6MDogW3NkYl0gIA0KWyAx MzE4LjYwMzIyOV0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNUIGRyaXZl cmJ5dGU9RFJJVkVSX09LDQpbIDEzMTguNjA0MjA1XSBzZCA5OjA6MDowOiBbc2RiXSBDREI6IA0K WyAxMzE4LjYwNDg1NF0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSA4NCA4MCAwMCAwNCAwMCAwMA0K WyAxMzE4LjYwNzUyNF0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVycm9yIGNvZGUNClsg MTMxOC42MDgyOTVdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC42MDkwMTldIFJlc3VsdDog aG9zdGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURSSVZFUl9PSw0KWyAx MzE4LjYwOTk2NF0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC42MTA1NzhdIFdyaXRl KDEwKTogMmEgMDAgMDAgMWUgY2YgMDAgMDAgMDQgMDAgMDANClsgMTMxOC42MTMyOTldIHNkIDk6 MDowOjA6IFtzZGJdIFVuaGFuZGxlZCBlcnJvciBjb2RlDQpbIDEzMTguNjE0MDAwXSBzZCA5OjA6 MDowOiBbc2RiXSAgDQpbIDEzMTguNjE0NTYzXSBSZXN1bHQ6IGhvc3RieXRlPURJRF9UUkFOU1BP UlRfRkFJTEZBU1QgZHJpdmVyYnl0ZT1EUklWRVJfT0sNClsgMTMxOC42MTY3MjddIHNkIDk6MDow OjA6IFtzZGJdIENEQjogDQpbIDEzMTguNjE3NzE4XSBXcml0ZSgxMCk6IDJhIDAwIDAwIDFlIGRi IDAwIDAwIDA0IDAwIDAwDQpbIDEzMTguNjE5NTY4XSBzZCA5OjA6MDowOiBbc2RiXSBVbmhhbmRs ZWQgZXJyb3IgY29kZQ0KWyAxMzE4LjYyMDMzOF0gc2QgOTowOjA6MDogW3NkYl0gIA0KWyAxMzE4 LjYyMDkyM10gUmVzdWx0OiBob3N0Ynl0ZT1ESURfVFJBTlNQT1JUX0ZBSUxGQVNUIGRyaXZlcmJ5 dGU9RFJJVkVSX09LDQpbIDEzMTguNjIxODIyXSBzZCA5OjA6MDowOiBbc2RiXSBDREI6IA0KWyAx MzE4LjYyMjQxNl0gV3JpdGUoMTApOiAyYSAwMCAwMCAxZSBmYiAwMCAwMCAwNCAwMCAwMA0KWyAx MzE4LjYyNDE5MV0gc2QgOTowOjA6MDogW3NkYl0gVW5oYW5kbGVkIGVycm9yIGNvZGUNClsgMTMx OC42MjQ5ODVdIHNkIDk6MDowOjA6IFtzZGJdICANClsgMTMxOC42MjU1MjldIFJlc3VsdDogaG9z dGJ5dGU9RElEX1RSQU5TUE9SVF9GQUlMRkFTVCBkcml2ZXJieXRlPURSSVZFUl9PSw0KWyAxMzE4 LjYyNjQzMF0gc2QgOTowOjA6MDogW3NkYl0gQ0RCOiANClsgMTMxOC42MjcwNjhdIFdyaXRlKDEw KTogMmEgMDAgMDAgMWUgY2IgMDAgMDAgMDQgMDAgMDANClsgMTMxOC42MzQ3MjNdIGxvc3QgcGFn ZSB3cml0ZSBkdWUgdG8gSS9PIGVycm9yIG9uIHNkYg0KWyAxMzE4LjY4NTA2Nl0gQnVmZmVyIEkv TyBlcnJvciBvbiBkZXZpY2Ugc2RiLCBsb2dpY2FsIGJsb2NrIDIwOTU5Mw0KWyAxMzE4Ljc0NTIw NF0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RiDQpbIDEzMTguNzkwMTUy XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sgMjA5NTk0DQpb IDEzMTguODA1NTA5XSBsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJvciBvbiBzZGINClsg MTMxOC44MDYyNzhdIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2aWNlIHNkYiwgbG9naWNhbCBibG9j ayAyMDk1OTUNClsgMTMxOC44MDcxNDVdIGxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gSS9PIGVycm9y IG9uIHNkYg0KWyAxMzE4LjgwNzg3NV0gQnVmZmVyIEkvTyBlcnJvciBvbiBkZXZpY2Ugc2RiLCBs b2dpY2FsIGJsb2NrIDIwOTU5Ng0KWyAxMzE4LjgwODgxOF0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0 byBJL08gZXJyb3Igb24gc2RiDQpbIDEzMTguODA5NTg1XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRl dmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sgMjA5NTk3DQpbIDEzMTguODEwNDIzXSBsb3N0IHBhZ2Ug d3JpdGUgZHVlIHRvIEkvTyBlcnJvciBvbiBzZGINClsgMTMxOC44MTE1NTFdIEJ1ZmZlciBJL08g ZXJyb3Igb24gZGV2aWNlIHNkYiwgbG9naWNhbCBibG9jayAyMDk1OTgNClsgMTMxOC44MTI0Nzdd IGxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gSS9PIGVycm9yIG9uIHNkYg0KWyAxMzE4LjgxMzI3M10g QnVmZmVyIEkvTyBlcnJvciBvbiBkZXZpY2Ugc2RiLCBsb2dpY2FsIGJsb2NrIDIwOTU5OQ0KWyAx MzE4LjgxNDExMV0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RiDQpbIDEz MTguODE0ODY2XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGIsIGxvZ2ljYWwgYmxvY2sg MjA5NjAwDQpbIDEzMTguODE1NzI2XSBsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJvciBv biBzZGINClsgMTMxOC44MTY2NDNdIFhGUyAoc2RiKTogbWV0YWRhdGEgSS9PIGVycm9yOiBibG9j ayAweDE5ZmM4MCAoInhmc19idWZfaW9kb25lX2NhbGxiYWNrcyIpIGVycm9yIDUgbnVtYmxrcyAx Ng0KWyAxMzE4LjgxODA4MF0gWEZTIChzZGIpOiBtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4 MTAyNWNmICgieGxvZ19pb2RvbmUiKSBlcnJvciA1IG51bWJsa3MgNjQNClsgMTMxOC44MTkzNTBd IFhGUyAoc2RiKTogeGZzX2RvX2ZvcmNlX3NodXRkb3duKDB4MikgY2FsbGVkIGZyb20gbGluZSAx MTcwIG9mIGZpbGUgZnMveGZzL3hmc19sb2cuYy4gIFJldHVybiBhZGRyZXNzID0gMHhmZmZmZmZm ZmEwNGI5ODU5DQpbIDEzMTguODIxMDg5XSBYRlMgKHNkYik6IExvZyBJL08gRXJyb3IgRGV0ZWN0 ZWQuICBTaHV0dGluZyBkb3duIGZpbGVzeXN0ZW0NClsgMTMxOC44MjIzMDFdIFhGUyAoc2RiKTog eGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMTMxOC44MjIzMDhdIFhGUyAoc2Ri KTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMTMxOC44MjIzMTFdIFhGUyAo c2RiKTogRGV0ZWN0ZWQgZmFpbGluZyBhc3luYyB3cml0ZSBvbiBidWZmZXIgYmxvY2sgMHgxOWZj YTAuIFJldHJ5aW5nIGFzeW5jIHdyaXRlLg0KWyAxMzE4LjgyMjMxMV0gDQpbIDEzMTguODIyMzIy XSBYRlMgKHNkYik6IG1ldGFkYXRhIEkvTyBlcnJvcjogYmxvY2sgMHgxODAwMTAgKCJ4ZnNfdHJh bnNfcmVhZF9idWZfbWFwIikgZXJyb3IgNSBudW1ibGtzIDgNClsgMTMxOC44MzQzMzldIFhGUyAo c2RiKTogUGxlYXNlIHVtb3VudCB0aGUgZmlsZXN5c3RlbSBhbmQgcmVjdGlmeSB0aGUgcHJvYmxl bShzKQ0KWyAxMzE4LjgzNTY4N10gWEZTIChzZGIpOiBtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2Nr IDB4MTAyNjBmICgieGxvZ19pb2RvbmUiKSBlcnJvciA1IG51bWJsa3MgNjQNClsgMTMxOC44Mzcw MjldIFhGUyAoc2RiKTogeGZzX2RvX2ZvcmNlX3NodXRkb3duKDB4MikgY2FsbGVkIGZyb20gbGlu ZSAxMTcwIG9mIGZpbGUgZnMveGZzL3hmc19sb2cuYy4gIFJldHVybiBhZGRyZXNzID0gMHhmZmZm ZmZmZmEwNGI5ODU5DQpbIDEzMTguODM4OTQ5XSBYRlMgKHNkYik6IG1ldGFkYXRhIEkvTyBlcnJv cjogYmxvY2sgMHgxMDI2NGYgKCJ4bG9nX2lvZG9uZSIpIGVycm9yIDUgbnVtYmxrcyA2NA0KWyAx MzE4Ljg0MDMxMl0gWEZTIChzZGIpOiB4ZnNfZG9fZm9yY2Vfc2h1dGRvd24oMHgyKSBjYWxsZWQg ZnJvbSBsaW5lIDExNzAgb2YgZmlsZSBmcy94ZnMveGZzX2xvZy5jLiAgUmV0dXJuIGFkZHJlc3Mg PSAweGZmZmZmZmZmYTA0Yjk4NTkNClsgMTMxOC44NDIwMzBdIFhGUyAoc2RiKTogbWV0YWRhdGEg SS9PIGVycm9yOiBibG9jayAweDEwMjY4ZiAoInhsb2dfaW9kb25lIikgZXJyb3IgNSBudW1ibGtz IDY0DQpbIDEzMTguODQ0NTQ1XSBYRlMgKHNkYik6IHhmc19kb19mb3JjZV9zaHV0ZG93bigweDIp IGNhbGxlZCBmcm9tIGxpbmUgMTE3MCBvZiBmaWxlIGZzL3hmcy94ZnNfbG9nLmMuICBSZXR1cm4g YWRkcmVzcyA9IDB4ZmZmZmZmZmZhMDRiOTg1OQ0KWyAxMzE4Ljg0NjIzNV0gWEZTIChzZGIpOiBt ZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4MTAyNmNmICgieGxvZ19pb2RvbmUiKSBlcnJvciA1 IG51bWJsa3MgNjQNClsgMTMxOC44NDc3MzBdIFhGUyAoc2RiKTogeGZzX2RvX2ZvcmNlX3NodXRk b3duKDB4MikgY2FsbGVkIGZyb20gbGluZSAxMTcwIG9mIGZpbGUgZnMveGZzL3hmc19sb2cuYy4g IFJldHVybiBhZGRyZXNzID0gMHhmZmZmZmZmZmEwNGI5ODU5DQpbIDEzMTguODUwMDA3XSBYRlMg KHNkYik6IG1ldGFkYXRhIEkvTyBlcnJvcjogYmxvY2sgMHgxMDI3MGYgKCJ4bG9nX2lvZG9uZSIp IGVycm9yIDUgbnVtYmxrcyA2NA0KWyAxMzE4Ljg1MjE2M10gWEZTIChzZGIpOiB4ZnNfZG9fZm9y Y2Vfc2h1dGRvd24oMHgyKSBjYWxsZWQgZnJvbSBsaW5lIDExNzAgb2YgZmlsZSBmcy94ZnMveGZz X2xvZy5jLiAgUmV0dXJuIGFkZHJlc3MgPSAweGZmZmZmZmZmYTA0Yjk4NTkNClsgMTMxOC44NTYx MjRdIFhGUyAoc2RiKTogbWV0YWRhdGEgSS9PIGVycm9yOiBibG9jayAweDEwMjc0ZiAoInhsb2df aW9kb25lIikgZXJyb3IgNSBudW1ibGtzIDY0DQpbIDEzMTguODU5NDk0XSBYRlMgKHNkYik6IHhm c19kb19mb3JjZV9zaHV0ZG93bigweDIpIGNhbGxlZCBmcm9tIGxpbmUgMTE3MCBvZiBmaWxlIGZz L3hmcy94ZnNfbG9nLmMuICBSZXR1cm4gYWRkcmVzcyA9IDB4ZmZmZmZmZmZhMDRiOTg1OQ0KWyAx MzE4Ljg2MTYzNF0gWEZTIChzZGIpOiBtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4MTAyNzhm ICgieGxvZ19pb2RvbmUiKSBlcnJvciA1IG51bWJsa3MgNjQNClsgMTMxOC44NjM3OTJdIFhGUyAo c2RiKTogeGZzX2RvX2ZvcmNlX3NodXRkb3duKDB4MikgY2FsbGVkIGZyb20gbGluZSAxMTcwIG9m IGZpbGUgZnMveGZzL3hmc19sb2cuYy4gIFJldHVybiBhZGRyZXNzID0gMHhmZmZmZmZmZmEwNGI5 ODU5DQpbIDEzMTguODcwMjQyXSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0 dXJuZWQuDQpbIDEzMTkuOTQwMzU2XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUg cmV0dXJuZWQuDQpbIDEzMTkuOTQ2MjA5XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9y IDUgcmV0dXJuZWQuDQpbIDEzMzEuODA0MDY1XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVy cm9yIDUgcmV0dXJuZWQuDQpbIDEzNjEuODg0MDcyXSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6 IGVycm9yIDUgcmV0dXJuZWQuDQpbIDEzOTEuOTY0MDc0XSBYRlMgKHNkYik6IHhmc19sb2dfZm9y Y2U6IGVycm9yIDUgcmV0dXJuZWQuDQpbIDQ0MDY0XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6 IGVycm9yIDUgcmV0dXJuZWQuDQpbIDE0NDAuMzQwMTA1XSBJTkZPOiB0YXNrIHVtb3VudDo1MTE3 IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4NClsgMTQ0MC4zNjkzNjRdICAgICAg IE5vdCB0YWludGVkIDMuMTUuMC1yYzMgIzQNClsgMTQ0MC4zNzAzNjhdICJlY2hvIDAgPiAvcHJv Yy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2Fn ZS4NClsgMTQ0MC4zNzI2NThdIHVtb3VudCAgICAgICAgICBEIGZmZmZmZmZmODE4MGZlNDAgICAg IDAgIDUxMTcgICA0MjQ1IDB4MDAwMDAwMDANClsgMTQ0MC4zODgxODNdICBmZmZmODgwMDMwMjg1 ZDU4IDAwMDAwMDAwMDAwMDAwODIgZmZmZjg4MDAzMDI4NWQ0OCBmZmZmZmZmZjgxMDgwZjgyDQpb IDE0NDAuNDA2Mzc2XSAgZmZmZjg4MDAyZjliODAwMCAwMDAwMDAwMDAwMDEzMTgwIGZmZmY4ODAw MzAyODVmZDggMDAwMDAwMDAwMDAxMzE4MA0KWyAxNDQwLjQwOTQwOF0gIGZmZmY4ODAwM2RhYTAw MDAgZmZmZjg4MDAyZjliODAwMCBmZmZmODgwMDFiYmViMGMwIGZmZmY4ODAwMWJiZWIwODANClsg MTQ0MC40MTIxNDFdIENhbGwgVHJhY2U6DQpbIDE0NDAuNDEyOTU4XSAgWzxmZmZmZmZmZjgxMDgw ZjgyPl0gPyB0cnlfdG9fd2FrZV91cCsweDIzMi8weDJiMA0KWyAxNDQwLjQxNDQyOV0gIFs8ZmZm ZmZmZmY4MTZjNTRkOT5dIHNjaGVkdWxlKzB4MjkvMHg3MA0KWyAxNDQwLjQxNTYwN10gIFs8ZmZm ZmZmZmZhMDRjMGNkNj5dIHhmc19haWxfcHVzaF9hbGxfc3luYysweDk2LzB4ZDAgW3hmc10NClsg MTQ0MC40MTcyNDJdICBbPGZmZmZmZmZmODEwOTIyMzA+XSA/IF9fd2FrZV91cF9zeW5jKzB4MjAv MHgyMA0KWyAxNDQwLjQxODQyNF0gIFs8ZmZmZmZmZmZhMDQ2ZjFhMz5dIHhmc191bm1vdW50ZnMr MHg2My8weDE2MCBbeGZzXQ0KWyAxNDQwLjQyMTIzM10gIFs8ZmZmZmZmZmZhMDQ3NGY2NT5dID8g a21lbV9mcmVlKzB4MzUvMHg0MCBbeGZzXQ0KWyAxNDQwLjQyNTE1NF0gIFs8ZmZmZmZmZmZhMDQ3 MGNmNT5dIHhmc19mc19wdXRfc3VwZXIrMHgyNS8weDYwIFt4ZnNdDQpbIDE0NDAuNDMyNDI3XSAg WzxmZmZmZmZmZjgxMTk1NjFlPl0gZ2VuZXJpY19zaHV0ZG93bl9zdXBlcisweDdlLzB4MTAwDQpb IDE0NDAuNDMzNTI4XSAgWzxmZmZmZmZmZjgxMTk1NmQwPl0ga2lsbF9ibG9ja19zdXBlcisweDMw LzB4ODANClsgMTQ0MC40MzQzNzBdICBbPGZmZmZmZmZmODExOTU5MWQ+XSBkZWFjdGl2YXRlX2xv Y2tlZF9zdXBlcisweDRkLzB4ODANClsgMTQ0MC40MzUzMTVdICBbPGZmZmZmZmZmODExOTY1MmU+ XSBkZWFjdGl2YXRlX3N1cGVyKzB4NGUvMHg3MA0KWyAxNDQwLjQzNjIzNV0gIFs8ZmZmZmZmZmY4 MTFiMWQ0Mj5dIG1udHB1dF9ub19leHBpcmUrMHhkMi8weDE2MA0KWyAxNDQwLjQzNzMxMV0gIFs8 ZmZmZmZmZmY4MTFiMmZmZj5dIFN5U191bW91bnQrMHhhZi8weDNiMA0KWyAxNDQwLjQzODY1NV0g IFs8ZmZmZmZmZmY4MTZkMTU5Mj5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTYvMHgxYg0KWyAx NDUyLjM4MDQyOF0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0K WyAxNDgyLjU4ODM1NF0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVk Lg0KWyAxNTEyLjY2ODA3M10gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVy bmVkLg0KWyAxNTQyLjc0ODE4Ml0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJl dHVybmVkLg0KWyAxNTYwLjQ0MDIxOV0gSU5GTzogdGFzayB1bW91bnQ6NTExNyBibG9ja2VkIGZv ciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuDQpbIDE1NjAuNTMyMTY4XSAgICAgICBOb3QgdGFpbnRl ZCAzLjE1LjAtcmMzICM0DQpbIDE1NjAuNTg3ODI5XSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5l bC9odW5nX3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuDQpbIDE1NjAu NjA4MjA3XSB1bW91bnQgICAgICAgICAgRCBmZmZmZmZmZjgxODBmZTQwICAgICAwICA1MTE3ICAg NDI0NSAweDAwMDAwMDAwDQpbIDE1NjAuNjA5NTgzXSAgZmZmZjg4MDAzMDI4NWQ1OCAwMDAwMDAw MDAwMDAwMDgyIGZmZmY4ODAwMzAyODVkNDggZmZmZmZmZmY4MTA4MGY4Mg0KWyAxNTYwLjYxMTQ1 MV0gIGZmZmY4ODAwMmY5YjgwMDAgMDAwMDAwMDAwMDAxMzE4MCBmZmZmODgwMDMwMjg1ZmQ4IDAw MDAwMDAwMDAwMTMxODANClsgMTU2MC42MTMzNjVdICBmZmZmODgwMDNkYWEwMDAwIGZmZmY4ODAw MmY5YjgwMDAgZmZmZjg4MDAxYmJlYjBjMCBmZmZmODgwMDFiYmViMDgwDQpbIDE1NjAuNjE1MDc1 XSBDYWxsIFRyYWNlOg0KWyAxNTYwLjYxNTY0OV0gIFs8ZmZmZmZmZmY4MTA4MGY4Mj5dID8gdHJ5 X3RvX3dha2VfdXArMHgyMzIvMHgyYjANClsgMTU2MC42MTY2NTZdICBbPGZmZmZmZmZmODE2YzU0 ZDk+XSBzY2hlZHVsZSsweDI5LzB4NzANClsgMTU2MC42MTc0NDhdICBbPGZmZmZmZmZmYTA0YzBj ZDY+XSB4ZnNfYWlsX3B1c2hfYWxsX3N5bmMrMHg5Ni8weGQwIFt4ZnNdDQpbIDE1NjAuNjE4Mzg4 XSAgWzxmZmZmZmZmZjgxMDkyMjMwPl0gPyBfX3dha2VfdXBfc3luYysweDIwLzB4MjANClsgMTU2 MC42MTkyMzldICBbPGZmZmZmZmZmYTA0NmYxYTM+XSB4ZnNfdW5tb3VudGZzKzB4NjMvMHgxNjAg W3hmc10NClsgMTU2MC42MjAxNTddICBbPGZmZmZmZmZmYTA0NzRmNjU+XSA/IGttZW1fZnJlZSsw eDM1LzB4NDAgW3hmc10NClsgMTU2MC42MjEwMjRdICBbPGZmZmZmZmZmYTA0NzBjZjU+XSB4ZnNf ZnNfcHV0X3N1cGVyKzB4MjUvMHg2MCBbeGZzXQ0KWyAxNTYwLjYyMTkxMl0gIFs8ZmZmZmZmZmY4 MTE5NTYxZT5dIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIrMHg3ZS8weDEwMA0KWyAxNTYwLjYyMjgw MV0gIFs8ZmZmZmZmZmY4MTE5NTZkMD5dIGtpbGxfYmxvY2tfc3VwZXIrMHgzMC8weDgwDQpbIDE1 NjAuNjIzNzU5XSAgWzxmZmZmZmZmZjgxMTk1OTFkPl0gZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIr MHg0ZC8weDgwDQpbIDE1NjAuNjI0NzExXSAgWzxmZmZmZmZmZjgxMTk2NTJlPl0gZGVhY3RpdmF0 ZV9zdXBlcisweDRlLzB4NzANClsgMTU2MC42MjU1NTldICBbPGZmZmZmZmZmODExYjFkNDI+XSBt bnRwdXRfbm9fZXhwaXJlKzB4ZDIvMHgxNjANClsgMTU2MC42MjY0MDVdICBbPGZmZmZmZmZmODEx YjJmZmY+XSBTeVNfdW1vdW50KzB4YWYvMHgzYjANClsgMTU2MC42MjcxOTldICBbPGZmZmZmZmZm ODE2ZDE1OTI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDE2LzB4MWINClsgMTU3Mi44MjkyMTBd IFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMTYwMi45MDgz NDJdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMTYzMi45 ODgzOTldIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMTY2 My4xMzI0OTldIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3IgNSByZXR1cm5lZC4NClsg MTY4MC42Mjg1NDldIElORk86IHRhc2sgdW1vdW50OjUxMTcgYmxvY2tlZCBmb3IgbW9yZSB0aGFu IDEyMCBzZWNvbmRzLg0KWyAxNjgwLjcwNDQyOV0gICAgICAgTm90IHRhaW50ZWQgMy4xNS4wLXJj MyAjNA0KWyAxNjgwLjczMTM5NV0gImVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNr X3RpbWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLg0KWyAxNjgwLjczMjYzMl0gdW1v dW50ICAgICAgICAgIEQgZmZmZmZmZmY4MTgwZmU0MCAgICAgMCAgNTExNyAgIDQyNDUgMHgwMDAw MDAwMA0KWyAxNjgwLjczMzkyNl0gIGZmZmY4ODAwMzAyODVkNTggMDAwMDAwMDAwMDAwMDA4MiBm ZmZmODgwMDMwMjg1ZDQ4IGZmZmZmZmZmODEwODBmODINClsgMTY4MC43MzU0MTBdICBmZmZmODgw MDJmOWI4MDAwIDAwMDAwMDAwMDAwMTMxODAgZmZmZjg4MDAzMDI4NWZkOCAwMDAwMDAwMDAwMDEz MTgwDQpbIDE2ODAuNzM3MTcyXSAgZmZmZjg4MDAzZGFhMDAwMCBmZmZmODgwMDJmOWI4MDAwIGZm ZmY4ODAwMWJiZWIwYzAgZmZmZjg4MDAxYmJlYjA4MA0KWyAxNjgwLjczODY0OF0gQ2FsbCBUcmFj ZToNClsgMTY4MC43MzkxNTddICBbPGZmZmZmZmZmODEwODBmODI+XSA/IHRyeV90b193YWtlX3Vw KzB4MjMyLzB4MmIwDQpbIDE2ODAuNzM5OTYzXSAgWzxmZmZmZmZmZjgxNmM1NGQ5Pl0gc2NoZWR1 bGUrMHgyOS8weDcwDQpbIDE2ODAuNzQwNzkxXSAgWzxmZmZmZmZmZmEwNGMwY2Q2Pl0geGZzX2Fp bF9wdXNoX2FsbF9zeW5jKzB4OTYvMHhkMCBbeGZzXQ0KWyAxNjgwLjc0MTcyN10gIFs8ZmZmZmZm ZmY4MTA5MjIzMD5dID8gX193YWtlX3VwX3N5bmMrMHgyMC8weDIwDQpbIDE2ODAuNzQyNTQ4XSAg WzxmZmZmZmZmZmEwNDZmMWEzPl0geGZzX3VubW91bnRmcysweDYzLzB4MTYwIFt4ZnNdDQpbIDE2 ODAuNzQ0NTcwXSAgWzxmZmZmZmZmZmEwNDc0ZjY1Pl0gPyBrbWVtX2ZyZWUrMHgzNS8weDQwIFt4 ZnNdDQpbIDE2ODAuNzQ1NDE5XSAgWzxmZmZmZmZmZmEwNDcwY2Y1Pl0geGZzX2ZzX3B1dF9zdXBl cisweDI1LzB4NjAgW3hmc10NClsgMTY4MC43NDY5MjZdICBbPGZmZmZmZmZmODExOTU2MWU+XSBn ZW5lcmljX3NodXRkb3duX3N1cGVyKzB4N2UvMHgxMDANClsgMTY4MC43NDc4MTRdICBbPGZmZmZm ZmZmODExOTU2ZDA+XSBraWxsX2Jsb2NrX3N1cGVyKzB4MzAvMHg4MA0KWyAxNjgwLjc0ODY3Nl0g IFs8ZmZmZmZmZmY4MTE5NTkxZD5dIGRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKzB4NGQvMHg4MA0K WyAxNjgwLjc0OTU3OF0gIFs8ZmZmZmZmZmY4MTE5NjUyZT5dIGRlYWN0aXZhdGVfc3VwZXIrMHg0 ZS8weDcwDQpbIDE2ODAuNzUwMzkwXSAgWzxmZmZmZmZmZjgxMWIxZDQyPl0gbW50cHV0X25vX2V4 cGlyZSsweGQyLzB4MTYwDQpbIDE2ODAuNzUxMjExXSAgWzxmZmZmZmZmZjgxMWIyZmZmPl0gU3lT X3Vtb3VudCsweGFmLzB4M2IwDQpbIDE2ODAuNzUyMDIwXSAgWzxmZmZmZmZmZjgxNmQxNTkyPl0g c3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxNi8weDFiDQpbIDE2OTMuMjc2MTQyXSBYRlMgKHNkYik6 IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJuZWQuDQpbIDE3MjMuNDIwNDU3XSBYRlMgKHNk Yik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJuZWQuDQpbIDE3NTMuNTY0NDMwXSBYRlMg KHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJuZWQuDQpbIDE3ODMuNjQ0MTM5XSBY RlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJuZWQuDQpbIDE4MDAuNzUyMTE2 XSBJTkZPOiB0YXNrIHVtb3VudDo1MTE3IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25k cy4NClsgMTgwMC44MTUxMDBdICAgICAgIE5vdCB0YWludGVkIDMuMTUuMC1yYzMgIzQNClsgMTgw MC44MzcyODJdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3Nl Y3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4NClsgMTgwMC44NDAzOTNdIHVtb3VudCAgICAgICAg ICBEIGZmZmZmZmZmODE4MGZlNDAgICAgIDAgIDUxMTcgICA0MjQ1IDB4MDAwMDAwMDANClsgMTgw MC44NDIyOTBdICBmZmZmODgwMDMwMjg1ZDU4IDAwMDAwMDAwMDAwMDAwODIgZmZmZjg4MDAzMDI4 NWQ0OCBmZmZmZmZmZjgxMDgwZjgyDQpbIDE4MDAuODQzNzc5XSAgZmZmZjg4MDAyZjliODAwMCAw MDAwMDAwMDAwMDEzMTgwIGZmZmY4ODAwMzAyODVmZDggMDAwMDAwMDAwMDAxMzE4MA0KWyAxODAw Ljg0NTIzOF0gIGZmZmY4ODAwM2RhYTAwMDAgZmZmZjg4MDAyZjliODAwMCBmZmZmODgwMDFiYmVi MGMwIGZmZmY4ODAwMWJiZWIwODANClsgMTgwMC44NDY3MTddIENhbGwgVHJhY2U6DQpbIDE4MDAu ODQ3MjI3XSAgWzxmZmZmZmZmZjgxMDgwZjgyPl0gPyB0cnlfdG9fd2FrZV91cCsweDIzMi8weDJi MA0KWyAxODAwLjg0ODA3OF0gIFs8ZmZmZmZmZmY4MTZjNTRkOT5dIHNjaGVkdWxlKzB4MjkvMHg3 MA0KWyAxODAwLjg0ODg5OV0gIFs8ZmZmZmZmZmZhMDRjMGNkNj5dIHhmc19haWxfcHVzaF9hbGxf c3luYysweDk2LzB4ZDAgW3hmc10NClsgMTgwMC44NDk4NjNdICBbPGZmZmZmZmZmODEwOTIyMzA+ XSA/IF9fd2FrZV91cF9zeW5jKzB4MjAvMHgyMA0KWyAxODAwLjg1MDcwNV0gIFs8ZmZmZmZmZmZh MDQ2ZjFhMz5dIHhmc191bm1vdW50ZnMrMHg2My8weDE2MCBbeGZzXQ0KWyAxODAwLjg1MTY3OV0g IFs8ZmZmZmZmZmZhMDQ3NGY2NT5dID8ga21lbV9mcmVlKzB4MzUvMHg0MCBbeGZzXQ0KWyAxODAw Ljg1MjU4Nl0gIFs8ZmZmZmZmZmZhMDQ3MGNmNT5dIHhmc19mc19wdXRfc3VwZXIrMHgyNS8weDYw IFt4ZnNdDQpbIDE4MDAuODUzNDcxXSAgWzxmZmZmZmZmZjgxMTk1NjFlPl0gZ2VuZXJpY19zaHV0 ZG93bl9zdXBlcisweDdlLzB4MTAwDQpbIDE4MDAuODU0MzU5XSAgWzxmZmZmZmZmZjgxMTk1NmQw Pl0ga2lsbF9ibG9ja19zdXBlcisweDMwLzB4ODANClsgMTgwMC44NTUxOTVdICBbPGZmZmZmZmZm ODExOTU5MWQ+XSBkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcisweDRkLzB4ODANClsgMTgwMC44NzE2 MzFdICBbPGZmZmZmZmZmODExOTY1MmU+XSBkZWFjdGl2YXRlX3N1cGVyKzB4NGUvMHg3MA0KWyAx ODAwLjg3MjU4MF0gIFs8ZmZmZmZmZmY4MTFiMWQ0Mj5dIG1udHB1dF9ub19leHBpcmUrMHhkMi8w eDE2MA0KWyAxODAwLjg3MzQyNV0gIFs8ZmZmZmZmZmY4MTFiMmZmZj5dIFN5U191bW91bnQrMHhh Zi8weDNiMA0KWyAxODAwLjg3NDE5M10gIFs8ZmZmZmZmZmY4MTZkMTU5Mj5dIHN5c3RlbV9jYWxs X2Zhc3RwYXRoKzB4MTYvMHgxYg0KWyAxODEzLjcyNDQ4Nl0gWEZTIChzZGIpOiB4ZnNfbG9nX2Zv cmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAxODQzLjgwNDE2NV0gWEZTIChzZGIpOiB4ZnNfbG9n X2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAxODc0LjAxMzI0OV0gWEZTIChzZGIpOiB4ZnNf bG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAxOTA0LjE1NjM5MF0gWEZTIChzZGIpOiB4 ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAxOTIwLjg3MjQ0M10gSU5GTzogdGFz ayB1bW91bnQ6NTExNyBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuDQpbIDE5MjAu OTczODczXSAgICAgICBOb3QgdGFpbnRlZCAzLjE1LjAtcmMzICM0DQpbIDE5MjEuMDQ0NjgwXSAi ZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxl cyB0aGlzIG1lc3NhZ2UuDQpbIDE5MjEuMTgxMTA5XSB1bW91bnQgICAgICAgICAgRCBmZmZmZmZm ZjgxODBmZTQwICAgICAwICA1MTE3ICAgNDI0NSAweDAwMDAwMDAwDQpbIDE5MjEuMjcxNjE1XSAg ZmZmZjg4MDAzMDI4NWQ1OCAwMDAwMDAwMDAwMDAwMDgyIGZmZmY4ODAwMzAyODVkNDggZmZmZmZm ZmY4MTA4MGY4Mg0KWyAxOTIxLjM0OTU1OV0gIGZmZmY4ODAwMmY5YjgwMDAgMDAwMDAwMDAwMDAx MzE4MCBmZmZmODgwMDMwMjg1ZmQ4IDAwMDAwMDAwMDAwMTMxODANClsgMTkyMS4zNzg1MThdICBm ZmZmODgwMDNkYWEwMDAwIGZmZmY4ODAwMmY5YjgwMDAgZmZmZjg4MDAxYmJlYjBjMCBmZmZmODgw MDFiYmViMDgwDQpbIDE5MjEuMzgwMjE3XSBDYWxsIFRyYWNlOg0KWyAxOTIxLjM4MDU0Nl0gIFs8 ZmZmZmZmZmY4MTA4MGY4Mj5dID8gdHJ5X3RvX3dha2VfdXArMHgyMzIvMHgyYjANClsgMTkyMS4z ODE0MzJdICBbPGZmZmZmZmZmODE2YzU0ZDk+XSBzY2hlZHVsZSsweDI5LzB4NzANClsgMTkyMS4z ODIyMjVdICBbPGZmZmZmZmZmYTA0YzBjZDY+XSB4ZnNfYWlsX3B1c2hfYWxsX3N5bmMrMHg5Ni8w eGQwIFt4ZnNdDQpbIDE5MjEuMzgzMjA1XSAgWzxmZmZmZmZmZjgxMDkyMjMwPl0gPyBfX3dha2Vf dXBfc3luYysweDIwLzB4MjANClsgMTkyMS4zODQyMzldICBbPGZmZmZmZmZmYTA0NmYxYTM+XSB4 ZnNfdW5tb3VudGZzKzB4NjMvMHgxNjAgW3hmc10NClsgMTkyMS4zODUxODZdICBbPGZmZmZmZmZm YTA0NzRmNjU+XSA/IGttZW1fZnJlZSsweDM1LzB4NDAgW3hmc10NClsgMTkyMS4zODYwNTldICBb PGZmZmZmZmZmYTA0NzBjZjU+XSB4ZnNfZnNfcHV0X3N1cGVyKzB4MjUvMHg2MCBbeGZzXQ0KWyAx OTIxLjM4NzE1OV0gIFs8ZmZmZmZmZmY4MTE5NTYxZT5dIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIr MHg3ZS8weDEwMA0KWyAxOTIxLjM4ODA4MV0gIFs8ZmZmZmZmZmY4MTE5NTZkMD5dIGtpbGxfYmxv Y2tfc3VwZXIrMHgzMC8weDgwDQpbIDE5MjEuMzg5MTQwXSAgWzxmZmZmZmZmZjgxMTk1OTFkPl0g ZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIrMHg0ZC8weDgwDQpbIDE5MjEuNDYyOTA4XSAgWzxmZmZm ZmZmZjgxMTk2NTJlPl0gZGVhY3RpdmF0ZV9zdXBlcisweDRlLzB4NzANClsgMTkyMS40OTMxMTFd ICBbPGZmZmZmZmZmODExYjFkNDI+XSBtbnRwdXRfbm9fZXhwaXJlKzB4ZDIvMHgxNjANClsgMTky MS40OTQwNjddICBbPGZmZmZmZmZmODExYjJmZmY+XSBTeVNfdW1vdW50KzB4YWYvMHgzYjANClsg MTkyMS40OTY1NzRdICBbPGZmZmZmZmZmODE2ZDE1OTI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsw eDE2LzB4MWINClsgMTkzNC4zMDAxNTNdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJyb3Ig NSByZXR1cm5lZC4NClsgMTk2NC40NDQxMTNdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTogZXJy b3IgNSByZXR1cm5lZC4NClsgMTk5NC41ODgzMzNdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3JjZTog ZXJyb3IgNSByZXR1cm5lZC4NClsgMjAyNC42Njg0MTZdIFhGUyAoc2RiKTogeGZzX2xvZ19mb3Jj ZTogZXJyb3IgNSByZXR1cm5lZC4NClsgMjA0MS40OTYxMjhdIElORk86IHRhc2sgdW1vdW50OjUx MTcgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNvbmRzLg0KWyAyMDQxLjYwNzUxN10gICAg ICAgTm90IHRhaW50ZWQgMy4xNS4wLXJjMyAjNA0KWyAyMDQxLjYwODI5MV0gImVjaG8gMCA+IC9w cm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBtZXNz YWdlLg0KWyAyMDQxLjYwOTg2MV0gdW1vdW50ICAgICAgICAgIEQgZmZmZmZmZmY4MTgwZmU0MCAg ICAgMCAgNTExNyAgIDQyNDUgMHgwMDAwMDAwMA0KWyAyMDQxLjYxMzE4M10gIGZmZmY4ODAwMzAy ODVkNTggMDAwMDAwMDAwMDAwMDA4MiBmZmZmODgwMDMwMjg1ZDQ4IGZmZmZmZmZmODEwODBmODIN ClsgMjA0MS42MTQ3MjhdICBmZmZmODgwMDJmOWI4MDAwIDAwMDAwMDAwMDAwMTMxODAgZmZmZjg4 MDAzMDI4NWZkOCAwMDAwMDAwMDAwMDEzMTgwDQpbIDIwNDEuNjE2Mzk1XSAgZmZmZjg4MDAzZGFh MDAwMCBmZmZmODgwMDJmOWI4MDAwIGZmZmY4ODAwMWJiZWIwYzAgZmZmZjg4MDAxYmJlYjA4MA0K WyAyMDQxLjYxNzkzOV0gQ2FsbCBUcmFjZToNClsgMjA0MS42MTg0NTddICBbPGZmZmZmZmZmODEw ODBmODI+XSA/IHRyeV90b193YWtlX3VwKzB4MjMyLzB4MmIwDQpbIDIwNDEuNjY2NTM2XSAgWzxm ZmZmZmZmZjgxNmM1NGQ5Pl0gc2NoZWR1bGUrMHgyOS8weDcwDQpbIDIwNDEuNjY3NjExXSAgWzxm ZmZmZmZmZmEwNGMwY2Q2Pl0geGZzX2FpbF9wdXNoX2FsbF9zeW5jKzB4OTYvMHhkMCBbeGZzXQ0K WyAyMDQxLjY2ODYxOV0gIFs8ZmZmZmZmZmY4MTA5MjIzMD5dID8gX193YWtlX3VwX3N5bmMrMHgy MC8weDIwDQpbIDIwNDEuNjY5NjMxXSAgWzxmZmZmZmZmZmEwNDZmMWEzPl0geGZzX3VubW91bnRm cysweDYzLzB4MTYwIFt4ZnNdDQpbIDIwNDEuNjcwNTI0XSAgWzxmZmZmZmZmZmEwNDc0ZjY1Pl0g PyBrbWVtX2ZyZWUrMHgzNS8weDQwIFt4ZnNdDQpbIDIwNDEuNjcxNDExXSAgWzxmZmZmZmZmZmEw NDcwY2Y1Pl0geGZzX2ZzX3B1dF9zdXBlcisweDI1LzB4NjAgW3hmc10NClsgMjA0MS42NzIzODdd ICBbPGZmZmZmZmZmODExOTU2MWU+XSBnZW5lcmljX3NodXRkb3duX3N1cGVyKzB4N2UvMHgxMDAN ClsgMjA0MS42NzMzMzNdICBbPGZmZmZmZmZmODExOTU2ZDA+XSBraWxsX2Jsb2NrX3N1cGVyKzB4 MzAvMHg4MA0KWyAyMDQxLjY3NDE5OF0gIFs8ZmZmZmZmZmY4MTE5NTkxZD5dIGRlYWN0aXZhdGVf bG9ja2VkX3N1cGVyKzB4NGQvMHg4MA0KWyAyMDQxLjY3NjYzM10gIFs8ZmZmZmZmZmY4MTE5NjUy ZT5dIGRlYWN0aXZhdGVfc3VwZXIrMHg0ZS8weDcwDQpbIDIwNDEuNjc3NjA0XSAgWzxmZmZmZmZm ZjgxMWIxZDQyPl0gbW50cHV0X25vX2V4cGlyZSsweGQyLzB4MTYwDQpbIDIwNDEuNjc4NDY5XSAg WzxmZmZmZmZmZjgxMWIyZmZmPl0gU3lTX3Vtb3VudCsweGFmLzB4M2IwDQpbIDIwNDEuNjc5NDE3 XSAgWzxmZmZmZmZmZjgxNmQxNTkyPl0gc3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxNi8weDFiDQpb IDIwNTQuNzQ4NDIzXSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJuZWQu DQpbIDIwODQuODkyMzk0XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0dXJu ZWQuDQpbIDIxMTUuMDM2NTA0XSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUgcmV0 dXJuZWQuDQpbIDIxNDUuMTgwMTQxXSBYRlMgKHNkYik6IHhmc19sb2dfZm9yY2U6IGVycm9yIDUg cmV0dXJuZWQuDQpbIDIxNjEuNjgwMTY1XSBJTkZPOiB0YXNrIHVtb3VudDo1MTE3IGJsb2NrZWQg Zm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4NClsgMjE2MS43OTgzODFdICAgICAgIE5vdCB0YWlu dGVkIDMuMTUuMC1yYzMgIzQNClsgMjE2MS44ODE4MTNdICJlY2hvIDAgPiAvcHJvYy9zeXMva2Vy bmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4NClsgMjE2 MS45OTI4MDZdIHVtb3VudCAgICAgICAgICBEIGZmZmZmZmZmODE4MGZlNDAgICAgIDAgIDUxMTcg ICA0MjQ1IDB4MDAwMDAwMDANClsgMjE2Mi4xMDk2MDddICBmZmZmODgwMDMwMjg1ZDU4IDAwMDAw MDAwMDAwMDAwODIgZmZmZjg4MDAzMDI4NWQ0OCBmZmZmZmZmZjgxMDgwZjgyDQpbIDIxNjIuMjY0 NjE4XSAgZmZmZjg4MDAyZjliODAwMCAwMDAwMDAwMDAwMDEzMTgwIGZmZmY4ODAwMzAyODVmZDgg MDAwMDAwMDAwMDAxMzE4MA0KWyAyMTYyLjQwNjE4NV0gIGZmZmY4ODAwM2RhYTAwMDAgZmZmZjg4 MDAyZjliODAwMCBmZmZmODgwMDFiYmViMGMwIGZmZmY4ODAwMWJiZWIwODANClsgMjE2Mi41MzE5 NThdIENhbGwgVHJhY2U6DQpbIDIxNjIuNTc2NDM3XSAgWzxmZmZmZmZmZjgxMDgwZjgyPl0gPyB0 cnlfdG9fd2FrZV91cCsweDIzMi8weDJiMA0KWyAyMTYyLjY2Nzg3Ml0gIFs8ZmZmZmZmZmY4MTZj NTRkOT5dIHNjaGVkdWxlKzB4MjkvMHg3MA0KWyAyMTYyLjY4OTc3NF0gIFs8ZmZmZmZmZmZhMDRj MGNkNj5dIHhmc19haWxfcHVzaF9hbGxfc3luYysweDk2LzB4ZDAgW3hmc10NClsgMjE2Mi42OTA2 NTddICBbPGZmZmZmZmZmODEwOTIyMzA+XSA/IF9fd2FrZV91cF9zeW5jKzB4MjAvMHgyMA0KWyAy MTYyLjY5MTQyMF0gIFs8ZmZmZmZmZmZhMDQ2ZjFhMz5dIHhmc191bm1vdW50ZnMrMHg2My8weDE2 MCBbeGZzXQ0KWyAyMTYyLjY5MjIyNl0gIFs8ZmZmZmZmZmZhMDQ3NGY2NT5dID8ga21lbV9mcmVl KzB4MzUvMHg0MCBbeGZzXQ0KWyAyMTYyLjY5MzA1M10gIFs8ZmZmZmZmZmZhMDQ3MGNmNT5dIHhm c19mc19wdXRfc3VwZXIrMHgyNS8weDYwIFt4ZnNdDQpbIDIxNjIuNjkzODQ5XSAgWzxmZmZmZmZm ZjgxMTk1NjFlPl0gZ2VuZXJpY19zaHV0ZG93bl9zdXBlcisweDdlLzB4MTAwDQpbIDIxNjIuNjk0 NjUzXSAgWzxmZmZmZmZmZjgxMTk1NmQwPl0ga2lsbF9ibG9ja19zdXBlcisweDMwLzB4ODANClsg MjE2Mi42OTY1OTNdICBbPGZmZmZmZmZmODExOTU5MWQ+XSBkZWFjdGl2YXRlX2xvY2tlZF9zdXBl cisweDRkLzB4ODANClsgMjE2Mi42OTc1MDFdICBbPGZmZmZmZmZmODExOTY1MmU+XSBkZWFjdGl2 YXRlX3N1cGVyKzB4NGUvMHg3MA0KWyAyMTYyLjY5ODI3Nl0gIFs8ZmZmZmZmZmY4MTFiMWQ0Mj5d IG1udHB1dF9ub19leHBpcmUrMHhkMi8weDE2MA0KWyAyMTYyLjY5OTE5NF0gIFs8ZmZmZmZmZmY4 MTFiMmZmZj5dIFN5U191bW91bnQrMHhhZi8weDNiMA0KWyAyMTYyLjY5OTkyNF0gIFs8ZmZmZmZm ZmY4MTZkMTU5Mj5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTYvMHgxYg0KWyAyMTc1LjI2MTMx MF0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAyMjA1LjQw NDQwMl0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAyMjM1 LjU0ODQ5NV0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0KWyAy MjY1LjY5MjE2Nl0gWEZTIChzZGIpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciA1IHJldHVybmVkLg0K WyAyMjgyLjcwMDE5NV0gSU5GTzogdGFzayB1bW91bnQ6NTExNyBibG9ja2VkIGZvciBtb3JlIHRo YW4gMTIwIHNlY29uZHMuDQpbIDIyODIuODE4MzQxXSAgICAgICBOb3QgdGFpbnRlZCAzLjE1LjAt cmMzICM0DQpbIDIyODIuODU2NzUyXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rh c2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuDQpbIDIyODIuOTI3MDk4XSB1 bW91bnQgICAgICAgICAgRCBmZmZmZmZmZjgxODBmZTQwICAgICAwICA1MTE3ICAgNDI0NSAweDAw MDAwMDAwDQpbIDIyODMuMDQyNTkzXSAgZmZmZjg4MDAzMDI4NWQ1OCAwMDAwMDAwMDAwMDAwMDgy IGZmZmY4ODAwMzAyODVkNDggZmZmZmZmZmY4MTA4MGY4Mg0KWyAyMjgzLjA4OTAzOV0gIGZmZmY4 ODAwMmY5YjgwMDAgMDAwMDAwMDAwMDAxMzE4MCBmZmZmODgwMDMwMjg1ZmQ4IDAwMDAwMDAwMDAw MTMxODANClsgMjI4My4wOTA1MzddICBmZmZmODgwMDNkYWEwMDAwIGZmZmY4ODAwMmY5YjgwMDAg ZmZmZjg4MDAxYmJlYjBjMCBmZmZmODgwMDFiYmViMDgwDQpbIDIyODMuMDkyMDQ1XSBDYWxsIFRy YWNlOg0KWyAyMjgzLjA5MzEyOV0gIFs8ZmZmZmZmZmY4MTA4MGY4Mj5dID8gdHJ5X3RvX3dha2Vf dXArMHgyMzIvMHgyYjANClsgMjI4My4xMzg1NzFdICBbPGZmZmZmZmZmODE2YzU0ZDk+XSBzY2hl ZHVsZSsweDI5LzB4NzANClsgMjI4My4yMjg2NDldICBbPGZmZmZmZmZmYTA0YzBjZDY+XSB4ZnNf YWlsX3B1c2hfYWxsX3N5bmMrMHg5Ni8weGQwIFt4ZnNdDQpbIDIyODMuMzM4MTM2XSAgWzxmZmZm ZmZmZjgxMDkyMjMwPl0gPyBfX3dha2VfdXBfc3luYysweDIwLzB4MjANClsgMjI4My40MjIyODNd ICBbPGZmZmZmZmZmYTA0NmYxYTM+XSB4ZnNfdW5tb3VudGZzKzB4NjMvMHgxNjAgW3hmc10NClsg MjI4My40MjMxMzddICBbPGZmZmZmZmZmYTA0NzRmNjU+XSA/IGttZW1fZnJlZSsweDM1LzB4NDAg W3hmc10NClsgMjI4My40MjM5MzFdICBbPGZmZmZmZmZmYTA0NzBjZjU+XSB4ZnNfZnNfcHV0X3N1 cGVyKzB4MjUvMHg2MCBbeGZzXQ0KWyAyMjgzLjQyNDg0Ml0gIFs8ZmZmZmZmZmY4MTE5NTYxZT5d IGdlbmVyaWNfc2h1dGRvd25fc3VwZXIrMHg3ZS8weDEwMA0KWyAyMjgzLjQ3NTk3M10gIFs8ZmZm ZmZmZmY4MTE5NTZkMD5dIGtpbGxfYmxvY2tfc3VwZXIrMHgzMC8weDgwDQpbIDIyODMuNDg2MjU4 XSAgWzxmZmZmZmZmZjgxMTk1OTFkPl0gZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIrMHg0ZC8weDgw DQpbIDIyODMuNDg4ODY1XSAgWzxmZmZmZmZmZjgxMTk2NTJlPl0gZGVhY3RpdmF0ZV9zdXBlcisw eDRlLzB4NzANClsgMjI4My40ODk3MTBdICBbPGZmZmZmZmZmODExYjFkNDI+XSBtbnRwdXRfbm9f ZXhwaXJlKzB4ZDIvMHgxNjANClsgMjI4My40OTA3MjNdICBbPGZmZmZmZmZmODExYjJmZmY+XSBT eVNfdW1vdW50KzB4YWYvMHgzYjANClsgMjI4My40OTE1MDFdICBbPGZmZmZmZmZmODE2ZDE1OTI+ XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDE2LzB4MWINCg== --001a11339ae4aa33e204f822fe89-- From david@fromorbit.com Mon Apr 28 20:01:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 05EDF29DF8 for ; Mon, 28 Apr 2014 20:01:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E71488F8039 for ; Mon, 28 Apr 2014 18:01:29 -0700 (PDT) X-ASG-Debug-ID: 1398733286-04cb6c729110de40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id fYW9p5IZiVrav6sU for ; Mon, 28 Apr 2014 18:01: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: AvRLAFX5XlN5LEcvPGdsb2JhbABTBoMGiESjWQEBAQWZdoEaFwMBAQEBODWCJQEBBTocIxAIAxgJJQ8FJQMHGhOIQMkDFxaFRIg8QweDJIEVBJkLinSLLis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 29 Apr 2014 10:31:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WewQD-0005l3-EL; Tue, 29 Apr 2014 11:01:21 +1000 Date: Tue, 29 Apr 2014 11:01:21 +1000 From: Dave Chinner To: Bob Mastors Cc: xfs@oss.sgi.com Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error Message-ID: <20140429010121.GE18672@dastard> X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error References: <20140428234558.GD18672@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398733287 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Apr 28, 2014 at 05:51:31PM -0600, Bob Mastors wrote: > Log output attached. > The xfs filesystem being mounted and unmounted is the only xfs filesystem > on the system. > Bob > > > On Mon, Apr 28, 2014 at 5:45 PM, Dave Chinner wrote: > > > On Mon, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote: > > > Greetings, > > > > > > I have an xfs umount hang caused by forcing the block device to return > > > i/o errors while copying files to the filesystem. > > > Detailed steps to reproduce the problem on virtualbox are below. > > > > > > The linux version is a recent pull and reports as 3.15.0-rc3. > > > > > > [ 2040.248096] INFO: task umount:10303 blocked for more than 120 seconds. > > > [ 2040.323947] Not tainted 3.15.0-rc3 #4 > > > [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > > disables > > > this message. > > > [ 2040.352665] umount D ffffffff8180fe40 0 10303 8691 > > > 0x00000000 > > > [ 2040.404918] ffff88001e33dd58 0000000000000086 ffff88001e33dd48 > > > ffffffff81080f82 > > > [ 2040.489901] ffff88001b311900 0000000000013180 ffff88001e33dfd8 > > > 0000000000013180 > > > [ 2040.534772] ffff88003daa3200 ffff88001b311900 ffff88002421aec0 > > > ffff88002421ae80 > > > [ 2040.587450] Call Trace: > > > [ 2040.592176] [] ? try_to_wake_up+0x232/0x2b0 > > > [ 2040.620212] [] schedule+0x29/0x70 > > > [ 2040.627685] [] xfs_ail_push_all_sync+0x96/0xd0 > > [xfs] > > > [ 2040.632236] [] ? __wake_up_sync+0x20/0x20 > > > [ 2040.659105] [] xfs_unmountfs+0x63/0x160 [xfs] > > > [ 2040.691774] [] ? kmem_free+0x35/0x40 [xfs] > > > [ 2040.698610] [] xfs_fs_put_super+0x25/0x60 [xfs] > > > [ 2040.706838] [] generic_shutdown_super+0x7e/0x100 > > > [ 2040.723958] [] kill_block_super+0x30/0x80 > > > [ 2040.734963] [] deactivate_locked_super+0x4d/0x80 > > > [ 2040.745485] [] deactivate_super+0x4e/0x70 > > > [ 2040.751274] [] mntput_no_expire+0xd2/0x160 > > > [ 2040.755894] [] SyS_umount+0xaf/0x3b0 > > > [ 2040.761032] [] system_call_fastpath+0x16/0x1b > > > [ .060058] XFS (sdb): xfs_log_force: error 5 returned. > > > [ 268059] XFS (sdb): xfs_log_force: error 5 returned. > > > > > > I took a look at xfs_ail_push_all_sync and it is pretty easy to see > > > the hang. But it is not obvious to me how to fix it. > > > Any ideas would be appreciated. > > > > > > I am available to run additional tests or capture more logging > > > or whatever if that would help. > > > > What's the entire log output from the first shutdown message? So what is the AIL stuck on? Can you trace the xfs_ail* trace points when it is in shutdown like this and post the output of the report? > [ 1318.816643] XFS (sdb): metadata I/O error: block 0x19fc80 ("xfs_buf_iodone_callbacks") error 5 numblks 16 > [ 1318.818080] XFS (sdb): metadata I/O error: block 0x1025cf ("xlog_iodone") error 5 numblks 64 > [ 1318.819350] XFS (sdb): xfs_do_force_shutdown(0x2) called from line 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa04b9859 > [ 1318.821089] XFS (sdb): Log I/O Error Detected. Shutting down filesystem > [ 1318.822301] XFS (sdb): xfs_log_force: error 5 returned. > [ 1318.822308] XFS (sdb): xfs_log_force: error 5 returned. > [ 1318.822311] XFS (sdb): Detected failing async write on buffer block 0x19fca0. Retrying async write. That's the only thing that is unusual about the hang. Does this always appear when a hang occurs? Cheers, Dave. -- Dave Chinner david@fromorbit.com From bob.mastors@solidfire.com Mon Apr 28 20:11:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 298AB29DF8 for ; Mon, 28 Apr 2014 20:11:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5EC930404E for ; Mon, 28 Apr 2014 18:11:54 -0700 (PDT) X-ASG-Debug-ID: 1398733912-04cb6c729110ef10001-NocioJ Received: from mail-ve0-f169.google.com (mail-ve0-f169.google.com [209.85.128.169]) by cuda.sgi.com with ESMTP id CmDdNWGeesjg8h9D (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 28 Apr 2014 18:11:52 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.128.169 Received: by mail-ve0-f169.google.com with SMTP id jx11so459129veb.0 for ; Mon, 28 Apr 2014 18:11:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=AAI9iD+69uR2vp7TTy9rcGbXzRjsEOHIb4qUCCHzhbI=; b=CeRopOAe6Cy6zOAn817iLKRneUUL1310cEZ++oQ/eEpMrBgZ7E42u9/nhqwhyKTBC9 9dsp+asO4FOLHadMxbQndu9c4yV4vr/Otn/zhSTjSPFWGMgp3YBNXjOgJo9t7aDq7H7p PyP7YyFmWgJ8ExJtaqDOS4B1X9FoO0hCbURvXxl3UbA1xtr5GkZ1lw8uqvztnG7EuxmN a4UTpNZSK6fzvDuraeTZVclajAiCZ3+YwUy2s6LHfmiFObUmRAac33SOKE89e8VMgmNr LzbsWOIK9Yo2ab07CKf3scRMrf/zpuiWif95jfrdfNMpX68I1hGDj80OuAourxahFqnJ xg/Q== X-Gm-Message-State: ALoCoQnFAwZ4yVry2OcfiP1hAOIJGFIaM/CKvDd4FLpXN1r6qQv+P6tpWb7lLejfsP4W7mgYXD63 MIME-Version: 1.0 X-Received: by 10.58.38.166 with SMTP id h6mr25941804vek.22.1398733912225; Mon, 28 Apr 2014 18:11:52 -0700 (PDT) Received: by 10.52.78.67 with HTTP; Mon, 28 Apr 2014 18:11:52 -0700 (PDT) In-Reply-To: <20140429010121.GE18672@dastard> References: <20140428234558.GD18672@dastard> <20140429010121.GE18672@dastard> Date: Mon, 28 Apr 2014 19:11:52 -0600 Message-ID: Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error From: Bob Mastors X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e013a0d40f94e9a04f8241d1d X-Barracuda-Connect: mail-ve0-f169.google.com[209.85.128.169] X-Barracuda-Start-Time: 1398733912 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e013a0d40f94e9a04f8241d1d Content-Type: text/plain; charset=ISO-8859-1 On Mon, Apr 28, 2014 at 7:01 PM, Dave Chinner wrote: > On Mon, Apr 28, 2014 at 05:51:31PM -0600, Bob Mastors wrote: > > Log output attached. > > The xfs filesystem being mounted and unmounted is the only xfs filesystem > > on the system. > > Bob > > > > > > On Mon, Apr 28, 2014 at 5:45 PM, Dave Chinner > wrote: > > > > > On Mon, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote: > > > > Greetings, > > > > > > > > I have an xfs umount hang caused by forcing the block device to > return > > > > i/o errors while copying files to the filesystem. > > > > Detailed steps to reproduce the problem on virtualbox are below. > > > > > > > > The linux version is a recent pull and reports as 3.15.0-rc3. > > > > > > > > [ 2040.248096] INFO: task umount:10303 blocked for more than 120 > seconds. > > > > [ 2040.323947] Not tainted 3.15.0-rc3 #4 > > > > [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > > > disables > > > > this message. > > > > [ 2040.352665] umount D ffffffff8180fe40 0 10303 8691 > > > > 0x00000000 > > > > [ 2040.404918] ffff88001e33dd58 0000000000000086 ffff88001e33dd48 > > > > ffffffff81080f82 > > > > [ 2040.489901] ffff88001b311900 0000000000013180 ffff88001e33dfd8 > > > > 0000000000013180 > > > > [ 2040.534772] ffff88003daa3200 ffff88001b311900 ffff88002421aec0 > > > > ffff88002421ae80 > > > > [ 2040.587450] Call Trace: > > > > [ 2040.592176] [] ? try_to_wake_up+0x232/0x2b0 > > > > [ 2040.620212] [] schedule+0x29/0x70 > > > > [ 2040.627685] [] xfs_ail_push_all_sync+0x96/0xd0 > > > [xfs] > > > > [ 2040.632236] [] ? __wake_up_sync+0x20/0x20 > > > > [ 2040.659105] [] xfs_unmountfs+0x63/0x160 [xfs] > > > > [ 2040.691774] [] ? kmem_free+0x35/0x40 [xfs] > > > > [ 2040.698610] [] xfs_fs_put_super+0x25/0x60 [xfs] > > > > [ 2040.706838] [] > generic_shutdown_super+0x7e/0x100 > > > > [ 2040.723958] [] kill_block_super+0x30/0x80 > > > > [ 2040.734963] [] > deactivate_locked_super+0x4d/0x80 > > > > [ 2040.745485] [] deactivate_super+0x4e/0x70 > > > > [ 2040.751274] [] mntput_no_expire+0xd2/0x160 > > > > [ 2040.755894] [] SyS_umount+0xaf/0x3b0 > > > > [ 2040.761032] [] system_call_fastpath+0x16/0x1b > > > > [ .060058] XFS (sdb): xfs_log_force: error 5 returned. > > > > [ 268059] XFS (sdb): xfs_log_force: error 5 returned. > > > > > > > > I took a look at xfs_ail_push_all_sync and it is pretty easy to see > > > > the hang. But it is not obvious to me how to fix it. > > > > Any ideas would be appreciated. > > > > > > > > I am available to run additional tests or capture more logging > > > > or whatever if that would help. > > > > > > What's the entire log output from the first shutdown message? > > So what is the AIL stuck on? Can you trace the xfs_ail* trace points > when it is in shutdown like this and post the output of the report? > I will try to get this info. Might take a couple of days. > > > [ 1318.816643] XFS (sdb): metadata I/O error: block 0x19fc80 > ("xfs_buf_iodone_callbacks") error 5 numblks 16 > > [ 1318.818080] XFS (sdb): metadata I/O error: block 0x1025cf > ("xlog_iodone") error 5 numblks 64 > > [ 1318.819350] XFS (sdb): xfs_do_force_shutdown(0x2) called from line > 1170 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa04b9859 > > [ 1318.821089] XFS (sdb): Log I/O Error Detected. Shutting down > filesystem > > [ 1318.822301] XFS (sdb): xfs_log_force: error 5 returned. > > [ 1318.822308] XFS (sdb): xfs_log_force: error 5 returned. > > [ 1318.822311] XFS (sdb): Detected failing async write on buffer block > 0x19fca0. Retrying async write. > > That's the only thing that is unusual about the hang. Does this > always appear when a hang occurs? > I don't think so but I have not been keeping all of the logs. I will run the test some more and see if it always appears or not. Thanks, Bob > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --089e013a0d40f94e9a04f8241d1d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
On M= on, Apr 28, 2014 at 7:01 PM, Dave Chinner <david@fromorbit.com> wrote:
On M= on, Apr 28, 2014 at 05:51:31PM -0600, Bob Mastors wrote:
> Log output attached.
> The xfs filesystem being mounted and unmounted is the only xfs filesys= tem
> on the system.
> Bob
>
>
> On Mon, Apr 28, 2014 at 5:45 PM, Dave Chinner <david@fromorbit.com> wrote:
>
> > On Mon, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote:
> > > Greetings,
> > >
> > > I have an xfs umount hang caused by forcing the block device= to return
> > > i/o errors while copying files to the filesystem.
> > > Detailed steps to reproduce the problem on virtualbox are be= low.
> > >
> > > The linux version is a recent pull and reports as 3.15.0-rc3= .
> > >
> > > [ 2040.248096] INFO: task umount:10303 blocked for more than= 120 seconds.
> > > [ 2040.323947] =A0 =A0 =A0 Not tainted 3.15.0-rc3 #4
> > > [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_= timeout_secs"
> > disables
> > > this message.
> > > [ 2040.352665] umount =A0 =A0 =A0 =A0 =A0D ffffffff8180fe40 = =A0 =A0 0 10303 =A0 8691
> > > 0x00000000
> > > [ 2040.404918] =A0ffff88001e33dd58 0000000000000086 ffff8800= 1e33dd48
> > > ffffffff81080f82
> > > [ 2040.489901] =A0ffff88001b311900 0000000000013180 ffff8800= 1e33dfd8
> > > 0000000000013180
> > > [ 2040.534772] =A0ffff88003daa3200 ffff88001b311900 ffff8800= 2421aec0
> > > ffff88002421ae80
> > > [ 2040.587450] Call Trace:
> > > [ 2040.592176] =A0[<ffffffff81080f82>] ? try_to_wake_u= p+0x232/0x2b0
> > > [ 2040.620212] =A0[<ffffffff816c54d9>] schedule+0x29/0= x70
> > > [ 2040.627685] =A0[<ffffffffa04c4cd6>] xfs_ail_push_al= l_sync+0x96/0xd0
> > [xfs]
> > > [ 2040.632236] =A0[<ffffffff81092230>] ? __wake_up_syn= c+0x20/0x20
> > > [ 2040.659105] =A0[<ffffffffa04731a3>] xfs_unmountfs+0= x63/0x160 [xfs]
> > > [ 2040.691774] =A0[<ffffffffa0478f65>] ? kmem_free+0x3= 5/0x40 [xfs]
> > > [ 2040.698610] =A0[<ffffffffa0474cf5>] xfs_fs_put_supe= r+0x25/0x60 [xfs]
> > > [ 2040.706838] =A0[<ffffffff8119561e>] generic_shutdow= n_super+0x7e/0x100
> > > [ 2040.723958] =A0[<ffffffff811956d0>] kill_block_supe= r+0x30/0x80
> > > [ 2040.734963] =A0[<ffffffff8119591d>] deactivate_lock= ed_super+0x4d/0x80
> > > [ 2040.745485] =A0[<ffffffff8119652e>] deactivate_supe= r+0x4e/0x70
> > > [ 2040.751274] =A0[<ffffffff811b1d42>] mntput_no_expir= e+0xd2/0x160
> > > [ 2040.755894] =A0[<ffffffff811b2fff>] SyS_umount+0xaf= /0x3b0
> > > [ 2040.761032] =A0[<ffffffff816d1592>] system_call_fas= tpath+0x16/0x1b
> > > [ .060058] XFS (sdb): xfs_log_force: error 5 returned.
> > > [ 268059] XFS (sdb): xfs_log_force: error 5 returned.
> > >
> > > I took a look at xfs_ail_push_all_sync and it is pretty easy= to see
> > > the hang. But it is not obvious to me how to fix it.
> > > Any ideas would be appreciated.
> > >
> > > I am available to run additional tests or capture more loggi= ng
> > > or whatever if that would help.
> >
> > What's the entire log output from the first shutdown message?=

So what is the AIL stuck on? Can you trace the xfs_ail* trace p= oints
when it is in shutdown like this and post the output of the report?
I will try to get this info.
Might take a couple of= days.
=A0

> [ 1318.816643] XFS (sdb): metadata I/O error: block 0x19fc80 ("xf= s_buf_iodone_callbacks") error 5 numblks 16
> [ 1318.818080] XFS (sdb): metadata I/O error: block 0x1025cf ("xl= og_iodone") error 5 numblks 64
> [ 1318.819350] XFS (sdb): xfs_do_force_shutdown(0x2) called from line = 1170 of file fs/xfs/xfs_log.c. =A0Return address =3D 0xffffffffa04b9859
> [ 1318.821089] XFS (sdb): Log I/O Error Detected. =A0Shutting down fil= esystem
> [ 1318.822301] XFS (sdb): xfs_log_force: error 5 returned.
> [ 1318.822308] XFS (sdb): xfs_log_force: error 5 returned.
> [ 1318.822311] XFS (sdb): Detected failing async write on buffer block= 0x19fca0. Retrying async write.

That's the only thing that is unusual about the hang. Does this
always appear when a hang occurs?
I don't think so= but I have not been keeping all of the logs.
I will run the test= some more and see if it always appears or not.

Thanks,
Bob
=A0

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--089e013a0d40f94e9a04f8241d1d-- From branto@redhat.com Tue Apr 29 05:25:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2E73029DF8 for ; Tue, 29 Apr 2014 05:25:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C94ABAC002 for ; Tue, 29 Apr 2014 03:24:57 -0700 (PDT) X-ASG-Debug-ID: 1398767093-04bdf02b8c1337f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DkSRGhqEhh0GJO9C for ; Tue, 29 Apr 2014 03:24:53 -0700 (PDT) X-Barracuda-Envelope-From: branto@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 s3TAOVD3002462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 29 Apr 2014 06:24:31 -0400 Received: from [10.34.31.223] (dhcp-31-223.brq.redhat.com [10.34.31.223]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3TAOScb019273 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 29 Apr 2014 06:24:29 -0400 Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() To: Mark Tinguely Cc: Eric Sandeen , Christoph Hellwig , Eric Sandeen , xfs-oss In-Reply-To: <535E94A4.2060701@sgi.com> References: <535E8344.2070209@redhat.com> <20140428164754.GA17472@infradead.org> <535E8D67.3010504@redhat.com> <535E8E47.2040701@sgi.com> <535E8F4C.8000003@sandeen.net> <535E94A4.2060701@sgi.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 29 Apr 2014 12:24:27 +0200 Message-ID: <1398767067.15380.26.camel@dhcp-31-223.brq.redhat.com> Mime-Version: 1.0 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: 1398767093 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, 2014-04-28 at 12:49 -0500, Mark Tinguely wrote: > On 04/28/14 12:26, Eric Sandeen wrote: > > On 4/28/14, 12:22 PM, Mark Tinguely wrote: > >> On 04/28/14 12:18, Eric Sandeen wrote: > >>> On 4/28/14, 11:47 AM, Christoph Hellwig wrote: > >>>> On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: > >>>>> Similar to xfs_file_fsync(), I think xfs_dir_fsync() needs > >>>>> to test for a shut down fs, > >>>> > >>>> It probably should. > >>>> > >>>>> lest we go down paths we'll > >>>>> never be able to complete; Boris reported that during some > >>>>> stress tests he had threads stuck in xlog_cil_force_lsn > >>>>> via xfs_dir_fsync(). > >>>> > >>>> But this could still happen if we get a shutdown coming in after that > >>>> test. > >>> > >>> True... that looked a bit hairier to sort out. :( > >>> > >>> -Eric > >>> > >> > >> > >> Are the sync lsn look okay? Was there an error writing the iclog buffer? > >> > >> xfs_do_force_shutdown() will also do a xlog_cil_force_lsn() via the > >> xfs_log_force_umount if the log buffer write was not in error. That > >> should be the same or later than this lsn. > > > > I don't have full details, unfortunately, just the sysrq backtraces. > > > > -Eric > > > >> --Mark. > > anything in the log as to what caused the hang? You mention a forced > shutdown; what caused the forced shutdown? Hi, I used src/godown utility from xfstests to simulate a power failure and cause the forced shutdown. The kernel does not report much. All I get is this kernel message (it repeats every few seconds): [498704.267273] XFS (dm-3): xfs_log_force: error 5 returned. Nothing else is reported by the kernel albeit ls /mnt/point already returns EIO. The whole test is fairly simple to describe: It runs several threads that ~randomly create/delete/truncate/mmap/fdatasync files in several iterations, then (after ~2 minutes) the src/godown utility is run and when the program gets the message from all the threads that they got some I/O errors, it will remount the fs and tell all the threads to continue with verification of fsynced data. The trouble is that the program will never get the message from all the threads because some of them are stuck in D state on fsync/fdatasync syscall after the src/godown utility is run > Is this the latest bits (3.15)? > As Eric mentioned earlier, it is 3.10 with a lot of backports from later kernels. Boris > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 29 07:57:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 542D429DF8 for ; Tue, 29 Apr 2014 07:57:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42D3E304043 for ; Tue, 29 Apr 2014 05:57:03 -0700 (PDT) X-ASG-Debug-ID: 1398776218-04cbb03cc513bfb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9tXMoWolXY528s4a; Tue, 29 Apr 2014 05:56:59 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3TCup7j024421 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 29 Apr 2014 08:56:51 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3TCuoIT019354; Tue, 29 Apr 2014 08:56:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6F08012573F; Tue, 29 Apr 2014 08:56:49 -0400 (EDT) Date: Tue, 29 Apr 2014 08:56:49 -0400 From: Brian Foster To: Dave Chinner Cc: Mark Tinguely , Eric Sandeen , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() Message-ID: <20140429125648.GA59046@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428205420.GB18672@dastard> <535ECAA6.3050200@sgi.com> <20140428221849.GC18672@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140428221849.GC18672@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398776219 X-Barracuda-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 29, 2014 at 08:18:49AM +1000, Dave Chinner wrote: > On Mon, Apr 28, 2014 at 04:39:50PM -0500, Mark Tinguely wrote: > > On 04/28/14 15:54, Dave Chinner wrote: > > >On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: ... > > xfs: don't sleep in xlog_cil_force_lsn on shutdown > > From: Dave Chinner > > Reports of a shutdown hang when fsyncing a directory have surfaced, > such as this: > > [ 3663.394472] Call Trace: > [ 3663.397199] [] schedule+0x29/0x70 > [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > [ 3663.435873] [] do_fsync+0x65/0xa0 > [ 3663.441408] [] SyS_fsync+0x10/0x20 > [ 3663.447043] [] system_call_fastpath+0x16/0x1b > > If we trigger a shutdown in xlog_cil_push() from xlog_write(), we > will never wake waiters on the current push sequence number, so > anything waiting in xlog_cil_force_lsn() for that push sequence > number to come up will not get woken and hence stall the shutdown. > > Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in > the push abort handling, in the log shutdown code when waking all > waiters, and adding a shutdown check in the sequence completion wait > loops to ensure they abort when a wakeup due to a shutdown occurs. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log.c | 7 +++++-- > fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- > 2 files changed, 47 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index a5f8bd9..dbba2d7 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -3952,11 +3952,14 @@ xfs_log_force_umount( > retval = xlog_state_ioerror(log); > spin_unlock(&log->l_icloglock); > } > + > /* > - * Wake up everybody waiting on xfs_log_force. > - * Callback all log item committed functions as if the > + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone > + * waiting on a CIL push that is issued as part of a log force first > + * before running the log item committed callback functions as if the > * log writes were completed. > */ > + wake_up_all(&log->l_cilp->xc_commit_wait); > xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); > Why is this necessary? It looks like xlog_state_do_callback() will hit the xlog_cil_committed() callback with the aborted flag... > #ifdef XFSERRORDEBUG > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index 7e54553..3a68ddf 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -385,7 +385,15 @@ xlog_cil_committed( > xfs_extent_busy_clear(mp, &ctx->busy_extents, > (mp->m_flags & XFS_MOUNT_DISCARD) && !abort); > > + /* > + * If we are aborting the commit, wake up anyone waiting on the > + * committing list. If we don't, then a shutdown we can leave processes > + * waiting in xlog_cil_force_lsn() waiting on a sequence commit that > + * will never happen because we aborted it. > + */ > spin_lock(&ctx->cil->xc_push_lock); > + if (abort) > + wake_up_all(&cil->xc_commit_wait); There's a compile error here. The parameter should be '&ctx->cil->...' Brian > list_del(&ctx->committing); > spin_unlock(&ctx->cil->xc_push_lock); > > @@ -564,8 +572,18 @@ restart: > spin_lock(&cil->xc_push_lock); > list_for_each_entry(new_ctx, &cil->xc_committing, committing) { > /* > + * Avoid getting stuck in this loop because we were woken by the > + * shutdown, but then went back to sleep once already in the > + * shutdown state. > + */ > + if (XLOG_FORCED_SHUTDOWN(log)) { > + spin_unlock(&cil->xc_push_lock); > + goto out_abort_free_ticket; > + } > + > + /* > * Higher sequences will wait for this one so skip them. > - * Don't wait for own own sequence, either. > + * Don't wait for our own sequence, either. > */ > if (new_ctx->sequence >= ctx->sequence) > continue; > @@ -810,6 +828,13 @@ restart: > */ > spin_lock(&cil->xc_push_lock); > list_for_each_entry(ctx, &cil->xc_committing, committing) { > + /* > + * Avoid getting stuck in this loop because we were woken by the > + * shutdown, but then went back to sleep once already in the > + * shutdown state. > + */ > + if (XLOG_FORCED_SHUTDOWN(log)) > + goto out_shutdown; > if (ctx->sequence > sequence) > continue; > if (!ctx->commit_lsn) { > @@ -833,14 +858,12 @@ restart: > * push sequence after the above wait loop and the CIL still contains > * dirty objects. > * > - * When the push occurs, it will empty the CIL and > - * atomically increment the currect sequence past the push sequence and > - * move it into the committing list. Of course, if the CIL is clean at > - * the time of the push, it won't have pushed the CIL at all, so in that > - * case we should try the push for this sequence again from the start > - * just in case. > + * When the push occurs, it will empty the CIL and atomically increment > + * the currect sequence past the push sequence and move it into the > + * committing list. Of course, if the CIL is clean at the time of the > + * push, it won't have pushed the CIL at all, so in that case we should > + * try the push for this sequence again from the start just in case. > */ > - > if (sequence == cil->xc_current_sequence && > !list_empty(&cil->xc_cil)) { > spin_unlock(&cil->xc_push_lock); > @@ -849,6 +872,17 @@ restart: > > spin_unlock(&cil->xc_push_lock); > return commit_lsn; > + > + /* > + * We detected a shutdown in progress. We need to trigger the log force > + * to pass through it's iclog state machine error handling, even though > + * we are already in a shutdown state. Hence we can't return > + * NULLCOMMITLSN here as that has special meaning to log forces (i.e. > + * LSN is already stable), so we return a zero LSN instead. > + */ > +out_shutdown: > + spin_unlock(&cil->xc_push_lock); > + return 0; > } > > /* > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 29 09:05:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9056E29DF8 for ; Tue, 29 Apr 2014 09:05:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 81B88304066 for ; Tue, 29 Apr 2014 07:05:21 -0700 (PDT) X-ASG-Debug-ID: 1398780316-04cb6c7292142340001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cP3iSZPXN71BvJoy for ; Tue, 29 Apr 2014 07:05:17 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3TE5EYt021967 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 29 Apr 2014 10:05:15 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3TE5EcA026466; Tue, 29 Apr 2014 10:05:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5835112573F; Tue, 29 Apr 2014 10:05:13 -0400 (EDT) Date: Tue, 29 Apr 2014 10:05:13 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140429140512.GB59046@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-4-git-send-email-david@fromorbit.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: 1398780316 X-Barracuda-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, Apr 29, 2014 at 07:04:53AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Prefetch currently does not do CRC validation when the IO completes > due to the optimisation it performs and the fact that it does not > know what the type of metadata into the buffer is supposed to be. > Hence, mark all prefetched buffers as "suspect" so that when the > end user tries to read it with a supplied validation function the > validation is run even though the buffer was already in the cache. > > Signed-off-by: Dave Chinner > --- Looks good to me. Thanks for the comments. Reviewed-by: Brian Foster > include/libxfs.h | 2 ++ > libxfs/rdwr.c | 58 ++++++++++++++++++++++++++++++++++++++++--------------- > repair/prefetch.c | 7 ++++--- > 3 files changed, 48 insertions(+), 19 deletions(-) > > diff --git a/include/libxfs.h b/include/libxfs.h > index 6b1e276..9c10957 100644 > --- a/include/libxfs.h > +++ b/include/libxfs.h > @@ -436,6 +436,8 @@ extern void libxfs_putbuf (xfs_buf_t *); > > #endif > > +extern void libxfs_readbuf_verify(struct xfs_buf *bp, > + const struct xfs_buf_ops *ops); > extern xfs_buf_t *libxfs_getsb(xfs_mount_t *, int); > extern void libxfs_bcache_purge(void); > extern void libxfs_bcache_flush(void); > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > index 7208a2f..ea4bdfd 100644 > --- a/libxfs/rdwr.c > +++ b/libxfs/rdwr.c > @@ -708,6 +708,17 @@ libxfs_readbufr(struct xfs_buftarg *btp, xfs_daddr_t blkno, xfs_buf_t *bp, > return error; > } > > +void > +libxfs_readbuf_verify(struct xfs_buf *bp, const struct xfs_buf_ops *ops) > +{ > + if (!ops) > + return; > + bp->b_ops = ops; > + bp->b_ops->verify_read(bp); > + bp->b_flags &= ~LIBXFS_B_UNCHECKED; > +} > + > + > xfs_buf_t * > libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, > const struct xfs_buf_ops *ops) > @@ -718,23 +729,38 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, > bp = libxfs_getbuf(btp, blkno, len); > if (!bp) > return NULL; > - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) > + > + /* > + * if the buffer was prefetched, it is likely that it was not validated. > + * Hence if we are supplied an ops function and the buffer is marked as > + * unchecked, we need to validate it now. > + * > + * We do this verification even if the buffer is dirty - the > + * verification is almost certainly going to fail the CRC check in this > + * case as a dirty buffer has not had the CRC recalculated. However, we > + * should not be dirtying unchecked buffers and therefore failing it > + * here because it's dirty and unchecked indicates we've screwed up > + * somewhere else. > + */ > + bp->b_error = 0; > + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { > + if (bp->b_flags & LIBXFS_B_UNCHECKED) > + libxfs_readbuf_verify(bp, ops); > 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. > + * Set the ops on a cache miss (i.e. first physical read) as the > + * verifier may change the ops to match the type of 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_error = 0; > - bp->b_ops = ops; > error = libxfs_readbufr(btp, blkno, bp, len, flags); > if (error) > bp->b_error = error; > - else if (bp->b_ops) > - bp->b_ops->verify_read(bp); > + else > + libxfs_readbuf_verify(bp, ops); > return bp; > } > > @@ -786,16 +812,15 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, > return NULL; > > bp->b_error = 0; > - bp->b_ops = ops; > - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) > + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) { > + if (bp->b_flags & LIBXFS_B_UNCHECKED) > + libxfs_readbuf_verify(bp, ops); > return bp; > - > - error = libxfs_readbufr_map(btp, bp, flags); > - if (!error) { > - bp->b_flags |= LIBXFS_B_UPTODATE; > - if (bp->b_ops) > - bp->b_ops->verify_read(bp); > } > + error = libxfs_readbufr_map(btp, bp, flags); > + if (!error) > + libxfs_readbuf_verify(bp, ops); > + > #ifdef IO_DEBUG > printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", > pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, > @@ -888,7 +913,8 @@ libxfs_writebufr(xfs_buf_t *bp) > #endif > if (!error) { > bp->b_flags |= LIBXFS_B_UPTODATE; > - bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT); > + bp->b_flags &= ~(LIBXFS_B_DIRTY | LIBXFS_B_EXIT | > + LIBXFS_B_UNCHECKED); > } > return error; > } > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 6d6d344..65fedf5 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -387,8 +387,7 @@ pf_read_inode_dirs( > int hasdir = 0; > int isadir; > > - bp->b_ops = &xfs_inode_buf_ops; > - bp->b_ops->verify_read(bp); > + libxfs_readbuf_verify(bp, &xfs_inode_buf_ops); > if (bp->b_error) > return; > > @@ -460,6 +459,7 @@ pf_read_discontig( > > pthread_mutex_unlock(&args->lock); > libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); > + bp->b_flags |= LIBXFS_B_UNCHECKED; > libxfs_putbuf(bp); > pthread_mutex_lock(&args->lock); > } > @@ -582,7 +582,8 @@ pf_batch_read( > if (len < size) > break; > memcpy(XFS_BUF_PTR(bplist[i]), pbuf, size); > - bplist[i]->b_flags |= LIBXFS_B_UPTODATE; > + bplist[i]->b_flags |= (LIBXFS_B_UPTODATE | > + LIBXFS_B_UNCHECKED); > len -= size; > if (B_IS_INODE(XFS_BUF_PRIORITY(bplist[i]))) > pf_read_inode_dirs(args, bplist[i]); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 29 09:06:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A3D7029DF8 for ; Tue, 29 Apr 2014 09:06:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 937F28F8035 for ; Tue, 29 Apr 2014 07:06:23 -0700 (PDT) X-ASG-Debug-ID: 1398780382-04cbb03cc5141590001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ehnWjD9T43QBiIxV for ; Tue, 29 Apr 2014 07:06:22 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s3TE6LtF006201 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 29 Apr 2014 10:06:21 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3TE6K3s002591; Tue, 29 Apr 2014 10:06:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BD3E512573F; Tue, 29 Apr 2014 10:06:19 -0400 (EDT) Date: Tue, 29 Apr 2014 10:06:19 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140429140619.GC59046@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1398780382 X-Barracuda-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 29, 2014 at 07:04:55AM +1000, Dave Chinner wrote: > From: Dave Chinner > > repair doesn't currently detect verifier errors in AG header > blocks - apart from the primary superblock they are not detected. > They are, fortunately, corrected in the important cases (AGF, AGI > and AGFL) because these structures are rebuilt in phase 5, but if > you run xfs_repair in checking mode it won't report them as bad. > > Signed-off-by: Dave Chinner > --- > repair/scan.c | 83 +++++++++++++++++++++++++++++++++++------------------------ > 1 file changed, 49 insertions(+), 34 deletions(-) > > diff --git a/repair/scan.c b/repair/scan.c > index 1744c32..dec84ed 100644 > --- a/repair/scan.c > +++ b/repair/scan.c > @@ -1207,39 +1207,38 @@ scan_ag( > void *arg) > { > struct aghdr_cnts *agcnts = arg; > - xfs_agf_t *agf; > - xfs_buf_t *agfbuf; > + struct xfs_agf *agf; > + struct xfs_buf *agfbuf = NULL; > int agf_dirty = 0; > - xfs_agi_t *agi; > - xfs_buf_t *agibuf; > + struct xfs_agi *agi; > + struct xfs_buf *agibuf = NULL; > int agi_dirty = 0; > - xfs_sb_t *sb; > - xfs_buf_t *sbbuf; > + struct xfs_sb *sb = NULL; > + struct xfs_buf *sbbuf = NULL; > int sb_dirty = 0; > int status; > + char *objname = NULL; > > - sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), > - 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; > - } > - sb = (xfs_sb_t *)calloc(BBSIZE, 1); > + sb = (struct xfs_sb *)calloc(BBSIZE, 1); > if (!sb) { > do_error(_("can't allocate memory for superblock\n")); > - libxfs_putbuf(sbbuf); > return; > } > + > + sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), > + XFS_FSS_TO_BB(mp, 1), 0, &xfs_sb_buf_ops); > + if (!sbbuf) { > + objname = _("root superblock"); > + goto out_free_sb; > + } > libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); > > agfbuf = libxfs_readbuf(mp->m_dev, > XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), > 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); > - free(sb); > - return; > + objname = _("agf block"); > + goto out_free_sbbuf; > } > agf = XFS_BUF_TO_AGF(agfbuf); > > @@ -1247,11 +1246,8 @@ scan_ag( > XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), > 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); > - libxfs_putbuf(sbbuf); > - free(sb); > - return; > + objname = _("agi block"); > + goto out_free_agfbuf; > } > agi = XFS_BUF_TO_AGI(agibuf); > > @@ -1295,15 +1291,9 @@ scan_ag( > } > > if (status && no_modify) { > - libxfs_putbuf(agibuf); > - libxfs_putbuf(agfbuf); > - libxfs_putbuf(sbbuf); > - free(sb); > - > do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), > agno); > - > - return; > + goto out_free_agibuf; > } > > scan_freelist(agf, agcnts); > @@ -1312,21 +1302,34 @@ scan_ag( > validate_agi(agi, agno, agcnts); > > ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); > + ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); > + ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); > + > + /* > + * Only pay attention to CRC/verifier errors if we can correct them. > + * While there, ensure that we corrected a corruption error if the > + * verifier detected one. > + */ > + if (!no_modify) { > + ASSERT(agi_dirty || agibuf->b_error != EFSCORRUPTED); > + ASSERT(agf_dirty || agfbuf->b_error != EFSCORRUPTED); > + ASSERT(sb_dirty || sbbuf->b_error != EFSCORRUPTED); > + > + agi_dirty += (agibuf->b_error == EFSBADCRC); > + agf_dirty += (agfbuf->b_error == EFSBADCRC); > + sb_dirty += (sbbuf->b_error == EFSBADCRC); > + } So we'll detect and correct the CRC error in normal mode, but no longer issue the preceding warnings ("would reset bad ...") for CRC errors in no_modify mode. Is that desired? I ask because it looks like a departure from previous versions. Otherwise, the code looks fine to me. Brian > > if (agi_dirty && !no_modify) > libxfs_writebuf(agibuf, 0); > else > libxfs_putbuf(agibuf); > > - ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); > - > if (agf_dirty && !no_modify) > libxfs_writebuf(agfbuf, 0); > else > libxfs_putbuf(agfbuf); > > - ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); > - > if (sb_dirty && !no_modify) { > if (agno == 0) > memcpy(&mp->m_sb, sb, sizeof(xfs_sb_t)); > @@ -1341,6 +1344,18 @@ scan_ag( > print_inode_list(i); > #endif > return; > + > +out_free_agibuf: > + libxfs_putbuf(agibuf); > +out_free_agfbuf: > + libxfs_putbuf(agfbuf); > +out_free_sbbuf: > + libxfs_putbuf(sbbuf); > +out_free_sb: > + free(sb); > + > + if (objname) > + do_error(_("can't get %s for ag %d\n"), objname, agno); > } > > #define SCAN_THREADS 32 > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 29 09:06:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 441AE29E02 for ; Tue, 29 Apr 2014 09:06:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1618B8F8035 for ; Tue, 29 Apr 2014 07:06:31 -0700 (PDT) X-ASG-Debug-ID: 1398780390-04bdf02b8d144b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WwoD7CgyTaqCFt0K for ; Tue, 29 Apr 2014 07:06:30 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3TE6Tux005874 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 29 Apr 2014 10:06:29 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3TE6S1r030288; Tue, 29 Apr 2014 10:06:29 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F10D112573F; Tue, 29 Apr 2014 10:06:27 -0400 (EDT) Date: Tue, 29 Apr 2014 10:06:27 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] repair: handle remote symlink CRC errors Message-ID: <20140429140627.GD59046@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 8/9] repair: handle remote symlink CRC errors References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1398780390 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Apr 29, 2014 at 07:04:58AM +1000, Dave Chinner wrote: > From: Dave Chinner > > We can't really repair broken symlink buffer contents, but we can at > least warn about it and correct the CRC error so the symlink is > again readable. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > repair/dinode.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/repair/dinode.c b/repair/dinode.c > index b086bec..8891e84 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -1254,6 +1254,7 @@ process_symlink_remote( > while (pathlen > 0) { > int blk_cnt = 1; > int byte_cnt; > + int badcrc = 0; > > fsbno = blkmap_get(blkmap, i); > if (fsbno == NULLDFSBNO) { > @@ -1284,6 +1285,12 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), > lino, i, fsbno); > return 1; > } > + if (bp->b_error == EFSBADCRC) { > + do_warn( > +_("Bad symlink buffer CRC, block %" PRIu64 ", inode %" PRIu64 ".\n" > + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); > + badcrc = 1; > + } > > byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); > byte_cnt = MIN(pathlen, byte_cnt); > @@ -1307,7 +1314,10 @@ _("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n") > offset += byte_cnt; > i++; > > - libxfs_putbuf(bp); > + if (badcrc && !no_modify) > + libxfs_writebuf(bp, 0); > + else > + libxfs_putbuf(bp); > } > return 0; > } > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Apr 29 09:06:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9FA5529DF8 for ; Tue, 29 Apr 2014 09:06:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D957304062 for ; Tue, 29 Apr 2014 07:06:55 -0700 (PDT) X-ASG-Debug-ID: 1398780414-04cb6c7291142520001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hBYFXbTPuuNsWptV for ; Tue, 29 Apr 2014 07:06:54 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s3TE6rbk006392 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 29 Apr 2014 10:06:53 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s3TE6qpJ003137; Tue, 29 Apr 2014 10:06:52 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CF83C12573F; Tue, 29 Apr 2014 10:06:51 -0400 (EDT) Date: Tue, 29 Apr 2014 10:06:51 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-ID: <20140429140651.GE59046@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1398780414 X-Barracuda-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, Apr 29, 2014 at 07:04:59AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Currently the attribute code will not detect and correct errors in > the attribute tree. It also fails to validate the CRCs and headers > on remote attribute blocks. Ensure that all the attribute blocks are > CRC checked and that the processing functions understand the correct > block formats for decoding. > > Signed-off-by: Dave Chinner > --- > repair/attr_repair.c | 45 +++++++++++++++++++++++++++++++++++++-------- > 1 file changed, 37 insertions(+), 8 deletions(-) > > diff --git a/repair/attr_repair.c b/repair/attr_repair.c > index ba85ac2..9b57960 100644 > --- a/repair/attr_repair.c > +++ b/repair/attr_repair.c > @@ -604,6 +604,7 @@ verify_da_path(xfs_mount_t *mp, > libxfs_putbuf(bp); > return(1); > } > + > /* > * update cursor, write out the *current* level if > * required. don't write out the descendant level > @@ -615,6 +616,8 @@ verify_da_path(xfs_mount_t *mp, > libxfs_writebuf(cursor->level[this_level].bp, 0); > else > libxfs_putbuf(cursor->level[this_level].bp); > + > + /* switch cursor to point at the new buffer we just read */ > cursor->level[this_level].bp = bp; > cursor->level[this_level].dirty = 0; > cursor->level[this_level].bno = dabno; > @@ -624,6 +627,14 @@ verify_da_path(xfs_mount_t *mp, > cursor->level[this_level].n = newnode; > #endif > entry = cursor->level[this_level].index = 0; > + > + /* > + * We want to rewrite the buffer a CRC error seeing as it Nit: ^ "on a CRC error ..." ? > + * contains what appears to be a valid node block, but only if > + * we are fixing errors. > + */ > + if (bp->b_error == EFSBADCRC && !no_modify) > + cursor->level[this_level].dirty++; > } > /* > * ditto for block numbers > @@ -974,6 +985,10 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, > xfs_dfsbno_t bno; > xfs_buf_t *bp; > int clearit = 0, i = 0, length = 0, amountdone = 0; > + int hdrsize = 0; > + > + if (xfs_sb_version_hascrc(&mp->m_sb)) > + hdrsize = sizeof(struct xfs_attr3_rmt_hdr); > > /* ASSUMPTION: valuelen is a valid number, so use it for looping */ > /* Note that valuelen is not a multiple of blocksize */ > @@ -986,16 +1001,26 @@ rmtval_get(xfs_mount_t *mp, xfs_ino_t ino, blkmap_t *blkmap, > break; > } > bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), > - XFS_FSB_TO_BB(mp, 1), 0, NULL); > + XFS_FSB_TO_BB(mp, 1), 0, > + &xfs_attr3_rmt_buf_ops); > if (!bp) { > do_warn( > _("can't read remote block for attributes of inode %" PRIu64 "\n"), ino); > clearit = 1; > break; > } > + > + if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { > + do_warn( > + _("Corrupt remote block for attributes of inode %" PRIu64 "\n"), ino); > + clearit = 1; > + break; > + } > + > ASSERT(mp->m_sb.sb_blocksize == XFS_BUF_COUNT(bp)); > - length = MIN(XFS_BUF_COUNT(bp), valuelen - amountdone); > - memmove(value, XFS_BUF_PTR(bp), length); > + > + length = MIN(XFS_BUF_COUNT(bp) - hdrsize, valuelen - amountdone); > + memmove(value, XFS_BUF_PTR(bp) + hdrsize, length); > amountdone += length; > value += length; > i++; > @@ -1143,7 +1168,6 @@ process_leaf_attr_block( > > xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); > clearit = usedbs = 0; > - *repair = 0; > firstb = mp->m_sb.sb_blocksize; > stop = xfs_attr3_leaf_hdr_size(leaf); > > @@ -1320,13 +1344,16 @@ process_leaf_attr_level(xfs_mount_t *mp, > } > > bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, dev_bno), > - XFS_FSB_TO_BB(mp, 1), 0, NULL); > + XFS_FSB_TO_BB(mp, 1), 0, > + &xfs_attr3_leaf_buf_ops); > if (!bp) { > do_warn( > _("can't read file block %u (fsbno %" PRIu64 ") for attribute fork of inode %" PRIu64 "\n"), > da_bno, dev_bno, ino); > goto error_out; > } > + if (bp->b_error == EFSBADCRC) > + repair++; > > leaf = bp->b_addr; > xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); > @@ -1382,9 +1409,9 @@ process_leaf_attr_level(xfs_mount_t *mp, > > current_hashval = greatest_hashval; > > - if (repair && !no_modify) > + if (repair && !no_modify) > libxfs_writebuf(bp, 0); > - else > + else > libxfs_putbuf(bp); > } while (da_bno != 0); > > @@ -1512,6 +1539,8 @@ process_longform_attr( > ino); > return(1); > } > + if (bp->b_error == EFSBADCRC) > + (*repair)++; > > /* verify leaf block */ > leaf = (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); > @@ -1555,7 +1584,7 @@ process_longform_attr( > 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) { > + if (*repair || repairlinks) { > *repair = 1; > libxfs_writebuf(bp, 0); > } else repairlinks incorporates a !no_modify check, but *repair does not. It's incremented unconditionally if we find a CRC error. I suspect this means we now need a !no_modify check for the writebuf/putbuf check here, as is done in the alternate path at the end of the function. Brian > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 29 13:15:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EADD929DF8 for ; Tue, 29 Apr 2014 13:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF6CF304064 for ; Tue, 29 Apr 2014 11:15:05 -0700 (PDT) X-ASG-Debug-ID: 1398795303-04cbb03cc4155880001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FtjJn9h1RoS8A4gI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Apr 2014 11:15:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfCYZ-000301-JN; Tue, 29 Apr 2014 18:15:03 +0000 Date: Tue, 29 Apr 2014 11:15:03 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated Message-ID: <20140429181503.GA9267@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/9] repair: ensure prefetched buffers have CRCs validated References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-4-git-send-email-david@fromorbit.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398795304 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 29 13:16:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0B08329DF8 for ; Tue, 29 Apr 2014 13:16:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D47C8304062 for ; Tue, 29 Apr 2014 11:16:57 -0700 (PDT) X-ASG-Debug-ID: 1398795416-04bdf02b8c15b870001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id O4uNZxBV32NI2sce (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Apr 2014 11:16:56 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfCaO-0003hG-MW; Tue, 29 Apr 2014 18:16:56 +0000 Date: Tue, 29 Apr 2014 11:16:56 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140429181656.GB9267@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-6-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398795416 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 07:04:55AM +1000, Dave Chinner wrote: > From: Dave Chinner > > repair doesn't currently detect verifier errors in AG header > blocks - apart from the primary superblock they are not detected. > They are, fortunately, corrected in the important cases (AGF, AGI > and AGFL) because these structures are rebuilt in phase 5, but if > you run xfs_repair in checking mode it won't report them as bad. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 29 13:17:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 51DE029DF8 for ; Tue, 29 Apr 2014 13:17:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 371898F8039 for ; Tue, 29 Apr 2014 11:17:34 -0700 (PDT) X-ASG-Debug-ID: 1398795453-04bdf02b8a15b970001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id f62WEhMoRvWW1tYd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Apr 2014 11:17:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfCaz-0003nR-2B; Tue, 29 Apr 2014 18:17:33 +0000 Date: Tue, 29 Apr 2014 11:17:33 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] repair: handle remote symlink CRC errors Message-ID: <20140429181733.GD9267@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 8/9] repair: handle remote symlink CRC errors References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-9-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398795453 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 07:04:58AM +1000, Dave Chinner wrote: > From: Dave Chinner > > We can't really repair broken symlink buffer contents, but we can at > least warn about it and correct the CRC error so the symlink is > again readable. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org Tue Apr 29 13:18:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D6D129DF8 for ; Tue, 29 Apr 2014 13:18:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 308588F8037 for ; Tue, 29 Apr 2014 11:18:50 -0700 (PDT) X-ASG-Debug-ID: 1398795527-04bdf02b8b15bb50001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 6S3CHatE12fbaOUm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 29 Apr 2014 11:18:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b74c7dfc30afbe8f0ad4+3901+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfCcB-00049z-Lz; Tue, 29 Apr 2014 18:18:47 +0000 Date: Tue, 29 Apr 2014 11:18:47 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-ID: <20140429181847.GE9267@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398719099-19194-10-git-send-email-david@fromorbit.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398795527 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 07:04:59AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Currently the attribute code will not detect and correct errors in > the attribute tree. It also fails to validate the CRCs and headers > on remote attribute blocks. Ensure that all the attribute blocks are > CRC checked and that the processing functions understand the correct > block formats for decoding. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From david@fromorbit.com Tue Apr 29 15:12:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A96D29DF8 for ; Tue, 29 Apr 2014 15:12:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EDA79304064 for ; Tue, 29 Apr 2014 13:12:24 -0700 (PDT) X-ASG-Debug-ID: 1398802342-04bdf02b8b1658b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id X3OqVTHhkg4pU2aI for ; Tue, 29 Apr 2014 13:12: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: AnpMAOoGYFN5LEcvPGdsb2JhbABZgwaIRKN5AQEBBZl3gSUXAwEBAQE4NYIlAQEFJxMcIxAIAw4HAwklDwUlAwcaE4hAyVQXFoU/iHoHgySBFQSZD4p4iy4r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 30 Apr 2014 05:42:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WfEO4-0008L3-KQ; Wed, 30 Apr 2014 06:12:20 +1000 Date: Wed, 30 Apr 2014 06:12:20 +1000 From: Dave Chinner To: Brian Foster Cc: Mark Tinguely , Eric Sandeen , Boris Ranto , xfs-oss Subject: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() Message-ID: <20140429201220.GC22497@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: test for shut down fs in xfs_dir_fsync() References: <535E8344.2070209@redhat.com> <20140428205420.GB18672@dastard> <535ECAA6.3050200@sgi.com> <20140428221849.GC18672@dastard> <20140429125648.GA59046@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140429125648.GA59046@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1398802342 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5367 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 08:56:49AM -0400, Brian Foster wrote: > On Tue, Apr 29, 2014 at 08:18:49AM +1000, Dave Chinner wrote: > > On Mon, Apr 28, 2014 at 04:39:50PM -0500, Mark Tinguely wrote: > > > On 04/28/14 15:54, Dave Chinner wrote: > > > >On Mon, Apr 28, 2014 at 11:35:16AM -0500, Eric Sandeen wrote: > ... > > > > xfs: don't sleep in xlog_cil_force_lsn on shutdown > > > > From: Dave Chinner > > > > Reports of a shutdown hang when fsyncing a directory have surfaced, > > such as this: > > > > [ 3663.394472] Call Trace: > > [ 3663.397199] [] schedule+0x29/0x70 > > [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > > [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > > [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > > [ 3663.435873] [] do_fsync+0x65/0xa0 > > [ 3663.441408] [] SyS_fsync+0x10/0x20 > > [ 3663.447043] [] system_call_fastpath+0x16/0x1b > > > > If we trigger a shutdown in xlog_cil_push() from xlog_write(), we > > will never wake waiters on the current push sequence number, so > > anything waiting in xlog_cil_force_lsn() for that push sequence > > number to come up will not get woken and hence stall the shutdown. > > > > Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in > > the push abort handling, in the log shutdown code when waking all > > waiters, and adding a shutdown check in the sequence completion wait > > loops to ensure they abort when a wakeup due to a shutdown occurs. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_log.c | 7 +++++-- > > fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- > > 2 files changed, 47 insertions(+), 10 deletions(-) > > > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > > index a5f8bd9..dbba2d7 100644 > > --- a/fs/xfs/xfs_log.c > > +++ b/fs/xfs/xfs_log.c > > @@ -3952,11 +3952,14 @@ xfs_log_force_umount( > > retval = xlog_state_ioerror(log); > > spin_unlock(&log->l_icloglock); > > } > > + > > /* > > - * Wake up everybody waiting on xfs_log_force. > > - * Callback all log item committed functions as if the > > + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone > > + * waiting on a CIL push that is issued as part of a log force first > > + * before running the log item committed callback functions as if the > > * log writes were completed. > > */ > > + wake_up_all(&log->l_cilp->xc_commit_wait); > > xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); > > > > Why is this necessary? It looks like xlog_state_do_callback() will hit > the xlog_cil_committed() callback with the aborted flag... I added it before adding the code into xlog_cil_committed(). Regardless, I think it's a good idea to have a specific wakeup to for waiters catch the shutdown purely from a defensive POV - if we screw up something else, we will still get a wakeup after the log is marked shutdown and not hang... > > #ifdef XFSERRORDEBUG > > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > > index 7e54553..3a68ddf 100644 > > --- a/fs/xfs/xfs_log_cil.c > > +++ b/fs/xfs/xfs_log_cil.c > > @@ -385,7 +385,15 @@ xlog_cil_committed( > > xfs_extent_busy_clear(mp, &ctx->busy_extents, > > (mp->m_flags & XFS_MOUNT_DISCARD) && !abort); > > > > + /* > > + * If we are aborting the commit, wake up anyone waiting on the > > + * committing list. If we don't, then a shutdown we can leave processes > > + * waiting in xlog_cil_force_lsn() waiting on a sequence commit that > > + * will never happen because we aborted it. > > + */ > > spin_lock(&ctx->cil->xc_push_lock); > > + if (abort) > > + wake_up_all(&cil->xc_commit_wait); > > There's a compile error here. The parameter should be '&ctx->cil->...' Forgot to refresh the patch - the tested version has this fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From resembleyuo@gmail.com Tue Apr 29 19:27:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3193829DF8 for ; Tue, 29 Apr 2014 19:27:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA28EAC008 for ; Tue, 29 Apr 2014 17:27:35 -0700 (PDT) X-ASG-Debug-ID: 1398817654-04cbb03cc416fef0001-NocioJ Received: from mail-ve0-f195.google.com (mail-ve0-f195.google.com [209.85.128.195]) by cuda.sgi.com with ESMTP id Sc28TXeog5Xtfi91 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 29 Apr 2014 17:27:34 -0700 (PDT) X-Barracuda-Envelope-From: resembleyuo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.195 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.195] Received: by mail-ve0-f195.google.com with SMTP id jw12so54237veb.10 for ; Tue, 29 Apr 2014 17:27:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.195] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.195] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=AKuQ7wU5hphnuVFMMYcT5ag/a0zFkSxyqjq/ZOf5Wt4=; b=R2jR7jCBYg24zyw8HPZwu9M73W2wLwGGi6fqwFPylRG2YeVpFbxxGeAsSwQLKJ0R4o qEW/dP6+09TGievhSuwej3+qe6EdXpdIgHpGfBQ/ZbOOw5XPc7miGhvELrbB56LfitaC NOYM35f787vDXeYpTduVqUgioIjOIlSvof2fdKSuevBn7LyNgrvt3kXWEqHDe0tbuRp/ 5qs/K0+vtD8U8fEuhW4iMsZHAoYQNRb8rPcByA9BGugJ5txC9VtUfYBOG2Viaty8BCGV RW6hBY9Djq2kIhPmcXuTQZBlbsPQrFzXlXHLcffB3bOQ9xYn8wd0Arh+nQtGBBwaZH76 +x3w== MIME-Version: 1.0 X-Received: by 10.52.37.196 with SMTP id a4mr648969vdk.33.1398817653576; Tue, 29 Apr 2014 17:27:33 -0700 (PDT) Received: by 10.220.184.6 with HTTP; Tue, 29 Apr 2014 17:27:31 -0700 (PDT) Date: Wed, 30 Apr 2014 08:27:31 +0800 Message-ID: Subject: color box, display box, corrugated box, color card, blister card, color sleeve, hang tag, label From: Jinghao Printing - CHINA X-ASG-Orig-Subj: color box, display box, corrugated box, color card, blister card, color sleeve, hang tag, label To: undisclosed-recipients:; Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ve0-f195.google.com[209.85.128.195] X-Barracuda-Start-Time: 1398817654 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5375 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, this is David Wu from Shanghai, China. We are a printing company, we can print color box, corrugated box, label, hang tag etc. Please let me know if you need these. I will send you the website then. Best regards, David Wu From david@fromorbit.com Tue Apr 29 22:22:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B53429DF8 for ; Tue, 29 Apr 2014 22:22:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D5887304062 for ; Tue, 29 Apr 2014 20:22:17 -0700 (PDT) X-ASG-Debug-ID: 1398828131-04bdf02b8b17e990001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id SiFvp6i3jt4872Ln for ; Tue, 29 Apr 2014 20:22:12 -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: AiJRAK9rYFN5LEcvPGdsb2JhbABZgwZPgm2oRQoBAQEBAQWUF4VggSYXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hADsoQFxaFP4Z/gXYFB4MkgRUEmQ+KeYsuKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Apr 2014 12:52:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WfL61-0000r4-61; Wed, 30 Apr 2014 13:22:09 +1000 Date: Wed, 30 Apr 2014 13:22:09 +1000 From: Dave Chinner To: Bob Mastors Cc: xfs@oss.sgi.com Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error Message-ID: <20140430032209.GA22353@dastard> X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error References: <20140428234558.GD18672@dastard> <20140429010121.GE18672@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398828131 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5379 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 03:47:15PM -0600, Bob Mastors wrote: > On Mon, Apr 28, 2014 at 7:01 PM, Dave Chinner wrote: > > > On Mon, Apr 28, 2014 at 05:51:31PM -0600, Bob Mastors wrote: > > > Log output attached. > > > The xfs filesystem being mounted and unmounted is the only xfs filesystem > > > on the system. > > > Bob > > > > > > > > > On Mon, Apr 28, 2014 at 5:45 PM, Dave Chinner > > wrote: > > > > > > > On Mon, Apr 28, 2014 at 04:29:02PM -0600, Bob Mastors wrote: > > > > > Greetings, > > > > > > > > > > I have an xfs umount hang caused by forcing the block device to > > return > > > > > i/o errors while copying files to the filesystem. > > > > > Detailed steps to reproduce the problem on virtualbox are below. > > > > > > > > > > The linux version is a recent pull and reports as 3.15.0-rc3. > > > > > > > > > > [ 2040.248096] INFO: task umount:10303 blocked for more than 120 > > seconds. > > > > > [ 2040.323947] Not tainted 3.15.0-rc3 #4 > > > > > [ 2040.343423] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > > > > disables > > > > > this message. > > > > > [ 2040.352665] umount D ffffffff8180fe40 0 10303 8691 > > > > > 0x00000000 > > > > > [ 2040.404918] ffff88001e33dd58 0000000000000086 ffff88001e33dd48 > > > > > ffffffff81080f82 > > > > > [ 2040.489901] ffff88001b311900 0000000000013180 ffff88001e33dfd8 > > > > > 0000000000013180 > > > > > [ 2040.534772] ffff88003daa3200 ffff88001b311900 ffff88002421aec0 > > > > > ffff88002421ae80 > > > > > [ 2040.587450] Call Trace: > > > > > [ 2040.592176] [] ? try_to_wake_up+0x232/0x2b0 > > > > > [ 2040.620212] [] schedule+0x29/0x70 > > > > > [ 2040.627685] [] xfs_ail_push_all_sync+0x96/0xd0 > > > > [xfs] > > > > > [ 2040.632236] [] ? __wake_up_sync+0x20/0x20 > > > > > [ 2040.659105] [] xfs_unmountfs+0x63/0x160 [xfs] > > > > > [ 2040.691774] [] ? kmem_free+0x35/0x40 [xfs] > > > > > [ 2040.698610] [] xfs_fs_put_super+0x25/0x60 [xfs] > > > > > [ 2040.706838] [] > > generic_shutdown_super+0x7e/0x100 > > > > > [ 2040.723958] [] kill_block_super+0x30/0x80 > > > > > [ 2040.734963] [] > > deactivate_locked_super+0x4d/0x80 > > > > > [ 2040.745485] [] deactivate_super+0x4e/0x70 > > > > > [ 2040.751274] [] mntput_no_expire+0xd2/0x160 > > > > > [ 2040.755894] [] SyS_umount+0xaf/0x3b0 > > > > > [ 2040.761032] [] system_call_fastpath+0x16/0x1b > > > > > [ .060058] XFS (sdb): xfs_log_force: error 5 returned. > > > > > [ 268059] XFS (sdb): xfs_log_force: error 5 returned. > > > > > > > > > > I took a look at xfs_ail_push_all_sync and it is pretty easy to see > > > > > the hang. But it is not obvious to me how to fix it. > > > > > Any ideas would be appreciated. > > > > > > > > > > I am available to run additional tests or capture more logging > > > > > or whatever if that would help. > > > > > > > > What's the entire log output from the first shutdown message? > > > > So what is the AIL stuck on? Can you trace the xfs_ail* trace points > > when it is in shutdown like this and post the output of the report? > > > > > # tracer: function > # > # entries-in-buffer/entries-written: 32/32 #P:4 > # > # _-----=> irqs-off > # / _----=> need-resched > # | / _---=> hardirq/softirq > # || / _--=> preempt-depth > # ||| / delay > # TASK-PID CPU# |||| TIMESTAMP FUNCTION > # | | | |||| | | > umount-2995 [003] .... 1125.524090: xfs_unmountfs <-xfs_fs_put_super > umount-2995 [003] .... 1125.524099: xfs_ail_push_all_sync <-xfs_unmountfs > umount-2995 [003] .... 1125.527498: xfs_ail_push_all_sync <-xfs_log_quiesce > kswapd0-43 [002] .... 1148.078330: xfs_ail_push_all <-xfs_reclaim_inodes_nr > kswapd0-43 [002] .... 1148.078332: xfs_ail_push <-xfs_ail_push_all > xfsaild/sdb-3005 [002] .... 1148.128311: xfs_ail_min_lsn <-xfsaild > kswapd0-43 [001] .... 1149.971684: xfs_ail_push_all <-xfs_reclaim_inodes_nr > kswapd0-43 [001] .... 1149.971695: xfs_ail_push <-xfs_ail_push_all > xfsaild/sdb-3005 [003] .... 1150.023104: xfs_ail_min_lsn <-xfsaild > umount-3013 [000] .N.. 1153.035350: xfs_unmountfs <-xfs_fs_put_super > umount-3013 [000] .... 1153.093488: xfs_ail_push_all_sync <-xfs_unmountfs > umount-3013 [000] .... 1153.122459: xfs_ail_push_all_sync <-xfs_log_quiesce > kswapd0-43 [003] .... 1186.232408: xfs_ail_push_all <-xfs_reclaim_inodes_nr > kswapd0-43 [003] .... 1186.232411: xfs_ail_push <-xfs_ail_push_all > xfsaild/sdb-3035 [001] .... 1186.288258: xfs_ail_min_lsn <-xfsaild > umount-3043 [001] .... 1188.653981: xfs_unmountfs <-xfs_fs_put_super > umount-3043 [001] .... 1188.653991: xfs_ail_push_all_sync <-xfs_unmountfs > kworker/0:0-2865 [000] .... 1199.903174: xfs_ail_min_lsn <-xfs_log_need_covered > kworker/0:0-2865 [000] .... 1199.903179: xfs_ail_push_all <-xfs_log_worker > kworker/0:0-2865 [000] .... 1199.903180: xfs_ail_push <-xfs_ail_push_all > kworker/0:0-2865 [000] .... 1229.837372: xfs_ail_min_lsn <-xfs_log_need_covered > kworker/0:0-2865 [000] .... 1229.837377: xfs_ail_push_all <-xfs_log_worker > kworker/0:0-2865 [000] .... 1229.837378: xfs_ail_push <-xfs_ail_push_all > kworker/0:0-2865 [000] .... 1259.835355: xfs_ail_min_lsn <-xfs_log_need_covered > kworker/0:0-2865 [000] .... 1259.835360: xfs_ail_push_all <-xfs_log_worker > kworker/0:0-2865 [000] .... 1259.835360: xfs_ail_push <-xfs_ail_push_all > kworker/0:0-2865 [000] .... 1289.834315: xfs_ail_min_lsn <-xfs_log_need_covered > kworker/0:0-2865 [000] .... 1289.834320: xfs_ail_push_all <-xfs_log_worker > kworker/0:0-2865 [000] .... 1289.834321: xfs_ail_push <-xfs_ail_push_all > kworker/0:0-2865 [000] .... 1319.831564: xfs_ail_min_lsn <-xfs_log_need_covered > kworker/0:0-2865 [000] .... 1319.831569: xfs_ail_push_all <-xfs_log_worker > kworker/0:0-2865 [000] .... 1319.831570: xfs_ail_push <-xfs_ail_push_all > > The first two xfs_unmountfs in the above log worked fine, no hang. > The third one hung. Well, I guess I should been more specific. ftrace is pretty much useless here - we need the information taht is recorded by the events, not the timing of the events. # trace-cmd record -e xfs_ail* .... ^C .... # trace-cmd report version = 6 cpus=1 kworker/0:1H-1269 [000] 104529.901271: xfs_ail_insert: dev 253:16 lip 0x0xffff880017a4b740 old lsn 0/0 new lsn 1/20 type XFS_LI_BUF flags IN_AIL kworker/0:1H-1269 [000] 104529.901273: xfs_ail_insert: dev 253:16 lip 0x0xffff880017a4bbc8 old lsn 0/0 new lsn 1/20 type XFS_LI_BUF flags IN_AIL kworker/0:1H-1269 [000] 104529.901273: xfs_ail_insert: dev 253:16 lip 0x0xffff88001b6f8098 old lsn 0/0 new lsn 1/20 type XFS_LI_INODE flags IN_AIL kworker/0:1H-1269 [000] 104529.901274: xfs_ail_insert: dev 253:16 lip 0x0xffff880027600c80 old lsn 0/0 new lsn 1/20 type XFS_LI_EFI flags IN_AIL kworker/0:1H-1269 [000] 104529.901274: xfs_ail_insert: dev 253:16 lip 0x0xffff88001b6f81c8 old lsn 0/0 new lsn 1/20 type XFS_LI_INODE flags IN_AIL kworker/0:1H-1269 [000] 104529.901274: xfs_ail_insert: dev 253:16 lip 0x0xffff88001b6f8130 old lsn 0/0 new lsn 1/20 type XFS_LI_INODE flags IN_AIL kworker/0:1H-1269 [000] 104529.901274: xfs_ail_insert: dev 253:16 lip 0x0xffff880017a4b488 old lsn 0/0 new lsn 1/20 type XFS_LI_BUF flags IN_AIL kworker/0:1H-1269 [000] 104529.901275: xfs_ail_insert: dev 253:16 lip 0x0xffff880017a4bcb0 old lsn 0/0 new lsn 1/20 type XFS_LI_BUF flags IN_AIL kworker/0:1H-1269 [000] 104529.901275: xfs_ail_insert: dev 253:16 lip 0x0xffff880017a4b910 old lsn 0/0 new lsn 1/20 type XFS_LI_BUF flags IN_AIL kworker/0:1H-1269 [000] 104529.901275: xfs_ail_insert: dev 253:16 lip 0x0xffff88001b6f8000 old lsn 0/0 new lsn 1/20 type XFS_LI_INODE flags IN_AIL kworker/0:1H-1269 [000] 104529.901277: xfs_ail_delete: dev 253:16 lip 0x0xffff880027600c80 old lsn 1/20 new lsn 1/20 type XFS_LI_EFI flags IN_AIL xfsaild/vdb-14828 [000] 104529.901338: xfs_ail_push: dev 253:16 lip 0x0xffff88001b6f8000 lsn 1/20 type XFS_LI_INODE flags IN_AIL xfsaild/vdb-14828 [000] 104529.901339: xfs_ail_push: dev 253:16 lip 0x0xffff880017a4b910 lsn 1/20 type XFS_LI_BUF flags IN_AIL xfsaild/vdb-14828 [000] 104529.901339: xfs_ail_push: dev 253:16 lip 0x0xffff880017a4bcb0 lsn 1/20 type XFS_LI_BUF flags IN_AIL xfsaild/vdb-14828 [000] 104529.901340: xfs_ail_push: dev 253:16 lip 0x0xffff880017a4b488 lsn 1/20 type XFS_LI_BUF flags IN_AIL ..... > [ 240.930278] xfsaild/sdb D ffffffff8180fe40 0 5640 2 0x00000000 > [ 240.931408] ffff88003cd5dc58 0000000000000046 ffff88003cd5dc68 ffffffff81069029 > [ 240.933116] ffff88003cdc8000 0000000000013180 ffff88003cd5dfd8 0000000000013180 > [ 240.934655] ffff88003daa1900 ffff88003cdc8000 ffff88003cd5dc28 0000000000000011 > [ 240.936328] Call Trace: > [ 240.936862] [] ? flush_work+0x139/0x1e0 > [ 240.937755] [] schedule+0x29/0x70 > [ 240.938532] [] xlog_cil_force_lsn+0x192/0x200 [xfs] > [ 240.939452] [] ? try_to_wake_up+0x2b0/0x2b0 > [ 240.940366] [] _xfs_log_force+0x6d/0x2b0 [xfs] > [ 240.941302] [] xfs_log_force+0x39/0xc0 [xfs] > [ 240.942174] [] xfsaild+0x137/0x6e0 [xfs] > [ 240.943008] [] ? xfs_trans_ail_cursor_first+0xa0/0xa0 [xfs] > [ 240.944240] [] kthread+0xc9/0xe0 > [ 240.945001] [] ? flush_kthread_worker+0xb0/0xb0 > [ 240.945884] [] ret_from_fork+0x7c/0xb0 > [ 240.946696] [] ? flush_kthread_worker+0xb0/0xb0 Try the patch here: http://oss.sgi.com/pipermail/xfs/2014-April/035870.html Needs a minor fix to compile as noted here: http://oss.sgi.com/pipermail/xfs/2014-April/035878.html Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Apr 29 22:55:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1860729DF8 for ; Tue, 29 Apr 2014 22:55:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC7258F8035 for ; Tue, 29 Apr 2014 20:55:53 -0700 (PDT) X-ASG-Debug-ID: 1398830151-04cb6c728f17aa30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NjYMkycp5oAcmGTv for ; Tue, 29 Apr 2014 20:55:51 -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: AqRVAN9zYFN5LEcvPGdsb2JhbABZgwaDPIUKo0UBAQEBAQWUF4VggSAXAwEBAQE4NYIlAQEFJxMcIxAIAw4HAwklDwUlAwcaE4hAyhsXFoU/iHoHgySBFQSZD5YnK4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Apr 2014 13:25:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WfLcZ-0000v7-UE; Wed, 30 Apr 2014 13:55:47 +1000 Date: Wed, 30 Apr 2014 13:55:47 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors Message-ID: <20140430035547.GB32204@dastard> X-ASG-Orig-Subj: Re: [PATCH 9/9] repair: detect and handle attribute tree CRC errors References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-10-git-send-email-david@fromorbit.com> <20140429140651.GE59046@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140429140651.GE59046@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398830151 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 10:06:51AM -0400, Brian Foster wrote: > On Tue, Apr 29, 2014 at 07:04:59AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Currently the attribute code will not detect and correct errors in > > the attribute tree. It also fails to validate the CRCs and headers > > on remote attribute blocks. Ensure that all the attribute blocks are > > CRC checked and that the processing functions understand the correct > > block formats for decoding. > > > > Signed-off-by: Dave Chinner > > --- > > repair/attr_repair.c | 45 +++++++++++++++++++++++++++++++++++++-------- > > 1 file changed, 37 insertions(+), 8 deletions(-) > > > > diff --git a/repair/attr_repair.c b/repair/attr_repair.c > > index ba85ac2..9b57960 100644 > > --- a/repair/attr_repair.c > > +++ b/repair/attr_repair.c > > @@ -604,6 +604,7 @@ verify_da_path(xfs_mount_t *mp, > > libxfs_putbuf(bp); > > return(1); > > } > > + > > /* > > * update cursor, write out the *current* level if > > * required. don't write out the descendant level > > @@ -615,6 +616,8 @@ verify_da_path(xfs_mount_t *mp, > > libxfs_writebuf(cursor->level[this_level].bp, 0); > > else > > libxfs_putbuf(cursor->level[this_level].bp); > > + > > + /* switch cursor to point at the new buffer we just read */ > > cursor->level[this_level].bp = bp; > > cursor->level[this_level].dirty = 0; > > cursor->level[this_level].bno = dabno; > > @@ -624,6 +627,14 @@ verify_da_path(xfs_mount_t *mp, > > cursor->level[this_level].n = newnode; > > #endif > > entry = cursor->level[this_level].index = 0; > > + > > + /* > > + * We want to rewrite the buffer a CRC error seeing as it > Nit: ^ "on a CRC error ..." ? Will fix. > > @@ -1555,7 +1584,7 @@ process_longform_attr( > > 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) { > > + if (*repair || repairlinks) { > > *repair = 1; > > libxfs_writebuf(bp, 0); > > } else > > repairlinks incorporates a !no_modify check, but *repair does not. It's > incremented unconditionally if we find a CRC error. I suspect this means > we now need a !no_modify check for the writebuf/putbuf check here, as is > done in the alternate path at the end of the function. I'll fix it. Christoph is right, we need a helper function for this. Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From benbi@server1.cbinetwhm.bi Wed Apr 30 02:16:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 805EF7F37 for ; Wed, 30 Apr 2014 02: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 1BD42AC006 for ; Wed, 30 Apr 2014 00:16:28 -0700 (PDT) X-ASG-Debug-ID: 1398842184-04cbb03cc4183840001-NocioJ Received: from server1.cbinetwhm.bi (server1.cbinetwhm.bi [196.2.13.50]) by cuda.sgi.com with ESMTP id sWP14uaOSNM8PPXK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 30 Apr 2014 00:16:26 -0700 (PDT) X-Barracuda-Envelope-From: benbi@server1.cbinetwhm.bi X-Barracuda-Apparent-Source-IP: 196.2.13.50 Received: from benbi by server1.cbinetwhm.bi with local (Exim 4.82) (envelope-from ) id 1WfOkg-0007gc-9f for xfs@oss.sgi.com; Wed, 30 Apr 2014 09:16:22 +0200 To: xfs@oss.sgi.com Subject: Attention Required X-PHP-Script: server1.cbinetwhm.bi/~benbi/mailer.php for 41.190.90.48, 41.79.226.26 X-ASG-Orig-Subj: Attention Required From: Ms.Akifa Khaled Nyuot Reply-To: akifa.khaled@gmail.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Wed, 30 Apr 2014 09:16:22 +0200 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server1.cbinetwhm.bi X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [525 536] / [47 12] X-AntiAbuse: Sender Address Domain - server1.cbinetwhm.bi X-Get-Message-Sender-Via: server1.cbinetwhm.bi: authenticated_id: benbi/only user confirmed/virtual account not confirmed X-Barracuda-Connect: server1.cbinetwhm.bi[196.2.13.50] X-Barracuda-Start-Time: 1398842186 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5384 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Have a good day! It is with a deep sense of need that I am compelled to contact you. Following the aftermath of December 17th 2013 conflict in my town of Jonglei state, south Sudan, my uncle (Mr. Hussein Maar Nyuot) the then acting governor of Jonglei State handed us (I and my two siblings) to Rev. Fr. Philips Polson, a missionary attaché with a humanitarian organization named, (GoodWill Foundation Outreach) who was at Sudan for humanitarian reason as a result of the ongoing conflict. The next few days saw us through a journey that ended where I am writing from, Accra the capital city of Ghana in the West African region. After arrival the past three months plus, we have been under the refuge of this organization, who has given us accommodation and been making all effort to settle us into the community. Within the sixth week of arrival, Rev. Fr. Polson invited me for a chat in his office and there he handed some documents over to me on which examining them, there contained some filled and signed documents and agreement for the safe keeping of valuables with a company at Amsterdam - the Netherlands, I have since then through the assistance of the Rev. Fr. Polson, spoken with my father's attorney at Amsterdsam who oversee the agreement and it has been disclosed to me that my father, Mr. Khaled Nyuot deposited in a security vault the sum of Three million, seven hundred and Fifty thousand Euros which he gave conditions before we could claim. Based on the conditions, I am making contact with you as a reliable person who will be committed to channel this money towards a profitable investment to enable I and my two siblings the best education in whichever part of the world and guarantee us the achievement of our respective goals towards a good life. My name is Akifa Khaled Nyuot, 19years of age. Write back to me for further details if you know and believe that you understand the predicament we have gone through and with a good intention for our well-being and future. Sincerely, Ms. Akifa Khaled Nyuot akifa.khaled@gmail.com +233 240523175 or contact me through Rev. Polson helpline@gwfo.org From namjae.jeon@samsung.com Wed Apr 30 05:11:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B590D7F37 for ; Wed, 30 Apr 2014 05:11:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B12B8F8033 for ; Wed, 30 Apr 2014 03:11:36 -0700 (PDT) X-ASG-Debug-ID: 1398852693-04cb6c729018db50001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id A2aFXN3T2FMEpQtD (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 30 Apr 2014 03:11:35 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N4U0004C9N8GG20@mailout2.samsung.com> for xfs@oss.sgi.com; Wed, 30 Apr 2014 19:11:32 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id CC.DC.11496.45CC0635; Wed, 30 Apr 2014 19:11:32 +0900 (KST) X-AuditID: cbfee691-b7f3e6d000002ce8-ad-5360cc54b23c Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id D7.F0.27725.45CC0635; Wed, 30 Apr 2014 19:11:32 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N4U003XH9N8GP20@mmp1.samsung.com>; Wed, 30 Apr 2014 19:11:32 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, Ashish Sangwan Subject: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Date: Wed, 30 Apr 2014 19:11:32 +0900 X-ASG-Orig-Subj: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Message-id: <004401cf645c$8f874710$ae95d530$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9kXGwbfKXrrR/LS5WP9gsPC4DCVQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrCIsWRmVeSWpSXmKPExsWyRsSkRDfkTEKwwZyDxhZLJ15itthy7B6j xZ69J1ksFvXdYnRg8Ti1SMJj9YWtjB59W1YxenzeJBfAEsVlk5Kak1mWWqRvl8CVcWDPPfaC yewVU//NZmlgvMXaxcjJISFgIvHiyGsWCFtM4sK99WxdjFwcQgJLGSV6/k1hgyn6cmsLK0Ri EaPErU0LGCGcv4wS3dvPA2U4ONgEtCX+bBEFaRARUJOYNGkHM0iYWSBG4kODJUhYWCBeYvfD PkYQm0VAVWL9+jNgi3kFLCV61q9jhLAFJX5MvgcWZxbQkli/8zgThC0vsXnNW2aIexQkdpx9 zQixSk9i/dVXUDUiEvtevAM7TUJgE7vE4om9zBDLBCS+TT7EAnKPhICsxKYDUHMkJQ6uuMEy gVFsFpLVs5CsnoVk9SwkKxYwsqxiFE0tSC4oTkovMtUrTswtLs1L10vOz93ECIyx0/+eTdzB eP+A9SHGZKD1E5mlRJPzgTGaVxJvaGxmZGFqYmpsZG5pRpqwkjhv+qOkICGB9MSS1OzU1ILU ovii0pzU4kOMTBycUg2MvDd9GitOyTxy+jLhZeHfU1vsa6bPi1MT07KeUh+pOoPLhrOllXGh h1FVVZH4ro8btnZPNfgwP2+JCntci9tl+9nzNP9PrQngntT2/8xcl5N7je2utfUcteg/0vbr jPaeq0LCOdlfr79b+ds/cN3xOZPP9Kr/rd1a2dz7amfHV8nbrzUWmultV2Ipzkg01GIuKk4E AGF8oNzHAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprIKsWRmVeSWpSXmKPExsVy+t9jAd2QMwnBBl8W61gsnXiJ2WLLsXuM Fnv2nmSxWNR3i9GBxePUIgmP1Re2Mnr0bVnF6PF5k1wAS1QDo01GamJKapFCal5yfkpmXrqt kndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0EolhbLEnFKgUEBicbGSvh2mCaEhbroW MI0Rur4hQXA9RgZoIGENY8aBPffYCyazV0z9N5ulgfEWaxcjJ4eEgInEl1tboGwxiQv31rN1 MXJxCAksYpS4tWkBI4Tzl1Gie/t5oCoODjYBbYk/W0RBGkQE1CQmTdrBDBJmFoiR+NBgCRIW FoiX2P2wjxHEZhFQlVi//gwLiM0rYCnRs34dI4QtKPFj8j2wOLOAlsT6nceZIGx5ic1r3jJD 3KMgsePsa0aIVXoS66++gqoRkdj34h3jBEaBWUhGzUIyahaSUbOQtCxgZFnFKJpakFxQnJSe a6hXnJhbXJqXrpecn7uJERzBz6R2MK5ssDjEKMDBqMTDK7A1PliINbGsuDL3EKMEB7OSCO+c ownBQrwpiZVVqUX58UWlOanFhxiTgT6dyCwlmpwPTC55JfGGxiZmRpZG5oYWRsbmpAkrifMe aLUOFBJITyxJzU5NLUgtgtnCxMEp1cDINM/FODNrjXiZ0vMQFbm4Rc6PX2x68KpgjvW8npcP Tpwsk+k4p228svBBEePrD3NPWufFOpw8J7d73Z/EHa78hbNnv+58on/jdl687KQPZ4Lqzrfc zrJ94+jv2N6e8jpMxSr/wtbVb3iSNKy2+LMbPzKzVT18w6Ne5cjzhYndu7MKTzNsLW9RYinO SDTUYi4qTgQAbQGi4iQDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1398852694 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 There is if condition to be block aligned for off and len of Collapse range. But off and len for all fallocate opearion can be aligned by incorrect if condition check. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- ltp/fsstress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 29fc250..ff9ed12 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -2230,7 +2230,7 @@ do_fallocate(int opno, long r, int mode) * Collapse range requires off and len to be block aligned, make it * more likely to be the case. */ - if (FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { + if (mode & FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); } -- 1.7.11-rc0 From lczerner@redhat.com Wed Apr 30 05:26:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C4BF29DF8 for ; Wed, 30 Apr 2014 05:26:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3B8CAC009 for ; Wed, 30 Apr 2014 03:26:19 -0700 (PDT) X-ASG-Debug-ID: 1398853578-04cb6c728f18e890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ggB8A4Orw3EKptpo for ; Wed, 30 Apr 2014 03:26:18 -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 s3UAQGC0028110 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 30 Apr 2014 06:26:16 -0400 Received: from dhcp-1-131.brq.redhat.com (dhcp-1-131.brq.redhat.com [10.34.1.131]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s3UAQDxU025523 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 30 Apr 2014 06:26:15 -0400 Date: Wed, 30 Apr 2014 12:26:13 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Namjae Jeon cc: Dave Chinner , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, Ashish Sangwan Subject: Re: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode In-Reply-To: <004401cf645c$8f874710$ae95d530$@samsung.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Message-ID: References: <004401cf645c$8f874710$ae95d530$@samsung.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398853578 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 30 Apr 2014, Namjae Jeon wrote: > Date: Wed, 30 Apr 2014 19:11:32 +0900 > From: Namjae Jeon > To: Dave Chinner > Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, > Ashish Sangwan > Subject: [PATCH] xfstests: fsstress: fix incorrect if condition check for > collapse range mode > > There is if condition to be block aligned for off and len of Collapse range. > But off and len for all fallocate opearion can be aligned by incorrect > if condition check. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > --- > ltp/fsstress.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/ltp/fsstress.c b/ltp/fsstress.c > index 29fc250..ff9ed12 100644 > --- a/ltp/fsstress.c > +++ b/ltp/fsstress.c > @@ -2230,7 +2230,7 @@ do_fallocate(int opno, long r, int mode) > * Collapse range requires off and len to be block aligned, make it > * more likely to be the case. > */ > - if (FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { > + if (mode & FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { > off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); > len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); > } oops :). Thanks for fixing it. Even though it would be better to use parentheses + if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { Reviewed-by: Lukas Czerner From namjae.jeon@samsung.com Wed Apr 30 05:33:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F022E29DF8 for ; Wed, 30 Apr 2014 05:33:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C522F30406A for ; Wed, 30 Apr 2014 03:33:32 -0700 (PDT) X-ASG-Debug-ID: 1398854008-04bdf02b8b194580001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id 4I8lKL91DqVRv0b1 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 30 Apr 2014 03:33:31 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N4U00D31ANFQU80@mailout1.samsung.com> for xfs@oss.sgi.com; Wed, 30 Apr 2014 19:33:15 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id A8.A9.11120.B61D0635; Wed, 30 Apr 2014 19:33:15 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-92-5360d16b51c2 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 51.31.25708.A61D0635; Wed, 30 Apr 2014 19:33:15 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N4U0075VANENBA0@mmp2.samsung.com>; Wed, 30 Apr 2014 19:33:14 +0900 (KST) From: Namjae Jeon To: =?iso-8859-2?Q?'Luk=E1=B9_Czerner'?= Cc: 'Dave Chinner' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, 'Ashish Sangwan' References: <004401cf645c$8f874710$ae95d530$@samsung.com> In-reply-to: Subject: RE: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Date: Wed, 30 Apr 2014 19:33:14 +0900 X-ASG-Orig-Subj: RE: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Message-id: <004501cf645f$97d5b6b0$c7812410$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=iso-8859-2 Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQFL8FRQV/1ByKD/Hmc7SCYcTilluQFQgstanCZaJkA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrEIsWRmVeSWpSXmKPExsWyRsSkSDf7YkKwwcrjPBZLJ15itthy7B6j xbIHm1ks9uw9yWKxqO8WowOrx6lFEh6rL2xl9Hi/7yqbR9+WVYwenzfJBbBGcdmkpOZklqUW 6dslcGWs+ZBb8Ien4ss2+QbGiVxdjJwcEgImElMXX2aHsMUkLtxbz9bFyMUhJLCUUeLRh9ts MEWvNzxlhUhMZ5R4frsfyvnLKDHlcB9LFyMHB5uAtsSfLaIgDSICdhJz57QwgdQwC7QwShxs 3Aa2QkigTOL1hwVg9ZwC7hKv55qDmMICyRKHPvqAVLAIqEqsePsZbC+vgKXEmt5/TBC2oMSP yffAOpkFdCS+TooACTMLyEtsXvOWGeJMBYkdZ18zQlxgJbH75R4miBoRiX0v3jGCXCMhcI9d 4uPhFewQuwQkvk0+BDZTQkBWYtMBqDmSEgdX3GCZwCgxC8nmWQibZyHZPAvJhgWMLKsYRVML kguKk9KLjPWKE3OLS/PS9ZLzczcxAuPz9L9n/TsY7x6wPsSYDLR9IrOUaHI+ML7zSuINjc2M LExNTI2NzC3NSBNWEue9/zApSEggPbEkNTs1tSC1KL6oNCe1+BAjEwenVAPjgdiowMdtS8wu ul89eWWfz6TGb5arPaPyOtYr/6xKuef99Gnr23/CjWvfbOR9tJCV59qvt8y2klLuG2Rj1ecF +CzdVVtUcD1TOF72lblNwh+VZerpwaIrq2btDb8Wvfi/p8vcZo1nMdHTDf6ukL2U2i/I0T57 +gRt1Rr/1M3PJh9d/7YlYbe7EktxRqKhFnNRcSIAoLBmVeUCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrPKsWRmVeSWpSXmKPExsVy+t9jQd3siwnBBrd/sFgsnXiJ2WLLsXuM FssebGax2LP3JIvFor5bjA6sHqcWSXisvrCV0eP9vqtsHn1bVjF6fN4kF8Aa1cBok5GamJJa pJCal5yfkpmXbqvkHRzvHG9qZmCoa2hpYa6kkJeYm2qr5OIToOuWmQO0XEmhLDGnFCgUkFhc rKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOYseZDbsEfnoov2+QbGCdydTFyckgImEi83vCU FcIWk7hwbz1bFyMXh5DAdEaJ57f7WSGcv4wSUw73sXQxcnCwCWhL/NkiCtIgImAnMXdOCxNI DbNAC6PEwcZt7CAJIYEyidcfFoDVcwq4S7yeaw5iCgskSxz66ANSwSKgKrHi7Wc2EJtXwFJi Te8/JghbUOLH5HtgncwCOhJfJ0WAhJkF5CU2r3nLDHGmgsSOs68ZIS6wktj9cg8TRI2IxL4X 7xgnMArNQjJpFsKkWUgmzULSsYCRZRWjaGpBckFxUnqukV5xYm5xaV66XnJ+7iZGcPQ/k97B uKrB4hCjAAejEg+vwNb4YCHWxLLiytxDjBIczEoivHOOJgQL8aYkVlalFuXHF5XmpBYfYkwG +nMis5Rocj4wMeWVxBsam5gZWRqZG1oYGZuTJqwkznuw1TpQSCA9sSQ1OzW1ILUIZgsTB6dU A2PGtlX3zaQ6Ln3s8V/52/PN86JJ6997P9tw44j/WoYJMetvnVc9Ht2h9l0jIyFB89/8KVzT m3SKLZwOPc1IlwzZsqI/e8Xi2+lvVHg254Wt5A0zbG+8eGdSm9/LY7niR1yWFfwL2p6ymO90 4XrmHye0LywyeJB4aMuBtZrlD6ZlSKmsP39cbeEfJZbijERDLeai4kQAZ8CHNUIDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1398854010 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > On Wed, 30 Apr 2014, Namjae Jeon wrote: > > > Date: Wed, 30 Apr 2014 19:11:32 +0900 > > From: Namjae Jeon > > To: Dave Chinner > > Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, > > Ashish Sangwan > > Subject: [PATCH] xfstests: fsstress: fix incorrect if condition check for > > collapse range mode > > > > There is if condition to be block aligned for off and len of Collapse range. > > But off and len for all fallocate opearion can be aligned by incorrect > > if condition check. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > --- > > ltp/fsstress.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/ltp/fsstress.c b/ltp/fsstress.c > > index 29fc250..ff9ed12 100644 > > --- a/ltp/fsstress.c > > +++ b/ltp/fsstress.c > > @@ -2230,7 +2230,7 @@ do_fallocate(int opno, long r, int mode) > > * Collapse range requires off and len to be block aligned, make it > > * more likely to be the case. > > */ > > - if (FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { > > + if (mode & FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { > > off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); > > len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); > > } > > oops :). Thanks for fixing it. Even though it would be better to use > parentheses Hi Lukas. Okay, I will send v2 patch. Thanks for review! > > + if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { > > Reviewed-by: Lukas Czerner From namjae.jeon@samsung.com Wed Apr 30 05:35:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E32A229DF8 for ; Wed, 30 Apr 2014 05:35:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6F012AC006 for ; Wed, 30 Apr 2014 03:35:15 -0700 (PDT) X-ASG-Debug-ID: 1398854111-04cbb03cc718dd50001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id mpo0EFWK8wDkJcyT (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 30 Apr 2014 03:35:13 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N4U00A7FAQNAV00@mailout3.samsung.com> for xfs@oss.sgi.com; Wed, 30 Apr 2014 19:35:11 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id D9.B6.18501.FD1D0635; Wed, 30 Apr 2014 19:35:11 +0900 (KST) X-AuditID: cbfee68d-b7f4e6d000004845-e5-5360d1df44ea Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 1F.91.25708.FD1D0635; Wed, 30 Apr 2014 19:35:11 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N4U003JHAQNGP50@mmp1.samsung.com>; Wed, 30 Apr 2014 19:35:11 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Ashish Sangwan Subject: [PATCH v2] xfstests: fsstress: fix incorrect if condition check for collapse range mode Date: Wed, 30 Apr 2014 19:35:11 +0900 X-ASG-Orig-Subj: [PATCH v2] xfstests: fsstress: fix incorrect if condition check for collapse range mode Message-id: <004601cf645f$dd216de0$976449a0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=iso-8859-2 Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9kX1garIi4UQ2rSXyzysmHwZv4dg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrLIsWRmVeSWpSXmKPExsWyRsSkWPf+xYRggzdHpC2WTrzEbLHl2D1G i2UPNrNY7Nl7ksViUd8tRgdWj1OLJDxWX9jK6PF+31U2j74tqxg9Pm+SC2CN4rJJSc3JLEst 0rdL4Mp4/OUkY8Fx9orez7tYGhg72boYOTkkBEwkOl4/gbLFJC7cWw9kc3EICSxllDjSf5AF pujQmwXMEIlFjBKt6x6xQDh/GSU2vHwA5HBwsAloS/zZIgrSICKgJjFp0g6wBmaBGYwSN3+t ZwVJCAskSTTvWc4EYrMIqEo82tPLCNLLK2Ap0Xc9HiTMKyAo8WPyPbCRzAI6El8nRYCEmQXk JTavecsMcY+CxI6zrxkhVulJ9H6ezAJRIyKx78U7RpC1EgLH2CV+bznPCLFKQOLb5ENgMyUE ZCU2HYCaIylxcMUNlgmMYrOQbJ6FsHkWks2zkGxYwMiyilE0tSC5oDgpvchQrzgxt7g0L10v OT93EyMw6k7/e9a7g/H2AetDjMlA2ycyS4km5wOjNq8k3tDYzMjC1MTU2Mjc0ow0YSVx3qSH SUFCAumJJanZqakFqUXxRaU5qcWHGJk4OKWAcXqkvO/TguWOjqc9DhUfkb6TkHn/eH2A2nWm CQ9yt2U88nQ8Xz9XqOX5pUvfnhw4vFZr77n3OlXbbgYYFwbOWDLjdZ44y9f2+w16ClJnbt+Y pXyk0nTV9G/tggwv3tVsfPRhxds7n5YfzUgN9fOoPOQ8VSH52Szdw30xyQffbAl7d81RfblB UJQSS3FGoqEWc1FxIgBPkaDD0AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprFKsWRmVeSWpSXmKPExsVy+t9jAd37FxOCDa4fE7FYOvESs8WWY/cY LZY92MxisWfvSRaLRX23GB1YPU4tkvBYfWEro8f7fVfZPPq2rGL0+LxJLoA1qoHRJiM1MSW1 SCE1Lzk/JTMv3VbJOzjeOd7UzMBQ19DSwlxJIS8xN9VWycUnQNctMwdouZJCWWJOKVAoILG4 WEnfDtOE0BA3XQuYxghd35AguB4jAzSQsIYx4/GXk4wFx9krej/vYmlg7GTrYuTkkBAwkTj0 ZgEzhC0mceHeeqA4F4eQwCJGidZ1j1ggnL+MEhtePgByODjYBLQl/mwRBWkQEVCTmDRpBzNI DbPADEaJm7/Ws4IkhAWSJJr3LGcCsVkEVCUe7ellBOnlFbCU6LseDxLmFRCU+DH5HthIZgEd ia+TIkDCzALyEpvXvIW6R0Fix9nXjBCr9CR6P09mgagRkdj34h3jBEaBWUgmzUKYNAvJpFlI OhYwsqxiFE0tSC4oTkrPNdIrTswtLs1L10vOz93ECI7pZ9I7GFc1WBxiFOBgVOLhFdgaHyzE mlhWXJl7iFGCg1lJhHfO0YRgId6UxMqq1KL8+KLSnNTiQ4zJQG9OZJYSTc4Hppu8knhDYxMz I0sjc0MLI2Nz0oSVxHkPtloHCgmkJ5akZqemFqQWwWxh4uCUamAMXrS3frPk5l+tcY9NbxWe uy1bmZCfZH7j1ZTAui2WAXskJVfrh5hONf2qee5P6OuFryYVF6+Y0/AipirWcE3Aykinc2zi PysWPFqYq+cyeaePcIl4/p9vBeeYF6Xfvnfd8XNZm//GhSmqvq3bFi6pDl5YZC4i/2ryRxu7 6OztGYcOPjA6ultciaU4I9FQi7moOBEAHry9Wy0DAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1398854112 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== There is if condition to be block aligned for off and len of Collapse range. But off and len for all fallocate opearion can be aligned by incorrect if condition check. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Lukas Czerner --- ltp/fsstress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 29fc250..ff9ed12 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -2230,7 +2230,7 @@ do_fallocate(int opno, long r, int mode) * Collapse range requires off and len to be block aligned, make it * more likely to be the case. */ - if (FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { + if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); } -- 1.7.11-rc0 From namjae.jeon@samsung.com Wed Apr 30 05:43:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1A19829DF8 for ; Wed, 30 Apr 2014 05:43:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96219AC006 for ; Wed, 30 Apr 2014 03:43:50 -0700 (PDT) X-ASG-Debug-ID: 1398854626-04cbb03cc718e540001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id xwA9EpFHRGvqhaar (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 30 Apr 2014 03:43:48 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N4U00ASHB4YAV00@mailout3.samsung.com> for xfs@oss.sgi.com; Wed, 30 Apr 2014 19:43:46 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id 37.D1.09952.1E3D0635; Wed, 30 Apr 2014 19:43:46 +0900 (KST) X-AuditID: cbfee690-b7fcd6d0000026e0-46-5360d3e1194c Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id C0.93.25708.1E3D0635; Wed, 30 Apr 2014 19:43:45 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N4U008HDB4XAI90@mmp2.samsung.com>; Wed, 30 Apr 2014 19:43:45 +0900 (KST) From: Namjae Jeon To: =?iso-8859-2?Q?'Luk=E1=B9_Czerner'?= Cc: 'Dave Chinner' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, 'Ashish Sangwan' References: <004401cf645c$8f874710$ae95d530$@samsung.com> In-reply-to: Subject: RE: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Date: Wed, 30 Apr 2014 19:43:45 +0900 X-ASG-Orig-Subj: RE: [PATCH] xfstests: fsstress: fix incorrect if condition check for collapse range mode Message-id: <004701cf6461$0fdab330$2f901990$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=iso-8859-2 Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQFL8FRQV/1ByKD/Hmc7SCYcTilluQFQgstanCZdKJA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrIIsWRmVeSWpSXmKPExsWyRsSkRPfR5YRggy07mCyWTrzEbLHl2D1G i2UPNrNY7Nl7ksViUd8tRgdWj1OLJDxWX9jK6PF+31U2j74tqxg9Pm+SC2CN4rJJSc3JLEst 0rdL4MpY8yG34A9PxZdt8g2ME7m6GDk5JARMJNYf3MgEYYtJXLi3nq2LkYtDSGApo8T53gvs MEVXJkxhhkhMZ5SY+2oVO4Tzl1Hi6pOdQBkODjYBbYk/W0RBGkQE7CTmzmlhAqlhFmhhlDjY uA1skpBAmcTrDwtYQOo5BdwlXs81BzGFBZIlDn30AalgEVCVuPXhPFg1r4ClREPLLCYIW1Di x+R7YJ3MAjoSXydFgISZBeQlNq95ywxxpoLEjrOvGSEusJLY/XQdO0SNiMS+F+8YIWpusUv8 u2ILsUpA4tvkQ2AjJQRkJTYdgBojKXFwxQ2WCYwSs5AsnoWweBaSxbOQLFjAyLKKUTS1ILmg OCm9yESvODG3uDQvXS85P3cTIzA6T/97NmEH470D1ocYk4G2T2SWEk3OB0Z3Xkm8obGZkYWp iamxkbmlGWnCSuK8ao+SgoQE0hNLUrNTUwtSi+KLSnNSiw8xMnFwSjUw2rk/7ORU6A/guSM1 RczG6StX78XFYUdcJu/6M6dKs82Yc3PH0/oHTMl9K9u37vXUWvfZPoLHuNVs4r9jM76Up/V1 31BcPufZvf1B0+c+5Z3Z7Xq9fnJYadzssooPlWy2kwN9HqyrtU505rbKMnPY8Xe7+ZWa+PCv WenO63z9NiZ/7WrsucqjxFKckWioxVxUnAgALtDMU+QCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrPKsWRmVeSWpSXmKPExsVy+t9jQd2HlxOCDRbOtrBYOvESs8WWY/cY LZY92MxisWfvSRaLRX23GB1YPU4tkvBYfWEro8f7fVfZPPq2rGL0+LxJLoA1qoHRJiM1MSW1 SCE1Lzk/JTMv3VbJOzjeOd7UzMBQ19DSwlxJIS8xN9VWycUnQNctMwdouZJCWWJOKVAoILG4 WEnfDtOE0BA3XQuYxghd35AguB4jAzSQsIYxY82H3II/PBVftsk3ME7k6mLk5JAQMJG4MmEK M4QtJnHh3nq2LkYuDiGB6YwSc1+tYodw/jJKXH2yE6iKg4NNQFvizxZRkAYRATuJuXNamEBq mAVaGCUONm5jB0kICZRJvP6wgAWknlPAXeL1XHMQU1ggWeLQRx+QChYBVYlbH86DVfMKWEo0 tMxigrAFJX5MvgfWySygI/F1UgRImFlAXmLzmrdQZypI7Dj7mhHiAiuJ3U/XsUPUiEjse/GO cQKj0Cwkk2YhTJqFZNIsJB0LGFlWMYqmFiQXFCel5xrpFSfmFpfmpesl5+duYgRH/zPpHYyr GiwOMQpwMCrx8ApsjQ8WYk0sK67MPcQowcGsJMI752hCsBBvSmJlVWpRfnxRaU5q8SHGZKA/ JzJLiSbnAxNTXkm8obGJmZGlkbmhhZGxOWnCSuK8B1utA4UE0hNLUrNTUwtSi2C2MHFwSjUw Msxr9v9z+1Txs4vSq7bv4Vbo0NuXFtDOYf9L/aMXX/fHr2c3HI39yF6+WGzBzFNLz02yrZf7 W3N3udOTotvGgpdXSiRceePhvP7fjZj52gFuhQ91/KexOv8WP/le+5KXIdeD35anH84teDk3 a0eXwV/xvkeswryqGps6ooL67t84MTVhbsrsEiWW4oxEQy3mouJEACsRtJ5CAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1398854628 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== > On Wed, 30 Apr 2014, Namjae Jeon wrote: > > > Date: Wed, 30 Apr 2014 19:11:32 +0900 > > From: Namjae Jeon > > To: Dave Chinner > > Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, > > Ashish Sangwan > > Subject: [PATCH] xfstests: fsstress: fix incorrect if condition check for > > collapse range mode > > > > There is if condition to be block aligned for off and len of Collapse range. > > But off and len for all fallocate opearion can be aligned by incorrect > > if condition check. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > --- > > ltp/fsstress.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/ltp/fsstress.c b/ltp/fsstress.c > > index 29fc250..ff9ed12 100644 > > --- a/ltp/fsstress.c > > +++ b/ltp/fsstress.c > > @@ -2230,7 +2230,7 @@ do_fallocate(int opno, long r, int mode) > > * Collapse range requires off and len to be block aligned, make it > > * more likely to be the case. > > */ > > - if (FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { > > + if (mode & FALLOC_FL_COLLAPSE_RANGE && (opno % 2)) { > > off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); > > len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); > > } > > oops :). Thanks for fixing it. Even though it would be better to use > parentheses Hi Lukas. Okay, I will send v2 patch. Thanks for review! > > + if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { > > Reviewed-by: Lukas Czerner From BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 30 07:02:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D735829DF8 for ; Wed, 30 Apr 2014 07:02:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7610AAC010 for ; Wed, 30 Apr 2014 05:02:15 -0700 (PDT) X-ASG-Debug-ID: 1398859333-04cbb03cc71962e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OHNFJpW3zbsOfhlv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 30 Apr 2014 05:02:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfTDJ-0006JV-7d; Wed, 30 Apr 2014 12:02:13 +0000 Date: Wed, 30 Apr 2014 05:02:13 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl Message-ID: <20140430120213.GA19963@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/2] xfs: fix tmpfile/selinux deadlock and initialize security/acl References: <1397071311-28371-1-git-send-email-bfoster@redhat.com> <1397071311-28371-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1397071311-28371-2-git-send-email-bfoster@redhat.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398859333 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks like I have lost the the argument on the ACLs. Do you want to resend a version of this rebased to the current tree, or should I do it? We probably should get this into 3.15 so that our tmpfile doesn't behave different from everyone else in the release where we introduce it. From tinguely@eagdhcp-232-128.americas.sgi.com Wed Apr 30 09:02:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 EA64029DF9 for ; Wed, 30 Apr 2014 09:02:18 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81408AC008 for ; Wed, 30 Apr 2014 07:02:15 -0700 (PDT) Received: from eagdhcp-232-128.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s3UE2DZ4007720 for ; Wed, 30 Apr 2014 09:02:13 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-128.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5/Submit) id s3UE2DPe007719; Wed, 30 Apr 2014 09:02:13 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140430134844.924376330@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Wed, 30 Apr 2014 08:48:44 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfsprog: fix xfs_inode lifetime issue These patches clean up the xfs(_trans)_iput() and fix the xfs_inode life time so that inodes with a extended attribute fork can add an attributes. Patch 1 removes the unused argument in _iput routines and introduces the IRELSE define for xfs_iput(). Patch 2 fixes the xfs_inode lifetime problem. Mark. From tinguely@eagdhcp-232-128.americas.sgi.com Wed Apr 30 09:03:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1BB9929DF9 for ; Wed, 30 Apr 2014 09:03:07 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE1F1304064 for ; Wed, 30 Apr 2014 07:03:03 -0700 (PDT) Received: from eagdhcp-232-128.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s3UE32WI007724 for ; Wed, 30 Apr 2014 09:03:02 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-128.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5/Submit) id s3UE324d007723; Wed, 30 Apr 2014 09:03:02 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140430135319.660238697@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Wed, 30 Apr 2014 08:48:45 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput References: <20140430134844.924376330@sgi.com> Content-Disposition: inline; filename=xfsprogs-remove-extra-var-xfs_iput.patch Remove the unused second argument to xfs_iput() and xfs_trans_iput(). Introduce the define "IRELE()" and use in place of xfs_iput(). Signed-off-by: Mark Tinguely --- db/attrset.c | 4 ++-- include/libxfs.h | 6 ++++-- libxfs/init.c | 4 ++-- libxfs/rdwr.c | 2 +- libxfs/trans.c | 11 +++++------ mkfs/proto.c | 2 +- repair/phase6.c | 2 +- repair/phase7.c | 2 +- 8 files changed, 17 insertions(+), 16 deletions(-) Index: b/db/attrset.c =================================================================== --- a/db/attrset.c +++ b/db/attrset.c @@ -170,7 +170,7 @@ attr_set_f( out: mp->m_flags &= ~LIBXFS_MOUNT_COMPAT_ATTR; if (ip) - libxfs_iput(ip, 0); + IRELE(ip); if (value) free(value); return 0; @@ -244,6 +244,6 @@ attr_remove_f( out: mp->m_flags &= ~LIBXFS_MOUNT_COMPAT_ATTR; if (ip) - libxfs_iput(ip, 0); + IRELE(ip); return 0; } Index: b/include/libxfs.h =================================================================== --- a/include/libxfs.h +++ b/include/libxfs.h @@ -532,7 +532,7 @@ extern xfs_buf_t *libxfs_trans_getsb (xf extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, uint, uint, struct xfs_inode **); -extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *, uint); +extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *); extern void libxfs_trans_ijoin (xfs_trans_t *, struct xfs_inode *, uint); extern void libxfs_trans_ihold (xfs_trans_t *, struct xfs_inode *); extern void libxfs_trans_ijoin_ref(xfs_trans_t *, struct xfs_inode *, int); @@ -653,7 +653,9 @@ extern int libxfs_iflush_int (xfs_inode_ /* Inode Cache Interfaces */ 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); +extern void libxfs_iput (xfs_inode_t *); + +#define IRELE(ip) libxfs_iput(ip) /* Shared utility routines */ extern unsigned int libxfs_log2_roundup(unsigned int i); Index: b/libxfs/init.c =================================================================== --- a/libxfs/init.c +++ b/libxfs/init.c @@ -778,9 +778,9 @@ void libxfs_rtmount_destroy(xfs_mount_t *mp) { if (mp->m_rsumip) - libxfs_iput(mp->m_rsumip, 0); + IRELE(mp->m_rsumip); if (mp->m_rbmip) - libxfs_iput(mp->m_rbmip, 0); + IRELE(mp->m_rbmip); mp->m_rsumip = mp->m_rbmip = NULL; } Index: b/libxfs/rdwr.c =================================================================== --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1076,7 +1076,7 @@ libxfs_idestroy(xfs_inode_t *ip) } void -libxfs_iput(xfs_inode_t *ip, uint lock_flags) +libxfs_iput(xfs_inode_t *ip) { if (ip->i_itemp) kmem_zone_free(xfs_ili_zone, ip->i_itemp); Index: b/libxfs/trans.c =================================================================== --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -250,13 +250,12 @@ libxfs_trans_iget( void libxfs_trans_iput( xfs_trans_t *tp, - xfs_inode_t *ip, - uint lock_flags) + xfs_inode_t *ip) { xfs_inode_log_item_t *iip; if (tp == NULL) { - libxfs_iput(ip, lock_flags); + IRELE(ip); return; } @@ -265,7 +264,7 @@ libxfs_trans_iput( ASSERT(iip != NULL); xfs_trans_del_item(&iip->ili_item); - libxfs_iput(ip, lock_flags); + IRELE(ip); } void @@ -737,7 +736,7 @@ ili_done: return; } /* free the inode */ - libxfs_iput(ip, 0); + IRELE(ip); } static void @@ -819,7 +818,7 @@ inode_item_unlock( iip->ili_flags = 0; if (!iip->ili_lock_flags) - libxfs_iput(ip, 0); + IRELE(ip); else iip->ili_lock_flags = 0; } Index: b/mkfs/proto.c =================================================================== --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -589,7 +589,7 @@ parseproto( break; parseproto(mp, ip, fsxp, pp, name); } - libxfs_iput(ip, 0); + IRELE(ip); return; default: ASSERT(0); Index: b/repair/phase6.c =================================================================== --- a/repair/phase6.c +++ b/repair/phase6.c @@ -2873,7 +2873,7 @@ process_dir_inode( |XFS_TRANS_SYNC); } } - libxfs_iput(ip, 0); + IRELE(ip); } /* Index: b/repair/phase7.c =================================================================== --- a/repair/phase7.c +++ b/repair/phase7.c @@ -99,7 +99,7 @@ update_inode_nlinks( set_nlinks(&ip->i_d, ino, nlinks, &dirty); if (!dirty) { - libxfs_trans_iput(tp, ip, 0); + libxfs_trans_iput(tp, ip); libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); } else { libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); From tinguely@eagdhcp-232-128.americas.sgi.com Wed Apr 30 09:04:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 BE7C429DF9 for ; Wed, 30 Apr 2014 09:04:27 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id 94FC5304032 for ; Wed, 30 Apr 2014 07:04:27 -0700 (PDT) Received: from eagdhcp-232-128.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s3UE4PEj007728 for ; Wed, 30 Apr 2014 09:04:25 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-128.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-128.americas.sgi.com (8.14.5/8.14.5/Submit) id s3UE4P1x007727; Wed, 30 Apr 2014 09:04:25 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140430135319.750775813@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Wed, 30 Apr 2014 08:48:46 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfsprogs: dont free xfs_inode until complete References: <20140430134844.924376330@sgi.com> Content-Disposition: inline; filename=xfsprogs-fix-release-xfs_inode.patch Originally, the xfs_inode are released upon the first call to xfs_trans_cancel, xfs_trans_commit, or inode_item_done. This code used the log item lock field to prevent the release of the inode on the next call to one of the above functions. This is a unusual use of the log item lock field which is suppose to specify which lock is to be release on transaction commit or cancel. User space does not perform locking in transactions.. Unfortunately, this breaks any code that relies on multiple transaction operations. For example, adding an extended attribute to an inode that does not have an attribute fork will fail: # xfs_db -x XFS_DEVICE xfs_db> inode INO_NUM xfs_db> attr_set newattribute This patch does the following: 1) Removes the iput from the transaction completion and requires that the xfs_inode allocators call IRELE() when they are done with the pointer. The real time inodes are pointed to by the xfs_mount and have a longer lifetime. 2) Removes libxfs_trans_iput() because transaction entries are removed in transaction commit and cancel. 3) Removes libxfs_trans_ihold() which is an obsolete interface. 4) Removes the now unneeded ili_flags from the xfs_inode_log_item structure. Signed-off-by: Mark Tinguely --- include/libxfs.h | 3 -- libxfs/trans.c | 59 +++++-------------------------------------------------- libxfs/util.c | 1 libxfs/xfs.h | 1 mkfs/proto.c | 16 +------------- repair/phase6.c | 13 +++--------- repair/phase7.c | 2 - 7 files changed, 13 insertions(+), 82 deletions(-) Index: b/include/libxfs.h =================================================================== --- a/include/libxfs.h +++ b/include/libxfs.h @@ -477,7 +477,6 @@ typedef struct xfs_inode_log_item { 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; } xfs_inode_log_item_t; typedef struct xfs_buf_log_item { @@ -532,9 +531,7 @@ extern xfs_buf_t *libxfs_trans_getsb (xf extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, uint, uint, struct xfs_inode **); -extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *); extern void libxfs_trans_ijoin (xfs_trans_t *, struct xfs_inode *, uint); -extern void libxfs_trans_ihold (xfs_trans_t *, struct xfs_inode *); extern void libxfs_trans_ijoin_ref(xfs_trans_t *, struct xfs_inode *, int); extern void libxfs_trans_log_inode (xfs_trans_t *, struct xfs_inode *, uint); Index: b/libxfs/trans.c =================================================================== --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -110,7 +110,7 @@ libxfs_trans_roll( /* * Commit the current transaction. * If this commit failed, then it'd just unlock those items that - * are not marked ihold. That also means that a filesystem shutdown + * are marked to be released. That also means that a filesystem shutdown * is in progress. The caller takes the responsibility to cancel * the duplicate transaction that gets returned. */ @@ -248,26 +248,6 @@ libxfs_trans_iget( } void -libxfs_trans_iput( - xfs_trans_t *tp, - xfs_inode_t *ip) -{ - xfs_inode_log_item_t *iip; - - if (tp == NULL) { - IRELE(ip); - return; - } - - ASSERT(ip->i_transp == tp); - iip = ip->i_itemp; - ASSERT(iip != NULL); - xfs_trans_del_item(&iip->ili_item); - - IRELE(ip); -} - -void libxfs_trans_ijoin( xfs_trans_t *tp, xfs_inode_t *ip, @@ -300,7 +280,6 @@ libxfs_trans_ijoin_ref( ASSERT(ip->i_itemp != NULL); xfs_trans_ijoin(tp, ip, lock_flags); - ip->i_itemp->ili_lock_flags = lock_flags; #ifdef XACT_DEBUG fprintf(stderr, "ijoin_ref'd inode %llu, transaction %p\n", ip->i_ino, tp); @@ -308,21 +287,6 @@ libxfs_trans_ijoin_ref( } void -libxfs_trans_ihold( - xfs_trans_t *tp, - xfs_inode_t *ip) -{ - ASSERT(ip->i_transp == tp); - ASSERT(ip->i_itemp != NULL); - - ip->i_itemp->ili_lock_flags = 1; - -#ifdef XACT_DEBUG - fprintf(stderr, "ihold'd inode %llu, transaction %p\n", ip->i_ino, tp); -#endif -} - -void libxfs_trans_inode_alloc_buf( xfs_trans_t *tp, xfs_buf_t *bp) @@ -701,7 +665,7 @@ inode_item_done( if (!(iip->ili_fields & XFS_ILOG_ALL)) { ip->i_transp = NULL; /* disassociate from transaction */ iip->ili_flags = 0; /* reset all flags */ - goto ili_done; + return; } /* @@ -711,7 +675,7 @@ inode_item_done( if (error) { fprintf(stderr, _("%s: warning - imap_to_bp failed (%d)\n"), progname, error); - goto ili_done; + return; } XFS_BUF_SET_FSPRIVATE(bp, iip); @@ -719,7 +683,7 @@ inode_item_done( if (error) { fprintf(stderr, _("%s: warning - iflush_int failed (%d)\n"), progname, error); - goto ili_done; + return; } ip->i_transp = NULL; /* disassociate from transaction */ @@ -727,16 +691,9 @@ inode_item_done( XFS_BUF_SET_FSPRIVATE2(bp, NULL); /* remove xact ptr */ libxfs_writebuf(bp, 0); #ifdef XACT_DEBUG - fprintf(stderr, "flushing dirty inode %llu, buffer %p (hold=%u)\n", - ip->i_ino, bp, iip->ili_lock_flags); + fprintf(stderr, "flushing dirty inode %llu, buffer %p\n", + ip->i_ino, bp); #endif -ili_done: - if (iip->ili_lock_flags) { - iip->ili_lock_flags = 0; - return; - } - /* free the inode */ - IRELE(ip); } static void @@ -817,10 +774,6 @@ inode_item_unlock( ip->i_transp = NULL; iip->ili_flags = 0; - if (!iip->ili_lock_flags) - IRELE(ip); - else - iip->ili_lock_flags = 0; } /* Index: b/libxfs/util.c =================================================================== --- a/libxfs/util.c +++ b/libxfs/util.c @@ -595,7 +595,6 @@ libxfs_alloc_file_space( break; } xfs_trans_ijoin(tp, ip, 0); - xfs_trans_ihold(tp, ip); xfs_bmap_init(&free_list, &firstfsb); error = xfs_bmapi_write(tp, ip, startoffset_fsb, allocatesize_fsb, Index: b/libxfs/xfs.h =================================================================== --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -292,7 +292,6 @@ roundup_64(__uint64_t x, __uint32_t y) #define xfs_trans_get_buf libxfs_trans_get_buf #define xfs_trans_getsb libxfs_trans_getsb #define xfs_trans_iget libxfs_trans_iget -#define xfs_trans_ihold libxfs_trans_ihold #define xfs_trans_ijoin libxfs_trans_ijoin #define xfs_trans_ijoin_ref libxfs_trans_ijoin_ref #define xfs_trans_init libxfs_trans_init Index: b/mkfs/proto.c =================================================================== --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -196,7 +196,6 @@ rsvfile( tp = libxfs_trans_alloc(mp, 0); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); ip->i_d.di_mode &= ~S_ISUID; @@ -463,7 +462,6 @@ parseproto( libxfs_trans_ijoin(tp, pip, 0); xname.type = XFS_DIR3_FT_REG_FILE; newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); - libxfs_trans_ihold(tp, pip); break; case IF_RESERVED: /* pre-allocated space only */ @@ -480,7 +478,6 @@ parseproto( xname.type = XFS_DIR3_FT_REG_FILE; newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); - libxfs_trans_ihold(tp, pip); libxfs_trans_log_inode(tp, ip, flags); error = libxfs_bmap_finish(&tp, &flist, &committed); @@ -488,6 +485,7 @@ parseproto( fail(_("Pre-allocated file creation failed"), error); libxfs_trans_commit(tp, 0); rsvfile(mp, ip, llen); + IRELE(ip); return; case IF_BLOCK: @@ -502,7 +500,6 @@ parseproto( libxfs_trans_ijoin(tp, pip, 0); xname.type = XFS_DIR3_FT_BLKDEV; newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); - libxfs_trans_ihold(tp, pip); flags |= XFS_ILOG_DEV; break; @@ -517,7 +514,6 @@ parseproto( libxfs_trans_ijoin(tp, pip, 0); xname.type = XFS_DIR3_FT_CHRDEV; newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); - libxfs_trans_ihold(tp, pip); flags |= XFS_ILOG_DEV; break; @@ -530,7 +526,6 @@ parseproto( libxfs_trans_ijoin(tp, pip, 0); xname.type = XFS_DIR3_FT_FIFO; newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); - libxfs_trans_ihold(tp, pip); break; case IF_SYMLINK: buf = getstr(pp); @@ -544,7 +539,6 @@ parseproto( libxfs_trans_ijoin(tp, pip, 0); xname.type = XFS_DIR3_FT_SYMLINK; newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); - libxfs_trans_ihold(tp, pip); break; case IF_DIRECTORY: getres(tp, 0); @@ -564,7 +558,6 @@ parseproto( newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &flist); pip->i_d.di_nlink++; - libxfs_trans_ihold(tp, pip); libxfs_trans_log_inode(tp, pip, XFS_ILOG_CORE); } newdirectory(mp, tp, ip, pip); @@ -572,7 +565,6 @@ parseproto( error = libxfs_bmap_finish(&tp, &flist, &committed); if (error) fail(_("Directory creation failed"), error); - libxfs_trans_ihold(tp, ip); libxfs_trans_commit(tp, 0); /* * RT initialization. Do this here to ensure that @@ -602,6 +594,7 @@ parseproto( error); } libxfs_trans_commit(tp, 0); + IRELE(ip); } void @@ -664,7 +657,6 @@ rtinit( *(__uint64_t *)&rbmip->i_d.di_atime = 0; libxfs_trans_log_inode(tp, rbmip, XFS_ILOG_CORE); libxfs_mod_sb(tp, XFS_SB_RBMINO); - libxfs_trans_ihold(tp, rbmip); mp->m_rbmip = rbmip; error = libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, &creds, &fsxattrs, &rsumip); @@ -675,7 +667,6 @@ rtinit( rsumip->i_d.di_size = mp->m_rsumsize; libxfs_trans_log_inode(tp, rsumip, XFS_ILOG_CORE); libxfs_mod_sb(tp, XFS_SB_RSUMINO); - libxfs_trans_ihold(tp, rsumip); libxfs_trans_commit(tp, 0); mp->m_rsumip = rsumip; /* @@ -688,7 +679,6 @@ rtinit( res_failed(i); libxfs_trans_ijoin(tp, rbmip, 0); - libxfs_trans_ihold(tp, rbmip); bno = 0; xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { @@ -725,7 +715,6 @@ rtinit( if (i) res_failed(i); libxfs_trans_ijoin(tp, rsumip, 0); - libxfs_trans_ihold(tp, rsumip); bno = 0; xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { @@ -761,7 +750,6 @@ rtinit( if (i) res_failed(i); libxfs_trans_ijoin(tp, rbmip, 0); - libxfs_trans_ihold(tp, rbmip); xfs_bmap_init(&flist, &first); ebno = XFS_RTMIN(mp->m_sb.sb_rextents, bno + NBBY * mp->m_sb.sb_blocksize); Index: b/repair/phase6.c =================================================================== --- a/repair/phase6.c +++ b/repair/phase6.c @@ -505,7 +505,6 @@ mk_rbmino(xfs_mount_t *mp) * commit changes */ libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - libxfs_trans_ihold(tp, ip); libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC); /* @@ -762,7 +761,6 @@ mk_rsumino(xfs_mount_t *mp) * commit changes */ libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - libxfs_trans_ihold(tp, ip); libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC); /* @@ -1024,6 +1022,8 @@ mk_orphanage(xfs_mount_t *mp) libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC); + IRELE(ip); + IRELE(pip); add_inode_reached(irec,ino_offset); return(ino); @@ -1221,6 +1221,8 @@ mv_orphanage( libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC); } + IRELE(ino_p); + IRELE(orphanage_ip); } static int @@ -1291,7 +1293,6 @@ longform_dir2_rebuild( if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); if ((error = libxfs_bmap_last_offset(tp, ip, &lastblock, XFS_DATA_FORK))) @@ -1331,7 +1332,6 @@ longform_dir2_rebuild( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); xfs_bmap_init(&flist, &firstblock); error = libxfs_dir_createname(tp, ip, &p->name, p->inum, @@ -1389,7 +1389,6 @@ dir2_kill_block( if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); libxfs_trans_bjoin(tp, bp); memset(&args, 0, sizeof(args)); xfs_bmap_init(&flist, &firstblock); @@ -1577,7 +1576,6 @@ longform_dir2_entry_check_data( if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); libxfs_trans_bjoin(tp, bp); libxfs_trans_bhold(tp, bp); xfs_bmap_init(&flist, &firstblock); @@ -2744,7 +2742,6 @@ process_dir_inode( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); shortform_dir2_entry_check(mp, ino, ip, &dirty, irec, ino_offset, @@ -2792,7 +2789,6 @@ process_dir_inode( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); xfs_bmap_init(&flist, &first); @@ -2854,7 +2850,6 @@ process_dir_inode( res_failed(error); libxfs_trans_ijoin(tp, ip, 0); - libxfs_trans_ihold(tp, ip); xfs_bmap_init(&flist, &first); Index: b/repair/phase7.c =================================================================== --- a/repair/phase7.c +++ b/repair/phase7.c @@ -99,7 +99,6 @@ update_inode_nlinks( set_nlinks(&ip->i_d, ino, nlinks, &dirty); if (!dirty) { - libxfs_trans_iput(tp, ip); libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); } else { libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); @@ -113,6 +112,7 @@ update_inode_nlinks( ASSERT(error == 0); } + IRELE(ip); } void From sandeen@sandeen.net Wed Apr 30 09:47:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 07B9F29DF9 for ; Wed, 30 Apr 2014 09:47:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01837304062 for ; Wed, 30 Apr 2014 07:47:52 -0700 (PDT) X-ASG-Debug-ID: 1398869270-04cbb03cc71a4560001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jtQyXDFmTDviv5Ka for ; Wed, 30 Apr 2014 07:47:50 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4DBD663C5FF1; Wed, 30 Apr 2014 09:47:50 -0500 (CDT) Message-ID: <53610D16.9040609@sandeen.net> Date: Wed, 30 Apr 2014 09:47:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput References: <20140430134844.924376330@sgi.com> <20140430135319.660238697@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput In-Reply-To: <20140430135319.660238697@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398869270 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/30/14, 8:48 AM, Mark Tinguely wrote: > Remove the unused second argument to xfs_iput() and > xfs_trans_iput(). > > Introduce the define "IRELE()" and use in place of xfs_iput(). Why do this? We had been moving away from the upper-case-macro- redefined-to-a-function meme... what does this #define gain? libxfs_iget/libxfs_iput pairs seem more obvious than libxfs_iget/IRELE()... Thanks, -Eric > Signed-off-by: Mark Tinguely > --- > db/attrset.c | 4 ++-- > include/libxfs.h | 6 ++++-- > libxfs/init.c | 4 ++-- > libxfs/rdwr.c | 2 +- > libxfs/trans.c | 11 +++++------ > mkfs/proto.c | 2 +- > repair/phase6.c | 2 +- > repair/phase7.c | 2 +- > 8 files changed, 17 insertions(+), 16 deletions(-) > > Index: b/db/attrset.c > =================================================================== > --- a/db/attrset.c > +++ b/db/attrset.c > @@ -170,7 +170,7 @@ attr_set_f( > out: > mp->m_flags &= ~LIBXFS_MOUNT_COMPAT_ATTR; > if (ip) > - libxfs_iput(ip, 0); > + IRELE(ip); > if (value) > free(value); > return 0; > @@ -244,6 +244,6 @@ attr_remove_f( > out: > mp->m_flags &= ~LIBXFS_MOUNT_COMPAT_ATTR; > if (ip) > - libxfs_iput(ip, 0); > + IRELE(ip); > return 0; > } > Index: b/include/libxfs.h > =================================================================== > --- a/include/libxfs.h > +++ b/include/libxfs.h > @@ -532,7 +532,7 @@ extern xfs_buf_t *libxfs_trans_getsb (xf > > extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, > uint, uint, struct xfs_inode **); > -extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *, uint); > +extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *); > extern void libxfs_trans_ijoin (xfs_trans_t *, struct xfs_inode *, uint); > extern void libxfs_trans_ihold (xfs_trans_t *, struct xfs_inode *); > extern void libxfs_trans_ijoin_ref(xfs_trans_t *, struct xfs_inode *, int); > @@ -653,7 +653,9 @@ extern int libxfs_iflush_int (xfs_inode_ > /* Inode Cache Interfaces */ > 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); > +extern void libxfs_iput (xfs_inode_t *); > + > +#define IRELE(ip) libxfs_iput(ip) > > /* Shared utility routines */ > extern unsigned int libxfs_log2_roundup(unsigned int i); > Index: b/libxfs/init.c > =================================================================== > --- a/libxfs/init.c > +++ b/libxfs/init.c > @@ -778,9 +778,9 @@ void > libxfs_rtmount_destroy(xfs_mount_t *mp) > { > if (mp->m_rsumip) > - libxfs_iput(mp->m_rsumip, 0); > + IRELE(mp->m_rsumip); > if (mp->m_rbmip) > - libxfs_iput(mp->m_rbmip, 0); > + IRELE(mp->m_rbmip); > mp->m_rsumip = mp->m_rbmip = NULL; > } > > Index: b/libxfs/rdwr.c > =================================================================== > --- a/libxfs/rdwr.c > +++ b/libxfs/rdwr.c > @@ -1076,7 +1076,7 @@ libxfs_idestroy(xfs_inode_t *ip) > } > > void > -libxfs_iput(xfs_inode_t *ip, uint lock_flags) > +libxfs_iput(xfs_inode_t *ip) > { > if (ip->i_itemp) > kmem_zone_free(xfs_ili_zone, ip->i_itemp); > Index: b/libxfs/trans.c > =================================================================== > --- a/libxfs/trans.c > +++ b/libxfs/trans.c > @@ -250,13 +250,12 @@ libxfs_trans_iget( > void > libxfs_trans_iput( > xfs_trans_t *tp, > - xfs_inode_t *ip, > - uint lock_flags) > + xfs_inode_t *ip) > { > xfs_inode_log_item_t *iip; > > if (tp == NULL) { > - libxfs_iput(ip, lock_flags); > + IRELE(ip); > return; > } > > @@ -265,7 +264,7 @@ libxfs_trans_iput( > ASSERT(iip != NULL); > xfs_trans_del_item(&iip->ili_item); > > - libxfs_iput(ip, lock_flags); > + IRELE(ip); > } > > void > @@ -737,7 +736,7 @@ ili_done: > return; > } > /* free the inode */ > - libxfs_iput(ip, 0); > + IRELE(ip); > } > > static void > @@ -819,7 +818,7 @@ inode_item_unlock( > > iip->ili_flags = 0; > if (!iip->ili_lock_flags) > - libxfs_iput(ip, 0); > + IRELE(ip); > else > iip->ili_lock_flags = 0; > } > Index: b/mkfs/proto.c > =================================================================== > --- a/mkfs/proto.c > +++ b/mkfs/proto.c > @@ -589,7 +589,7 @@ parseproto( > break; > parseproto(mp, ip, fsxp, pp, name); > } > - libxfs_iput(ip, 0); > + IRELE(ip); > return; > default: > ASSERT(0); > Index: b/repair/phase6.c > =================================================================== > --- a/repair/phase6.c > +++ b/repair/phase6.c > @@ -2873,7 +2873,7 @@ process_dir_inode( > |XFS_TRANS_SYNC); > } > } > - libxfs_iput(ip, 0); > + IRELE(ip); > } > > /* > Index: b/repair/phase7.c > =================================================================== > --- a/repair/phase7.c > +++ b/repair/phase7.c > @@ -99,7 +99,7 @@ update_inode_nlinks( > set_nlinks(&ip->i_d, ino, nlinks, &dirty); > > if (!dirty) { > - libxfs_trans_iput(tp, ip, 0); > + libxfs_trans_iput(tp, ip); > libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); > } else { > libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Wed Apr 30 09:50:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8288329DF9 for ; Wed, 30 Apr 2014 09:50:17 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66B97304032; Wed, 30 Apr 2014 07:50:17 -0700 (PDT) Message-ID: <53610DA7.8070806@sgi.com> Date: Wed, 30 Apr 2014 09:50:15 -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 1/2] xfsprogs: remove unused argument in trans_iput References: <20140430134844.924376330@sgi.com> <20140430135319.660238697@sgi.com> <53610D16.9040609@sandeen.net> In-Reply-To: <53610D16.9040609@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/30/14 09:47, Eric Sandeen wrote: > On 4/30/14, 8:48 AM, Mark Tinguely wrote: >> > Remove the unused second argument to xfs_iput() and >> > xfs_trans_iput(). >> > >> > Introduce the define "IRELE()" and use in place of xfs_iput(). > Why do this? We had been moving away from the upper-case-macro- > redefined-to-a-function meme... what does this #define gain? > > libxfs_iget/libxfs_iput pairs seem more obvious than > libxfs_iget/IRELE()... > > Thanks, > -Eric > To be consistent with the kernel code. --Mark. From sandeen@sandeen.net Wed Apr 30 10:02:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B124829DF9 for ; Wed, 30 Apr 2014 10:02:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C03A8F8040 for ; Wed, 30 Apr 2014 08:02:53 -0700 (PDT) X-ASG-Debug-ID: 1398870172-04cbb03cc71a57d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AYMlZPj0G3yJYGUC for ; Wed, 30 Apr 2014 08:02: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-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9BCFD63C5FF1; Wed, 30 Apr 2014 10:02:52 -0500 (CDT) Message-ID: <5361109C.4000502@sandeen.net> Date: Wed, 30 Apr 2014 10:02:52 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput References: <20140430134844.924376330@sgi.com> <20140430135319.660238697@sgi.com> <53610D16.9040609@sandeen.net> <53610DA7.8070806@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput In-Reply-To: <53610DA7.8070806@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1398870172 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 4/30/14, 9:50 AM, Mark Tinguely wrote: > On 04/30/14 09:47, Eric Sandeen wrote: >> On 4/30/14, 8:48 AM, Mark Tinguely wrote: >>> > Remove the unused second argument to xfs_iput() and >>> > xfs_trans_iput(). >>> > >>> > Introduce the define "IRELE()" and use in place of xfs_iput(). >> Why do this? We had been moving away from the upper-case-macro- >> redefined-to-a-function meme... what does this #define gain? >> >> libxfs_iget/libxfs_iput pairs seem more obvious than >> libxfs_iget/IRELE()... >> >> Thanks, >> -Eric >> > > To be consistent with the kernel code. Gah, hohum, I'm not even going to try to explain why I thought we didn't have it in kernel code. sorry for the noise, -Eric > --Mark. > From BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 30 10:10:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1D92129DF9 for ; Wed, 30 Apr 2014 10:10:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08101304032 for ; Wed, 30 Apr 2014 08:10:22 -0700 (PDT) X-ASG-Debug-ID: 1398870621-04cbb03cc71a6030001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 3I2THIGT3gZJDye8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 30 Apr 2014 08:10:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfW9N-0005Fb-25; Wed, 30 Apr 2014 15:10:21 +0000 Date: Wed, 30 Apr 2014 08:10:21 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput Message-ID: <20140430151021.GA15162@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput References: <20140430134844.924376330@sgi.com> <20140430135319.660238697@sgi.com> <53610D16.9040609@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53610D16.9040609@sandeen.net> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398870621 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 30, 2014 at 09:47:50AM -0500, Eric Sandeen wrote: > On 4/30/14, 8:48 AM, Mark Tinguely wrote: > > Remove the unused second argument to xfs_iput() and > > xfs_trans_iput(). > > > > Introduce the define "IRELE()" and use in place of xfs_iput(). > > Why do this? We had been moving away from the upper-case-macro- > redefined-to-a-function meme... what does this #define gain? > > libxfs_iget/libxfs_iput pairs seem more obvious than > libxfs_iget/IRELE()... Mostly to match the kernel that makes it do an iput underneath.. From BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 30 10:11:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1748929DF9 for ; Wed, 30 Apr 2014 10:11:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B39A3AC012 for ; Wed, 30 Apr 2014 08:10:56 -0700 (PDT) X-ASG-Debug-ID: 1398870655-04cbb03cc71a60b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ZmbUbJPhWRoN3gyp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 30 Apr 2014 08:10:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfW9v-0005PI-1i; Wed, 30 Apr 2014 15:10:55 +0000 Date: Wed, 30 Apr 2014 08:10:55 -0700 From: Christoph Hellwig To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput Message-ID: <20140430151055.GB15162@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsprogs: remove unused argument in trans_iput References: <20140430134844.924376330@sgi.com> <20140430135319.660238697@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140430135319.660238697@sgi.com> 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: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1398870655 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Apr 30, 2014 at 08:48:45AM -0500, Mark Tinguely wrote: > Remove the unused second argument to xfs_iput() and > xfs_trans_iput(). > > Introduce the define "IRELE()" and use in place of xfs_iput(). > > Signed-off-by: Mark Tinguely Looks good, Reviewed-by: Christoph Hellwig From BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org Wed Apr 30 10:14:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1FACC29DF9 for ; Wed, 30 Apr 2014 10:14:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA499AC00B for ; Wed, 30 Apr 2014 08:14:33 -0700 (PDT) X-ASG-Debug-ID: 1398870871-04bdf02b8c1ac800001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id cF8WhoEwsBJq6l7M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 30 Apr 2014 08:14:31 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b866e36709fcd56311b1+3902+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WfWDP-0005bz-AS; Wed, 30 Apr 2014 15:14:31 +0000 Date: Wed, 30 Apr 2014 08:14:31 -0700 From: Christoph Hellwig To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfsprogs: dont free xfs_inode until complete Message-ID: <20140430151431.GC15162@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfsprogs: dont free xfs_inode until complete References: <20140430134844.924376330@sgi.com> <20140430135319.750775813@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140430135319.750775813@sgi.com> 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1398870871 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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5395 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 Wed, Apr 30, 2014 at 08:48:46AM -0500, Mark Tinguely wrote: > Originally, the xfs_inode are released upon the first > call to xfs_trans_cancel, xfs_trans_commit, or > inode_item_done. This code used the log item lock field > to prevent the release of the inode on the next call to > one of the above functions. This is a unusual use of the > log item lock field which is suppose to specify which lock > is to be release on transaction commit or cancel. User > space does not perform locking in transactions.. > > Unfortunately, this breaks any code that relies on multiple > transaction operations. For example, adding an extended > attribute to an inode that does not have an attribute fork > will fail: > > # xfs_db -x XFS_DEVICE > xfs_db> inode INO_NUM > xfs_db> attr_set newattribute > > This patch does the following: > 1) Removes the iput from the transaction completion and > requires that the xfs_inode allocators call IRELE() > when they are done with the pointer. The real time > inodes are pointed to by the xfs_mount and have a longer > lifetime. Makes sense, the kernel hasn't done an iput during transaction completion for a long time. > 2) Removes libxfs_trans_iput() because transaction entries > are removed in transaction commit and cancel. Also matches the kernel and makes sense. > 3) Removes libxfs_trans_ihold() which is an obsolete interface. Ditto. > 4) Removes the now unneeded ili_flags from the xfs_inode_log_item > structure. ili_lock_flags, not ili_flags. Given that we never lock inodes in userspace there is no need to unlock them during transaction commit, and no need to track this. There's also no shared code that references this field, so it can safely go. The patch looks good to me, and having consistent behavior with the kernel code is very useful to have! Reviewed-by: Christoph Hellwig